快速冪演算法

2021-10-08 09:39:45 字數 1642 閱讀 6811

主要思想

3^10=333333333*3

//盡量想辦法把指數變小來,這裡的指數為10

3^10=(3x3)(3x3)(3x3)(3x3)(3x3)

3^ 10=(3*3)^5

3^ 10=9^5

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

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

95=( 9 4)*(91)

//此時我們抽出了乙個底數的一次方,這裡即為9^ 1,這個9^ 1我們先單獨移出來,剩下的9^4又能夠在執行「縮指數」操作了,把指數縮小一半,底數執行平方操作

95 =(81 2)*(91)

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

95=(65611)*(91)

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

95=(65610)x(91)x(65611)=1x(91)x(65611)=(91)(65611)=96561=59049

我們能夠發現,最後的結果是9*6561,而9是怎麼產生的?是不是當指數為奇數5時,此時底數為9。那6561又是怎麼產生的呢?是不是當指數為奇數1時,此時的底數為6561。

所以我們能發現乙個規律:最後求出的冪結果實際上就是在變化過程中所有當指數為奇數時底數的乘積。

入門版~~~

long

long

fastpower

(long

long base,

long

long power)

else

}return result;

}

高階版~~~~

long

long

fastpower

(long

long base,

long

long power)

power >>=1;

//位操作,此處等價於power=power/2

base =

(base * base)

%1000;}

return result;

}

詳細了解的請看這個大佬的部落格,寫的非常贊新增鏈結描述

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

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

快速冪演算法

在 上一直沒有找到有關於快速冪演算法的乙個詳細的描述和解釋,這裡,我給出快速冪演算法的完整解釋,用的是c 語言,不同語言的讀者只好換個位啦,畢竟讀 c的人較多 所謂的快速冪,實際上是快速冪取模的縮寫,簡單的說,就是快速的求乙個冪式的模 餘 在程式設計過程中,經常要去求一些大數對於某個數的餘數,為了得...

快速冪演算法

模運算 公式 a b mod n a mod n b mod n mod n a b mod n a mod n b mod n mod n a b mod n a mod n b mod n mod n 要保證n是整數 要知道a mod n和b mod n都是比n小的 利用這些共識可以有效地防止溢...