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

设 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值