Karatsuba算法的自己实现

问题描述

大家好,我试图提出自己的Karatsuba乘法算法实现,其中,当一个数字是一位数字时,基本情况是微不足道的乘法。我的代码似乎无法给出正确的答案,我相信这与z1的计算方式有关,但我不太清楚,请帮助我。

import math
x = input()
y = input()

def suba(x,y):
    if len(x) == 1 or len(y) == 1:
        x = int(x)
        y = int(y)
        return x*y
    else:
        n = int(math.ceil((min(len(x),len(y)))/2))
        h1 = x[0:n]
        l1 = x[n:len(x)]
        h2 = y[0:n]
        l2 = y[n:len(y)]
        z0 = suba(l1,l2)
        z1 = suba(str(int(l1)+int(h1)),str(int(l2)+int(h2)))
        z2 = suba(h1,h2)
        return (z2*10**(n*2))+((z1-z2-z0)*10**(n))+z0

print(suba(x,y))

解决方法

问题出在拆分中。您需要以 low (右侧)部分的大小为 n 的方式进行拆分。这是必要的,因为 x y high 部分必须具有可比性:它们必须通过除以相同来提取为10的幂。

因此将拆分代码更改为此:

    h1 = x[:-n]
    l1 = x[-n:]
    h2 = y[:-n]
    l2 = y[-n:]

还请注意,不必为范围的开头指定0,也不必为范围的结尾指定长度,因为它们是默认值。