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