fibonacci_factorization_method.sf 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #!/usr/bin/ruby
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 09 September 2018
  4. # https://github.com/trizen
  5. # A new integer factorization method, using the Fibonacci numbers.
  6. # It uses the smallest divisor `d` of `p - legendre(p, 5)`, such that `Fibonacci(d) = 0 (mod p)`.
  7. # By selecting a small bound B, we compute `k = lcm(1..B)`, hoping that `k` is a
  8. # multiple of `d`, then `gcd(Fibonacci(k) (mod n), n)` in a non-trivial factor of `n`.
  9. # This method is similar in flavor to Pollard's p-1 and Williams's p+1 methods.
  10. func fibonacci_factorization(n, B=10000) {
  11. var k = consecutive_lcm(B) # lcm(1..B)
  12. var F = fibmod(k, n) # Fibonacci(k) (mod n)
  13. return gcd(F, n)
  14. }
  15. say fibonacci_factorization(257221 * 470783, 700); #=> 470783 (p+1 is 700-smooth)
  16. say fibonacci_factorization(333732865481 * 1632480277613, 3000); #=> 333732865481 (p-1 is 3000-smooth)
  17. for k in (1..50) {
  18. var n = (random_prime(2**k) * random_prime(2**k))
  19. var p = fibonacci_factorization(n, 2 * n.ilog2**2)
  20. if (p.is_prime) {
  21. say "#{n} = #{p} * #{n/p}"
  22. }
  23. }
  24. __END__
  25. 3214709 = 1613 * 1993
  26. 167569819 = 19001 * 8819
  27. 2851899013 = 49807 * 57259
  28. 27732054173 = 153607 * 180539
  29. 3709275441913 = 1991999 * 1862087
  30. 16170839753069 = 1629653 * 9922873
  31. 423422405914009 = 10333903 * 40974103
  32. 122720571221359159 = 384088241 * 319511399
  33. 69782959258128563 = 271895191 * 256653893
  34. 35012441184542164741 = 6294003887 * 5562824843
  35. 524934717838728509869 = 18711680699 * 28053851831
  36. 113042322296238658633 = 3370274783 * 33540980951
  37. 28555019079287984329261 = 386638476841 * 73854571621
  38. 544812320889004864776853 = 333732865481 * 1632480277613
  39. 5070894233593682106381371 = 1927323093737 * 2631055607683