binary_gcd_algorithm.sf 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 12 August 2017
  4. # https://github.com/trizen
  5. # Algorithm invented by J. Stein in 1967, described in the
  6. # book "Algorithmic Number Theory" by Eric Bach and Jeffrey Shallit.
  7. func binary_gcd(u, v) {
  8. var g = 1
  9. while (u.is_even && v.is_even) {
  10. u >>= 1
  11. v >>= 1
  12. g <<= 1
  13. }
  14. while (u) {
  15. if (u.is_even) {
  16. u >>= 1
  17. }
  18. elsif (v.is_even) {
  19. v >>= 1
  20. }
  21. elsif (u >= v) {
  22. u -= v
  23. u >>= 1
  24. }
  25. else {
  26. v -= u
  27. v >>= 1
  28. }
  29. }
  30. return (g * v)
  31. }
  32. say binary_gcd(10628640, 3628800) #=> 1440
  33. say binary_gcd(3628800, 10628640) #=> 1440
  34. var u = 484118311800307409686872049018968526148964320406131317406564776592214983358038627898935326228550128722261905040875508300794183477624832000000000000000000000000
  35. var v = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
  36. say binary_gcd(u, v) #=> 33464469725118339932738475939854523519700805708105926500308251028510111778609255576238987149312000000000000000000000000
  37. say binary_gcd(v, u) #=> 33464469725118339932738475939854523519700805708105926500308251028510111778609255576238987149312000000000000000000000000