快速冪演算法

2021-10-03 03:20:32 字數 1061 閱讀 5116

求a^b%m的值。

當b是奇數時,有a ^ b = a * a ^(b-1)

當b是偶數時,那麼有a ^ b= a ^ (b/2) * a ^ (b/2)

根據這兩個條件寫遞迴式。

#include

using

namespace std;

#define ll long long

ll a,b,m;

ll func

(ll a,ll b,ll m)

intmain()

快速冪的迭**法

對於 a ^ b來說,若果把 b 寫成2 進製,那麼b 就可以寫成若干二次冪之和,如13 的二進位制 1101,於是3 號位 、2號位、0號位就都是1,那麼就可以得到13 = 2^3 + 2^2 + 2^1 = 8 + 4 + 1。所以a ^13 = a^8 * a^4 * a^1。

通過同樣的推導,我們可以把任意的a ^ b 表示成 a ^ (2 ^ k)……、a ^ 8、a^ 4、a^ 2、a^ 1中若干的乘積。若果二進位制的i號位為1.那麼想中的a^ (2^ i)就被選中。於是可以得到計算a^ b的大致思路:令i 從0到k列舉b的二進位制的每一位,如果為1 那就累計a^(2 ^i)。注意

a^ (2^ k)……、a^ 8、a^ 4、a^ 2、a^ 1前一項總是等於後一項的平方(正是因為如此,每對b的二進位制判斷一位數,底數a就要平方)。具體步驟。

(1)初始令ans = 1,用來存放累積的結果。

(2)判斷b的二進位制末尾是否為1 ,(及判斷 b&1 是否為 1),也可以理解為判斷b 是否為奇數。如果是的話,令ans乘上a的值。

(3)令a平方,並使b右移一位,(也可以理解為,b/2)

(4)只要b 大於0,就返回(2)。

#include

using

namespace std;

#define ll long long

ll a,b,m;

intmain()

cout

}

演算法提高快速冪(快速冪演算法詳解)

問題描述 給定a,b,p,求 a b mod p。輸入格式 輸入共一行。第一行有三個數,n,m,p。輸出格式 輸出共一行,表示所求。樣例輸入 2 5 3 樣例輸出 資料規模和約定 共10組資料 對100 的資料,a,b為long long範圍內的非負整數,p為int內的非負整數。所謂的快速冪,實際上...

快速冪演算法

在 上一直沒有找到有關於快速冪演算法的乙個詳細的描述和解釋,這裡,我給出快速冪演算法的完整解釋,用的是c 語言,不同語言的讀者只好換個位啦,畢竟讀 c的人較多 所謂的快速冪,實際上是快速冪取模的縮寫,簡單的說,就是快速的求乙個冪式的模 餘 在程式設計過程中,經常要去求一些大數對於某個數的餘數,為了得...

快速冪演算法

模運算 公式 a b mod n a mod n b mod n mod n a b mod n a mod n b mod n mod n a b mod n a mod n b mod n mod n 要保證n是整數 要知道a mod n和b mod n都是比n小的 利用這些共識可以有效地防止溢...