文中x(n) 表示x的n次方;
計算x(n) 的明顯演算法是使用n-1次乘法自乘,有一種遞迴演算法更好:n≤1是這種遞迴的基準情形,否則若n為偶數,我們有x(n) = x(n/2) × x(n/2),若x為奇數,則x(n) = x((n-1)/2) × x((n-1)/2) × x
例如:為了計算x(62),演算法將如下進行,它只用到9次乘法:
在圖中,第20行到第22行實際上是不需要的,因為如果n=1,那麼27行將做同樣的事情,
第27行還可以寫成:
return pow(x,n-1) * x;
而不影響程式的正確性。事實上程式仍將以o(log n) 執行,但是下面所有對第24行的修改都是不可取的,最然它們看起來都正確:
1,return pow(pow(x,2),n/2);
2, return pow(pow(x,n/2),2);
3, return pow(x,n/2) * pow(x,n/2);
第一行和第二行都是不正確的,因為當n=2時遞迴呼叫pow中有乙個是以2作為第二個引數。這樣程式會有乙個無限迴圈,將不能繼續執行;
第三行會影響程式的效率,因為此時有兩個大小為n/2的遞迴呼叫而不是乙個。
歐幾里德演算法
歐幾里德演算法稱為輾轉相除法,用來求已知m n兩個自然數的公因數。結合程式說明一下輾轉相除的具體情況。首先看遞迴實現 1 int getcd int m,intn 2 6if m if m n 1316 else 1720 主要計算過程分為三個步驟 1 對輸入的兩個自然數m n取餘數r,使得0 r ...
擴充套件歐幾里德演算法
擴充套件歐幾里德演算法已經搞了好幾天了,今天終於看明白,小做總結。講擴充套件歐幾里得演算法之前,先講歐幾里得演算法和貝祖定理。歐幾里得演算法 歐幾里得演算法就是輾轉相除法,即gcd a,b gcd b,a b 簡單證明一下 r gcd a,b a nr,b mr。a b n n m m r。因為gc...
快速冪(冪運算取模的logn演算法)
以下以求a的b次方來介紹 把b轉換成二進位制數 該二進位制數第i位的權為 例如11的二進位制是1011 11 2 1 2 0 2 1 2 1 因此,我們將a 轉化為算 對於 令a 0 a 2 0 1 a 1 a 2 1 1 a 2 a 2 2 0 a 3 a 2 3 1 可以看出a n 的前半部分是...