學楊輝三角的時候偶然看到了這個東西,然後應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,...