holf_factorization.sf 1.5 KB

12345678910111213141516171819202122232425262728293031323334
  1. #!/usr/bin/ruby
  2. # Hart’s One-Line Factoring Algorithm.
  3. # See also:
  4. # https://wrap.warwick.ac.uk/54707/1/WRAP_Hart_S1446788712000146a.pdf
  5. # https://programmingpraxis.com/2014/01/28/harts-one-line-factoring-algorithm/
  6. func HOLF_factor(n, iter=100000) {
  7. for k in (1..iter) {
  8. var s = 1+isqrt(n * 4*k)
  9. var m = powmod(s, 2, n)
  10. if (m.is_square) {
  11. var g = gcd(n, s - m.isqrt)
  12. if (g.is_between(2, n-1)) {
  13. return g
  14. }
  15. }
  16. }
  17. return 1
  18. }
  19. say HOLF_factor(126727335216251935155511386856292269344039435369339223952841818402341178946842787391524421251641584095380245040090295288781100410936392638772851127857739674291628104658325634644906472821071273024005952940961745631724673242565456694421601734604687078622903224894582381431189998689129881876425605119999999999999999999999999)
  20. say HOLF_factor(501683471371554052574395593328002385856815909090992391730837714087618687789563199570570904748766683429134165931903849390638583070098709002977060135024453968329425015984667453956539152122050098453561508979991634026587581234275280113197333815352093406638207274145779974221097800552970426675930071039999999999999999999999999)
  21. __END__
  22. 90526428980625828101248261690578699475994489216450172824535174978361071993433018140673220056871822737666086983202407045503649654589358079999999999999999999999999
  23. 44796583413093193287215634651008016235543664766903178304924622669704447996750359492291902708555128777401775001997067403960568901240094719999999999999999999999999