快速冪取模其實是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...