分治 大整數乘法

2021-08-01 08:18:54 字數 917 閱讀 4233

問題描述:設x和y是兩個n位的二進位制整數,現在要計算它們的乘積xy,傳統方法計算每2個1位數乘法或加法都看作一步運算,這樣需要o(n2)次位運算,代價太高,現在運用分治法設計乙個更有效的大整數乘法演算法。

當n=1時,計算x·y就是一次位乘。現在對x、y進行劃分,把x和y各分為兩段,每段長為n/2(假設n=2k,k為正整數),

x=a·2n/2+b

y=c·2n/2+d

那麼xy=(x=a·2n/2+b)(y=c·2n/2+d)=ac2n+(ac+bd)2n/2+bd

這樣計算需要4次n/2位整數乘法(ac,ad,bc和bd),3次n/2位的加法和2次移位合併成x·y.

t(n) = 4 t(n / 2) + θ(n) ,

根據主項定理:t(n) =o(nlog24)=o(n2),

代價並沒有減小,可以通過減少乘法增加加法的方式減小時間複雜度,

xy==ac2n+((a-b)(d-c)+bd+ac)·2n/2+bd

這樣減少了一次n/2位的乘法,合併代價稍有增加,六次加減法、兩次移位,仍為o(n)階,

現在的時間複雜度為:

t(n) = 3 t(n / 2) + θ(n),通過master定理求得,t(n) = o(nlog2 3) = o(n1.59 )

c++實現**

#include

#include

using

namespace

std;

#define sign(a) ((a > 0) ? 1 : -1)

int divideconquer(int x, int y, int n)else

if(n == 1)else

}int main()

分治 大整數乘法

第一次自己完整寫對,多多指教 演算法思路 分治。第一步 經過預處理將兩個整數變為長度一樣的兩個數 短的在前面補0 第二部 把兩個大整數都平分為前後兩部分 第三部 按以下公式計算 實現大數乘法之前實現了大數加減法 公式 x a 10 n 2 b y c 10 n 2 d xy ac 10 n a b ...

分治演算法 大整數乘法

用分治演算法程式設計實現兩個n 位十進位製大整數的乘法運算。分析 用分治演算法程式設計實現兩個n 位十進位製大整數的乘法運算。演算法描述 兩個十進位制的數 x y x a 10 n1 b y c 10 n2 d 則 x y a 10 n1 b c 10 n2 d 設乙個陣列,將其看做10000 進製...

分治遞迴 大整數乘法

設x,y十進位制整數,計算乘積xy。用小學方法設計演算法,計算步驟太多,而且效率低。t n o n 2 所以用分治方法設計更有效的大整數乘法。將n為十進位制整數x,y分為兩段,每段長為n 2 若位數為奇數,每段長為 n 2 n 2 1 x分為a和b,y分為c和d.比如 8945456 即a 89,b...