快速冪取模演算法

2021-09-06 14:43:23 字數 993 閱讀 9915

所謂的快速冪,實際上是快速冪取模的縮寫,簡單的說,就是快速的求乙個冪式的模(餘)。在程式設計過程中,經常要去求一些大數對於某個數的餘數,為了得到更快、計算範圍更大的演算法,產生了快速冪取模演算法。我們先從簡單的例子入手:求abmodc

int ans = 1

;for(int i = 1;i<=b;i++)

ans = ans % c;

缺點:這個演算法存在著明顯的問題,如果a和b過大,很容易就會溢位。

我們先來看看第乙個改進方案:在講這個方案之前,要先看這樣乙個公式:ab mod c = (a mod c)c mod c

於是不用思考的進行了改進:

int ans = 1

;a = a % c; //

加上這一句

for(int i = 1;i<=b;i++)

ans = ans % c;

讀者應該可以想到,既然某個因子取餘之後相乘再取餘保持餘數不變,那麼新算得的ans也可以進行取餘,所以得到比較良好的改進版本。

int ans = 1

;a = a % c; //

加上這一句

for(int i = 1;i<=b;i++)

ans = ans % c;

這個演算法在時間複雜度上沒有改進,仍為o(b),不過已經好很多的,但是在c過大的條件下,還是很有可能超時,所以,我們推出以下的快速冪演算法。

快速冪演算法依賴於以下明顯的公式:

int powermod(int a, int b, int

c)

return

ans;

}

本演算法的時間複雜度為o(logb),能在幾乎所有的程式設計(競賽)過程中通過,是目前最常用的演算法之一。

ps:本文參考自網路

快速冪 快速冪取模演算法

在平時我們需要求乙個a b時,一般會用c 自帶的pow 函式對吧,可是加入資料十分大時,pow 是十分慢的,這個時候我們需要乙個能高效求出a b的演算法,這這時就出現了快速冪演算法。假如我們需要求3 999,那麼我們是不是可以發現3 999 3 512 256 128 64 32 4 2 1 3 5...

快速冪取模演算法

因為進製對個位不影響,積的取餘等於取餘的積取餘 includeint powermod int a,int b,int c return ans int main return 0 1.如果b是偶數,我們可以記k a2 mod c,那麼求 k b 2 mod c 就可以了。2.如果b是奇數,我們也可...

快速冪取模演算法

求ab c,其中a,b的值可能很大,導致ab的值long long都存不下 對於ab c 1.首先我們將b分解成如下表示 b b0 b1 21 bn 2n 其中的 b0,b1,bn 指的是對應b的二進位制表示法中對應位置的取值,1或者0 比如 6 110 b0 0,b1 1,b2 1 則ab可以表示...