我开始了一门新的算法课程。教授正在尝试用其他规则创建一个乘法算法。
例如,他将我们试图相乘的数字分成两组。x = 3452
那么a = 34
, b = 52
(同样适用于y
)。
据他介绍,基本操作将是:
如果给你两个数字,每个数字只有一个数字。然后你只需将它们乘以一个基本操作并返回结果。
如果这些是非常简单的操作,您将如何计算ac
、和递归?ad
bc
bd
以下是您为 karatsuba 编写代码(在 python 中)的方式(假设 x 和 y 始终具有相同的偶数位数):
def numDigits(x):
"""
Returns the number of digits in x
"""
if x == 0:
return 1
digits = 0
while x >= 1:
x = int(x / 10)
digits+=1
return digits
def multiply(x, y):
x_digits = numDigits(x)
y_digits = numDigits(y)
if x_digits != y_digits:
return -1 # not valid
n = x_digits
if n == 1: # checks if x (and y) are only 1 digit
return x*y # single digit multiplication
half_n = int(n / 2)
a = int(x / (10**half_n))
b = x - (a*(10**half_n))
c = int(y / (10**half_n))
d = y - (c*(10**half_n))
ac = multiply(a, c)
ad = multiply(a, d)
bc = multiply(b, c)
bd = multiply(b, d)
return (10**n)*ac + (10**half_n)*(ad + bc) + bd
assert multiply(1, 2) == 2
assert multiply(10, 20) == 200
assert multiply(15, 21) == 315
assert multiply(1710, 2450) == 4189500
print("all pass!")
您可以修改代码以允许 x 和 y 具有奇数位数并具有不同的长度,需要做更多的工作。