chernick-carmichael_with_n_factors.jl 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #!/usr/bin/julia
  2. # Trizen
  3. # Date: 11 June 2019
  4. # https://github.com/trizen
  5. # Generate the smallest extended Chernick-Carmichael number with n prime factors.
  6. # Takes ~7 minutes to find a(10).
  7. # OEIS sequence:
  8. # https://oeis.org/A318646 -- The least Chernick's "universal form" Carmichael number with n prime factors.
  9. # See also:
  10. # https://oeis.org/wiki/Carmichael_numbers
  11. # https://www.ams.org/journals/bull/1939-45-04/S0002-9904-1939-06953-X/home.html
  12. using Primes
  13. function trial_pretest(k::UInt64)
  14. if ((k % 3)==0 || (k % 5)==0 || (k % 7)==0 || (k % 11)==0 ||
  15. (k % 13)==0 || (k % 17)==0 || (k % 19)==0 || (k % 23)==0)
  16. return (k <= 23)
  17. end
  18. return true
  19. end
  20. function gcd_pretest(k::UInt64)
  21. if (k <= 107)
  22. return true
  23. end
  24. gcd(29*31*37*41*43*47*53*59*61*67, k) == 1 &&
  25. gcd(71*73*79*83*89*97*101*103*107, k) == 1
  26. end
  27. function is_chernick(n::Int64, m::UInt64)
  28. t = 9*m
  29. if (!trial_pretest(6*m + 1))
  30. return false
  31. end
  32. if (!trial_pretest(12*m + 1))
  33. return false
  34. end
  35. for i in 1:n-2
  36. if (!trial_pretest((t << i) + 1))
  37. return false
  38. end
  39. end
  40. if (!gcd_pretest(6*m + 1))
  41. return false
  42. end
  43. if (!gcd_pretest(12*m + 1))
  44. return false
  45. end
  46. for i in 1:n-2
  47. if (!gcd_pretest((t << i) + 1))
  48. return false
  49. end
  50. end
  51. if (!isprime(6*m + 1))
  52. return false
  53. end
  54. if (!isprime(12*m + 1))
  55. return false
  56. end
  57. for i in 1:n-2
  58. if (!isprime((t << i) + 1))
  59. return false
  60. end
  61. end
  62. return true
  63. end
  64. function chernick_carmichael(n::Int64, m::UInt64)
  65. prod = big(1)
  66. prod *= 6*m + 1
  67. prod *= 12*m + 1
  68. for i in 1:n-2
  69. prod *= ((big(9)*m)<<i) + 1
  70. end
  71. prod
  72. end
  73. function cc_numbers(from, to)
  74. for n in from:to
  75. multiplier = 1
  76. if (n > 4) multiplier = 1 << (n-4) end
  77. if (n > 5) multiplier *= 5 end
  78. m = UInt64(multiplier)
  79. while true
  80. if (is_chernick(n, m))
  81. println("a(", n, ") = ", chernick_carmichael(n, m))
  82. break
  83. end
  84. m += multiplier
  85. end
  86. end
  87. end
  88. cc_numbers(3, 9)
  89. # Terms a(3)-a(10):
  90. # a(3) = 1729
  91. # a(4) = 63973
  92. # a(5) = 26641259752490421121
  93. # a(6) = 1457836374916028334162241
  94. # a(7) = 24541683183872873851606952966798288052977151461406721
  95. # a(8) = 53487697914261966820654105730041031613370337776541835775672321
  96. # a(9) = 58571442634534443082821160508299574798027946748324125518533225605795841
  97. # a(10) = 24616075028246330441656912428380582403261346369700917629170235674289719437963233744091978433592331048416482649086961226304033068172880278517841921