constant-recursive_factorization_method.sf 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #!/usr/bin/ruby
  2. # Author: Daniel "Trizen" Șuteu
  3. # Date: 02 March 2021
  4. # https://github.com/trizen
  5. # A new factorization method for numbers that have prime factors close to each other, using a modular constant-recursive sequence.
  6. # The idea is to try to find a non-trivial factor of `n` by checking:
  7. #
  8. # gcd(f(n) - f(k), n)
  9. #
  10. # for several small k >= 1, where f(n) is a C-finite sequence.
  11. func f(n, m) {
  12. powmod(2, n, m)
  13. #Quadratic(5, 3, 2).powmod(n, m) -> a
  14. #Gauss(3, 5).powmod(n, m) -> real
  15. #fibmod(n, m)
  16. #lucasUmod(4, 3, n, m)
  17. #lucasVmod(8, -2, n, m)
  18. }
  19. func constant_recursive_factor(n, tries = 1e4) {
  20. var z = f(n, n) || return 1
  21. if (z == 1) {
  22. return 1
  23. }
  24. tries.times { |k|
  25. var t = f(k, n) || next
  26. var g = gcd(z-t, n)
  27. if (g.is_between(2, n-1)) {
  28. return g
  29. }
  30. }
  31. return 1
  32. }
  33. var p = 1e20.random_prime
  34. var n = (p * p.next_prime * p.next_prime.next_prime)
  35. say "Factoring: #{n}"
  36. say ("Factor found: ", constant_recursive_factor(n))
  37. say ''
  38. say constant_recursive_factor(777154480374632653) #=> 919447
  39. say constant_recursive_factor(1169586052690021349455126348204184925097724507) #=> 166585508879747
  40. say constant_recursive_factor(61881629277526932459093227009982733523969186747) #=> 1233150073853267
  41. say constant_recursive_factor(173315617708997561998574166143524347111328490824959334367069087) #=> 173823271649325368927
  42. say constant_recursive_factor(random_prime(1e30) * (2**128 + 1)) #=> 340282366920938463463374607431768211457