快速冪 講解版

2021-10-02 20:04:32 字數 1653 閱讀 4869

這是在csdn上的第一篇文章,今年疫情嚴重,推遲復學了,並且今年的藍橋杯又要開始了,不想和去年一樣菜,於是就在家裡反思了去年的藍橋杯的錯誤

去年這個時候,對於藍橋杯,只掌握了動態規劃,dfs, bfs等常規解法,忽略了快速冪,這個演算法在rsa解密那一題其實是非常有用的,於是就寫下了這個快速冪的文章,也算是對自己的菜的一種警示

我來說一說我自己的理解,假設a = 3, b = 5

快速冪的演算法就是將b由十進位制變成二進位制表示(101)2

3

53^5

35= 3(2

2+20

)3^

3(22+2

0)= 3

43^4

34× 3

13^1

31我相信很多人都和我一樣會問這個34是怎麼來的?

其實這就是這個演算法的關鍵

我們知道101有3位數,總共要迴圈3次,每一次迴圈都要對這個數》1(將這個二進位制數移動一位),當第一次迴圈時,3會平方,變成32

^22,第二次迴圈時,我們的32 平方之後就變成了34,此時我們只用了兩次迴圈,就出現了a4

這就是為什麼快速冪能夠實現o(logn)

下面進行乙個動態 的講解(文本版)

3

53^5

35= 3

43^4

34× 3

13^1

31我們先讓 ans = 1; a = 3; b = 5;

最開始,b = 5 = (101)2 時,二進位制的最後一位是1,此時我們是需要把ans乘以a的,因為在 3

43^4

34× 3

13^1

31這裡,是需要計算3

13^1

31的 ,此時ans = 3 也就是 3

13^1

31,此時距離我們的正確答案是還缺少乙個3

43^4

34而我們下面將會執行b >>= 1 a *= a這兩步,這時候b = 3 = (10)2,a進行了平方處理,變成了a2(值為32)

再進行迴圈時,此時二進位制最後一位是0,3

53^5

35= 3

43^4

34× 3

13^1

31,我們從這裡也可以看出確實是不需要乘以32的,之後繼續執行b >>= 1 a *= a這兩步,這時候b = 1 = (1)2,a進行了平方處理,變成了a4(值為34),我們想要的34終於出來了

再進行迴圈時,b的二進位制表示的最後一位是1,當然是要執行ans *= a這一步,這時候我們的a4

^44也被乘進去了,最終答案也就出來了,至於接下來要執行的 b >>= 1 和 a *= a 這兩個步驟當然也是要繼續執行的,只不過b變成了0不會再進行迴圈啦(終於結束啦 )

public

intfastpow

(int a,

int b)

b >>=1;

// 二進位制數往右移動1位,相當於除於2

a *= a;

//a變平方

}return ans;

}

這次先寫快速冪的理解,下次再寫快速乘乘

第一次寫部落格,表達的不是很清楚,希望大家諒解

最後武漢加油,中國加油,早日解決這個病毒

快速冪講解

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

快速冪講解

快速冪取模 用法 用於求解 a 的 b 次方,而b是乙個非常大的數,用o n 的複雜度會超時。那麼就需要這個演算法,注意它不但可以對數求次冪,而且可用於矩陣快速冪。假如求 x n 次方 我們可以把 n 表示為 2 k1 2k2 2 k3 可以證明所有數都可以用前式來表示。其實就是二進位制表示數的原理...

快速冪講解

快速冪這個東西比較好理解,但實現起來到不老好辦,記了幾次老是忘,今天把它系統的總結一下防止忘記。首先,快速冪的目的就是做到快速求冪,假設我們要求a b,按照樸素演算法就是把a連乘b次,這樣一來時間複雜度是o b 也即是o n 級別,快速冪能做到o logn 快了好多好多。它的原理如下 假設我們要求a...