lucas_pseudoprimes_generation_erdos_method.sf 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #!/usr/bin/ruby
  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. func lucas_pseudoprimes(L, P=1, Q=-1) {
  9. var D = (P*P - 4*Q)
  10. var primes = do {
  11. var divisors = L.divisors
  12. var A = divisors.map { .dec }.grep {|p|
  13. p.is_odd && !(p `divides` L) && p.is_prime && (kronecker(D, p) == -1)
  14. }
  15. var B = divisors.map { .inc }.grep {|p|
  16. p.is_odd && !(p `divides` L) && p.is_prime && (kronecker(D, p) == 1)
  17. }
  18. A + B -> sort.uniq
  19. }
  20. for k in (2 .. primes.len) {
  21. primes.combinations(k, {|*S|
  22. var n = S.prod
  23. var k = kronecker(D, n) # optionally, check if k == -1
  24. if (lucasUmod(P, Q, n - k, n) == 0) {
  25. say n
  26. }
  27. })
  28. }
  29. }
  30. lucas_pseudoprimes(720, 1, -1)
  31. __END__
  32. 323
  33. 1891
  34. 6601
  35. 13981
  36. 342271
  37. 1590841
  38. 852841
  39. 3348961
  40. 9937081
  41. 16778881
  42. 72881641
  43. 10756801
  44. 154364221
  45. 205534681
  46. 609865201
  47. 807099601
  48. 1438048801
  49. 7692170761
  50. 921921121
  51. 32252538601
  52. 222182990161
  53. 2051541911881
  54. 2217716806743361