new_idea_2.sf 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #!/usr/bin/ruby
  2. # Try to generate an abundant Carmichael number.
  3. func a(L) {
  4. L.divisors.map{.inc}.grep{.is_odd && .is_prime}.grep { |p| L%p != 0 }
  5. }
  6. #var good_prod = 495088126122885
  7. #var good_prod = 387623715
  8. #var good_prod = 19976310800932286865
  9. #var good_prod = 2799500171953451613547965
  10. #var good_primes = good_prod.factor
  11. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89]
  12. #var good_primes = [3, 5, 17, 23, 29, 53, 89]
  13. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 353]
  14. #var good_primes = [3, 5, 17, 23, 29, 53, 59, 83, 89, 113, 353]
  15. #var good_primes = [3, 5, 17, 23, 29, 53, 59, 83, 89]
  16. #var good_primes = [3, 5, 17, 23, 29, 53, 89, 113, 257, 353]
  17. #var good_primes = [3, 5, 17, 23, 29, 53, 89, 113, 257, 353, 617]
  18. #var good_primes = [3, 5, 17, 23, 29, 53, 89, 113, 353]
  19. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 113, 353]
  20. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 353, 449]
  21. #var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 197, 257, 353, 617, 1409, 2003]
  22. var good_primes = [3, 5, 17, 23, 29, 53, 83, 89, 113, 197]
  23. var good_prod = good_primes.prod
  24. #good_primes.pop
  25. #good_prod = good_primes.prod
  26. var arr = [
  27. #main_prime.factor.lcm{.dec}
  28. #495088126122885 * good_prod -> rad
  29. #1..100 -> map { _ * good_prod }...
  30. #2306304 * good_prod -> rad
  31. #144144, 144144, 720720, 1585584, 2306304, 11531520, 11531520, 15135120, 25369344, 31279248, 80720640, 80720640, 126846720, 126846720, 126846720, 126846720, 126846720, 126846720, 126846720, 149909760, 149909760, 149909760, 149909760, 149909760, 149909760, 149909760, 149909760, 157549392, 329801472, 887927040, 1049368320, 1049368320, 1233872640, 1233872640, 1233872640, 1533692160, 1649007360, 1649007360, 1649007360, 1649007360, 1649007360, 1649007360, 1649007360, 1815061248, 2048142096, 2410087680, 6146300160, 16040344320, 31331139840, 40971490560, 40971490560, 106525875456, 473034481920, 745681128192, 6149448264960, 6149448264960
  32. #2024, 1188, 7201568, 15542912, 285824, 5789168, 4352299952
  33. #139678448, 1240624, 7771456, 7771456, 2626624, 10506496, 15542912, 10506496
  34. 147090944, 202250048, 257409152, 294181888, 374902528, 514818304, 1029636608, 1231886656
  35. ].map{ _ }.grep{ .sigma0 < 1e6 }.uniq.sort_by{ a(_).len }
  36. # 16016 -- lcm
  37. # 720, 792, 864, 1440, 4320, 5040, 7560, 10080, 11232, 30240, 50400, 55440
  38. # 1440, 5040, 8640, 10080, 11232, 12960, 13440, 14400, 15120, 30240, 50400, 846720
  39. for n in (arr) {
  40. #ARGF.each {|n|
  41. #n.to_i!
  42. #n > 1e7 || next
  43. #n.is_smooth(1e6) || next
  44. if (n.sigma0 > 1e6) {
  45. say "n = #{n} has too many divisors -- stopping"
  46. break
  47. }
  48. var primes = a(n) #.grep{.inc.is_smooth(20)}
  49. next if (primes.len < 20)
  50. good_primes.all {|p|
  51. primes.has(p)
  52. } || next
  53. primes = primes.grep { _ > good_primes.max }
  54. #primes = primes.grep { !good_primes.has(_) }
  55. # 176
  56. #for k in (min(primes.len>>1, 24) `downto` 3) {
  57. #var good_primes = Set(3, 5, 17, 23, 89)
  58. #var good_primes = Set(3, 5, 17, 23, 29, 53, 83, 89)
  59. #var good_primes = Set(3, 5, 17, 23, 29, 53, 89, 113, 127)
  60. #var good_primes = Set(3, 5, 17, 23, 29, 53, 89, 113, 257, 353)
  61. #var good_primes = Set(3, 5, 17)
  62. # var good_prod = good_primes.prod
  63. primes -= good_primes
  64. var t = primes.prod
  65. say "# Primes: #{n} -> #{primes.len}"
  66. #~ for k in (1..10) {
  67. #~ var count = 0
  68. #~ primes.combinations(k, {|*list|
  69. #~ var v = list.prod*good_prod
  70. #~ if (v.is_pseudoprime) {
  71. #~ say "Fermat: #{v}" if !v.is_carmichael
  72. #~ if (v.is_abundant and v<3470207934739664512679701940114447720865) {
  73. #~ say "Smaller abundant Fermat: #{v}"
  74. #~ }
  75. #~ if (v > 18446744073709551616) {
  76. #~ say v if v.is_carmichael
  77. #~ }
  78. #~ }
  79. #~ break if (++count > 1e5)
  80. #~ })
  81. #~ }
  82. #next
  83. #var good_primes = Set(3, 5, 17, 23, 29, 53, 89)
  84. for k in (primes.len `downto` 1) {
  85. next if (primes.len-k + good_primes.len > 25)
  86. say "Combination: #{k} of #{primes.len}"
  87. var count = 0
  88. primes.combinations(k, {|*list|
  89. var l = list.prod
  90. var v = (good_prod * t/l)
  91. if (v % n == 1) {
  92. say v
  93. }
  94. v = (good_prod * l)
  95. if (v%n == 1) {
  96. say v
  97. }
  98. #~ if (v.is_pseudoprime) {
  99. #~ say "Fermat: #{v}" if !v.is_carmichael
  100. #~ if (v.is_abundant and v<3470207934739664512679701940114447720865) {
  101. #~ say "Smaller abundant Fermat: #{v}"
  102. #~ }
  103. #~ if (v.is_carmichael) {
  104. #~ say v if (v > 2**64)
  105. #~ if (is_abundant(v)) {
  106. #~ die "Found abundant: #{v}"
  107. #~ }
  108. #~ }
  109. #~ }
  110. break if (++count > 1e5)
  111. })
  112. }
  113. }