簡體   English   中英

Karatsuba算法,略有誤差

[英]Karatsuba algorithm, slight inaccuracy

我花了一段時間試圖在 Python 中實現 Karatsuba 的算法,但是當我嘗試將兩個更大的數字(超過 ~10^15)相乘時,我的結果開始變得不准確。 我不知道為什么。

附帶問題:我的基本情況是否有一種方法是“x 和 y 都(而不是其中一個)嚴格小於(而不是小於)10”


def karatsuba(x, y):
    # 1. Split ints

    if x <= 10 or y <= 10:
        #Base case
        return x * y

    n_x = ceil(log(x, 10))  # Nb of digits in x
    n_y = ceil(log(y, 10))

    n = max(n_x, n_y)

    b = int(x % (10 ** (n // 2)))
    a = int(x / (10 ** (n // 2)))
    d = int(y % (10 ** (n // 2)))
    c = int(y / (10 ** (n // 2)))

    # 2. Recursive calls

    ac = karatsuba(a, c)
    bd = karatsuba(b, d)
    kara = karatsuba((a + b), (c + d))

    res = ac * (10 ** (2*(n//2))) + (kara - ac - bd) * (10 ** (n//2)) + bd

    return res

例子:

x = 151222321858446622145369417738339374
y = 875336699541236667457869597252254524
karatsuba(x, y)

返回:

132370448112535269852891372864998437604548273605778561898354233338827976

代替:

132370448112535277024334963430875927265604725663292579898354233338827976

由於您的/部門,您會因float而失去精度。 改用// 然后你也不需要轉換回int 更好的是,使用divmod

    N = 10 ** (n // 2)
    a, b = divmod(x, N)
    c, d = divmod(y, N)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM