prog.sf 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #!/usr/bin/ruby
  2. # a(n) is the least prime p such that the concatenation p|n has exactly n prime factors with multiplicity.
  3. # https://oeis.org/A358596
  4. # Known terms:
  5. # 3, 2, 83, 2, 67, 41, 947, 4519, 15659081, 2843, 337957, 389, 1616171, 6132829, 422116888343, 24850181, 377519743, 194486417892947, 533348873, 324403, 980825013273164555563, 25691144027, 273933405157, 1238831928746353181, 311195507789, 129917586781, 2159120477658983490299
  6. func almost_prime_numbers(a, b, k, callback) {
  7. a = max(2**k, a)
  8. var mod = 10**k.len
  9. func (m, lo, j) {
  10. var hi = idiv(b,m).iroot(j)
  11. if (lo > hi) {
  12. return nil
  13. }
  14. if (j == 1) {
  15. lo = max(lo, idiv_ceil(a, m))
  16. each_prime(lo, hi, {|p|
  17. var n = m*p
  18. var (q,r) = divmod(n, mod)
  19. if ((r == k) && (q.is_prime)) {
  20. callback(q)
  21. }
  22. })
  23. return nil
  24. }
  25. each_prime(lo, hi, {|p|
  26. __FUNC__(m*p, p, j-1)
  27. })
  28. }(1, 2, k)
  29. return callback
  30. }
  31. func a(n) {
  32. var x = 2**n
  33. var y = 2*x
  34. loop {
  35. var arr = gather {
  36. almost_prime_numbers(x, y, n, { take(_) })
  37. }.sort
  38. arr && return arr[0]
  39. x = y+1
  40. y = 2*x
  41. }
  42. }
  43. for n in (1..100) {
  44. say "#{n} #{a(n)}"
  45. }
  46. __END__
  47. 1 3
  48. 2 2
  49. 3 83
  50. 4 2
  51. 5 67
  52. 6 41
  53. 7 947
  54. 8 4519
  55. 9 15659081
  56. 10 2843
  57. 11 337957
  58. 12 389
  59. 13 1616171
  60. 14 6132829