karatsuba_multiplication.sf 603 B

123456789101112131415161718192021222324252627
  1. #!/usr/bin/ruby
  2. # A simple implementation of the Karatsuba multiplication.
  3. # See also:
  4. # https://en.wikipedia.org/wiki/Karatsuba_algorithm
  5. func karatsuba_multiplication(x, y, n=8) {
  6. if (n <= 1) {
  7. x * y
  8. }
  9. else {
  10. var m = (n.is_even ? (n >> 1) : ((n >> 1) + 1))
  11. var (a, b) = divmod(x, 1 << m)
  12. var (c, d) = divmod(y, 1 << m)
  13. var e = __FUNC__(a, c, m)
  14. var f = __FUNC__(b, d, m)
  15. var g = __FUNC__(a - b, c - d, m)
  16. (e << (2*m)) + ((e + f - g) << m) + f
  17. }
  18. }
  19. say karatsuba_multiplication(122, 422) # 122 * 422 = 51484