use strict; use prime; my @prime = prime::make_prime_table(100 * 10000); my %prime_hash; foreach my $p (@prime) { $prime_hash{$p} = 1; } for (my $n = 9; $n < 100 * 10000; $n += 2) { if (exists($prime_hash{$n})) { next; } my $prime_end = prime_idx($n); my $ok = 0; for (my $i = 0; $i < $prime_end; ++$i) { my $p = $n - $prime[$i]; my $sq = $p / 2; my $f = sqrt($sq); if ($sq == int($sq) && $f == int($f)) { $ok = 1; print "$n = $prime[$i] + 2 * $f^2\n"; last; } } if (!$ok) { print "MIN NUM($n)\n"; exit(0); } } sub prime_idx { my $n = shift; if (50 * 10000 > $n) { for (my $i = 0; $i < @prime; ++$i) { if ($prime[$i] >= $n) { return $i; } } } else { for (my $i = 50 * 10000; $i < @prime ; ++$i) { if ($prime[$i] >= $n) { return $i; } } } return 0; }