binary_gcd_algorithm.pl 849 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/usr/bin/perl
  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. use 5.010;
  8. use strict;
  9. use warnings;
  10. sub binary_gcd {
  11. my ($u, $v) = @_;
  12. my $g = 1;
  13. while (($u & 1) == 0 and ($v & 1) == 0) {
  14. $u >>= 1;
  15. $v >>= 1;
  16. $g <<= 1;
  17. }
  18. while ($u != 0) {
  19. if (($u & 1) == 0) {
  20. $u >>= 1;
  21. }
  22. elsif (($v & 1) == 0) {
  23. $v >>= 1;
  24. }
  25. elsif ($u >= $v) {
  26. $u -= $v;
  27. $u >>= 1;
  28. }
  29. else {
  30. $v -= $u;
  31. $v >>= 1;
  32. }
  33. }
  34. return ($g * $v);
  35. }
  36. say binary_gcd(10628640, 3628800); #=> 1440
  37. say binary_gcd(3628800, 10628640); #=> 1440