Welcome to the Monastery 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 taking refuge in the Monastery: (5)
As of 2018-03-24 14:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
When I think of a mole I think of:

Results (299 votes). Check out past polls.

Notices?