omega_palindromes.rb 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #!/usr/bin/ruby
  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. require 'prime'
  13. def iroot(n,k)
  14. (n**(1.0/k)).to_i
  15. end
  16. def f(m, p, j, a, b)
  17. lst = []
  18. s = iroot(b/m, j)
  19. (p..s).each do |q|
  20. q.prime? || next
  21. if (q == 5 && m%2 == 0)
  22. next
  23. end
  24. v = m*q
  25. while (v <= b)
  26. if (j == 1)
  27. if (v >= a && v.to_s.reverse == v.to_s)
  28. print("Found upper-bound: ", v, "\n")
  29. b = [b, v].min
  30. lst << v
  31. end
  32. elsif (v*(q+1) <= b)
  33. lst += f(v, q+1, j-1, a, b)
  34. end
  35. v *= q
  36. end
  37. end
  38. return lst
  39. end
  40. def omega_palindromes(a, b, n)
  41. a = [a, Prime.first(n).reduce(:*)].max
  42. return f(1,2,n,a,b).sort
  43. end
  44. def a(n)
  45. if (n == 0)
  46. return 1
  47. end
  48. x = Prime.first(n).reduce(:*)
  49. y = 2*x
  50. while (true) do
  51. print("Sieving range: ", [x,y], "\n")
  52. v = omega_palindromes(x, y, n)
  53. if (v.size > 0)
  54. return v[0]
  55. end
  56. x = y+1
  57. y = 2*x
  58. end
  59. end
  60. (12..12).each {|n|
  61. p([n, a(n)])
  62. }