两个整数相乘,使用基本算法,时间复杂度为O(n^2) ,这对于日趋庞大的数据来说是很慢的,目前比较常见的一种大整数的快速算法是 Karatsuba算法,当然他不是最快的,但是比基本算法要好的多,时间复杂度为O(n^1.59),在密码运算中相差是很大的。
现在考虑分治算法。取m = (n+1)/2,把x写成10^m*a+b的形式,y写成10^m*c+d的形式,则a, b, c, d都是m位整数(如果不足m位,前面可以补0)。
递归方程为T(n) = 4T(n/2) + O(n),其中系数4为四次乘法ac, bd, bc, ad,附加代价n为最后一个return语句的两次高精度加法。方程的解为T(n) = O(n^2),和暴力乘法没有区别。
Anatolii Karatsuba在1962年提出一个改进方法(并由Knuth改进):用ac和bd计算bc + ad,即:
bc + ad = ac + bd - (a - b) * (c - d)
这样一来,只需要进行三次递归乘法,即递归方程变为了T(n) = 3T(n/2)+O(n),解为T(n) = O(nlog3) = O(n^1.585),比暴力乘法快。
计算整数乘法的最快算法是基于FFT的,它的时间复杂度为O