generate_fermat_overpseudoprimes_2.pl 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 28 January 2019
  4. # https://github.com/trizen
  5. # A new algorithm for generating Fermat overpseudoprimes to any given base.
  6. # See also:
  7. # https://oeis.org/A141232 -- Overpseudoprimes to base 2: composite k such that k = A137576((k-1)/2).
  8. # See also:
  9. # https://en.wikipedia.org/wiki/Fermat_pseudoprime
  10. # https://trizenx.blogspot.com/2020/08/pseudoprimes-construction-methods-and.html
  11. use 5.020;
  12. use warnings;
  13. use experimental qw(signatures);
  14. use Math::AnyNum qw(prod);
  15. use ntheory qw(:all);
  16. sub fermat_overpseudoprimes ($base, $prime_limit, $callback) {
  17. my %common_divisors;
  18. say ":: Sieving...";
  19. forprimes {
  20. my $p = $_;
  21. my $z = znorder($base, $p);
  22. if ($p < 3e8 or exists($common_divisors{$z})) {
  23. push @{$common_divisors{$z}}, $p;
  24. }
  25. } 3, $prime_limit;
  26. say ":: Done sieving...";
  27. foreach my $arr (values %common_divisors) {
  28. my $l = scalar(@$arr);
  29. foreach my $k (4 .. $l) {
  30. forcomb {
  31. my $n = prod(@{$arr}[@_]);
  32. $callback->($n);
  33. } $l, $k;
  34. }
  35. }
  36. }
  37. sub is_fibonacci_pseudoprime ($n) {
  38. (lucas_sequence($n, 1, -1, $n - kronecker($n, 5)))[0] == 0;
  39. }
  40. my $base = 2; # generate overpseudoprime to this base
  41. my $prime_limit = 1e10; # sieve primes up to this limit
  42. open my $fh, '>', 'file7.txt';
  43. fermat_overpseudoprimes(
  44. $base, # base
  45. $prime_limit, # prime limit
  46. sub ($n) {
  47. say $n;
  48. say $fh $n;
  49. }
  50. );