未學習快速冪時我們的冪(power)運算一般都是通過for,while迴圈來進行的如
int
power
(int a,
int n)
這樣其時間複雜度為o(n)。十分浪費時間。
這時如果我們使用快速冪其時間複雜度將降到o(logn)。
我們的運算效率將大大提公升。
那麼我們要怎麼樣進行快速冪運算呢?
快速冪演算法是建立在二進位制的按權展開求和的方法的基礎上的,在二進位制中我們先將二迸制的數寫成加權係數展開式,而後根據十進位制的加法規則進行求和得到原來的數,如10 二進位製碼為1010
可由0 * 2^ 0+1 * 2 ^1 +0 * 2 ^2+1 * 2 ^3
得到,我們通過思考將其和我們的冪的運算進行結合,便可得到一下式子:
2^ (0 * 2^ 0 + 1 * 2^ 1 + 0 * 2^ 2 + 1 * 2^ 3)
這時我們發現迴圈次數減少了一半多,然後我們將0省去又可以省去一些迴圈次數。最終我們可以得到以下式子:
2^ (2^ 1+2^3)
下面我們進行**除錯:
int quick-
power
(int a,
int n)
return ans;
}
介紹了我眼中的快速冪,接下來加上乙個模的運算。
我還是乙個小白的時候想過為啥我們要輾轉去取模?這個問題後來才知道我們的計算機儲存不了太大的資料這樣會溢位,導致結果出錯。然而我們的程式中乙個關鍵資料出錯就會影響全。而我們運算中如何解決呢?我們可以通過取模來解決像上面冪的運算到後面資料會很大我們要進行合理取模防止溢位,
我們可以從數論問題中得到以下公式:
(a * b) mod c = ((a mod c)*(b mod c)) mod c
再而推導出後面公式:
(a^b) mod c = (a mod c)^b mod c
這樣就成功再此完成從乘法到冪運算的轉化,然後再在**中實現:
long
long
int quick-
power_mod
(int a,
int n,
int mod)
return ans;
}
我們冪運算還是乘積的本質,所以我們通過乘積來計算結果的。以上就是我對快速冪的模的理解,如有錯誤,希望各位大神指正謝謝。 快速冪 快速冪矩陣 快速冪取模
快速冪可以通過算式化簡來有效的減少計算量 例如8 5,如果不採用任何化簡方式,則是8 8 8 8 8 快速冪思想就是將指數進行分解,從而減少計算次數,參照的是二級制下的指數分離思想 對於5,可以化為101二級制串,所以5 2 0 2 2 所以8 5 8 1 8 4,從而有效地從五次計算化為了兩次計算...
快速冪 快速冪取模
快速冪的思想在於快速求解高冪指數的冪運算 複雜度為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...