分治法求兩個大整數的乘積
分治法求兩個大整數的乘積
,把兩個
n位的大整數
u.v分割成長度為
n/3的三段,可以用五次
n/3位整數的乘法求得
uv的值。按此思想設計乙個兩個大整數乘積的分治演算法把
u分成u1、
u2、u3三段,即
u=u1*22n/3+u2*2n/3+u3 把
v分成v1、
v2、v3三段,即
v=v1*22n/3+v2*2n/3+v3
則:uv=u1v1*24n/3+(u2v1+u1v2)*2n+(u1v3+u2v2+u3v1)*22n/3+(u3v2+u2v3)*2n/3+u3v3
由上邊式子知:
u1v1
和u3v3
是避免不了的要進行乘法運算。
另外在其餘三個式子中要通過拆分消除缺少的分量。
例如在u1v3+u2v2+u3v1
中要在所有分量中消除
u1v1 u1v2 u2v1 u2v3 u3v2 u3v3
。則可以構造
(u1+u2+u3)*(v1+v2+v3)
和(u1-u2+u3)*(v1-v2+v3)
兩個式子通過正負抵消在所有分量中消除多餘分量。
在u2v1+u1v2
和u3v2+u2v3
中還要構造彌補抵消
u2v2
的式子,通過演算給分量配係數可得構造式子為
(u1-2u2+4u3)*(v1-2v2+4v3)
。綜上:可令
m1=u1v1
m2=u3v3
m3=(u1+u2+u3)*(v1+v2+v3)
m4=(u1-u2+u3)*(v1-v2+v3)
m5=(u1-2u2+4u3)*(v1-2v2+4v3)
則有:u1v1=m1
u2v1+u1v2=(3m1
-12m2
+2m3
-6m4+m5)/6
u1v3+u2v2+u3v1=(m3+m4)/2-m1-m2
u3v2+u2v3=(
-3m1+
12m2
+m3+
3m4-m5)/6
u3v3=m2
m1,m2,m3,m4,m5
即為五次
n/3位整數的乘法。
求兩個正整數的乘積
給你兩個正整數 aa 和 bb,1 a,b 10 1 a,b 102000 求 aa 與 bb 的乘積。包括一行,兩個正整數aa 和 bb,1 a,b 10 1 a,b 102000 一行,乙個正整數表示乘積。輸入 1複製 3 7 輸出 1複製 21 解題思路 1.通過歸納得出乘法對應的位置兩乘數和...
兩個大整數相加
本程式功能為將輸入的兩個大整數求和 include int main t date2 100 f date 100 char a,b char date1 100 date2 100 printf 請輸入兩個大整數,以回車鍵區分 n while a getchar n while b getchar...
兩個大整數相加 Java實現
本文分析和實現了兩個大整數相加的思路和做法 1.首先,由於計算機表示的整數範圍有限,當加數的位數超過計算機所能表示的範圍時就需要用到這裡的演算法。由於整數過大,不能一次完成相加,我們猜想能否將兩個整數儲存到陣列中,然後逐位相加。當然,這裡實現的方法就是基於此。如下 public class bigi...