superpseudoprimes.pl 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #!/usr/bin/perl
  2. # a(n) is the smallest super-pseudoprime to all bases <= prime(n).
  3. # Except for a(19) (and possibly other temrs), this sequence is similar with:
  4. # https://oeis.org/A285549
  5. use 5.020;
  6. use strict;
  7. use warnings;
  8. use ntheory qw(:all);
  9. use Math::GMPz;
  10. use Math::Prime::Util::GMP;
  11. use experimental qw(signatures);
  12. sub is_super_pseudoprime ($n, @bases) {
  13. Math::Prime::Util::GMP::is_pseudoprime($n, @bases) || return 0;
  14. my @factors = factor($n);
  15. foreach my $base (@bases) {
  16. powmod($base, gcd(map { $_ - 1 } @factors), $n) == 1
  17. or return 0;
  18. }
  19. return 1;
  20. }
  21. my @terms;
  22. while (<>) {
  23. next if /^\h*#/;
  24. /\S/ or next;
  25. my $n = (split(' ', $_))[-1];
  26. $n || next;
  27. next if $n > ~0;
  28. #next if (length($n) > 40);
  29. if (is_pseudoprime($n, 2)) {
  30. if ($n > ~0) {
  31. $n = Math::GMPz->new($n);
  32. }
  33. push @terms, $n;
  34. }
  35. }
  36. @terms = sort { $a <=> $b } @terms;
  37. my $p = 2;
  38. my @bases = ($p);
  39. foreach my $n (@terms) {
  40. while (is_super_pseudoprime($n, @bases)) {
  41. say "a(", scalar(@bases), ") <= $n";
  42. $p = next_prime($p);
  43. unshift @bases, $p;
  44. }
  45. }
  46. __END__
  47. a(1) <= 341
  48. a(2) <= 2701
  49. a(3) <= 721801
  50. a(4) <= 721801
  51. a(5) <= 42702661
  52. a(6) <= 1112103541
  53. a(7) <= 2380603501
  54. a(8) <= 5202153001
  55. a(9) <= 17231383261
  56. a(10) <= 251994268081
  57. a(11) <= 1729579597021
  58. a(12) <= 55181730338101
  59. a(13) <= 142621888086541
  60. a(14) <= 242017633321201
  61. a(15) <= 242017633321201
  62. a(16) <= 242017633321201
  63. a(17) <= 1174858593838021
  64. a(18) <= 1174858593838021
  65. a(19) <= 790489610041255741
  66. a(20) <= 790489610041255741
  67. a(21) <= 790489610041255741
  68. a(22) <= 790489610041255741