分治法来解决大整数乘法问题

设 x 和 y 都是 n 位的二进制整数,现在要计算它们的乘积 xy ,显然我们可以用一般的方法来计算。但是这样计算步骤太多,效率低下。如果将每 2 个 1 位数的乘法或加法看作一步运算,那么这种方法要作 O(n^2) 步运算才能求出乘积 xy 。那么我们如何来设计一个更有效的方法来实现大整数乘法呢?我们可以把x、y分别分解为左、右两半,每一半长度为 n/2,如:x = 10110110, 则 xl = 1011,xr = 0110。由此可得

    xy= (2^n * xl * yl) + 2^(n/2)(xl * yr + xr * yl) + (xr * yl)

此表达式的复杂性在于 4 个乘法运算。然而,我们还可以继续推导,使它简化为 3 次乘法运算,化简后的式子如下:

         xy= (xl * yl)2^n +[(xl – xr)(yr – yl) + (xl * yl) + (xr * yr)]2^(n/2) + (xr * yr)   (1)

显然,在(1)式中,只有三次乘法运算 (xl * yl)、(xl – xr)(yr – yl)、(xr * yr)。从而算法复杂度就会从蛮力计算时的 n^2 降到(3/4)n^2

    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/yyslovej/article/details/50799522
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞