omega_palindromes.jl 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #!/usr/bin/julia
  2. # Smallest palindrome with exactly n distinct prime factors.
  3. # https://oeis.org/A335645
  4. # Known terms:
  5. # 1, 2, 6, 66, 858, 6006, 222222, 20522502, 244868442, 6172882716, 231645546132, 49795711759794, 2415957997595142, 495677121121776594, 22181673755737618122
  6. # New term found:
  7. # a(15) = 5521159517777159511255 (took 3h, 40min, 22,564 ms.)
  8. # New term found by Michael S. Branicky:
  9. # a(16) = 477552751050050157255774
  10. # Lower-bounds:
  11. # a(17) > 7875626394231654969634815
  12. using Primes
  13. function big_prod(arr)
  14. r = big"1"
  15. for n in (arr)
  16. r *= n
  17. end
  18. return r
  19. end
  20. function omega_palindromes(A, B, n::Int64)
  21. A = max(A, big_prod(primes(prime(n))))
  22. F = function(m, lo::Int64, j::Int64)
  23. lst = []
  24. hi = round(Int64, fld(B, m)^(1/j))
  25. if (lo > hi)
  26. return lst
  27. end
  28. for q in (primes(lo, hi))
  29. if (q == 5 && iseven(m))
  30. continue
  31. end
  32. v = m*q
  33. while (v <= B)
  34. if (j == 1)
  35. if (v >= A)
  36. s = string(v)
  37. if (reverse(s) == s)
  38. println("Found upper-bound: ", v)
  39. B = min(v, B)
  40. push!(lst, v)
  41. end
  42. end
  43. elseif (v*(q+1) <= B)
  44. lst = vcat(lst, F(v, q+1, j-1))
  45. end
  46. v *= q
  47. end
  48. end
  49. return lst
  50. end
  51. return sort(F(big"1",2,n))
  52. end
  53. function a(n::Int64)
  54. if (n == 0)
  55. return 1
  56. end
  57. #x = big_prod(primes(prime(n)))
  58. x = big"7875626394231654969634815"
  59. y = 2*x
  60. while (true)
  61. println("Sieving range: ", [x,y]);
  62. v = omega_palindromes(x, y, n)
  63. if (length(v) > 0)
  64. return v[1]
  65. end
  66. x = y+1
  67. y = 2*x
  68. end
  69. end
  70. for n in 17:17
  71. println([n, a(n)])
  72. end