我最近将 Karatsuba 乘法作为个人练习。我按照wikipedia 上提供的伪代码用 Python 编写了我的实现:
程序 karatsuba(num1, num2) 如果 (num1 < 10) 或 (num2 < 10) 返回 num1*num2 /* 计算数字的大小 */ m = max(size_base10(num1), size_base10(num2)) m2 = m/2 /* 围绕中间分割数字序列 */ high1, low1 = split_at(num1, m2) high2, low2 = split_at(num2, m2) /* 对大约一半大小的数字进行 3 次调用 */ z0 = karatsuba(low1, low2) z1 = karatsuba((low1+high1), (low2+high2)) z2 = karatsuba(high1, high2) 返回 (z2*10^(2*m2)) + ((z1-z2-z0)*10^(m2)) + (z0)
这是我的python实现:
def karat(x,y):
if len(str(x)) == 1 or len(str(y)) == 1:
return x*y
else:
m = max(len(str(x)),len(str(y)))
m2 = m / 2
a = x / 10**(m2)
b = x % 10**(m2)
c = y / 10**(m2)
d = y % 10**(m2)
z0 = karat(b,d)
z1 = karat((a+b),(c+d))
z2 = karat(a,c)
return (z2 * 10**(2*m2)) + ((z1 - z2 - z0) * 10**(m2)) + (z0)
我的问题是关于z0
,z1
和z2
.
z2移动了m位(其中m是两个相乘数字中最大的长度)。
该算法不是简单地乘以10^(m),而是使用 *10^(2*m2)* 其中m2是m/2。
我尝试用 m 替换2 * m2并得到不正确的结果。我认为这与数字的分配方式有关,但我不确定发生了什么。