recursively_generate_fermat_from_znorder_with_variations.sf 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #!/usr/bin/ruby
  2. # Recursively generate Fermat pseudoprimes to base 2, using primes of the form k*z + 1,
  3. # where z is the multimplicative order: znorder(2, n) and n and k are positive integers.
  4. var seen = Set()
  5. var PRIME_LIMIT = 1e6
  6. func generate_fermat_from_znorder(n) is cached {
  7. var z = znorder(2, n)
  8. #z < 3427425 || return nil
  9. #z < 4e6 || return nil
  10. z < PRIME_LIMIT || return nil
  11. for k in (1..1000) {
  12. var p = (z*k + 1)
  13. #p < 7e3 || break
  14. p < PRIME_LIMIT || break
  15. p.is_prime || next
  16. n.is_div(p) && next
  17. for r in (n.divisors(1e5)) {
  18. next if (r == n)
  19. var t = (n/r * p)
  20. if (t.is_psp && !seen.has(t)) {
  21. say t
  22. seen << t
  23. __FUNC__(t)
  24. }
  25. }
  26. }
  27. return nil
  28. }
  29. DATA.slurp.nums.each {|n|
  30. generate_fermat_from_znorder(n)
  31. }
  32. __DATA__
  33. 4 6 8 9 10 12 14 15 16 18 20 21 22 24 25 26 27 28 30 32 33 34 35 36 38 39 40 42 44 45 46 48 49 50 51 52 54 55 56 57 58 60 62 63 64 65 66 68 69 70 72 74 75 76 77 78 80 81 82 84 85 86 87 88 90 91 92 93 94 95 96 98 99 100 102 104 105 106 108 110 111 112 114 115 116 117 118 119 120 121 122 123 124 125 126 128 129 130 132 133