generate_fermat_p==3_(mod 80).pl 1003 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/usr/bin/perl
  2. # Generate Fermat base-2 pseudoprimes where each prime factor is congruent to 3 (mod 80).
  3. use 5.020;
  4. use warnings;
  5. use experimental qw(signatures);
  6. use List::Util qw(shuffle);
  7. use ntheory qw(forcomb forprimes kronecker divisors lucas_sequence factor_exp factor primes divisor_sum powmod);
  8. use Math::Prime::Util::GMP qw(is_frobenius_pseudoprime vecprod binomial is_pseudoprime);
  9. my %common_divisors;
  10. forprimes {
  11. if (($_ % 80 == 3)) {
  12. foreach my $d (divisors($_ - 1)) {
  13. if (powmod(2, $d, $_) == 1) {
  14. push @{$common_divisors{$d}}, $_;
  15. }
  16. }
  17. }
  18. } 1e9;
  19. my $k = 3;
  20. foreach my $arr (values %common_divisors) {
  21. my @nums = @$arr;
  22. next if (@nums < $k);
  23. forcomb {
  24. my $n = vecprod(@nums[@_]);
  25. if ($n > ~0) {
  26. say $n;
  27. }
  28. }
  29. scalar(@nums), $k;
  30. }
  31. __END__
  32. 4263739170243679206753787
  33. 1820034970687975620484907
  34. 522925572082528736632187
  35. 164853581396047908970027
  36. 68435117188079800987