簡體   English   中英

用Python實現Karatsubas乘法算法

[英]Implementing Karatsubas Multiplication Algorithm in Python

我正在嘗試在Python中實現Karatsuba的乘法算法

這是我的代碼

import math
# Base
B=10
# No. of digits
n=4
# Numbers
x=1234
y=5678

def karatsuba(x,y,d):
    if (x < 10 o r y < 10):
        return x*y

    # Partition
    m=math.floor(d/2)
    n=math.ceil(d/2)

    x1=x//B**n
    x2=x%B**n

    y1=y//B**n
    y2=y%B**n

    a=karatsuba(x1,y1,m)
    b=karatsuba(x1+x2,y1+y2,m) #Line 25
    c=karatsuba(x2,y2,n)

    tot = a*(B**(2*m)) + b*(B**m) + c

res=karatsuba(x,y,n)

print('%d * %d = %d' %(x, y, res))

但是正如您在Line 25中看到的那樣,當我們執行x1+x2y1+y2 (考慮x1x2y1y2m位數字)時,一個或兩個總和可能超過m位。 在這種情況下,我如何用兩個具有不同數字位數的數字遞歸調用karatsuba() 誰能對此提供簡單的解決方案。

您不需要傳遞數字的大小。 如果您采用這種方式,則算法將僅適用於每個遞歸調用中具有相同位數的數字。 取而代之的是輸入函數來計算兩個數字的位數n = max(len(str(x)), len(str(y)))然后將x,y中的較小者用最高有效位填充0s結束將n和2均分的過程。

希望這應該是我在算法課程中所做的可行的實現:

def karatsuba(x, y):
    if x < 10 or y < 10:
        return x * y
    # get longest digits
    n = max(math.log10(x) + 1, math.log10(y) + 1)
    # catch where n is odd
    n -= n % 2
    bn = B ** (n // 2)
    x1, x2 = divmod(x, bn)
    y1, y2 = divmod(y, bn)
    ac = karatsuba(x1, y1)
    bd = karatsuba(x2, y2)
    # caluclate a+b and c + d subtracting already
    # calculated ac and bd leaving ad + bc
    adbc = karatsuba(x1 + x2, y1 + y2) - ac - bd
    # x . y = 10 ^ n ac + 10^n/2 (ad + bc) + bd
    return ((B ** n) * ac) + bn * adbc + bd


res = karatsuba(x, y)

print('%d * %d = %d' % (x, y, res))

暫無
暫無

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

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