substring_primes_in_base_n.sf 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 05 July 2021
  4. # https://github.com/trizen
  5. # Generate all the primes such that all substrings (in a given base) are also primes.
  6. # See also:
  7. # https://oeis.org/A085823
  8. # https://rosettacode.org/wiki/Substring_primes
  9. func split_at_indices(array, indices) {
  10. var parts = []
  11. var i = 0
  12. for j in (indices) {
  13. parts << array.slice(i, j+1)
  14. i = j+1
  15. }
  16. parts
  17. }
  18. func consecutive_partitions(array, callback) {
  19. for k in (0..array.len) {
  20. combinations(array.len, k, {|*indices|
  21. var t = split_at_indices(array, indices)
  22. if (t.sum_by{.len} == array.len) {
  23. callback(t)
  24. }
  25. })
  26. }
  27. }
  28. func is_substring_prime(digits, base) {
  29. for k in (^digits) {
  30. digits.first(k+1).digits2num(base).is_prime || return false
  31. }
  32. consecutive_partitions(digits, {|part|
  33. part.all { .digits2num(base).is_prime } || return false
  34. })
  35. return true
  36. }
  37. func generate_from_prefix(p, base, digits) {
  38. var seq = [p]
  39. digits.each {|d|
  40. var num = (p*base + d)
  41. if (is_prime(num) && is_substring_prime(num.digits(base), base)) {
  42. seq << __FUNC__(num, base, digits)...
  43. }
  44. }
  45. return seq
  46. }
  47. func substring_primes(base) { # finite sequence for each base
  48. var prime_digits = (base-1 -> primes) # prime digits < base
  49. prime_digits.map {|p| generate_from_prefix(p, base, prime_digits)... }\
  50. .sort
  51. }
  52. for base in (2..20) {
  53. say "base = #{base}: #{substring_primes(base)}"
  54. }
  55. __END__
  56. base = 2: []
  57. base = 3: [2]
  58. base = 4: [2, 3, 11]
  59. base = 5: [2, 3, 13, 17, 67]
  60. base = 6: [2, 3, 5, 17, 23]
  61. base = 7: [2, 3, 5, 17, 19, 23, 37]
  62. base = 8: [2, 3, 5, 7, 19, 23, 29, 31, 43, 47, 59, 61, 157, 239, 251, 349, 379, 479, 491]
  63. base = 9: [2, 3, 5, 7, 23, 29, 47]
  64. base = 10: [2, 3, 5, 7, 23, 37, 53, 73, 373]
  65. base = 11: [2, 3, 5, 7, 29, 79]
  66. base = 12: [2, 3, 5, 7, 11, 29, 31, 41, 43, 47, 67, 71, 89, 137, 139, 359, 499, 503, 521, 569, 571, 809, 857, 859, 6043]
  67. base = 13: [2, 3, 5, 7, 11, 29, 31, 37, 41, 67, 379]
  68. base = 14: [2, 3, 5, 7, 11, 13, 31, 41, 47, 53, 73, 83, 101, 103, 109, 157, 167, 193, 439, 661, 1033, 2203]
  69. base = 15: [2, 3, 5, 7, 11, 13, 37, 41, 43, 47, 107, 167, 197, 557, 617, 647]
  70. base = 16: [2, 3, 5, 7, 11, 13, 37, 43, 53, 59, 61, 83, 179, 181, 211, 691, 947, 3389]
  71. base = 17: [2, 3, 5, 7, 11, 13, 37, 41, 47, 53, 223, 631]
  72. base = 18: [2, 3, 5, 7, 11, 13, 17, 41, 43, 47, 53, 59, 61, 67, 71, 97, 101, 103, 107, 131, 137, 139, 211, 239, 241, 251, 311, 313, 317, 751, 787, 859, 1069, 1103, 1109, 1213, 1223, 1283, 1289, 1759, 1831, 1861, 1871, 1931, 1933, 2371, 3803, 4349, 4523, 5639, 5647, 15467, 19867, 34807]
  73. base = 19: [2, 3, 5, 7, 11, 13, 17, 41, 43, 59, 97, 211]
  74. base = 20: [2, 3, 5, 7, 11, 13, 17, 19, 43, 47, 53, 59, 67, 71, 73, 79, 103, 107, 113, 151, 157, 223, 227, 233, 239, 263, 271, 277, 347, 353, 359, 383, 397, 1063, 1423, 1427, 1433, 1439, 1471, 1583, 1597, 3023, 4663, 4783, 5273, 5279, 7673, 28663]
  75. base = 21: [2, 3, 5, 7, 11, 13, 17, 19, 47, 53, 59, 61, 107, 149, 233, 359, 401, 1283]
  76. base = 22: [2, 3, 5, 7, 11, 13, 17, 19, 47, 61, 71, 73, 79, 83, 113, 127, 157, 167, 173, 293, 379, 421, 431, 1039, 1051, 1579, 1609, 1619, 1831, 2503, 3461, 3467, 6449]
  77. base = 23: [2, 3, 5, 7, 11, 13, 17, 19, 53, 59, 71, 163, 439]
  78. base = 24: [2, 3, 5, 7, 11, 13, 17, 19, 23, 53, 59, 61, 67, 71, 79, 83, 89, 127, 131, 137, 139, 173, 179, 181, 191, 269, 271, 277, 281, 283, 317, 331, 419, 421, 431, 461, 463, 467, 479, 557, 563, 569, 571, 1279, 1283, 1289, 1291, 1423, 1429, 1433, 1483, 1613, 1619, 1709, 1721, 1723, 1901, 1907, 1997, 1999, 2011, 3061, 3163, 3299, 3301, 3343, 3347, 3359, 4159, 4349, 4363, 4603, 6473, 6653, 6803, 7949, 7951, 10061, 10069, 11071, 11083, 11117, 11213, 13669, 13679, 13709, 13711, 30949, 34301, 35597, 38861, 41357, 45631, 73483, 79181, 99829, 104717, 110477, 110479, 190783, 190829, 265717, 266003]
  79. base = 25: [2, 3, 5, 7, 11, 13, 17, 19, 23, 53, 61, 67, 73, 127, 277, 577]
  80. base = 26: [2, 3, 5, 7, 11, 13, 17, 19, 23, 59, 71, 83, 89, 97, 101, 137, 149, 193, 199, 293, 349, 449, 461, 499, 601, 617, 15649]
  81. base = 27: [2, 3, 5, 7, 11, 13, 17, 19, 23, 59, 61, 67, 71, 73, 83, 137, 191, 353, 461, 1811]
  82. base = 28: [2, 3, 5, 7, 11, 13, 17, 19, 23, 59, 61, 67, 73, 79, 89, 97, 101, 103, 107, 151, 157, 163, 199, 311, 313, 331, 367, 383, 479, 487, 499, 647, 661, 1657, 1669, 1879, 2503, 2719, 2851, 2999, 4231, 4567, 5591, 8713, 8731, 10289, 13417, 18121, 18133, 244471]
  83. base = 29: [2, 3, 5, 7, 11, 13, 17, 19, 23, 61, 71, 89, 379]
  84. base = 30: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 157, 163, 167, 173, 179, 223, 227, 229, 233, 239, 337, 347, 349, 353, 359, 397, 401, 409, 419, 521, 523, 577, 587, 593, 599, 701, 709, 719, 877, 881, 883, 887, 2027, 2029, 2039, 2137, 2153, 2377, 2393, 2399, 2677, 2683, 2687, 2927, 2939, 3037, 3049, 3109, 3119, 3221, 3299, 4723, 4729, 4733, 4909, 4919, 5021, 5023, 5209, 5381, 5387, 6701, 6709, 6719, 6823, 6899, 7001, 7019, 7177, 7187, 10133, 10139, 10477, 10487, 10499, 10601, 10781, 11923, 11927, 11933, 11939, 12037, 12049, 12277, 12577, 12583, 15647, 15649, 17327, 17333, 17623, 17977, 17981, 17987, 21059, 21277, 21577, 21587, 26339, 26437, 26449, 26459, 26497, 26501, 60899, 64601, 71327, 71333, 71987, 88177, 91139, 91499, 98981, 141709, 141719, 142019, 147583, 150649, 161459, 201037, 201049, 201577, 314623, 357823, 361499, 368327, 377339, 469487, 520019, 539339, 539449, 638327, 793139, 793487, 794923, 6031499, 16183487, 23804623, 485504623]
  85. base = 31: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 67, 73, 79, 157]
  86. base = 32: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 67, 71, 83, 101, 103, 107, 109, 113, 127, 163, 167, 173, 179, 191, 227, 229, 241, 359, 383, 419, 421, 433, 439, 547, 557, 563, 613, 619, 631, 739, 743, 941, 947, 997, 1009, 1021, 2161, 3251, 3299, 3301, 3313, 3491, 3511, 4093, 5227, 5233, 5347, 7331, 11491, 13421, 13859, 14051, 17509, 17827, 31907]
  87. base = 33: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 71, 73, 79, 83, 89, 97, 101, 167, 233, 431, 563, 761, 2411, 2609, 2741, 2939]
  88. base = 34: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 71, 73, 79, 97, 107, 109, 113, 131, 173, 181, 193, 199, 241, 251, 257, 269, 379, 397, 449, 461, 601, 607, 653, 659, 677, 787, 811, 991, 997, 1009, 1061, 3709, 3719, 3847, 12889, 15269]
  89. base = 35: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 73, 83, 89, 101, 107, 457, 1087, 2557]
  90. base = 36: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 79, 83, 89, 101, 103, 113, 127, 131, 137, 139, 191, 193, 197, 199, 211, 257, 263, 269, 271, 281, 283, 401, 409, 419, 479, 487, 491, 499, 617, 619, 631, 641, 643, 691, 701, 839, 857, 859, 1049, 1051, 1061, 1063, 1123, 1129, 2861, 3001, 3011, 3209, 3643, 4079, 4099, 4937, 4951, 5011, 6899, 6959, 6967, 6971, 7121, 7603, 9283, 9473, 9491, 9689, 10133, 14447, 14449, 14747, 17257, 17539, 17707, 17971, 17977, 22229, 22303, 23081, 24907, 25243, 30859, 30869, 30871, 30931, 30937, 37781, 37783, 37847, 37853, 38201, 40433, 40459, 103001, 147571, 273739, 341041, 637459, 1111289, 1113521, 22948529]