I'm having trouble to implement the karatsuba algorithm in python. I'm working with lists in base 2 (the MSB is at the end in the list). The implementation given to me is this:
Input: 2 bit-numbers of bit length n
Output: their product a*b
function Karatsuba(a, b)
if(n == 1) return a*b
else
a1, a0, leftmost(n/2)(rounded up), rightmost(n/2)(rounded down) bits of a
b1, b0, leftmost(n/2)(rounded up), rightmost(n/2)(rounded down) bits of b
s1 = Karatsuba(a1, b1)
s2 = Karatsuba(a0, b0)
s3 = Karatsuba(a1 + a0, b1 + b0)
return s1 * 2^n + (s3 - s1 - s2) * 2^(n/2) + s2
and this my python implementation:
def karatsuba(A, B):
if(len(A) == 1 or len(B) == 1):
return Multiply(A, B)
n = max(len(A), len(B))
m = n / 2
print "Karatsuba call"
print "A", A, "\n"
print "B", B, "\n"
lowA = A[:m]
highA = A[m:]
lowB = B[:m]
highB = B[m:]
print "highA", highA, "\n"
print "lowA", lowA, "\n"
print "highB", highB, "\n"
print "lowB", lowB, "\n"
s1 = karatsuba(highA, highB)
s2 = karatsuba(lowA, lowB)
s3 = karatsuba(Add(highA, lowA), Add(highB, lowB))
f1 = Multiply(s1, pow2(n))
f2 = Multiply(Sub(Sub(s3, s1), s2), pow2(m))
return Add(f1, Add(f2, s2))
However running with the input (remember the MSB is the rightmost bit):
A [0, 1, 1]
B [0, 1, 1]
I get Product Karatsuba [0, 0, 0, 1, 0, 0, 1, 0] 72
but it should output [0, 0, 1, 0, 0, 1] 36
. The functions Add, Substract, pow2 and Multiply are working, I have tested them separately. If it helps here's the full output with the print statements:
Karatsuba call
A [0, 1, 1]
B [0, 1, 1]
highA [1, 1]
lowA [0]
highB [1, 1]
lowB [0]
Karatsuba call
A [1, 1]
B [1, 1]
highA [1]
lowA [1]
highB [1]
lowB [1]
Karatsuba call
A [0, 1]
B [0, 1]
highA [1]
lowA [0]
highB [1]
lowB [0]
Karatsuba call
A [1, 1]
B [1, 1]
highA [1]
lowA [1]
highB [1]
lowB [1]
Karatsuba call
A [0, 1]
B [0, 1]
highA [1]
lowA [0]
highB [1]
lowB [0]
I'm searching for hours, and I have no more idea where my error is. Can somebody help me? Thanks