karatsuba_multiplication.sf 864 B

123456789101112131415161718192021222324252627282930
  1. #!/usr/bin/ruby
  2. # A simple implementation of the Karatsuba multiplication,
  3. # which was the first subquadratic-time algorithm ever invented.
  4. func karatsuba_multiplication(x, y, n=8) {
  5. if (n <= 1) {
  6. x * y
  7. }
  8. else {
  9. var m = ceil(n/2)
  10. var (a, b) = divmod(x, ipow2(m))
  11. var (c, d) = divmod(y, ipow2(m))
  12. var e = karatsuba_multiplication(a, c, m)
  13. var f = karatsuba_multiplication(b, d, m)
  14. var g = karatsuba_multiplication(a - b, c - d, m)
  15. (ipow2(2*m) * e) + (ipow2(m) * (e + f - g)) + f
  16. }
  17. }
  18. say karatsuba_multiplication(122, 422) # 122 * 422 = 51484
  19. assert_eq(karatsuba_multiplication(122, 422), 51484)
  20. assert_eq(karatsuba_multiplication(413, -921, 12), -380373)
  21. assert_eq(karatsuba_multiplication(-132, 713, 9), -94116)
  22. assert_eq(karatsuba_multiplication(-993, -375, 5), 372375)