大整数乘法

问题描述

nn 位二进制整数 XXYY 相乘,通常算法时间复杂度为 O(n2)O(n^2)。是否存在分治算法可以降低时间复杂度?

问题分析

XXYYnn 位整数,将 XX 分为 n/2n/2 位的两部分(高 n/2n/2 位的 AA 和低 n/2n/2 位的 BB),将 YY 分为 n/2n/2 位的两部分(高 n/2n/2 位的 CC 和低 n/2n/2 位的 DD)。则 X×YX \times Y 可以表示为:

XY=(A2n/2+B)(C2n/2+D)=AC2n+(AD+BC)2n/2+BD=AC2n+((A+B)(C+D)ACBD)2n/2+BD \begin{aligned} XY &= (A \cdot 2^{n/2} + B)(C \cdot 2^{n/2} + D) \\ &= AC \cdot 2^n + (AD + BC) \cdot 2^{n/2} + BD \\ &= AC \cdot 2^n + ((A+B)(C+D) - AC - BD) \cdot 2^{n/2} + BD \end{aligned}

需要计算的子问题包括 ACACBDBD(A+B)(C+D)(A+B)(C+D)。其中 (A+B)(C+D)(A+B)(C+D) 中的加法运算的时间复杂度取决于问题规模,即数字位数 nn。因此可以得到如下递推式:

T(n)=3T(n2)+Θ(n) \begin{aligned} T(n) = 3 T\left( \frac{n}{2} \right) + \Theta(n) \end{aligned}

可以解得时间复杂度为:

T(n)=Θ(nlog23) \begin{aligned} T(n) = \Theta\left(n^{\log _{2}{3}}\right) \end{aligned}