lucas_pseudoprimes_generation_erdos_method.pl 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #!/usr/bin/perl
  2. # Erdos construction method for Lucas D-pseudoprimes, for discriminant D = P^2-4Q:
  3. # 1. Choose an even integer L with many divisors.
  4. # 2. Let P be the set of primes p such that p-kronecker(D,p) divides L and p does not divide L.
  5. # 3. Find a subset S of P such that n = prod(S) satisfies U_n(P,Q) == 0 (mod n) and kronecker(D,n) == -1.
  6. # Alternatively:
  7. # 3. Find a subset S of P such that n = prod(P) / prod(S) satisfies U_n(P,Q) == 0 (mod n) and kronecker(D,n) == -1.
  8. use 5.020;
  9. use warnings;
  10. use ntheory qw(:all);
  11. use List::Util qw(uniq);
  12. use experimental qw(signatures);
  13. sub lambda_primes ($L, $D) {
  14. # Primes p such that `p - kronecker(D,p)` divides L and p does not divide L.
  15. my @divisors = divisors($L);
  16. my @A = grep { ($_ > 2) and is_prime($_) and ($L % $_ != 0) and kronecker($D, $_) == -1 } map { $_ - 1 } @divisors;
  17. my @B = grep { ($_ > 2) and is_prime($_) and ($L % $_ != 0) and kronecker($D, $_) == +1 } map { $_ + 1 } @divisors;
  18. sort { $a <=> $b } uniq(@A, @B);
  19. }
  20. sub lucas_pseudoprimes ($L, $P = 1, $Q = -1) {
  21. my $D = ($P * $P - 4 * $Q);
  22. my @P = lambda_primes($L, $D);
  23. foreach my $k (2 .. @P) {
  24. forcomb {
  25. my $n = vecprod(@P[@_]);
  26. my $k = kronecker($D, $n);
  27. if ((lucas_sequence($n, $P, $Q, $n - $k))[0] == 0) {
  28. say $n;
  29. }
  30. } scalar(@P), $k;
  31. }
  32. }
  33. lucas_pseudoprimes(720, 1, -1);
  34. __END__
  35. 323
  36. 1891
  37. 6601
  38. 13981
  39. 342271
  40. 1590841
  41. 852841
  42. 3348961
  43. 9937081
  44. 16778881
  45. 72881641
  46. 10756801
  47. 154364221
  48. 205534681
  49. 609865201
  50. 807099601
  51. 1438048801
  52. 7692170761
  53. 921921121
  54. 32252538601
  55. 222182990161
  56. 2051541911881
  57. 2217716806743361