快速冪取模演算法

2021-07-12 01:00:22 字數 1511 閱讀 3348

因為進製對個位不影響,積的取餘等於取餘的積取餘

#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是奇數,我們也可以記k = a2 mod c,那麼求

((k)b/2 mod c ×a ) mod c =((k)b/2 mod c * a) mod c就可以了。

那麼我們可以得到以下演算法:

演算法4:

int ans = 1;

a = a % c;

if(b%2==1)

ans = (ans * a) mod c; //

如果是奇數,要多求一步,可以提前算到

ans中

k = (a*a) % c; //

我們取a2

而不是a

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

ans = ans % c;

我們可以看到,我們把時間複雜度變成了o(b/2).當然,這樣子治標不治本。但我們可以看到,當我們令k = (a * a) mod c時,狀態已經發生了變化,我們所要求的最終結果即為(k)b/2 mod c而不是原來的ab mod c,所以我們發現這個過程是可以迭代下去的。當然,對於奇數的情形會多出一項a mod c,所以為了完成迭代,當b是奇數時,我們通過

ans = (ans * a) % c;來彌補多出來的這一項,此時剩餘的部分就可以進行迭代了。

形如上式的迭代下去後,當b=0時,所有的因子都已經相乘,演算法結束。於是便可以在o

(log b

的時間內完成了。於是,有了最終的演算法:快速冪演算法。

演算法5:快速冪演算法

int ans = 1;

a = a % c;

while(b>0)

將上述的**結構化,也就是寫成函式:

int powermod(int a, int b, int c)

return ans; }

本演算法的時間複雜度為o(

logb

),能在幾乎所有的程式設計(競賽)過程中通過,是目前最常用的演算法之一。

快速冪 快速冪取模演算法

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

快速冪取模演算法

求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可以表示...

快速冪取模演算法

演算法1 int ans 1 for int i 1 i b i ans ans c 可以對a關於c取餘,這樣可以大大減少a的大小 演算法2int ans 1 a a c 加上這一句 for int i 1 i b i ans ans c 既然某個因子取餘之後相乘再取餘保持餘數不變,ans也可以進行...