快速冪演算法

2021-09-23 01:36:21 字數 1332 閱讀 9591

顧名思義,快速冪就是快速算底數的n次冪。其時間複雜度為 o(log₂n), 與樸素的o(n)相比效率有了極大的提高。

其基本原理如下:

用 ab來做初步介紹:

我們首先把b轉換為二進位制數,則該二進位制的第i位權為2i-1

e.g. a11=(a2)0+(a2)1+(a2)3

而11的二進位制是1011

so:11=23*1+22*0+21*1+20*1

因此,我們有了以上的轉換:a11=(a2)0+(a2)1+(a2)3

幾點普及:

b &

1//取b二進位制的最低位,判斷和1是否相同,相同返回1,否則返回0,可用於判斷奇偶

b>>

1//把b的二進位制右移一位,即去掉其二進位制位的最低位

接下來我們用完整的**塊進行呈現

#include

#define ll long long

using namespace std;

void

quick_power

(int x,

int y)

cout<}int

main()

以上就是快速冪演算法的最基本常用的形式了,涉及二進位制位運算,也是屬於非遞迴版

接下來是取模快速冪演算法

這一部分就跟數論關係很大了。取模也是數論問題中經常出現的。那麼對於冪來取模,如果我們直接用模運算實際上是速度很慢的(因為試除法)。所以我們不妨在求快速冪的時候新增一些內容,從而得到結果。這個演算法需要了解一下數論的乙個定理:

(ab) mod c = ((a mod c)(b mod c)) mod c

那麼根據上面的定理可以推導出另乙個定理:

(a^b) mod c = (a mod c)^b mod c

具體的證明這裡不再贅述,主要是看第二個定理,恰好符合我們的小標題——快速冪取模。我們可以在求快速冪的時候,通過對底數取模的方式,不斷縮小底數的規模。那麼我們在上面快速冪的基礎上,新增取模,就可以完成整個操作。

ll qp

(ll a,ll b,ll c)

return ans;

}

如果能理解上面的快速冪演算法,那麼這個也會比較好理解了。定理裡面,底數是要有一次取模運算的。這裡我們在給base賦值的時候就執行了一次。那麼對於後面的一次取模,我們實際上利用了分配率,即:

(ab) mod c = ((a mod c)(b mod c)) mod c

我們求冪的本質仍然是求積。所以每次我們對base或者ans進行運算的時候,都必須使用一次分配率,所以都要mod c。

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

問題描述 給定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小的 利用這些共識可以有效地防止溢...