快速冪取模就是使用更快的方式計算冪式的模,例如當
a a
和b' role="presentation">b
b很大時,用傳統的方法計算ab
%ca b%
c會發生溢位,這時我們就需要使用快速冪取模演算法。
int ans = 1;
for(int i = 0; i < b; i++)
ans = ans * a;
ans = ans % c;
這個演算法不僅複雜度是o(
b)o (b
),而且一旦
a a
或者b' role="presentation">b
b的值過大,就會發生溢位。下面,我們來看乙個新的演算法:
我們來證明ab
%c=(
a%c)
b%c ab%
c=(a
%c)b
%c
設a=k×c+
e a=k
×c+e
,帶入上式得(k
×c+e
)b%c
=eb%
c=(a
%c)b
%c( k×
c+e)
b%c=
eb%c
=(a%
c)b%
c證畢。
利用這個公式,我們可以改進剛才的演算法
int ans = 1;
a = a % c;
for(int i = 0; i < b; i++)
ans = ans * a;
ans = ans % c;
這個演算法的時間複雜度仍然是o(
b)o (b
),還是會在
b b
很大的時候發生溢位。我們還需要繼續改進演算法。
我們的最終演算法依賴下面這兩個公式:
1. 當
b' role="presentation">b
b是偶數時,ab
%c=(
(a2)
b/2)
%ca b%
c=((
a2)b
/2)%
c2. 當
b b
是奇數時,ab
%c=(
(a2)
b/2×
a)%c
' role="presentation">ab%
c=((
a2)b
/2×a
)%ca
b%c=
((a2
)b/2
×a)%
c這兩個公式是很容易證明的,我們不在贅述。
根據這兩個公式,我們有:
1. 當
b b
是偶數時,ab
%c=(
a2)b
/2%c
=(a2
%c)b
/2%c
' role="presentation">ab%
c=(a
2)b/
2%c=
(a2%
c)b/
2%ca
b%c=
(a2)
b/2%
c=(a
2%c)
b/2%
c2. 當
b b
是奇數時,ab
%c=(
(a2)
b/2×
a)%c
=[(a
2%c)
b/2%
c×(a
%c)]
%c' role="presentation">ab%
c=((
a2)b
/2×a
)%c=
[(a2
%c)b
/2%c
×(a%
c)]%
cab%
c=((
a2)b
/2×a
)%c=
[(a2
%c)b
/2%c
×(a%
c)]%
c 這樣就可以寫出快速冪取模的遞迴演算法了
#include
int powermod(int a, int b, int c)
}int main()
這時我們的演算法不但不會溢位,而且時間複雜度也降到了
log2(b
) log2
(b
)
快速冪 快速冪取模演算法
在平時我們需要求乙個a b時,一般會用c 自帶的pow 函式對吧,可是加入資料十分大時,pow 是十分慢的,這個時候我們需要乙個能高效求出a b的演算法,這這時就出現了快速冪演算法。假如我們需要求3 999,那麼我們是不是可以發現3 999 3 512 256 128 64 32 4 2 1 3 5...
快速冪及快速冪取模演算法的分析與實現
快速冪的思想 列如2 10 我們將其10化為二進位制為 1010 那麼我們可以得到 10 0 2 0 1 2 1 0 2 2 1 2 3 所以得到2 10 2 0 2 0 1 2 1 0 2 2 1 2 3 最後得到 2 2 1 2 2 3 在了解快速冪之前,我們還應該先了解一下位運算的倆個符號 1...
快速冪取模演算法
因為進製對個位不影響,積的取餘等於取餘的積取餘 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是奇數,我們也可...