is_almost_prime.sf 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #!/usr/bin/ruby
  2. # Tests for the Number `is_almost_prime(n,k)` method.
  3. # Timings:
  4. # 17 feb 2023: 4.385s +/- 0.1
  5. # 23 feb 2023: 3.913s
  6. # 04 mar 2023: 3.635s
  7. # 13 jul 2023: 3.364s
  8. # 14 sep 2023: 2.575s (after removing a duplicated test)
  9. # 23 sep 2023: 3.391s (after adding two more tests)
  10. # 14 dec 2023: 3.894s (after adding more tests)
  11. #~ Num!USE_CONJECTURES = true
  12. define EXTRA = false # true to run extra tests (slower)
  13. func A242786(n) {
  14. for (var p = 2; true; p.next_prime!) {
  15. var v = (p**n + 1)
  16. v.is_almost_prime(n) || next
  17. return p
  18. }
  19. }
  20. assert_eq(
  21. A242786.map(1..11),
  22. %n[2, 3, 3, 43, 7, 41, 23, 643, 17, 557, 251],
  23. )
  24. assert_eq(A242786(21), 1151)
  25. func A241793(n) {
  26. for k in (1..Inf) {
  27. var b = bigomega(k)*n
  28. var v = (k**n - 1)
  29. is_almost_prime(v, b) || next
  30. return k
  31. }
  32. }
  33. assert_eq(
  34. A241793.map(1..16),
  35. %n[3, 34, 5, 15, 17, 55, 79, 5, 53, 23, 337, 13, 601, 79, 241, 41],
  36. )
  37. assert_eq(A241793(24), 79)
  38. func A368163(n) {
  39. for k in (1..Inf) {
  40. var v = (k**n - 1)
  41. is_almost_prime(v, n) || next
  42. return k
  43. }
  44. }
  45. assert_eq(
  46. A368163.map(1..16),
  47. %n[3, 4, 4, 10, 17, 8, 25, 5, 28, 9, 81, 13, 289, 64, 100, 41],
  48. )
  49. assert_eq(A368163(24), 79)
  50. assert_eq(A368163(27), 961) if EXTRA
  51. assert_eq(A368163(28), 729)
  52. assert_eq(A368163(30), 361)
  53. assert(is_almost_prime(961**27 - 1, 27))
  54. assert(is_almost_prime(14015**26 - 1, 26)) if EXTRA
  55. assert(is_almost_prime(2047**32 - 1, 32)) if EXTRA
  56. func A368162(n) {
  57. for k in (1..Inf) {
  58. var v = (k**n + 1)
  59. is_almost_prime(v, n) || next
  60. return k
  61. }
  62. }
  63. assert_eq(
  64. A368162.map(1..15),
  65. %n[1, 3, 3, 43, 7, 32, 23, 643, 17, 207, 251, 3255, 255, 1568, 107],
  66. )
  67. assert_eq(A368162(21), 1151) if EXTRA
  68. assert(is_almost_prime(1151**21 + 1, 21))
  69. assert(is_almost_prime(4095**17 + 1, 17))
  70. assert(is_almost_prime(6272**18 + 1, 18))
  71. func A281940(n) {
  72. for k in (1..Inf) {
  73. var v = (k**n + 1)
  74. v.is_prob_squarefree(1e3) || next
  75. v.is_almost_prime(n) || next
  76. v.is_squarefree || next
  77. return k
  78. }
  79. }
  80. assert_eq(
  81. A281940.map(1..12),
  82. %n[1, 3, 9, 43, 46, 47, 245, 1697, 109, 565, 3938, 3255]
  83. )
  84. func A281940_alt(n) {
  85. for k in (1..Inf) {
  86. var v = (k**n + 1)
  87. v.is_squarefree_almost_prime(n) || next
  88. return k
  89. }
  90. }
  91. assert_eq(
  92. A281940_alt.map(1..12),
  93. %n[1, 3, 9, 43, 46, 47, 245, 1697, 109, 565, 3938, 3255]
  94. )
  95. func A280005(n) {
  96. for(var p = 2; true; p.next_prime!) {
  97. var v = (p**n + 1)
  98. v.is_prob_squarefree(1e3) || next
  99. v.is_almost_prime(n) || next
  100. v.is_squarefree || next
  101. return p
  102. }
  103. }
  104. assert_eq(
  105. A280005.map(1..10),
  106. %n[2, 3, 13, 43, 73, 47, 457, 1697, 109, 8161]
  107. )
  108. func A280005_alt(n) {
  109. for(var p = 2; true; p.next_prime!) {
  110. var v = (p**n + 1)
  111. v.is_squarefree_almost_prime(n) || next
  112. return p
  113. }
  114. }
  115. assert_eq(
  116. A280005_alt.map(1..10),
  117. %n[2, 3, 13, 43, 73, 47, 457, 1697, 109, 8161]
  118. )
  119. func A358863(n) {
  120. for k in (1..Inf) {
  121. var v = polygonal(k, n)
  122. if (v.is_almost_prime(n)) {
  123. return v
  124. }
  125. }
  126. }
  127. assert_eq(A358863.map(3..19), %n[28, 16, 176, 4950, 8910, 1408, 346500, 277992, 7542080, 326656, 544320, 120400000, 145213440, 48549888, 4733575168, 536813568, 2149576704])
  128. func A358865(n) {
  129. for k in (1..Inf) {
  130. var v = pyramidal(k, n)
  131. if (v.is_almost_prime(n)) {
  132. return v
  133. }
  134. }
  135. }
  136. assert_eq(A358865.map(3..21), %n[20, 140, 405, 2856, 25296, 111720, 25984, 5474000, 237600, 223826688, 3852800, 268565760, 1834725376, 175861400000, 335674368, 2863363937280, 4383831556096, 206015846400, 3400704000])
  137. assert(6378421230653912273852177516895163581869770560831402039659052275307515868158149242183187027058743269083585164524698761215608346720446543721867890772992768450030990772124462439643369906993789153742999577997533023369718005328697704646795653340413290216914429581800198907520670422145782789421503445838438309411889963011879677086315079680346076913198656865252722018507700079241053301126985375100206013999932788906892043402372100794021347723757962214999239405763985925478958053765385390392428991093620063803159748213554713516270836566432768442321417273611613661964043740485967874546203158330542419346172965725208847889307596664965692982489236584360678086793885224312622009679624680125435713130901431548084498643988804235541146098681538248403808764459574030837406569943265425119945515620987942036623366002995111745100363660322741847883390914005559246543930659653872917345326198079665168962285351976979752322993704768006328130917743545206406358713737580633683126888580933576598622705103763505867769189580877823254445988109717369710491787515696906699326587144119103036177901022625401163297714167068028230540962534246165735639040001.is_almost_prime(2))
  138. assert(1536502117117468999680.is_almost_prime(28))
  139. assert(21266854897681220860.is_almost_prime(13))
  140. assert(7423007155473283614010.is_almost_prime(13))
  141. assert(3108276166302017120182510.is_almost_prime(14))
  142. assert(1393807661947063401736092760.is_almost_prime(17))
  143. assert(32749388246772812069108696710.is_almost_prime(16))
  144. assert(1421044357661885128003268103460.is_almost_prime(17))
  145. assert(!is_almost_prime(503**72 * (2**64 + 1), 77))
  146. assert(!is_almost_prime(503**76 * (2**64 + 1), 77))
  147. assert(!is_almost_prime(503**77 * (2**64 + 1), 77))
  148. assert(!is_almost_prime(503**78 * (2**64 + 1), 77))
  149. assert(is_almost_prime(503**75 * (2**64 + 1), 77))
  150. assert(!is_almost_prime(503**74 * (2**128 + 1), 77))
  151. assert(!is_almost_prime(503**76 * (2**128 + 1), 77))
  152. assert(!is_almost_prime(503**77 * (2**128 + 1), 77))
  153. assert(!is_almost_prime(503**78 * (2**128 + 1), 77))
  154. assert(is_almost_prime(503**75 * (2**128 + 1), 77))
  155. assert(!is_almost_prime(3449**74 * 1e100.random_prime, 76))
  156. assert(!is_almost_prime(3449**76 * 1e100.random_prime, 76))
  157. assert(is_almost_prime(3449**75 * 1e100.random_prime, 76))
  158. assert(
  159. %n[28, 16, 176, 4950, 8910, 1408, 346500, 277992, 7542080, 326656, 544320, 120400000, 145213440, 48549888, 4733575168, 536813568, 2149576704, 3057500160, 938539560960, 1358951178240, 36324805836800, 99956555776, 49212503949312, 118747221196800, 59461613912064, 13749193801728, 7526849672380416, 98516240758210560, 4969489493917696, 78673429816934400, 4467570822566903808, 1013309912383488000].map_kv{|k,v|
  160. v.is_almost_prime(k+3)
  161. }.all
  162. )
  163. assert_eq(
  164. %n[1, 3, 9, 43, 46, 47, 245, 1697, 109, 565, 3938, 3255, 30089, 18951, 2217].map_kv{|n,k| is_almost_prime(k**(n+1) + 1, n+1) },
  165. 15.of(true)
  166. )
  167. assert_eq(
  168. %n[2, 3, 3, 43, 7, 41, 23, 643, 17, 557, 251, 13183, 1999, 10007, 107].map_kv{|n,k| is_almost_prime(k**(n+1) + 1, (n+1)) },
  169. 15.of(true)
  170. )
  171. assert(is_almost_prime(33577**18 + 1, 18))
  172. assert(!is_almost_prime((2**64 + 1) * 503**78, 77))
  173. assert(is_almost_prime((2**64 + 1) * 503**78, 80))
  174. say "** Test passed!"