快速求冪演算法

2021-06-06 12:41:24 字數 1108 閱讀 4764

我們知道在數學表示式中pow(x, n)表示求x^n的冪。一般情況下,如果我們要寫乙個程式的話,最簡單的程式可能是這樣的:

int pow(int x, int n)

return result;

}

通過使用如上的程式,2^4 = 2 * 2 * 2 * 2,在程式中做了4-1=3次乘法,但是有沒有更高效的演算法來減少乘法的次數呢。

答案是肯定的。

我們知道

2^9 = 2^4 * 2^4 * 2

2^8 = 2^4 * 2^4

2^7 = 2^3 * 2^3 * 2

2^6 = 2^3 * 2^3

我們發現了什麼?

x^n = x^(n/2) * x^(n/2) (n為偶數)

x^n = x^(n/2) * x^(n/2) * n (n為奇數);

這樣的話我們就可以使用遞迴的方法將問題化為一半一半的解法。(divide and conquer)

程式如下:

int pow2(int x, int n)
網上也有另外一種寫法:

int pow2(int x, int n)

其實,這兩種寫法是相同,君不見pow(x, n) * pow(x, n) = pow(x*x, n)

遞迴有很多好處,其中之一就是**簡潔,可讀性強,但是也有不好的地方,如果n的位數足夠大(假設整個結果不溢位的情況),那麼其使用的棧可能會產生溢位的情況。

現在既然我們已經有了乙個遞迴的方法,那麼寫乙個非遞迴的方法就水到渠成了。我們要想想如何去寫這個非遞迴的程式了。

例如2^9 = 2^(1001) 括號裡面是二進位制數制。在我們做2^9乘法的時候,我們是用這樣的方法來乘的:2^9 = 2^8 * 2^1

也就是只有在二進位制數字上為1時乘乙個2^n,而在二進位制數字上為0時,則不乘。那麼我們的程式就有了:

int pow3(int x, int n)

return result;

}

程式執行良好,結果與上面的兩個程式的結果相同,但是時間不知道要比上面的遞迴程式快多少倍呢!

演算法 快速冪,快速冪求逆元

基本思想 3 11 11 1011 3 1 3 3 2 9 3 4 81 3 8 6561 3 11 3 9 6561 第一種 當資料範圍m,k,p 10 9 int qmi int m,int k,int p return res 值得一提 k 1 除以2向0取整 詳細可以看狀態壓縮dp 內含位運...

快速求冪演算法

在寫乙個數的冪運算的時候我們通常會想到比較直觀的o n 演算法,如下 include int main printf d res 最近在做資料結構習題的時候學習到了一中快速求冪演算法,時間複雜度為log2 n 這個演算法運用到了二進位制數的除2運算,二進位制的除法與十進位制基本類似,下面舉乙個例子2...

快速求冪演算法

快速求正整數次冪,當然不能直接死乘。舉個例子 3 999 3 3 3 3 直接乘要做998次乘法。但事實上可以這樣做,先求出2 k次冪 3 2 3 3 3 4 3 2 3 2 3 8 3 4 3 4 3 16 3 8 3 8 3 32 3 16 3 16 3 64 3 32 3 32 3 128 3...