phi_finder_factorization_algorithm.sf 933 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #!/usr/bin/ruby
  2. # A new factorization algorithm for semiprimes, by estimating phi(n).
  3. # The algorithm is called "Phi-Finder" and is due to Kyle Kloster (2010), described in his thesis:
  4. # Factoring a semiprime n by estimating φ(n)
  5. func phi_factor(n) {
  6. return [] if (n <= 1)
  7. return [n] if n.is_prime
  8. if (n.is_square) {
  9. return 2.of(n.isqrt)
  10. }
  11. var E = (n - 2*n.isqrt + 1)
  12. var E0 = powmod(2, -E, n)
  13. var L = n.ilog2
  14. var i = 0
  15. while (E0 & (E0-1) != 0) {
  16. E0 <<= L
  17. E0 %= n
  18. ++i
  19. }
  20. var t = (0..L -> first_by {|k| powmod(2, k, n) == E0 })
  21. var phi = abs(i*L - E - t)
  22. var q = (n - phi + 1)
  23. var p = (q + isqrt(q*q - 4*n))>>1
  24. [n `idiv` p, p]
  25. }
  26. for k in (10..25) {
  27. var n = (random_nbit_prime(k) * random_nbit_prime(k))
  28. var f = phi_factor(n)
  29. say "#{n} = #{f.join(' * ')}"
  30. assert_eq(f.prod, n)
  31. assert(f.all{.is_prime})
  32. }