Karatsuba无限递归- Python



新手。我花了一天的大部分时间研究Karatsuba算法,因为我认为它会很有成效。我在这里看到过类似的问题,但它们是用其他语言写的,看起来奇怪地复杂。以下是我的代码。当它碰到对ac的递归调用时,它就会继续递归。就好像它永远不会碰到基本情况一样。如果有人能好心地就问题出在哪里提供一些见解,我将不胜感激。对于这段代码,您应该假设我是将以10为基数的2个四位数相乘。

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))

只是用整数除法修复你的代码使其正常工作,但这里有一个稍微不同的版本,使用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

但是在二进制中操作要快得多,并且使用位旋转:

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

要整数除法吗?在这种情况下,您应该使用:

a = x // 10 ** (n / 2)

c = y // 10 ** (n / 2)

否则,你的程序将通过小数传递给你的函数,我认为这是无意的。

我也是一个初学者,请随时纠正我

最新更新