new_idea_4.sf 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #!/usr/bin/ruby
  2. # Erdos construction method for Carmichael numbers:
  3. # 1. Choose an integer L with many prime factors.
  4. # 2. Let P be the set of primes d+1, where d|L and d+1 does not divide L.
  5. # 3. Find a subset S of P such that prod(S) == 1 (mod L). Then prod(S) is a Carmichael number.
  6. #var L = 720
  7. #for L in (1e3..1e4) {
  8. #for L in (14322, 1919190, 56786730, 140100870, 209191710, 2328255930, 2381714790, 7225713885390, 9538864545210, 21626561658972270, 446617991732222310, 115471236091149548610, 5145485882746933233510, 14493038256293268734790) {
  9. #var good_lambda = 147090944*47*19
  10. #var good_lambda = 1517684360192
  11. var good_lambda = 137971305472**2
  12. #var good_lambda = (1029636608*19*47)**2
  13. for k in (good_lambda.divisors.flip) {
  14. #for k in (137971305472) {
  15. #for L in ([2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 11, 13, 41].prod) {
  16. #var L = (18386368 * k)
  17. #var L = (4596592 * k)
  18. var L = (good_lambda / k)
  19. #var good_primes = [3, 5, 17, 23, 29, 53]
  20. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 197, 353, 449, 617]
  21. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 197, 257, 353, 617]
  22. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 197]
  23. #var good_primes = [3, 5, 17, 23, 29, 53, 89, 113, 197, 257, 353, 419, 449, 617, 2003]
  24. #var good_primes = [3, 5, 17, 23, 29, 53, 89, 113, 197, 257, 353]
  25. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 197, 353, 617, 1409, 2003, 2549, 10193, 16073, 202049, 275969, 18386369]
  26. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 353, 617, 1409, 2003, 2549, 10193, 16073, 202049, 18386369]
  27. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 197, 353, 1373, 2003, 2297, 2549, 4019]
  28. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 353, 617]
  29. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 197, 257, 353, 617, 1409, 2003, 2549]
  30. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 353, 617, 2003, 2549]
  31. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 257, 353, 449, 617, 1409, 2003, 2297, 2549, 3137, 3329, 4019]
  32. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 257, 353, 449, 617, 1409, 2003, 2297, 2549, 3137, 3329, 4019, 7547, 9857]
  33. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 197, 353, 617, 2297, 3137, 4019, 7547, 8009, 9857]
  34. var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 353, 617, 2003, 2549]
  35. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 257, 353, 617, 1409, 2003, 2549, 3137, 9857, 10193, 16073, 68993, 202049, 1500929, 18386369]
  36. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 353, 617, 2003, 2549, 3137, 9857, 10193, 16073, 68993, 202049, 1500929, 18386369]
  37. var P = L.divisors.map { .inc }.grep { .is_odd && .is_prime }.grep {|p| L%p != 0 }
  38. var prefix = good_primes.prod
  39. P.prod % prefix == 0 || next
  40. P = P.grep { is_coprime(_, prefix) }
  41. var Q = P.grep { _ > 113 }
  42. var t = Q.prod
  43. say "Testing: #{L} with k = #{k}"
  44. say "Has #{P.len} good divisors"
  45. for k in (1..Q.len) {
  46. good_primes.len + (Q.len-k) >= 25 || next
  47. good_primes.len + (Q.len-k) > 35 && next
  48. say "[1] Combination: #{k} with #{good_primes.len + (Q.len - k)} prime factors = #{binomial(Q.len, k)}"
  49. var count = 0
  50. Q.combinations(k, {|*S|
  51. if (t/S.prod * prefix % L == 1) {
  52. say (t/S.prod * prefix)
  53. }
  54. break if (++count >= 1e4);
  55. })
  56. var count = 0
  57. Q.flip.combinations(k, {|*S|
  58. if (t/S.prod * prefix % L == 1) {
  59. say (t/S.prod * prefix)
  60. }
  61. break if (++count >= 1e4);
  62. })
  63. var count = 0
  64. Q.shuffle.combinations(k, {|*S|
  65. if (t/S.prod * prefix % L == 1) {
  66. say (t/S.prod * prefix)
  67. }
  68. break if (++count >= 1e4);
  69. })
  70. }
  71. for k in (P.len `downto` 1) {
  72. good_primes.len + k >= 25 || next
  73. good_primes.len + k > 35 && next
  74. say "[2] Combination: #{k} with #{good_primes.len + k} prime factors = #{binomial(P.len, k)}"
  75. var count = 0
  76. P.combinations(k, {|*S|
  77. if (S.prod * prefix % L == 1) {
  78. say (S.prod * prefix)
  79. }
  80. break if (++count >= 1e4);
  81. })
  82. var count = 0
  83. P.flip.combinations(k, {|*S|
  84. if (S.prod * prefix % L == 1) {
  85. say (S.prod * prefix)
  86. }
  87. break if (++count >= 1e4);
  88. })
  89. var count = 0
  90. P.shuffle.combinations(k, {|*S|
  91. if (S.prod * prefix % L == 1) {
  92. say (S.prod * prefix)
  93. }
  94. break if (++count >= 1e4);
  95. })
  96. }
  97. }