large_chernick.pl 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #!/usr/bin/perl
  2. # Daniel "Trizen" Șuteu
  3. # Date: 16 May 2019
  4. # https://github.com/trizen
  5. # Generate the smallest extended Chernick-Carmichael number with k prime factors.
  6. # OEIS sequence:
  7. # https://oeis.org/A318646 -- The least Chernick's "universal form" Carmichael number with n prime factors.
  8. # See also:
  9. # https://oeis.org/wiki/Carmichael_numbers
  10. # http://www.ams.org/journals/bull/1939-45-04/S0002-9904-1939-06953-X/home.html
  11. use 5.020;
  12. use warnings;
  13. use ntheory qw(:all);
  14. use experimental qw(signatures);
  15. #use Math::AnyNum qw(:overload);
  16. # Generate the factors of a Chernick number, given n
  17. # and k, where k is the number of distinct prime factors.
  18. sub chernick_carmichael_factors ($n, $k) {
  19. (6 * $n + 1, 12 * $n + 1, (map { (1 << $_) * 9 * $n + 1 } 1 .. $k - 2));
  20. }
  21. # Find the smallest Chernick-Carmichael number with k prime factors.
  22. sub extended_chernick_carmichael_number ($k, $callback) {
  23. #foreach my $m(5..100) {
  24. # say "Trying: $m";
  25. my $multiplier = 1;
  26. if ($k > 4) {
  27. $multiplier = 1 << ($k - 4);
  28. }
  29. #$multiplier *= 25*2;
  30. #for (my $n = 1e6 ; ; ++$n) {
  31. # try n to be smooth
  32. for my $n(1e7..1e8) {
  33. if (is_prime(6*$n*$multiplier+1) and is_prime(12*$n*$multiplier+1)) {
  34. my @f = chernick_carmichael_factors($n * $multiplier, $k);
  35. next if not vecall { is_prime($_) } @f;
  36. $callback->(vecprod(@f), @f);
  37. }
  38. }
  39. }
  40. foreach my $k (9) {
  41. extended_chernick_carmichael_number(
  42. $k,
  43. sub ($n, @f) {
  44. say "a($k) = $n";
  45. }
  46. );
  47. }
  48. __END__
  49. a(3) = 1729
  50. a(4) = 63973
  51. a(5) = 26641259752490421121
  52. a(6) = 1457836374916028334162241
  53. a(7) = 24541683183872873851606952966798288052977151461406721
  54. a(8) = 53487697914261966820654105730041031613370337776541835775672321
  55. a(9) = 58571442634534443082821160508299574798027946748324125518533225605795841
  56. Trying: 28
  57. Parameter '2.07255127086009e+19' must be an integer at u.pl line 43.
  58. Trying: 24
  59. Parameter '1.94317514610573e+19' must be an integer at u.pl line 47.