michael_omega_palindromes.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #!/usr/bin/python
  2. # Python program for OEIS A335645
  3. # Translation of Daniel Suteu's PARI
  4. # by Michael S. Branicky, Feb 06 2023
  5. # Install sympy for pypy3:
  6. # pip --python=/usr/bin/pypy3 install sympy
  7. # Timings with pypy3:
  8. # 10 231645546132 77 2.6759650707244873
  9. # 11 49795711759794 93 5.6582934856414795
  10. # 12 2415957997595142 111 11.3309805393219
  11. # 13 495677121121776594 131 52.19296479225159
  12. # 14 22181673755737618122 153 135.02077960968018
  13. # A335645 Smallest palindrome with exactly n distinct prime factors.
  14. data = [1, 2, 6, 66, 858, 6006, 222222, 20522502, 244868442, 6172882716, 231645546132, 49795711759794, 2415957997595142, 495677121121776594, 22181673755737618122, 5521159517777159511255]
  15. from sympy import primorial, primerange, integer_nthroot
  16. def cond(n):
  17. s = str(n)
  18. return s == s[::-1]
  19. def omega_cond(A, B, n):
  20. A = max(A, primorial(n))
  21. def f(m, p, j):
  22. lst = []
  23. for q in primerange(p, integer_nthroot(B//m, j)[0]+2):
  24. if q == 5 and m%2 == 0:
  25. continue
  26. v = m*q
  27. while v <= B:
  28. if j == 1:
  29. if v >= A and cond(v):
  30. print("Found upper-bound: ", v)
  31. lst.append(v)
  32. elif v*(q+1) <= B:
  33. lst += f(v, q+1, j-1)
  34. v *= q
  35. return lst
  36. return sorted(f(1, 2, n))
  37. def a(n):
  38. if n == 0:
  39. return 1
  40. x = primorial(n)
  41. y = 2*x
  42. while True:
  43. print("Sieving range: ", [x,y]);
  44. v = omega_cond(x, y, n)
  45. if len(v) > 0:
  46. return v[0]
  47. x = y+1
  48. y = 2*x
  49. print(a(13))
  50. # ~ print([a(n) for n in range(0, 12)])
  51. # ~ from time import time
  52. # ~ time0 = time()
  53. # ~ alst = []
  54. # ~ for n in range(20):
  55. # ~ an = a(n)
  56. # ~ alst.append(an)
  57. # ~ print(n, an, len(str(alst))-2, time()-time0)
  58. # ~ print(" ", alst)
  59. # ~ print(" ", data)