快速冪的理解及使用

2022-09-08 09:18:10 字數 1890 閱讀 9054

wiki

快速冪也稱為平方求冪(exponentiating by squaring)

快速冪時計算乙個數的大正整數乘冪的一般方法(對多項式,矩陣也適用)

\[x^n =

\begin

x(x^2)^}, & \text \\

(x^2)^}, & \text

\end

\]平方法轉換思想

將指數的位,二進位制的位,來確定計算哪些冪

\[x = a * b ^n

,x= a * (b^2)^}

\]每次把b進行平方,將n看作乙個二進位制的數,如果k位為1,則最後的結果需要乘上 b(2k)

b= 13(1101)

\[x = b^

,= b^1 * b^ * b^8

\]**實現

# a * b^n

def quickpower(a,b,n):

x = a

p = b

while n >0:

if(n & 1) == 1:

x = x * p

p = p * p # p,p^2,p^4,p^8

n = n >> 1

return x

// b^n

int mod = 10e9;

long long power(long long p,long long n)

}

計算大指數冪除以乙個數的餘數,在密碼學中應用較多

leetcode.372超級次方

// a^b % mod

// b是以乙個大數,儲存在陣列中

class solution

private int dfs(int a,int b,int len)

private int quickpow(int a ,int b)

return ans;

}}

快速冪在動態規劃中的應用

動態規劃主要用來解決兩種問題:

快速冪可以在組合計數問題中,對計算進行加速(時間複雜度從 o(n) -> o(logn))

[leetcode.1411]

\[dp[i][0] = dp[i-1][0] * 3 + dp[i-1][1] * 2

,dp[i][1] = dp[i-1][0] * 2 + dp[i-1][1] * 2

\]邊界條件

\[dp[1][0] = dp[1][0] = 6

\]

int numofways(int n) 

return (dp[n][0] + dp[n][1]) % mod;

}

轉換為矩陣求解

\[(dp[i][0],dp[i][1]) = (dp[i-1][0] ,dp[i-1][1]) * \begin

3&2\\

2&2\\

\end

,(dp[n][0], dp[n][1] = (dp[1][0] , dp[1][1])* \begin

3&2\\

2&2\\

\end ^

\]

class solution }; // 1x2

vector> m,}; // 2x2

auto mul = [kmod](const vector>& a,

const vector>& b) ;

--n;

while (n)

// ans = ans0 * m^(n-1)

return (ans[0][0] + ans[0][1]) % kmod;

}};

快速冪模板及對其的理解

下面先貼上學長教的快速冪模板 typedef long long ll ll qpow ll a,ll b,ll mod a a a mod b 1 return ans 那麼這個快速冪是如何實現的呢?原理就是將a b拆分掉,拆分成若干部分,每一部分a的指數都是2的n次方的格式,下面是乙個例子 就像...

快速冪及快速冪取餘

快速冪 當遇到求 a na n an這種問題時,可以將指數n拆開於是變成 a2 n 2 a 2 a2 n 2。然後重複將n除2,底數平方,直到指數為0為止就是結果。於是解決這題的時間複雜度從 o n o n o n 普通迴圈相乘a的做法 到了 o l ogn o logn o logn 這就是快速冪...

初學 快速冪 的理解

部落格停了差不多三個月,雖然這一段時間在學演算法,但從來沒有寫部落格。今天看了一上午的快速冪,突然想寫寫部落格,增加一下自己的記憶!這個博文知識簡單介紹一下演算法中取餘的原因 1至於快速冪的概念不詳細記錄了。當我們想求a的b次冪對c取余時,我們會直接想到用這個演算法 int ans 1 for i ...