快速冪詳解

2021-08-19 19:31:05 字數 2160 閱讀 6424

學楊輝三角的時候偶然看到了這個東西,然後應aj

a

j做一題寫一篇部落格的要求,我就補發了這篇部落格

若對一些概念有不懂的地方在後面坐著放入了概念補充,若需要的可以去看一下

當我們需要求出ab

a

b的時候,樸素的想法是直接

b b

個a' role="presentation" style="position: relative;">a

a相乘,這樣子的時間複雜度效率較低為o(

n)o (n

)

int power(int a,int b)

現在我們開始考慮,如何讓這個演算法更加高效呢?這就需要用到乘方的基本性質中的乙個:

同底次冪相乘,底數不變,指數相加

其中ci

c i為

b b

在二進位制下分解為的各個非0位乘以其對應的次方數,也就是說ci

' role="presentation" style="position: relative;">cic

i是2 2

的n' role="presentation" style="position: relative;">nn次冪

例如311 3

11,若我們需要去求它的冪,按照之前的演算法,我們需要迴圈11次,但是我們把其拆開

而1,2,8這三個數可以用二進位制表示,就可以從原來的十一次運算縮減到3次運算

而為什麼要拆成2的幾次冪呢?這裡也用到了乙個定理:

任何正整數都可以表示為幾個2的正整數冪之和

而且在運算的時候,我們可以儲存2n

2

n次冪,然後判斷指數在二進位制下的這一位是否是1,如果是則乘

這樣的時間複雜度就降低到了o(

log(

b)) o(l

og(b

))

由於快速冪程式的寫法很多,這裡給出的是速度最快的位運算寫法。

前面講到快速冪其實就是利用了幾個定理,那麼具體怎麼實現呢?我們先講幾個變數

最終答案:an

s ans

(儲存所有a2

n a2n

的結果的積)

底數:x

x(會改變,因為中途我們只需要求它指數為2n

' role="presentation" style="position: relative;">2n2

n的情況)

指數:y

y(會改變,起到乙個二進位制的作用,它的作用是分解正整數為二進位制時對應的每一位)

int fast_power(int x,int y)

return ans;//所有a的ci次方的積即為a的b次方

}

n' role="presentation" style="position: relative;">n

n個相同因數的積的運算叫做乘方,乘方的結果叫做冪,例如 23

=2∗2

∗2=823

=2∗2

∗2=8

34=3∗3

∗3∗3

=8134=

3∗3∗

3∗3=

81乘方中有幾個基本定理在後續中會提到,先了解一下其它的一些基本概念

若我們稱

s s

為冪,a

' role="presentation" style="position: relative;">a

a為底數,

b b

為指數

例如 2

3' role="presentation" style="position: relative;">232

3這個式子的底數是2,指數是3,冪為8,讀作:

二的三次方

或者 二的三次冪

例如

2−2=

122=142

−2=1

22=1

43

−1=1

31=1

3 3−1

=131

=1

3洛谷p1226:

快速冪詳解

1.首先說快速冪是用處 快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 o lgn 比樸素的o n 快了不知多少啊!以下以求a的b次方來介紹 2.快速冪的原理 把b轉換成2進製數 該2進製數第i位的權為a 2 i 1 例如 a 11 a 2 0 2 1 2 3 11的二進位制是1 011...

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

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

矩陣快速冪詳解

在講矩陣快速冪之前,先引入整數快速冪的概念。整數快速冪 為了引出矩陣快速冪,以及說明快速冪演算法的好處,我們可以先求整數的冪。如果現在要算x 8 則x x x x x x x x x按照尋常思路,乙個乙個往上邊乘,則乘法運算進行7次。用 x x x x x x x x 這種求法,先進行乘法得x 2,...