upper-bounds-faster.sf 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #!/usr/bin/ruby
  2. # Smallest overpseudoprime to base 2 (A141232) with n distinct prime factors.
  3. # https://oeis.org/A353409
  4. # Known terms:
  5. # 2047, 13421773, 14073748835533
  6. # Upper-bounds:
  7. # a(5) <= 1376414970248942474729
  8. # a(6) <= 48663264978548104646392577273
  9. # a(7) <= 294413417279041274238472403168164964689
  10. # a(8) <= 98117433931341406381352476618801951316878459720486433149
  11. # a(9) <= 1252977736815195675988249271013258909221812482895905512953752551821
  12. include("../../../factordb/auto.sf")
  13. var n = 7
  14. var psize = 10
  15. var from = 2647
  16. var upto = 3000
  17. say ":: Searching upper-bounds for n = #{n} in range #{from} .. #{upto}"
  18. var min = Hash()
  19. func check_combinations(f,n) {
  20. var count = 0
  21. var success = false
  22. f.combinations(n, {|*a|
  23. var t = a.prod
  24. if (t.is_strong_psp) {
  25. min{n} := Inf
  26. success = true
  27. if (t < min{n}) {
  28. say "\na(#{n}) <= #{t}\n"
  29. min{n} = t
  30. }
  31. }
  32. break if (++count > 1e6)
  33. })
  34. return success
  35. }
  36. var counter = 0
  37. for p in (primes(from, upto)) {
  38. if (++counter % 10 == 0) {
  39. say ":: Checking: p = #{p}"
  40. }
  41. for k in (p, 4*p, 12*p) {
  42. var f = factordb(2**k - 1).grep{ .len <= psize }.grep{.is_prime}.grep {|p| powmod(2, k, p) == 1 }.grep{|p| znorder(2,p) == k }
  43. say "[#{k}] Binomial: #{binomial(f.len, n)}" if (f.len >= n)
  44. var success = check_combinations(f, n)
  45. if (success) {
  46. say ":: Checking also the combinations for n = #{n+1}"
  47. check_combinations(f, n+1) &&
  48. check_combinations(f, n+2) &&
  49. check_combinations(f, n+3) &&
  50. check_combinations(f, n+4)
  51. }
  52. }
  53. }
  54. __END__
  55. a(5) <= 3223802185639011132549803
  56. a(5) <= 636607858967934928371769
  57. a(5) <= 145505063083208835861853
  58. a(5) <= 124250696089090697678753
  59. a(5) <= 79122810072725207031253
  60. a(5) <= 63018455673461680466449
  61. a(5) <= 8278905362357819790631
  62. a(5) <= 1376414970248942474729
  63. a(6) <= 6207602089353930933432401115757211526727413361
  64. a(6) <= 112236525927686091107643454350711622517
  65. a(6) <= 13264566429400773810375679971999741133
  66. a(6) <= 32245825439777493648426550929515449
  67. a(6) <= 721606983841657320586259138751241
  68. a(6) <= 44308853725126158640748255977121
  69. a(6) <= 157839641006967261025228640857
  70. a(6) <= 48663264978548104646392577273
  71. a(7) <= 294413417279041274238472403168164964689
  72. a(8) <= 98117433931341406381352476618801951316878459720486433149
  73. a(9) <= 1252977736815195675988249271013258909221812482895905512953752551821