快速冪演算法(數學)

2021-10-02 06:15:59 字數 1778 閱讀 8414

快速冪演算法能幫我們算出指數非常大的冪,傳統的求冪演算法之所以時間複雜度非常高(為o(指數n)),就是因為當指數n非常大的時候,需要執行的迴圈操作次數也非常大。所以我們快速冪演算法的核心思想就是每一步都把指數分成兩半,而相應的底數做平方運算。這樣不僅能把非常大的指數給不斷變小,所需要執行的迴圈次數也變小,而最後表示的結果卻一直不會變。讓我們先來看乙個簡單的例子:3的10次方

3^10=3*3*3*3*3*3*3*3*3*3

盡量想辦法把指數變小來,這裡的指數為10,我們來對其進行變形↓↓↓

3^10=(3*3)*(3*3)*(3*3)*(3*3)*(3*3)

3^10=(3*3)^5

3^10=9^5

此時指數由10變成了5(縮小了一半),而底數從3變成了9(擴大了一倍),求3^10原本需要執行10次迴圈操作,求9^5卻只需要執行5次迴圈操作,但是3^10卻等於9^5,我們用一次(底數變平方操作)的操作減少了原本一半的迴圈量,特別是在冪特別大的時候效果非常好,例如:2^10000=4^5000,底數只是做了乙個小小的平方操作,而指數就從10000變成了5000,減少了5000次的迴圈操作。

現在我們的問題是如何把指數5變成原來的一半,我們都知道,5是乙個奇數,5的一半是2.5,但是我們又知道,指數不能為小數,因此我們不能這麼簡單粗暴的直接執行5/2,然而,這裡還有另一種方法能表示9^5

9^5=(9^4)*(9^1)

此時我們抽出了乙個底數的一次方,這裡即為9^1,這個9^1我們先單獨移出來,剩下的9^4又能夠執行我們上文所說的操作(起個名字吧,叫「縮指數,擴底數」)了,把指數縮小一半,底數執行平方操作

9^5=(81^2)*(9^1)

把指數縮小一半,底數執行平方操作

9^5=(6561^1)*(9^1)

此時,我們發現指數又變成了乙個奇數1,按照上面對指數為奇數的操作方法,應該抽出了乙個底數的一次方,這裡即為6561^1,這個6561^1我們先單獨移出來,但是此時指數卻變成了0,也就意味著我們無法再進行「縮指數,擴底數」操作了。

9^5=(6561^0)*(9^1)*(6561^1)=1*(9^1)*(6561^1)=(9^1)*(6561^1)=9*6561=59049

我們能夠發現,最後的結果是9*6561,而9是怎麼產生的?是不是當指數為奇數5時,此時底數為9。那6561又是怎麼產生的呢?是不是當指數為奇數1時,此時的底數為6561。所以我們能發現乙個規律:最後求出的冪結果實際上就是在變化過程中所有當指數為奇數時底數的乘積。

long long fastpower(long long base,long long power)

return result;

}

不過,對於上述**,細心的同學應該能夠發現,好像還可以再優化一下,以便程式執行起來更加節省時間。

在c語言中,power%2==1可以用更快的「位運算」來代替,例如:power&1。因為如果power為偶數,則其二進位制表示的最後一位一定是0;如果power是奇數,則其二進位制表示的最後一位一定是1。將他們分別與1的二進位製做「與」運算,得到的就是power二進位制最後一位的數字了,是0則為偶數,是1則為奇數。例如5是奇數,則5&1=1;而6是偶數,則6&1=0;因此奇偶數的判斷就可以用「位運算」來替換了。同樣,對於power=power/2來說,也可以用更快的「位運算」進行替代,我們只要把power的二進位制表示向右移動1位就能變成原來的一半了。

long long fastpower(long long base,long long power)

return result;

}

數學 快速冪與矩陣快速冪

二進位製取冪的想法是,我們將取冪的任務按照指數的 二進位制表示 來分割成更小的任務 快速冪的遞迴版本 long long fastpower long long a,long long b while迴圈版本 相對於原來的遞迴版本更快 解決你的tle long long fastpower long...

數學 快速冪與矩陣快速冪

1.a sequence of numbers 題目 題解 這是一道隱藏的快速冪的模板題,從資料我們就可以知道。對該題進行分析,如何判別是等差or等比,通過比較a 2 a 1 a 3 a 2 如果相等,則為等差 否則a 2 a 1 a 3 a 2 就為等比,然後利用快速冪來解決等比。includeu...

數學基礎 快速冪

首先,顧名思義,快速冪就是快速的冪 不過可能有人曉得從math裡頭的pow a,b 不過,這樣的快速冪是沒有靈魂的,我們要自己敲 自己手敲冪,最簡單的方法。如下 1 int power int a,intb 2 8return ans 9 這個比較基礎的方法,的時間複雜度當然要比快速冪慢很多了,所以...