prog.pl 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #!/usr/bin/perl
  2. # Smallest base-n Fermat pseudoprime with n distinct prime factors.
  3. # https://oeis.org/A271874
  4. # Known terms:
  5. # 341, 286, 11305, 2203201, 12306385
  6. # New terms:
  7. # 341, 286, 11305, 2203201, 12306385, 9073150801, 3958035081, 2539184851126, 152064312120721, 10963650080564545, 378958695265110961, 1035551157050957605345, 57044715596229144811105, 6149883077429715389052001, 426634466310819456228926101, 166532358913107245358261399361
  8. # a(7)-a(17) from ~~~~
  9. # New terms found:
  10. # a(7) = 9073150801
  11. # a(8) = 3958035081
  12. # a(9) = 2539184851126
  13. # a(10) = 152064312120721
  14. # a(11) = 10963650080564545
  15. # a(12) = 378958695265110961
  16. # a(13) = 1035551157050957605345
  17. # a(14) = 57044715596229144811105
  18. # a(15) = 6149883077429715389052001
  19. # a(16) = 426634466310819456228926101
  20. # a(17) = 166532358913107245358261399361
  21. # a(18) = 15417816366043964846263074467761
  22. # a(19) = 7512467783390668787701493308514401
  23. # a(20) = 182551639864089765855891394794831841
  24. # a(21) = 73646340445282784237405289363506168161
  25. # a(22) = 12758106140074522771498516740500829830401
  26. # a(23) = 233342982005748265084053300837644203002001
  27. # a(24) = 41711804619389959984296019492852898455016161
  28. # a(25) = 35654496932132728635037829367481372591614792001
  29. # a(26) = 13513093081489380840188651246675032067011140079201
  30. # a(27) = 2758048007075525871042090011995729226316189827518801
  31. =for comment
  32. # PARI/GP program (version 1):
  33. fermat_psp(A, B, k, base=2) = A=max(A, vecprod(primes(k))); (f(m, l, p, j) = my(list=List()); forprime(q=p, sqrtnint(B\m, j), if(base%q != 0, my(z=znorder(Mod(base, q)), L=lcm(l, z)); if(gcd(L, m)==1, my(v=m*q, r=nextprime(q+1)); while(v <= B, if(j==1, if(v>=A && if(k==1, !isprime(v), 1) && (v-1)%l == 0 && (v-1)%z == 0 && Mod(base, v)^(v-1) == 1, listput(list, v)), if(v*r <= B, list=concat(list, f(v, l, r, j-1)))); v *= q)))); list); vecsort(Vec(f(1, 1, 2, k)));
  34. a(n) = if(n < 2, return()); my(x=vecprod(primes(n)), y=2*x); while(1, my(v=fermat_psp(x, y, n, n)); if(#v >= 1, return(v[1])); x=y+1; y=2*x); \\ ~~~~
  35. # PARI/GP program (version 2):
  36. fermat_psp(A, B, k, base) = A=max(A, vecprod(primes(k))); (f(m, l, p, j) = my(list=List()); forprime(q=p, sqrtnint(B\m, j), if(base%q != 0, my(v=m*q, t=q, r=nextprime(q+1)); while(v <= B, my(L=lcm(l, znorder(Mod(base, t)))); if(gcd(L, v) == 1, if(j==1, if(v>=A && if(k==1, !isprime(v), 1) && (v-1)%L == 0, listput(list, v)), if(v*r <= B, list=concat(list, f(v, L, r, j-1)))), break); v *= q; t *= q))); list); vecsort(Vec(f(1, 1, 2, k)));
  37. a(n) = if(n < 2, return()); my(x=vecprod(primes(n)), y=2*x); while(1, my(v=fermat_psp(x, y, n, n)); if(#v >= 1, return(v[1])); x=y+1; y=2*x); \\ ~~~~
  38. =cut
  39. use 5.020;
  40. use warnings;
  41. use ntheory qw(:all);
  42. use experimental qw(signatures);
  43. use Math::GMP qw(:constant);
  44. sub fermat_pseudoprimes ($A, $B, $k, $base, $callback) {
  45. $A = vecmax($A, pn_primorial($k));
  46. sub ($m, $lambda, $p, $j) {
  47. my $s = rootint(divint($B, $m), $j);
  48. for (my $r ; $p <= $s ; $p = $r) {
  49. $r = next_prime($p);
  50. if ($base % $p == 0) {
  51. next;
  52. }
  53. my $z = znorder($base, $p);
  54. my $L = lcm($lambda, $z);
  55. gcd($L, $m) == '1' or next;
  56. for (my ($q, $v) = ($p+0, $m * $p) ; $v <= $B ; ($q, $v) = ($q*$p, $v*$p)) {
  57. my $z = znorder($base, $q);
  58. my $L = lcm($lambda, $z);
  59. gcd($L, $v) == 1 or last;
  60. if ($j == 1) {
  61. $v >= $A or next;
  62. $k == 1 and is_prime($v) and next;
  63. ($v - 1) % $L == 0 or next;
  64. $callback->($v);
  65. next;
  66. }
  67. $v * $r <= $B or next;
  68. __SUB__->($v, $L, $r, $j - 1);
  69. }
  70. }
  71. }
  72. ->(1, 1, 2, $k);
  73. }
  74. #a(n) = if(n < 2, return()); my(x=vecprod(primes(n)), y=2*x); while(1, my(v=fermat_psp(x, y, n, n)); if(#v >= 1, return(v[1])); x=y+1; y=2*x); \\ ~~~~
  75. sub a($n) {
  76. my $x = pn_primorial($n);
  77. my $y = 2*$x;
  78. $x = Math::GMP->new("$x");
  79. $y = Math::GMP->new("$y");
  80. for (;;) {
  81. my @arr;
  82. fermat_pseudoprimes($x, $y, $n, $n, sub($v) { push @arr, $v });
  83. if (@arr) {
  84. @arr = sort {$a <=> $b} @arr;
  85. return $arr[0];
  86. }
  87. $x = $y+1;
  88. $y = 2*$x;
  89. }
  90. }
  91. foreach my $n (2..100) {
  92. say "a($n) = ", a($n);
  93. }
  94. __END__
  95. =for comment
  96. # Square array A(n, k) read by antidiagonals downwards: smallest base-n Fermat pseudoprime with k distinct prime factors for k, n >= 2.
  97. # https://oeis.org/A271873
  98. # (VERSION 1)
  99. fermat_psp(A, B, k, base) = A=max(A, vecprod(primes(k))); (f(m, l, p, j) = my(list=List()); forprime(q=p, sqrtnint(B\m, j), if(base%q != 0, my(z=znorder(Mod(base, q)), L=lcm(l, z)); if(gcd(L, m)==1, my(v=m*q, r=nextprime(q+1)); while(v <= B, if(j==1, if(v>=A && if(k==1, !isprime(v), 1) && (v-1)%l == 0 && (v-1)%z == 0 && Mod(base, v)^(v-1) == 1, listput(list, v)), if(v*r <= B, list=concat(list, f(v, l, r, j-1)))); v *= q)))); list); vecsort(Vec(f(1, 1, 2, k)));
  100. T(n,k) = if(n < 2, return()); my(x=vecprod(primes(k)), y=2*x); while(1, my(v=fermat_psp(x, y, k, n)); if(#v >= 1, return(v[1])); x=y+1; y=2*x);
  101. print_table(n, k) = for(x=2, n, for(y=2, k, print1(T(x, y), ", ")); print(""));
  102. for(k=2, 9, for(n=2, k, print1(T(n, k-n+2)", "))); \\ ~~~~
  103. # (VERSION 2)
  104. fermat_psp(A, B, k, base) = A=max(A, vecprod(primes(k))); (f(m, l, p, j) = my(list=List()); forprime(q=p, sqrtnint(B\m, j), if(base%q != 0, my(v=m*q, t=q, r=nextprime(q+1)); while(v <= B, my(L=lcm(l, znorder(Mod(base, t)))); if(gcd(L, v) == 1, if(j==1, if(v>=A && if(k==1, !isprime(v), 1) && (v-1)%L == 0, listput(list, v)), if(v*r <= B, list=concat(list, f(v, L, r, j-1)))), break); v *= q; t *= q))); list); vecsort(Vec(f(1, 1, 2, k)));
  105. T(n,k) = if(n < 2, return()); my(x=vecprod(primes(k)), y=2*x); while(1, my(v=fermat_psp(x, y, k, n)); if(#v >= 1, return(v[1])); x=y+1; y=2*x);
  106. print_table(n, k) = for(x=2, n, for(y=2, k, print1(T(x, y), ", ")); print(""));
  107. for(k=2, 9, for(n=2, k, print1(T(n, k-n+2)", "))); \\ ~~~~
  108. # New terms:
  109. # 341, 561, 91, 11305, 286, 15, 825265, 41041, 435, 124, 45593065, 825265, 11305, 561, 35, 370851481, 130027051, 418285, 41041, 1105, 6, 38504389105, 2531091745, 30534805, 2203201, 25585, 561, 21, 7550611589521, 38504389105, 370851481, 68800501, 682465, 62745, 105, 28
  110. =cut
  111. 341, 561, 11305, 825265, 45593065, 370851481, 38504389105, 7550611589521, 277960972890601,
  112. 91, 286, 41041, 825265, 130027051, 2531091745, 38504389105, 5342216661145, 929845918823185,
  113. 15, 435, 11305, 418285, 30534805, 370851481, 38504389105, 7550611589521, 277960972890601,
  114. 124, 561, 41041, 2203201, 68800501, 979865601, 232250619601, 9746347772161, 1237707914764321,
  115. 35, 1105, 25585, 682465, 12306385, 305246305, 16648653385, 1387198666945, 75749848475665,
  116. 6, 561, 62745, 902785, 87570145, 9073150801, 211215631705, 24465723528961, 1135341818898001,
  117. 21, 105, 1365, 121485, 2103465, 96537441, 3958035081, 705095678001, 74398297074465,
  118. 28, 286, 2926, 421876, 5533066, 85851766, 15539169646, 2539184851126, 65749886703865,
  119. 33, 561, 41041, 1242241, 68800501, 4646703061, 216337302181, 9746347772161, 152064312120721,