sophie_germain_factorization_method_fast.sf 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/usr/bin/ruby
  2. # Author: Trizen
  3. # Date: 11 November 2023
  4. # https://github.com/trizen
  5. # A simple factorization method, based on Sophie Germain's identity:
  6. # x^4 + 4y^4 = (x^2 + 2xy + 2y^2) * (x^2 - 2xy + 2y^2)
  7. # This method is also effective for numbers of the form: n^4 + 4^(2k+1).
  8. # See also:
  9. # https://oeis.org/A227855 -- Numbers of the form x^4 + 4*y^4.
  10. # https://www.quora.com/What-is-Sophie-Germains-Identity
  11. func sophie_germain_decomposition(n) {
  12. var t = n.iroot(4)
  13. var u = (n - t**4)>>2
  14. if (u.is_power(4)) {
  15. var (x,y) = (t, u.iroot(4))
  16. assert_eq(n, x**4 + 4*y**4)
  17. return [x, y]
  18. }
  19. var t = (4*n).iroot(4)>>1
  20. var u = (n - 4*t**4)
  21. if (u.is_power(4)) {
  22. var (x,y) = (u.iroot(4), t)
  23. assert_eq(n, x**4 + 4*y**4)
  24. return [x, y]
  25. }
  26. return []
  27. }
  28. func sophie_germain_factors(n) {
  29. var arr = sophie_germain_decomposition(n) || return []
  30. var (x,y) = arr...
  31. var f = [x**2 - 2*x*y + 2*y**2, x**2 + 2*x*y + 2*y**2]
  32. assert_eq(f.prod, n)
  33. return f
  34. }
  35. var x = 642393874177414576297153561759
  36. var y = 714067453700987
  37. for n in ([(x**4 + 4*y**4), (4*x**4 + y**4)]) {
  38. say sophie_germain_decomposition(n)
  39. }
  40. assert_eq(sophie_germain_decomposition(x**4 + 4*y**4), [x, y])
  41. assert_eq(sophie_germain_decomposition(y**4 + 4*x**4), [y, x])
  42. say sophie_germain_factors(77001290479960160497341160397504245)
  43. say sophie_germain_factors(19250322619990040124335290452638485)
  44. say sophie_germain_factors(27606985387162255149739023449108101809804435888681546220650096903087665)
  45. say sophie_germain_factors(173291855882550928723650886508942731464777317210988535948154973788413831737851601439998400381508723631086950685087723242628644864)
  46. say sophie_germain_factors(13093562431584567480052758787310396608866568184172259157933165472384535185618698219533080369303616628603546736510240284036869026183541572213318079483505)
  47. __END__
  48. [642393874177414576297153561759, 714067453700987]
  49. [714067453700987, 642393874177414576297153561759]
  50. [277491095817736105, 277491031750210669]
  51. [138745604154213509, 138745459629795665]
  52. [166153499473114514665395754616490745, 166153499473114453560556010453601017]
  53. [13164036458569648337239753460497746266300898132282617629258080512, 13164036458569648337239753460419861813422875717854660184319779072]
  54. [3618502788666131106986593281521497141767405545090156208559806116590740633113, 3618502788666131106986593281521497099061968496512379043906292883903830095385]