初学者。我花了大部分时间研究Karatsuba算法只是因为我认为它会很有成效。我在这里看过类似的问题,但它们使用的是其他语言,看起来很复杂。以下是我的代码。它命中ac的递归调用的那一刻,它只是继续递归。就好像它永远不会碰到基本情况一样。如果有人能够提供一些关于哪里出错的见解,那将非常感激。对于这段代码,你应该假设我乘以2,基数为10,四位数。
def karatsuba(x, y):
if len(str(x)) == 1 or len(str(y)) == 1:
return (x * y)
else:
n = (max(len(str(x)), len(str(y))))
a = x / 10**(n / 2)
b = x % 10**(n / 2)
c = y / 10**(n / 2)
d = y % 10**(n / 2)
ac = karatsuba(a, c)
ad = karatsuba(a, d)
bc = karatsuba(b, c)
bd = karatsuba(b, d)
product = (10**n*(ac) + 10**(n/2)*(ad + bc) + bd)
return product
print (karatsuba(1234, 5678))
答案 0 :(得分:3)
使用整数除法修复代码使其正常工作但是使用3个递归调用(在基础10中)这是一个略有不同的版本:
def karatsuba(x, y):
if x < 10 or y < 10:
return x * y
n = max(len(str(x)), len(str(y))) // 2
p = 10**n
a, b = divmod(x, p)
c, d = divmod(y, p)
ac = karatsuba(a, c)
bd = karatsuba(b, d)
abcd = karatsuba(a+b, c+d) - ac - bd
return (ac*p + abcd)*p + bd
但是在二进制操作和使用bit-twiddling方面运行速度要快得多:
def karatsuba(x, y):
if x < 16 or y < 16:
return x * y
n = max(x.bit_length(), y.bit_length()) // 2
mask = (1 << n) - 1
a, b = x >> n, x & mask
c, d = y >> n, y & mask
ac = karatsuba(a, c)
bd = karatsuba(b, d)
abcd = karatsuba(a+b, c+d) - ac - bd
return (((ac << n) + abcd) << n) + bd
答案 1 :(得分:1)
你想要整数除法吗?在这种情况下,您应该使用:
a = x // 10 ** (n / 2)
和
c = y // 10 ** (n / 2)
否则,你的程序将以小数形式输入你的函数,我认为这不是你想要的。
我也是初学者,随时纠正我。