prog.sf 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #!/usr/bin/ruby
  2. # Square array A(n, k) read by antidiagonals downwards: smallest base-n Fermat pseudoprime with k distinct prime factors for k, n >= 2.
  3. # https://oeis.org/A271873
  4. # Previously known terms:
  5. # 341, 561, 91, 11305, 286, 15, 825265, 41041, 435, 124, 45593065, 825265, 11305, 561, 35
  6. # New terms:
  7. # 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
  8. #`{
  9. # PARI/GP program:
  10. fermat_psp(A, B, k, base) = A=max(A, vecprod(primes(k))); (f(m, l, lo, k) = my(list=List()); my(hi=sqrtnint(B\m, k)); if(lo > hi, return(list)); if(k==1, forstep(p=lift(1/Mod(m, l)), hi, l, if(isprimepower(p) && gcd(m*base, p) == 1, my(n=m*p); if(n >= A && (n-1) % znorder(Mod(base, p)) == 0, listput(list, n)))), forprime(p=lo, hi, base%p == 0 && next; my(z=znorder(Mod(base, p))); gcd(m,z) == 1 || next; my(q=p, v=m*p); while(v <= B, list=concat(list, f(v, lcm(l, z), p+1, k-1)); q *= p; Mod(base, q)^z == 1 || break; v *= p))); list); vecsort(Set(f(1, 1, 2, k)));
  11. 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);
  12. print_table(n, k) = for(x=2, n, for(y=2, k, print1(T(x, y), ", ")); print(""));
  13. for(k=2, 9, for(n=2, k, print1(T(n, k-n+2)", "))); \\ ~~~~
  14. }
  15. var base2_psp_with_n_prime_factors = Hash(
  16. 2 341
  17. 3 561
  18. 4 11305
  19. 5 825265
  20. 6 45593065
  21. 7 370851481
  22. 8 38504389105
  23. 9 7550611589521
  24. 10 277960972890601
  25. 11 32918038719446881
  26. 12 1730865304568301265
  27. 13 606395069520916762801
  28. 14 59989606772480422038001
  29. 15 6149883077429715389052001
  30. 16 540513705778955131306570201
  31. 17 35237869211718889547310642241
  32. 18 13259400431578770557375638157521
  33. 19 580827911915963785382253469211401
  34. 20 292408776547176479576081475390697801
  35. 21 39498823114155235923831808284152901601
  36. 22 3284710806953570725820888298298841565601
  37. 23 327373784481535488655521620744179013043601
  38. 24 221404014114397213806721960178887462402717201
  39. 25 43691666165877828056799483424028795272585383601
  40. 26 13213974925373194568934435211730355813060799098001
  41. 27 1952204134080476076724242017017925744953021675628161
  42. 28 633922683896008820507659141940205847766668463614120801
  43. 29 208615777921466463779477993429576353802684390620173966001
  44. 30 44091058061027666417635106691235215695970713110442194459201
  45. 31 2884167509593581480205474627684686008624483147814647841436801
  46. 32 2214362930783528605057288166084711828471950070626477770522049201
  47. )
  48. var bfile_fh = File("bfile.txt").open_r
  49. var lookup = Hash()
  50. for k in (2..100) {
  51. for n in (2..k) {
  52. bfile_fh.eof && break
  53. var j = (k - n + 2)
  54. lookup{[n,j]} = bfile_fh.readline.nums.last
  55. }
  56. }
  57. func T(n, k) {
  58. if (n == 2) {
  59. return base2_psp_with_n_prime_factors{k} if base2_psp_with_n_prime_factors.has(k)
  60. }
  61. if (lookup.has([n,k])) {
  62. return lookup{[n,k]}
  63. }
  64. var x = pn_primorial(k)
  65. var y = 2*x
  66. loop {
  67. var arr = k.fermat_psp(n, x, y)
  68. if (arr) {
  69. return arr[0]
  70. }
  71. x = y+1
  72. y = 2*x
  73. }
  74. }
  75. var count = 2
  76. for k in (2..100) {
  77. for n in (2..k) {
  78. say (count++, " ", T(n, k - n + 2))
  79. }
  80. }