imprimitive_carmichael_better.sf 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #!/usr/bin/ruby
  2. # Generate imprimitive Carmichael numbers with n prime factors.
  3. func is_imprimitive(n) {
  4. n.factor.gcd_by { .dec }**2 > lambda(n)
  5. }
  6. func generate_imprimitive(p, m) {
  7. for z in (2..100) {
  8. var arr = []
  9. for k in (1 .. 2.sqrt**z) {
  10. k.is_smooth(5) || next
  11. k.rad.gpf >= 3 || next
  12. #next if (2*5 > 40)
  13. var r = (2*k*p + 1)
  14. #r > 400 || next
  15. if (r.is_prime && (r.dec.gpf == p)) {
  16. arr << r
  17. }
  18. }
  19. #arr = arr.grep { _ > 10_000}
  20. # var copy = arr.clone
  21. # arr || next
  22. # for k in (2..copy.max.ilog2) {
  23. # arr = copy.grep{ _ > 2**k}
  24. # next if (arr == copy)
  25. var t = binomial(arr.len, m)
  26. t >= m || next
  27. t < 1e6 || break
  28. #~ arr = arr.last(19448)
  29. var count = 0
  30. say "# [#{z}] Combinations: #{t}"
  31. #~ denominations = arr
  32. #~ change(m)
  33. arr.combinations(m, {|*a|
  34. with (a.prod) { |C|
  35. #break if (C > 325533792014488126487416882038879701391121)
  36. #break if (C.gpf / C.lpf > 40)
  37. if (C.is_carmichael) {
  38. say C
  39. say "# Imprimitive with p = #{p}: #{C}" if is_imprimitive(C)
  40. }
  41. }
  42. #break if (++count > 1e5)
  43. })
  44. # }
  45. }
  46. }
  47. for p in (primes(11..457)) {
  48. say "# p = #{p}"
  49. generate_imprimitive(p,9)
  50. }