兩個長為n-bit的數x和y相乘。我們可以將數分為長為n/2-bit的前後兩部分,分別相乘。
x * y
= (2n/2xl + xr) * (2n/2yl + yr)
= 2nxlyl + 2n/2(xlyr + xryl)+ xryr
= 2nxlyl + 2n/2((xl+xr)(yl+yr) - xlyl - xryr)+ xryr
公式如上,
xl,yl,xr,yr,(xl+xr),(yl+yr)都只有n/2-bit,2個長為n-bit的數相城,簡化成了6個n/2-bit的數簡單的相乘相加減,大大的提公升了計算的效率。
我們可以就這樣把它一直分解下去,如:
成功將大規模問題分解成了若干個小規模問題。
演算法分析:
分治法實現大數相乘 C 實現
分治法的思路一般的演算法教科書上都有,大數相乘也經常用來作為練習分治思想的很好的例子。具體如下 雖然上面的原理是對應2進製的,但是對於10進製也同樣可行。用c 實現,盡可能的利用c 的特性。本例中,只要拆分的數字小於9位數,就可以直接相乘計算,保證不會溢位。在程式設計中,還需要用的加法和減法,也要通...
大數相乘(C語言,分治演算法)
問題 由於程式語言提供的基本數值資料型別表示的數值範圍有限,不能滿足較大規模的高精度數值計算,因此需要利用其他方法實現高精度數值的計算,於是產生了大數運算。大數運算主要有加 減 乘三種方法。下面就是用分治演算法解決 大數相乘 問題。分治演算法解題的一般步驟 include using namespa...
矩陣相乘(分治法)
乙個簡單的分治演算法求矩陣相乘 c a b 假設三個矩陣均為n n,n為2的冪。可以對其分解為4個n 2 n 2的子矩陣分別遞迴求解 遞迴分治演算法 演算法中乙個重要的細節就是在分塊的時候,採用的是下標的方式。include include define row 16 指定 行數 define co...