prog.pl 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #!/usr/bin/perl
  2. use 5.014;
  3. use ntheory qw(:all);
  4. use 5.020;
  5. use warnings;
  6. use ntheory qw(:all);
  7. use experimental qw(signatures);
  8. # Generate the factors of a Chernick number, given n
  9. # and m, where n is the number of distinct prime factors.
  10. sub chernick_carmichael_factors ($n, $m) {
  11. (6*$m + 1, 12*$m + 1, (map { (1 << $_) * 9*$m + 1 } 1 .. $n-2));
  12. }
  13. # Check the conditions for an extended Chernick-Carmichael number
  14. sub is_chernick_carmichael ($n, $m) {
  15. ($n == 2) ? (is_prime(6*$m + 1) && is_prime(12*$m + 1))
  16. : (is_prime((1 << ($n-2)) * 9*$m + 1) && __SUB__->($n-1, $m));
  17. }
  18. my $n = 5;
  19. foreach my $k(1..100) {
  20. my $m = pn_primorial($k);
  21. say "Testing: $m";
  22. my @primes = sieve_prime_cluster(6*$m , (1<<($n-2)) * 9*$m + 2,
  23. 6*$m, 12*$m,
  24. map{ ((1<<$_) * 9 * $m ) }1..($n-2)
  25. );
  26. foreach my $p(@primes) {
  27. if (($p-1) % 6 == 0) {
  28. #say $p;
  29. if (is_chernick_carmichael($n, ($p-1)/6)) {
  30. my $t = vecprod(chernick_carmichael_factors($n, ($p-1)/6));
  31. if (is_carmichael($t)) {
  32. say "Carmichael: $t";
  33. }
  34. elsif (is_pseudoprime($t, 2)) {
  35. say "Fermat: ", $t;
  36. }
  37. }
  38. }
  39. }
  40. }
  41. __END__
  42. #foreach my $n(1..10){
  43. my $n = 7;
  44. #foreach my $m(1..1000) {
  45. #for (my $ = 1; ; ++$m) {
  46. my $multiplier = 1<<($n-4);
  47. my $k = 1;
  48. while (1) {
  49. my $m = $k*$multiplier;
  50. my @primes = sieve_prime_cluster(6*$m + 1, (1<<($n-2)) * 9*$m + 1,
  51. map{ 6 * ( (1 << $_ ) * 3* $m) } 1..$n-2
  52. );
  53. #say for @primes;
  54. foreach my $p(@primes) {
  55. if (($p-1) % 6 == 0) {
  56. #say $p;
  57. if (is_chernick_carmichael($n, ($p-1)/6)) {
  58. say "Found: ", vecprod(chernick_carmichael_factors($n, ($p-1)/6));
  59. }
  60. }
  61. }
  62. ++$k;
  63. # $m = (1<<($n-2)) * 9*$m + 1;
  64. }
  65. #my $m = 950560;
  66. #say 6*$m + 1;
  67. #say ( (1<<($n-2)) * 9*$m + 1);