squarefree_omega_palindromes.jl 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #!/usr/bin/julia
  2. # Smallest squarefree palindrome with exactly n distinct prime factors.
  3. # https://oeis.org/A046399
  4. # Known terms:
  5. # 1, 2, 6, 66, 858, 6006, 222222, 22444422, 244868442, 6434774346, 438024420834, 50146955964105, 2415957997595142, 495677121121776594, 22181673755737618122, 8789941164994611499878
  6. # Corrected term:
  7. # a(15) = 5521159517777159511255
  8. # New term found by Michael S. Branicky:
  9. # a(16) = 477552751050050157255774
  10. # Lower-bounds:
  11. # a(17) > 63005011153853239757078527
  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 squarefree_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. if (j == 1)
  29. lo = round(Int64, max(lo, cld(A, m)))
  30. if (lo > hi)
  31. return lst
  32. end
  33. for q in (primes(lo, hi))
  34. v = m*q
  35. s = string(v)
  36. if (reverse(s) == s)
  37. println("Found upper-bound: ", v)
  38. B = min(v, B)
  39. push!(lst, v)
  40. end
  41. end
  42. else
  43. for q in (primes(lo, hi))
  44. if (q == 5 && iseven(m))
  45. ## ok
  46. else
  47. lst = vcat(lst, F(m*q, q+1, j-1))
  48. end
  49. end
  50. end
  51. return lst
  52. end
  53. return sort(F(big"1",2,n))
  54. end
  55. function a(n::Int64)
  56. if (n == 0)
  57. return 1
  58. end
  59. #x = big_prod(primes(prime(n)))
  60. x = big"63005011153853239757078527"
  61. y = 2*x
  62. while (true)
  63. println("Sieving range: ", [x,y]);
  64. v = squarefree_omega_palindromes(x, y, n)
  65. if (length(v) > 0)
  66. return v[1]
  67. end
  68. x = y+1
  69. y = 2*x
  70. end
  71. end
  72. for n in 17:17
  73. println([n, a(n)])
  74. end