學習筆記 1 快速冪

2022-09-03 21:24:19 字數 2871 閱讀 5516

這一寒假,因為假期的延長,學習了一下新的演算法和資料結構。可能有些完全掌握了,但是有些確實有些不熟練。

在假期的最後一段時間,我會將在寒假及之前學習的一些知識逐漸整理為筆記,供自己複習鞏固,也供他人學習了解。筆記的順序按照我學習該知識點的時間排序。

筆記大部分會寫的很詳細,面向初學者還是很好懂的。雖然我的語文不好,但我會盡量用我的最好水平來寫。

可能乙個學 oi 還不到半年的蒟蒻的筆記確實沒有什麼看的價值,但我還是希望和大家一起慢慢變強。oi 的路還很長,一步一步走下去吧。

希望在某一天開學後,沒有人後悔自己一整個寒假碌碌無為。

什麼是快速冪

快速冪的原理

快速冪的**實現

快速冪的位運算優化

快速冪是一種快速求冪的演算法,面對大量資料時就會展現出它的優勢。

樸素的求冪演算法是用乙個迴圈逐漸累乘,時間複雜度為 \(\theta(n)\),\(n\) 為指數。**如下:

#define mod 10000007

long long power(long long base,long long n)

但是在處理正整數次冪時,可以使用一種時間複雜度為 \(\theta(\log_2n)\) 的演算法,就是我們要用的快速冪。

快速冪的思想是將指數拆分為若干個 \(2\) 次冪之和,然後分別進行計算。

為什麼這樣更快呢?我們想一下,如果在迴圈中乘上本身而不是乘上底數,即可得到若干的 \(2\) 次冪,求 \(2^i\) 次冪的時間複雜度就是 \(\theta(i)\),而樸素的演算法為 \(\theta(2^i)\)。

那麼怎麼將十進位制轉換為二進位制?不會的人請看下面。

我們舉乙個例子,我們要求 \(a\) 的 \(11\) 次冪。

我們將 \(11\) 轉換為二進位制數:

\[(11)_=(1011)_2

\]我們發現二進位制中,數字為 \(1\) 的數字為第 \(0\) 位、第 \(1\) 位和第 \(3\) 位,分別對應 \(2^0,2^1,2^3\),而 \(11\) 正好等於 \(2^0+2^1+2^3\)。

其實上述做法就是十進位制轉二進位制最常用的方法:按權展開。

因此,並根據同底數冪乘法原理:

\[a^=a^=a^\times a^\times a^

\]就可以實現用若干 \(2\) 次冪來表示指數再進行計算了。

如何用**實現呢?一般有迴圈和遞迴兩種。

while 迴圈實現

一般常用此方法,因為迴圈效率比遞迴高,個人也較喜歡此方法。下面的詳細解釋也以此方法為例。

在 while 迴圈中,指數不為 \(0\) 為迴圈條件,每次迴圈中將底數擴方,相應的指數除以 \(2\)。在遇到奇數時,代表乙個二次冪分解完,將答案乘上當前的底數。

**:

#define mod 10000007

long long qpower(long long base,long long n) //base 為底數,n 為指數。

return res;

}

結合 dev-c++ 的除錯功能我們可以更清楚的了解實現的過程,我們以計算 \(2^5\) 為例:

進入迴圈,初始賦值:

此時 \(n\) 為奇數,更新 res。同時更改 base(底數)、n(指數):

然後的 \(n\) 為偶數,res 不作操作,其他同上。

這是就是最後一次了,\(n\) 為 \(1\),最後一次更新。

然後 \(n\) 變成了 \(0\),跳出迴圈,此時 res 為 \(32\)。

遞迴實現:

遞迴實現的思路其實和迴圈是一樣的,我在這裡就簡單的貼乙個**:

#define mod 10000007

long long qpower(long long base,long long n)

前置知識:位運算基礎。

我們知道,計算機有乙個很神奇的運算,叫做位運算,它比普通運算快許多,那在快速冪中能不能用位運算優化呢?

肯定是能的。

首先>>表示右移,a>>i表示將 \(a\) 在二進位制下右移 \(i\) 位,低位丟棄。那麼不難想到,n/2就可以用n>>1來代替。

那麼在判定奇偶性時怎麼用位運算優化呢?首先,我們知道,如果乙個數是奇數,那麼它在二進位制下,末位一定是 \(1\)。根據這個特點,我們可以用按位與&這種運算來代替。

我們知道,\(1\) 的二進位制數是 \(0000\ldots 0001\),那麼將它和乙個奇數按位與,結果肯定是 \(0000\ldots 0001\),轉為十進位制就是 \(1\),偶數則為 \(0\)。因此,**中的n%2==1可以改為n&1

優化過的**:

#define mod 10000007

long long qpower(long long base,long long n)

return res;

}

這是第一篇筆記,可能有很多不足,我會逐漸改進。希望能越來越好吧。

學習筆記 快速冪

求 m n k 快速冪 m n k int quickpow int m,int n,int k return b 快速冪,通過將n轉換成二進位制的方法優化運算。例如n 37 的時候 37 2 5 2 2 2 0 那麼m 37 k m 2 5 2 2 2 0 k m 2 5 m 2 2 m 2 0 ...

快速冪學習筆記

使用一般方法來計算x nx n xn需要計算n nn次,而快速冪就是一種只需要計算log 2 n log 2 n log2 n 次就可以計算出x nx n xn的演算法。1.n an b na b n an b n nanb n a b 容易得很,是八年級數學內容吧 2.二進位制 假設n 10 10...

學習筆記 快速冪

定義 快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 o log n 與樸素的o n 相比效率有了極大的提高。舉例 以下以求a的b次方來介紹 把b轉換成二進位制數。該二進位制數第i位的權為2 i 1 例如a 11 a 2 0 2 1 2 3 11的二進位制是1011 11 2 1 2 0...