use strict; my @P = (); my %reverseP = (); my $i = 0; my $j = 0; my $min = 0; print "Starting generation..."; for ($i = 1; $i < 100000; $i++) { my $Pn = pentagonal($i); push @P, $Pn; $reverseP{$Pn} = $i; $min = $Pn; } print " Done\n"; for ($i = 1; $i < 10000; $i++) { for ($j = 1; $j < 10000; $j++) { if ($reverseP{$P[$i] + $P[$j]} > 0) { my $D = abs($P[$i] - $P[$j]); if ($reverseP{$D} > 0 && $min > $D) { print "$i : $j :: " . $P[$i] . " : " . $P[$j] . " :: " . $D . "\n"; $min = $D; } } } } sub pentagonal { my $n = shift; return ($n * (3 * $n - 1) / 2); }