快速冪運算

2021-09-17 07:09:19 字數 898 閱讀 8640

首先,快速冪的目的就是做到快速求冪,假設我們要求a^b,按照樸素演算法就是把a連乘b次,這樣一來時間複雜度是o(b)也即是o(n)級別,快速冪能做到o(logn),快了好多好多。它的原理如下: 

假設我們要求a^b,那麼其實b是可以拆成二進位制的,該二進位制數第i位的權為2^(i-1),例如當b==11時

a11=a(2^0+2^1+2^3)

11的二進位制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我們將a¹¹轉化為算 a2^0*a2^1*a2^3,也就是a1*a2*a8 ,看出來快的多了吧原來算11次,現在算三次,但是這三項貌似不好求的樣子....不急,下面會有詳細解釋。

一、由於是二進位制,很自然地想到用位運算這個強大的工具:&和》    

&運算通常用於二進位製取位操作,例如乙個數 & 1 的結果就是取二進位制的最末位。還可以判斷奇偶x&1==0為偶,x&1==1為奇。

>>運算比較單純,二進位制去掉最後一位,不多說了,先放**再解釋。

int poww(int a, int b) 

return ans;

}

以b==11為例,b=>1011,二進位制從右向左算,但乘出來的順序是 a^(2^0)*a^(2^1)*a^(2^3),是從左向右的。我們不斷的讓base*=base目的即是累乘,以便隨時對ans做出貢獻。

其中要理解base*=base這一步:因為 base*base==base2,下一步再乘,就是base2*base2==base4,然後同理  base4*base4=base8,由此可以做到base-->base2-->base4-->base8-->base16-->base32.......指數正是 2^i ,再看上面的例子,a¹¹= a1*a2*a8,這三項就可以完美解決了,快速冪就是這樣。

快速冪運算

知識點 快速冪運算 快速冪運算 原來 當我們計算a k時候,一定是 a a a a a k個 現在 把k拆成二進位制,為了表達清楚,我們這裡讓k 11 11 dec 1011 b 1 2 3 0 2 2 1 2 1 1 2 0 我們會發現其中有0的地方是個廢操作 那麼我們將去除這個廢操作的過程叫做快...

快速冪運算

如果我們要求x n次方 當n很大的時候 會gg 這個時候就會用到快速冪演算法了,顧名思義,快速冪,快速求冪。因為任何乙個數都可以用2進製表示。比如9 2 3 2 0 7 2 2 2 1 2 0 所以我們可以把n看成 n 2 k1 2 k2 2 k3.這樣來表示。當然我們同樣可以把x用這樣表示。即 x...

快速冪運算

求 x n mod 當資料過大時,會造成溢位,因此無法得出正確的答案。已知取模運算的運算法則 a b p a p b p p 也就是如果我們要求 abc d a db dc d d 因此,我們可以借助這個法則,只需要在迴圈乘積的每一步都提前進行 取模 運算,而不是等到最後直接對結果 取模 也能達到同...