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

整数相乘:小整数相乘在算法时间分析中可以认为是常数时间,但是对于大整数,时间需要考虑。两个N位数的整数X和Y相乘,常规方法花费时间是\Theta (N^2),因为X的每一位都要和Y的每一位相乘,是两层循环。

分治算法解决整数相乘问题:

例如,X是12345678,Y是87654321,将X和Y都拆成两半,得到

X_{L}=1234

X_{R}=5678

Y_{L}=8765

Y_{R}=4321

X=X_{L}10^{4}+X_{R}Y=Y_{L}10^{4}+Y_{R},得到

XY=X_{L}Y_{L}10^{8}+(X_{L}Y_{R}+X_{R}Y_{L})10^{4}+X_{R}Y_{R}

这个方程由4个乘法组成,即X_{L}Y_{L},X_{L}Y_{R},X_{R}Y_{L},X_{R}Y_{R},每个问题是原问题的N/2大小,加上增加一堆0的O(N)附加工作,得到递归公式如下:

T(N)=4T(N/2)+O(N)

应用分治算法定理,得到T(N)=O(N^2),因此并没有改进时间。想要改进时间,需要考虑减少子问题规模,一个观察如下:

X_{L}Y_{R}+X_{R}Y_{L}=(X_{L}-X_{R})(Y_{L}-X_{R})+X_{L}T_{L}+X_{R}Y_{R}

这样,只需要求X_{L}X_{L},X_{L}X_{L},(X_{L}-X_{R})(Y_{R}-Y_{L})三个子问题,公式为

T(N)=3T(N/2)+O(N)

应用分治算法定理,得到T(N)=O(N^{log_{2}^{3}}),是一个亚二次时间界

猜你喜欢

转载自blog.csdn.net/kdb_viewer/article/details/83142894