[英]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+x2
和y1+y2
(考慮x1
, x2
, y1
, y2
是m
位數字)時,一個或兩個總和可能超過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.