整數快速冪以及大數取模快速冪運算

2021-10-06 14:39:31 字數 1167 閱讀 4717

最近寫到快速冪的演算法題,就比如313,按照之前的做法無非不是寫個迴圈模擬計算,對於指數較小的情況的確可以完成,倘若指數過於大,程式會超時,此時就需要運用到快速冪的方法:

正常情況下的計算時間複雜程度為o(n),a^n=a * a * a…* a(n個a)

但a和n過於大時我們可以換種思路,我們知道a^n * a^m = a^(m+n),

而我們所用的快速冪的方法就是按指數的二進位制來劃分新的任務。

用313作為例子,13 = (1101)2,我們同時也不難發現

313 = 3(1101)

2 = 38 * 34 * 31

因為n有|log2

n|+1個二進位制位,由上面不難看出我們只需要計算o(logn)次就可以計算出結果,所以其時間複雜程度頁大大降低。

同時觀察上面例子我們也不難發現,結果都是2k相乘

31 = 3

32 = (31)2

34 = (32)2

38 = (34)2

而從上面我們也可以看出除了第乙個,後面任意乙個元素都是其前乙個元素的平方,同時在例子中參與相乘的元素都是二進位為1的整係數冪。

於是我們可以寫出**:

int

quickpow

(int x ,

int y)

//傳入底數和指數

res = res * res;

y = y >>1;

//右位移操作

}return ans;

}

當然很多時候冪運算結果過於大所以題目有時會採取取模操作,這時的大數快速冪道理也是一樣,可由上面的結論進行轉換。

有數學定理這樣定義:(a^b)%c = ((a%c)^b)%c

由次我們可以寫出**:

int

quickpow

(int a,

int b,

int c)

//傳入底數,指數和模

b = b >>1;

res =

(res * res)

%c;//同樣取模防止溢位

}return ans;

}

以上便是我對快速冪的理解,如果有什麼錯誤請大家指出,共同進步!!!

快速冪 大數取模

首先要知道取餘的公式 a b p a p b p p。那麼冪不就是乘機的累積嗎,由此給出 int fast int a,int b,int p return int t p 順便把大數取模也給出吧,它的原理就是這個取餘公式 a b p a p b p p 那麼大數可以看做每一位的那位數字乘以自身的權...

快速冪 快速冪取模

快速冪的思想在於快速求解高冪指數的冪運算 複雜度為o log2n 與樸素運算相比有很大的改進 接下來給出 其中有詳解 include include using namespace std typedef long long ll ll pow1 int a,int b 最常規的方法 將冪指數轉化為...

快速冪 快速冪取模

求x m 一般方法是 xm x xm 1,這樣需要做m次乘法,未免過慢。加速方法有兩種。1.基於當m為偶數時,xm x2 m 2 當m為奇數時,xm x xm 1。顯然當m為偶數時m會減半,當m為奇數時,下次就是偶數。m可以很快收斂到0.表示冪 2.將m看成二進位制串mkmk 1 m1m0,那麼xm...