karatsuba_multiplication.pl 766 B

123456789101112131415161718192021222324252627282930313233343536
  1. #!/usr/bin/perl
  2. # A simple implementation of the Karatsuba multiplication.
  3. # See also:
  4. # https://en.wikipedia.org/wiki/Karatsuba_algorithm
  5. use 5.020;
  6. use strict;
  7. use warnings;
  8. use experimental qw(signatures);
  9. use Math::AnyNum qw(:overload);
  10. use Math::AnyNum qw(divmod);
  11. sub karatsuba_multiplication ($x, $y, $n = 8) {
  12. if ($n <= 1) {
  13. return $x * $y;
  14. }
  15. my $m = ($n % 2 == 0) ? ($n >> 1) : (($n >> 1) + 1);
  16. my ($a, $b) = divmod($x, 1 << $m);
  17. my ($c, $d) = divmod($y, 1 << $m);
  18. my $e = __SUB__->($a, $c, $m);
  19. my $f = __SUB__->($b, $d, $m);
  20. my $g = __SUB__->($a - $b, $c - $d, $m);
  21. ($e << (2*$m)) + (($e + $f - $g) << $m) + $f;
  22. }
  23. say karatsuba_multiplication(122, 422); # 122 * 422 = 51484