prog.sf 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #!/usr/bin/ruby
  2. # a(n) is the least integer m such that M(m) is divisible by prime(n)^2 or -1 if no such m exists.
  3. # https://oeis.org/A354293
  4. # See also:
  5. # https://oeis.org/A354292
  6. # Known terms:
  7. # 3, 4, -1, 23, 21, -1, 188, 65, 1010, 2231, -1, -1, 1326, 389, 1092, 13196, 1450, -1, 40466, 85553, 665, -1, 5139193, 333, -1, 408241, -1, 3072, 6702, 1393, 5832, 935, 1071, 77421, 292187, 775383, 493135, 4185, 1784560, 10632, 7935, 743003, 13418, 64499
  8. var known_terms = Hash(
  9. 1 => 3
  10. 2=> 4
  11. 5=> 21
  12. 4=> 23
  13. 8=> 65
  14. 7=> 188
  15. 24=> 333
  16. 14=> 389
  17. 21=> 665
  18. 9=> 1010
  19. 15=> 1092
  20. 13=> 1326
  21. 17=> 1450
  22. 10=> 2231
  23. 16=> 13196
  24. 19=> 40466
  25. 20=> 85553
  26. 26=> 408241
  27. 31 => 5832
  28. 32 => 935
  29. 33 => 1071
  30. 34 => 77421
  31. 35 => 292187
  32. 30 => 1393,
  33. 36 => 775383,
  34. 37 => 493135,
  35. 28 => 3072,
  36. 29 => 6702,
  37. 38 => 4185,
  38. 41 => 7935,
  39. 40 => 10632,
  40. 46 => 12176,
  41. 43 => 13418,
  42. 44 => 64499,
  43. 1 => 3
  44. 2 => 4
  45. 3 => -1
  46. 4 => 23
  47. 5 => 21
  48. 6 => -1
  49. 7 => 188
  50. 8 => 65
  51. 9 => 1010
  52. 10 => 2231
  53. 11 => -1
  54. 12 => -1
  55. 13 => 1326
  56. 14 => 389
  57. 15 => 1092
  58. 39 => 1784560,
  59. 42 => 743003,
  60. # Term for p = 83 is given in the paper:
  61. # https://arxiv.org/pdf/2205.09902.pdf
  62. 83.pi => 5139193,
  63. 5.pi => -1,
  64. 13.pi => -1,
  65. 31.pi => -1,
  66. 37.pi => -1,
  67. 61.pi => -1,
  68. 79.pi => -1,
  69. 97.pi => -1,
  70. 103.pi => -1,
  71. )
  72. say "Known terms:\n"
  73. var prev_k = 0
  74. known_terms.keys.map{.to_i}.sort.each {|k|
  75. k - prev_k == 1 || break
  76. if (known_terms{k} != -1) {
  77. if (known_terms{k} < 1e6) {
  78. assert_eq(motzkin(known_terms{k}) % k.prime**2, 0)
  79. }
  80. }
  81. print(known_terms{k}, ", ")
  82. prev_k = k
  83. }
  84. say "\n"
  85. #primes -= [ 5, 13, 31, 37, 61, 79, 97, 103 ]
  86. #var primes = [39.prime]
  87. var primes = 200.primes
  88. primes = primes.grep {|p|
  89. !known_terms.has(p.pi)
  90. }
  91. say primes
  92. func catalanmod(n,m) {
  93. if (is_coprime(n+1, m)) {
  94. divmod(binomialmod(2*n, n, m), n+1, m)
  95. }
  96. else {
  97. idiv(binomial(2*n, n), (n+1)) % m
  98. }
  99. }
  100. func isok(n, m) {
  101. sum(0..n, {|k|
  102. (-1)**(n-k) * mulmod(binomialmod(n,k,m), catalanmod(k+1, m), m)
  103. }) % m == 0
  104. }
  105. #say isok(2231, 10.prime**2)
  106. #say isok(5139193, 83**2)
  107. var (a, b, n) = (0, 1, 1)
  108. Inf.times {
  109. var M = idiv(b,n)
  110. n += 1
  111. (a, b) = (b, idiv((3*(n-1)*n*a + (2*n - 1)*n*b), ((n+1)*(n-1))))
  112. var found = []
  113. for p in (primes) {
  114. if (p.sqr `divides` M) {
  115. say "#{p.pi} => #{n-2}"
  116. found << p
  117. }
  118. }
  119. if (found) {
  120. primes -= found
  121. primes || break
  122. }
  123. }