fermat_from_lucas_sequences.sf 610 B

123456789101112131415161718192021222324252627282930
  1. #!/usr/bin/ruby
  2. # Extract Fermat pseudoprimes from Lucas sequences.
  3. var seen = Set()
  4. for k in (1..1e3), P in (-5 .. 5), Q in (-5 .. 5), n in [lucasU(P, Q, k), lucasV(P, Q, k)] {
  5. var trial_limit = 1e7
  6. var f = n.trial_factor(trial_limit).first(-1)
  7. while (f.prod.sigma0 > 1e4) {
  8. f = n.trial_factor(trial_limit /= 10).first(-1)
  9. }
  10. f || next
  11. var D = f.prod.divisors
  12. for d in (D) {
  13. var z = n/d
  14. if (z > 2**64 && z.is_pseudoprime) {
  15. next if seen.has(z)
  16. next if z.is_prov_prime
  17. seen << z
  18. say z
  19. }
  20. }
  21. }