generate_pseudoprimes.pl 1015 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #!/usr/bin/perl
  2. use 5.020;
  3. use warnings;
  4. use experimental qw(signatures);
  5. use Math::AnyNum qw(prod);
  6. use ntheory qw(:all);
  7. sub fermat_pseudoprimes ($limit, $callback) {
  8. my %common_divisors;
  9. forprimes {
  10. my $p = $_;
  11. foreach my $d (divisors($p - 1)) {
  12. if (powmod(2, $d, $p) == 1) {
  13. push @{$common_divisors{$d}}, $p;
  14. }
  15. }
  16. } $limit;
  17. my %seen;
  18. foreach my $arr (values %common_divisors) {
  19. my $l = $#{$arr} + 1;
  20. foreach my $k (2 .. $l) {
  21. forcomb {
  22. my $n = prod(@{$arr}[@_]);
  23. $callback->($n) if !$seen{$n}++;
  24. } $l, $k;
  25. }
  26. }
  27. }
  28. my @pseudoprimes;
  29. fermat_pseudoprimes(
  30. 1e5,
  31. sub ($n) {
  32. my $t = "$n";
  33. if ($t > ~0) {
  34. say $t;
  35. }
  36. if ($t eq reverse($t)) {
  37. if ($t > 1037998220228997301) {
  38. die "New term: $t";
  39. }
  40. say "Palindrome: $t";
  41. }
  42. }
  43. );