A few comments:

- The symmetry of the problem leads to 10 different cases only. We can assume that 1<=$c<$b<$a<=$rep.
- This also implies that $a is always at least 3, and $b at least 2.
- This way the loops are simpler and no check for equality is required.
- I think that $a, $b, $c are the correct parameters to store the results rather than the polynomials itself.

Here is my proposed code:

`use strict;
use warnings;
use Math::Polynomial::Solve qw!poly_derivative poly_roots!;
use Data::Dumper;
my %haystack;
my $rep = int 5; # $rep means right endpoint of the interval [0, $rep]
foreach my $a (3..$rep ) {
foreach my $b (2..$a-1 ) {
foreach my $c (1..$b-1 ) {
my @quintic = (1, -$a - $b - $c, $a*$b + $a*$c + $b*$c, -$a*$b*$
+c, 0, 0);
my @derivative = poly_derivative(@quintic);
my @zeros = poly_roots(@derivative);
$haystack{"$a,$b,$c"}{"p"} = \@quintic;
$haystack{"$a,$b,$c"}{"d"} = \@derivative;
$haystack{"$a,$b,$c"}{"z"} = \@zeros;
}
}
}
print Dumper{%haystack};
`

Comment onRe: Issue with hash definition & possibly some other stuffDownloadCode