快速冪取模演算法證明及實現

2021-08-16 17:12:40 字數 2297 閱讀 1840

快速冪取模就是使用更快的方式計算冪式的模,例如當

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是奇數,我們也可...