XP is just a number PerlMonks

### Re^2: help with simplifying program

by crunch_this! (Acolyte)
 on May 24, 2013 at 16:57 UTC ( #1035175=note: print w/replies, xml ) Need Help??

in reply to Re: help with simplifying program
in thread help with simplifying program

This is the part of the program it comes from. I thought all the math stuff would be Math::Something so I didn't know about that combinatorics module! That sounds very interesting. I wonder if/how it could be applied here? It runs through all the possible polynomials of a certain form and spits out the ones whose derivatives have (approximately) integer roots.

```# \$lep means smallest nonzero root in the interval [0, \$rep]
# \$rep means right endpoint of the interval [0, \$rep]
my \$lep = int 1;
my \$rep = int 100;

foreach my \$x (\$lep+2 .. \$rep ) {
foreach my \$y (\$lep+1 .. \$x-1 ) {
foreach my \$z (\$lep .. \$y-1 ) {
foreach my \$s (1..\$rep/4) {
unless (\$y == \$x + \$s && \$z == \$y + \$s ) {

# assigns a truth value to whether or not it is wi
+thin 0.0001 of an integer (1=true, 0=false)
sub is_approximately_an_integer {
my \$eps = 0.0001;
while( my \$w = shift ) {

# need to use "round", "int" does not work!

return 0 if abs( \$w-round(\$w) ) > \$eps;
}
return 1
}
}
}

push @wants,
map { { join(', ', \$x, \$y, \$z) => \$_ } }
grep { is_approximately_an_integer( @\$_ ) } [
poly_roots(
poly_derivative(

# expanded form of x*(x - \$x)*(x - \$y)*(x
+- \$z)
1, -\$x - \$y - \$z, \$x*\$y + \$x*\$z + \$y*\$z, -
+\$x*\$y*\$z, 0
)
)
];
}
}
}

Replies are listed 'Best First'.
Re^3: help with simplifying program
by BillKSmith (Vicar) on May 24, 2013 at 18:05 UTC
Oops, I was slightly wrong. Combinations will only replace three of your loops. You still have to select the applicable combinations.
```use Algorithm::Combinatorics qw(combinations);

my \$lep = int 1;
my \$rep = int 100;
my \$iter = combinations( [\$lep+2 ..\$rep], 3 );
while (my \$c = \$iter->next) {
my (\$x, \$y, \$z) = @\$c;
foreach my \$s (1..\$rep/4) {
# as before
}
}
Bill
Re^3: help with simplifying program
by hdb (Monsignor) on May 24, 2013 at 17:47 UTC

You should figure this out yourself!! Read the documentation!!

```use strict;
use warnings;
use Algorithm::Combinatorics qw(combinations);

my \$rep = 5; # should be 100
my @data = 0..\$rep;
my \$iter = combinations( \@data, 4 );
while( my \$p = \$iter->next ) {
my ( \$z, \$y, \$x, \$w ) = @\$p;
next unless \$w-2*\$x+\$y or \$x-2*\$y+\$z;
print "\$w, \$x, \$y, \$z\n";
}
I've got a bunch of different cases I want to look at so this is only a template. I pasted the stuff with map/grep instead of printing the 4 variables. I can figure out how to modify things it's just the first step that I usually get stuck on. Thx very much for helping anyway.

Create A New User
Node Status?
node history
Node Type: note [id://1035175]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (5)
As of 2018-06-24 21:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Should cpanminus be part of the standard Perl release?

Results (126 votes). Check out past polls.

Notices?