递归分治算法-大整数乘法

问题描述:

设X和Y都是n位整数,计算它们的乘积XY。可以使用传统的数学计算方法,但是这样做计算步骤太多,效率较低。如果将每个一位数的乘法或加法看做一步运算,则这种方法需要进行O(n^2)步运算才能求出乘积XY。

方法一

基本计算步骤如下,如:56*78
第一步:6*8;
第二步:5*8;
第三步:6*7;
第四步:5*7;
第五步:以上4步的和加起来,得到最后的结果。
将以上的例子进行抽象,即可以这样表示:
将n位十进制(还包括其他进制,如二进制、八进制、十六进制等)整数X和Y都分为2段,每段的长为n/2位。即:
X=A10n2+BX=A∗10n2+B
Y=C10n2+DY=C∗10n2+D
这样XY的乘积就是
XY=(A10n2+B)C10n2+D=AC10n+AD+BC10n2+BDXY=(A∗10n2+B)∗(C∗10n2+D)=AC∗10n+(AD+BC)∗10n2+BD
由以上的等式我们可以看出,需要4次乘法,分别是:AC,AD,BC,BD,以及3次加法,还有3次移位操作。所有这些加法和移位公用O(n)步运算。设T(n)是2个n位整数相乘所需的运算总数,则有:

T(n) =

{O(1),4T(n2)+O(n),n =1 n>1{O(1),n =14T(n2)+O(n), n>1


然后,我们进行计算,得到该算法的时间复杂度为O(n^2),具体过程如下:
这里写图片描述  

方法二

然后我们对于该问题进行优化,要想改进该算法的复杂性,必须减少乘法的次数。我们对以上的表达式进行一个优化,得到如下的表达式:
XY=A10n2+BC10n2+D=AC10n+AD+BC10n2+BD=AC10n+((AB)(DC)+AC+BD)10n2+BDXY=(A∗10n2+B)(C∗10n2+D)=AC∗10n+(AD+BC)∗10n2+BD=AC∗10n+((A−B)(D−C)+AC+BD)∗10n2+BD
通过以上表达式变形,我们只需进行3次n/2位整数的乘法,6次加减法操作和2次移位。由此可得如下的表达式:
T(n) =

{O(1),3T(n2)+O(n),n =1 n>1{O(1),n =13T(n2)+O(n), n>1

再次进行计算,得到该算法的时间复杂度为O (nlog3)(nlog3) ,相比于O (n2)(n2) 来说,这是一个很大的改进。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_28897525/article/details/79878064
今日推荐