lucas-miller_factorization_method.sf 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 07 January 2020
  4. # https://github.com/trizen
  5. # A simple factorization method, using the Lucas `U_n(P,Q)` sequences.
  6. # Inspired by the Miller-Rabin factorization method.
  7. # Works best on Lucas pseudoprimes.
  8. # See also:
  9. # https://en.wikipedia.org/wiki/Lucas_pseudoprime
  10. # https://en.wikipedia.org/wiki/Miller-Rabin_primality_test
  11. func lucas_miller_factor(n, j=1, k=100) {
  12. var D = n+j
  13. var s = D.valuation(2)
  14. var r = s-1
  15. var d = D>>s
  16. for (1..k) {
  17. var P = min(irand(1, 1e6), irand(1, n-1))
  18. var Q = min(irand(1, 1e6), irand(1, n-1))*[1,-1].rand
  19. next if is_square(P*P - 4*Q)
  20. var T = powmod(Q, d, n)
  21. var (U,V) = lucasUVmod(P, Q, d, n)
  22. for b in (0..r) {
  23. for g in (gcd(U,n), gcd(V,n), gcd(V-P,n)) {
  24. if (g.is_between(2, n-1)) {
  25. return g
  26. }
  27. }
  28. U = mulmod(U, V, n)
  29. V = mulmod(V, V, n)
  30. V = submod(V, 2*T, n)
  31. T = mulmod(T, T, n)
  32. }
  33. }
  34. return 1
  35. }
  36. say lucas_miller_factor(16641689036184776955112478816668559)
  37. say lucas_miller_factor(17350074279723825442829581112345759)
  38. say lucas_miller_factor(61881629277526932459093227009982733523969186747)
  39. say lucas_miller_factor(122738580838512721992324860157572874494433031849, -1)
  40. say lucas_miller_factor(181490268975016506576033519670430436718066889008242598463521)
  41. say lucas_miller_factor(173315617708997561998574166143524347111328490824959334367069087)
  42. say lucas_miller_factor(57981220983721718930050466285761618141354457135475808219583649146881)
  43. say lucas_miller_factor(2425361208749736840354501506901183117777758034612345610725789878400467)
  44. say lucas_miller_factor(131754870930495356465893439278330079857810087607720627102926770417203664110488210785830750894645370240615968198960237761)