smallest_carmichael_divisible_by_n.sf 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #!/usr/bin/ruby
  2. # Simple method for finding the smallest Carmichael number divisible by n.
  3. # See also:
  4. # https://oeis.org/A135721
  5. # https://oeis.org/A253595
  6. func carmichael_divisible_by(n) {
  7. n.is_even && return nil
  8. gcd(n, phi(n)) == 1 || return nil
  9. n >= 3 || return nil
  10. var c = n
  11. var t = n
  12. if (c.is_prime) {
  13. c = (c**2 - c)
  14. }
  15. c.is_carmichael && return c
  16. loop {
  17. t.is_carmichael && return t
  18. t += c
  19. }
  20. }
  21. assert_eq(carmichael_divisible_by(3), 561)
  22. assert_eq(carmichael_divisible_by(3*5), 62745)
  23. assert_eq(carmichael_divisible_by(7*19), 1729)
  24. assert_eq(carmichael_divisible_by(47*89), 62745)
  25. assert_eq(carmichael_divisible_by(5*47*89), 62745)
  26. assert_eq(carmichael_divisible_by(3*47*89), 62745)
  27. assert_eq(carmichael_divisible_by(3*89), 62745)
  28. say carmichael_divisible_by.map(primes(3..50))
  29. say 40.of(carmichael_divisible_by).grep
  30. __END__
  31. [561, 1105, 1729, 561, 1105, 561, 1729, 6601, 2465, 2821, 29341, 6601, 334153, 62745]
  32. [561, 1105, 1729, 561, 1105, 62745, 561, 1729, 6601, 2465, 2821, 561, 825265, 29341]