当程序计算的两个数字的乘积超过了基本类型的表示范围,可以使用Karatsuba算法,即采用分治的思想。
Karatsuba于1960年发明在
O
(
n
log
2
3
)
{\rm O}(n^{\log 2^3 } )
O(nlog23) 步骤内将两个n位数相乘的Karatsuba算法。它反证了安德雷·柯尔莫哥洛夫于1956年认为这个乘法需要
Ω
(
n
2
)
\Omega (n^{2})
Ω(n2) 步骤的猜想。
代码如下
def karatsuba_mul(num2,num2):
if len(str(num1))==1 or len(str(num2))==1:
return num1*num2
n=max(len(str(num1)),len(str(num2)))
half=n//2
a=num1//10**half
b=num1%10**half
c=num2//10**half
d=num2%10**half
ac=karatsuba_mul(a,c) #计算a*c
bd=karatsuba_mul(b,d) #计算b*d
abcd=karatsuba_mul(a+b,c+d) #计算(a+b)*(c+d)
adbc=abcd-ac-bd
return ac*10**(2*half)+adbc*10**half+bd