fermat_from_fermat_cached.pl 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #!/usr/bin/perl
  2. # Extract Fermat pseudoprimes from other pseudoprimes, having all the prime factors:
  3. # p == 3 (mod 8)
  4. # kroncker(5,p) = -1
  5. # Also having an odd number of factors, therefore kronecker(5,n) = -1.
  6. # If n is also a Fibonacci pseudoprime, then it would be a counter-example to the PSW conjecture.
  7. use 5.020;
  8. use strict;
  9. use warnings;
  10. use Storable;
  11. use Math::GMPz;
  12. use ntheory qw(:all);
  13. use Math::Prime::Util::GMP;
  14. use experimental qw(signatures);
  15. #my $storable_file = "cache/factors-carmichael.storable";
  16. my $storable_file = "cache/factors-fermat.storable";
  17. #my $storable_file = "cache/factors-lucas-carmichael.storable";
  18. my $table = retrieve($storable_file);
  19. my %seen;
  20. while (my ($key, $value) = each %$table) {
  21. my @factors = split(' ', $value);
  22. my $omega = scalar(@factors);
  23. $omega > 3 or next;
  24. #$factors[-1] < ~0 or next;
  25. @factors = grep {
  26. ($_ < ~0)
  27. ? ($_ % 8 == 3 and kronecker(5, $_) == -1)
  28. : (Math::Prime::Util::GMP::modint($_, 8) == 3 and Math::Prime::Util::GMP::kronecker(5, $_) == -1)
  29. } @factors;
  30. my $len = scalar(@factors);
  31. if ($len >= 3 and $len < $omega) {
  32. for (my $k = 3 ; $k <= $len ; $k += 2) {
  33. forcomb {
  34. my $z = Math::Prime::Util::GMP::vecprod(@factors[@_]);
  35. if (not exists($seen{$z}) and not exists($table->{$z}) and Math::Prime::Util::GMP::is_pseudoprime($z, 2)) {
  36. say $z;
  37. $seen{$z} = 1;
  38. }
  39. }
  40. $len, $k;
  41. }
  42. }
  43. }