generate_carmichael_overpseudoprimes.pl 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #!/usr/bin/perl
  2. # A new algorithm for generating Carmichael numbers that are also overpseudoprimes to base 2.
  3. use 5.020;
  4. use strict;
  5. use warnings;
  6. use ntheory qw(:all);
  7. use Math::AnyNum qw(prod);
  8. use experimental qw(signatures);
  9. sub carmichael_overpseudoprimes ($n) {
  10. my $p = nth_prime($n);
  11. my %table;
  12. #say ":: Sieving...";
  13. my $upto = 1e6;
  14. foreach my $k (1 .. $upto) {
  15. is_smooth($k, $p-1) || next;
  16. my $r = (4 * $k * $p + 1);
  17. if (is_prime($r)) {
  18. push @{$table{znorder(2, $r)}}, $r;
  19. }
  20. }
  21. #say ":: Creating combinations...";
  22. foreach my $arr (values %table) {
  23. my $l = scalar(@$arr);
  24. my $k = 4; # minimum number of prime factors
  25. next if ($l < $k);
  26. foreach my $j ($k .. $l) {
  27. forcomb {
  28. my $C = prod(@{$arr}[@_]);
  29. if ($C > ~0 and is_carmichael($C)) {
  30. say $C;
  31. }
  32. } $l, $j;
  33. }
  34. }
  35. }
  36. foreach my $n (prime_count(919) .. 3000) {
  37. say ":: Generating with n = $n and p = ", nth_prime($n);
  38. carmichael_overpseudoprimes($n);
  39. }