大整数的乘法(递归方程+复杂度分析)

递归方程+复杂度分析

大整数的乘法

背景介绍

设X和Y都是n位二进制整数,现在需要计算它们的乘积XY,如果使用小学的思路设计算法,那么需要n2次乘法和n-1次加法,效率太低,那么能够设计出一种算法能够提高效率?

方案一

将n位二进制整数X和Y都分为两段,每段的长度为n/2,如下图所示

在这里插入图片描述

此时, X = A 2 n / 2 + B X=A2^{n/2}+B X=A2n/2+B Y = C 2 n / 2 + D Y=C2^{n/2}+D Y=C2n/2+D,XY的乘积就为:

X Y = ( A 2 n / 2 + B ) ( C 2 n / 2 + D ) = A C 2 n + ( A D + B C ) 2 n / 2 + B D XY=(A2^{n/2}+B)(C2^{n/2}+D)=AC2^n+(AD+BC)2^{n/2}+BD XY=(A2n/2+B)(C2n/2+D)=AC2n+(AD+BC)2n/2+BD,共需要4次2n/2位的乘法,3次长度不超过2n的加法,以及两次移位操作,所以可以得出对应递归方程如下:
T ( n ) = { O ( 1 ) n = 1 4 T ( n / 2 ) + O ( n ) n > 1 T(n)= \begin{cases} O(1)\quad\quad\quad\quad\quad\quad\quad{n=1}\\ 4T(n/2)+O(n)\quad\quad{n\gt1} \end{cases} T(n)={O(1)n=14T(n/2)+O(n)n>1
对应的时间复杂度求解过程如下:

当n>1时(注:ci为常数):
T ( n ) = 4 T ( n / 2 ) + O ( n ) = 4 2 T ( n / 2 2 ) + c 1 O ( n ) = . . . = 4 k T ( n / 2 k ) + c k O ( n ) T(n)=4T(n/2)+O(n)\\ =4^2T(n/2^2)+c_1O(n)\\ =...\\ =4^kT(n/2^k)+c_kO(n) T(n)=4T(n/2)+O(n)=42T(n/22)+c1O(n)=...=4kT(n/2k)+ckO(n)
2 k = n 2^k=n 2k=n,则 k = l o g 2 n k=log_2n k=log2n,此时
T ( n ) = 4 k T ( n / 2 k ) + c k O ( n ) = 4 k T ( 1 ) + c k O ( n ) = ( 2 l o g 2 4 ) l o g 2 n + c k O ( n ) = ( 2 l o g 2 n ) l o g 2 4 + c k O ( n ) = O ( n l o g 2 4 ) + c k O ( n ) = O ( n l o g 2 4 ) = O ( n 2 ) T(n)=4^kT(n/2^k)+c_kO(n)\\ =4^kT(1)+c_kO(n)\\ =(2^{log_24})^{log_2n}+c_kO(n)\\ =(2^{log_2n})^{log_24}+c_kO(n)\\ =O(n^{log_24})+c_kO(n)\\ =O(n^{log_24})\\ =O(n^2) T(n)=4kT(n/2k)+ckO(n)=4kT(1)+ckO(n)=(2log24)log2n+ckO(n)=(2log2n)log24+ckO(n)=O(nlog24)+ckO(n)=O(nlog24)=O(n2)
注:这里系数是4,求完相应对数后,结果为2,写的麻烦是为了当系数为3时,同学们也能理解清楚计算的过程。

方案二

X Y = A C 2 n + ( ( A − B ) ( D − C ) + A C + B D ) 2 n / 2 + B D XY=AC2^n+((A-B)(D-C)+AC+BD)2^{n/2}+BD XY=AC2n+((AB)(DC)+AC+BD)2n/2+BD,看上去算式更复杂,但仅需3次n/2位整数的乘法,6次加、减法和2次移位。于是可得出递归方程如下:
T ( n ) = { O ( 1 ) n = 1 3 T ( n / 2 ) + O ( n ) n > 1 T(n)= \begin{cases} O(1)\quad\quad\quad\quad\quad\quad\quad{n=1}\\ 3T(n/2)+O(n)\quad\quad{n\gt1} \end{cases} T(n)={O(1)n=13T(n/2)+O(n)n>1
通过上述的时间复杂度求解过程,可算得 T ( n ) = O ( n l o g 2 3 ) = O ( n 1.59 ) T(n)=O(n^{log_23})=O(n^{1.59}) T(n)=O(nlog23)=O(n1.59),相较于之前的,算是较大的一个改进。


因为博主写也只是在学习过程中做个人总结,所以难免可能会有错误的地方,欢迎大家一起交流、讨论。如果有幸解决了您的一些疑问,本人不胜感激!

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值