pollard-brent_rho_factor.sf 884 B

1234567891011121314151617181920212223242526272829303132
  1. #!/usr/bin/ruby
  2. # Pollard-Brent rho integer factorization algorithm.
  3. # See also:
  4. # https://facthacks.cr.yp.to/rho.html
  5. # https://en.wikipedia.org/wiki/Pollard%27s_rho_algorithm
  6. # https://en.algorithmica.org/hpc/algorithms/factorization/
  7. func pollard_brent_factor(n, tries = (1 << 20), M = 2048) {
  8. var x = 1
  9. for (var l = M; l < tries; l *= 2) {
  10. var (y,p) = (x,1)
  11. for i in (^l `by` M) {
  12. for j in (^M) {
  13. x = (powmod(x, 2, n) + 1)
  14. p = mulmod(p, x-y, n)
  15. }
  16. is_coprime(n, p) || return gcd(p, n)
  17. }
  18. }
  19. return 1
  20. }
  21. say pollard_brent_factor(503*863) #=> 863
  22. say pollard_brent_factor(33670570905491953) #=> 36169843
  23. say pollard_brent_factor(314159265358979323) #=> 317213509
  24. say pollard_brent_factor(242363923520394591022973) #=> 786757556719