快速冪與快速冪取模

2021-08-16 00:01:08 字數 1253 閱讀 6112

快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 o(log?n), 與樸素的o(n)相比效率有了極大的提高。而快速冪取模就是對冪運算後結果進行取模運算。在程式設計過程中可能會遇到要求乙個很大的數的模,為了得到乙個能計算更大範圍,速度更快的演算法,快速冪取模演算法應運而生。

一.計算冪,計算a^b有很多種方法

①有乙個pow函式可以用於計算a^b

pow(a,b);
②利用for迴圈計算

int sum=1;

for(int i=0;i接下來就是快速冪的各種方法。

快速冪,還是很好懂的乙個演算法。

快速冪就是把指數進行一次log(n)級別的變換

比如我們要求3^11

我們可以把指數用二進位制數替換11,11的二進位制數也就是1011。11 = 1011=2^3+2^1+2^0

而3^11就可以寫成(3^8)*(3^2)*(3^1)。

只需要算3^1和3^2還有3^8,這樣,是不是複雜度就降了。這就是快速冪。

1,當b為偶數時,a^b可以轉為a^2的b/2次方。

2.當b為奇數時,a^b可以轉為a^2的b/2次方,再乘以a。

而a^2的b/2次方,以可以使用上述方式轉為a^4的b/4次方再乘以某個數。

我們看看**

int quick(int a,int b)

return ans;

}

在每一次進行迴圈時,如果b為奇數,則a^b可以轉為a^2的b/2次方乘以a。所以每一次進行a^2計算時,需要根據b是否為奇數決定是否在最終的結果上乘以a。

base *= base;  此步計算完成後,則base是下乙個進行平方運算的數。這樣當所有的迴圈結束後,base就是a^k,其中k是離b最近的,且為2的整數次方的數。

這個也是利用了快速冪的演算法,但是在寫程式之前,你得知道乙個知識

證明:

則我們計算(a^b)%m時就能得出

}大同小異

水平限制,只能寫成這樣了。希望能對你們學習有幫助,為你在程式設計之路獻上綿薄之力。

快速冪與快速冪取模

對大數時間複雜度的優化,具體操作是利用二進位制操作 11的二進位制是1011,11 2 1 2 0 2 1 2 1,因此,我們將a 轉化為算 a 20 a 21 a 23 看出來快的多了吧原來算11次,現在算三次 運算還可以判斷奇偶x 1 0為偶,x 1 1為奇 int ksm int a,int ...

快速冪與快速冪取模

正常的求冪就是一直累乘如下 include intmain 這種方法實現很簡單,但是有時候挺浪費時間,於是就有了快速冪。關於快速冪,用乙個簡單的例子說明比較容易理解。關於nm舉乙個實際,比如2 11。通常我們使用累乘法需要運算10次。211 2 2 2 2 2 2 2 2 2 2 2。而我們可以將1...

快速冪與快速冪取模

intmi int a,int b return num 這種暴力求法的時間複雜度是o n 為了降低時間複雜度,我們引用快速冪,它的時間複雜度縮短到o logn 我認為快速冪之所以快,主要是運用到了位運算。對於位運算,我們舉個例子 比如 2 13 13的二進位制為1101,那我們可以得到1 2 0 ...