基礎演算法 快速冪

2021-09-22 23:04:45 字數 1438 閱讀 5700

冪運算是非常常見的一種運算,求取an,最容易想到的方法便是通過迴圈逐個累乘,其複雜度為o(n),這在很多時候是不夠快的,所以我們需要一種演算法來優化冪運算的過程。

該怎樣去加速冪運算的過程呢?既然我們覺得將冪運算分為n步進行太慢,那我們就要想辦法減少步驟,把其中的某一部分合成一步來進行。

比如,如果n能被2整除,那我們可以先計算一半,得到an/2的值,再把這個值平方得出結果。這樣做雖然有優化,但優化的程度很小,仍是線性的複雜度。

再比如,如果我們能找到2k=n,那我們就能把原來的運算優化成((a2)2)2…,只需要k次運算就可以完成,效率大大提公升。可惜的是,這種條件顯然太苛刻了,適用範圍很小。不過這給了我們一種思路,雖然我們很難找到2k=n,但我們能夠找到2k1+2k2+2k3+…+2km=n。這樣,我們可以通過遞推,在很短的時間內求出各個項的值。

我們都學習過進製與進製的轉換,知道乙個b進製數的值可以表示為各個數字的值與權值之積的總和。比如,2進製數1001,它的值可以表示為10進製的1×23+0×22+0×21+1×20,即9。這完美地符合了上面的要求。可以通過2進製來把n轉化成2km的序列之和,而2進製中第i位(從右邊開始計數,值為1或是0)則標記了對應的2i−1是否存在於序列之中。譬如,13為二進位制的1101,他可以表示為23+22+20,其中由於第二位為0,21項被捨去。

如此一來,我們只需要計算a、a2、a4、a8…a2km的值(這個序列中的項不一定都存在,由n的二進位制決定)並把它們乘起來即可完成整個冪運算。借助位運算的操作,可以很方便地實現這一演算法,其複雜度為o(logn)。

typedef

long

long ll;

ll mod;

ll qpow

(ll a, ll n)

//計算a^n % mod

return re % mod;

}

取模運算一般情況下是需要的,當然也可以省去。

需要進行冪運算的不僅僅只有整數,比如,在poj3070 fibonacci中,就需要我們快速地完成方陣的冪運算。知道了如何做快速冪,我們還可以將同樣的思想運用在其他地方。除了乘法的規則與普通快速冪不同之外不同,其他的細節並沒有什麼差別。

實現矩陣快速冪的一種方法如下:

struct matrix//定義乙個結構體,方便傳遞值;/*

maxn和mod由全域性定義,其中mod根據需要可以省去

*/matrix mat_multi

(matrix a, matrix b)

//矩陣求積}}

return ans;

}matrix mat_quickpow

(matrix a,

int n)

//矩陣快速冪

}while

(n !=0)

//方法與普通快速冪相同,只有乘法的實現不同

return ans;

}

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

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