Недавно я воплотил Карацубу Умножение как личное упражнение. Я написал свою реализацию в Python после pseudocode provided on wikipedia:Выполнение размножения Карацубы
procedure karatsuba(num1, num2) if (num1 < 10) or (num2 < 10) return num1*num2 /* calculates the size of the numbers */ m = max(size_base10(num1), size_base10(num2)) m2 = m/2 /* split the digit sequences about the middle */ high1, low1 = split_at(num1, m2) high2, low2 = split_at(num2, m2) /* 3 calls made to numbers approximately half the size */ z0 = karatsuba(low1, low2) z1 = karatsuba((low1+high1), (low2+high2)) z2 = karatsuba(high1, high2) return (z2*10^(2*m2)) + ((z1-z2-z0)*10^(m2)) + (z0)
Вот моя реализация питон:
def karat(x,y):
if len(str(x)) == 1 or len(str(y)) == 1:
return x*y
else:
m = max(len(str(x)),len(str(y)))
m2 = m/2
a = x/10**(m2)
b = x % 10**(m2)
c = y/10**(m2)
d = y % 10**(m2)
z0 = karat(b,d)
z1 = karat((a+b),(c+d))
z2 = karat(a,c)
return (z2 * 10**(2*m2)) + ((z1 - z2 - z0) * 10**(m2)) + (z0)
Мой вопрос об окончательном слиянии z0
, z1
и z2
.
z2 сдвигается м цифры над (где м длина самой большой из двух умножают число).
Вместо простого умножения на 10^(м), алгоритм использует * 10^(2 * м2) *, где м2 является м/2.
Я попытался заменить 2 * m2 с м и получил неправильные результаты. Я думаю, что это связано с тем, как цифры разделяются, но я не совсем уверен, что происходит.
Я не понимаю 'потому что я могу уменьшить умножение поплавка в функции': какую цель вы пытаетесь достичь в первую очередь с помощью арифметики с плавающей запятой? – greybeard
спасибо, я должен изменить код –