1. 程式人生 > >分治演算法解決大整數乘法問題

分治演算法解決大整數乘法問題

整數相乘:小整數相乘在演算法時間分析中可以認為是常數時間,但是對於大整數,時間需要考慮。兩個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}}),是一個亞二次時間界