lehman_factorization.sf 761 B

1234567891011121314151617181920212223242526272829303132
  1. #!/usr/bin/ruby
  2. # Simple implementation of Lehman's factorization method.
  3. func lehman_factor(n) {
  4. var c = n.icbrt
  5. var r = c.isqrt
  6. for k in (1 .. c.inc) {
  7. for a in (RangeNum(2*isqrt(n*k) + 1, 2*isqrt(n*k) + idiv(r, 4*k.isqrt) + 2)) {
  8. if (a.powmod(2, n).is_square) {
  9. return gcd(a + isqrt(a.sqr % n), n)
  10. }
  11. }
  12. }
  13. # Check whether n has any prime factor in the range [2, n^(1/3)]
  14. return n.trial_factor(c).first
  15. }
  16. for n in ([43*97, 503*863, 39557647476023, 160587846247027, 2**64 - 1, 2**128 - 1]) {
  17. say "lehman_factor(#{n}) = #{lehman_factor(n)}"
  18. }
  19. say ''
  20. for n in (1..10) {
  21. var n = 2.of { 18.random_nbit_prime }.prod
  22. say ("lehman_factor(#{n}) = ", lehman_factor(n))
  23. }