快速冪取模演算法 模板

2021-07-30 20:23:57 字數 703 閱讀 8763

快速冪取模其實是a^b%c,這就是著名的rsa公鑰加密的方法,當a,b都很大的時候,直接求是不可取的,所以就用到了快速冪取模。

首先你得明白他的原理,其實是用到了二分的思想,把b按照二進位制展開

b = p(n)*2^n  +  p(n-1)*2^(n-1)  +…+   p(1)*2  +  p(0)。其中p(i) (0<=i<=n)為 0 或 1。

所以此時a^b =  a^ (p(n)*2^n  +  p(n-1)*2^(n-1)  +...+  p(1)*2  +  p(0))=  a^(p(n)*2^n)  *  a^(p(n-1)*2^(n-1))  *...*  a^(p(1)*2)  *  a^p(0);

對於p(i)=0的情況不用處理,因為a^(p(i) * 2^(i-1) ) =  a^0  =  1;

所以我們需要考慮的僅僅是p(i)=1的情況,化簡得:

a^(2^i)  = a^(2^(i-1)  * 2) = (  a^(  p(i)  *  2^(i-1)  )  )^2

【此處有詳細的介紹。

這裡給出非遞迴的方法:

[html]view plain

copy

long long modexp(long long a, long long b, int mod)  

return res;  

快速冪取模演算法 模板

快速冪取模其實是a b c,這就是著名的rsa公鑰加密的方法,當a,b都很大的時候,直接求是不可取的,所以就用到了快速冪取模。首先你得明白他的原理,其實是用到了二分的思想,把b按照二進位制展開 b p n 2 n p n 1 2 n 1 p 1 2 p 0 其中p i 0 i n 為 0 或 1。所...

快速冪取模演算法模板

在miller rabbin測試素數,就用到了快速冪取模的思想。這裡總結下。求a b c 這就是著名的rsa公鑰的加密方法 當a,b很大時,直接求解這個問題不太可能 演算法1 利用公式a b c a c b c,這樣每一步都進行這種處理,這就解決了a b可能太大存不下的問題,但這個演算法的時間複雜度...

快速冪 快速冪取模演算法

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