學習筆記——快速冪
阿新 • • 發佈:2018-10-31
蒟蒻寫文,難免疏忽,歡迎來踩!
快速冪的必要性
在講快速冪之前,有必要闡明快速冪的重要性。 快速冪之所以重要,是因為很多數論的題目都需要快速的求出某數的冪。在這種情況下,樸素演算法的O(n)時間複雜度難以滿足要求,故考慮使用快速冪。 快速冪的思路與實現(PRE)
首先我們來熟悉兩種位運算以及與之等價的十進位制運算。 第一種是向右位移,操作符是>>,操作符的左值是要進行位移的數,右值是位移位數。為了使筆記更加簡潔,我們在此只介紹>>1。>>1是指將被運算元轉換成二進位制後將數整體向右移動一位,以(10000101001) 2
剛才在介紹右位移操作時我們曾經提到任何一個十進位制整數都能轉換成2 n的和的形式。現在假設我們被要求求出a b。那麼我們可以將b分解為之前2的冪的和的形式,並使用右移一位的形式逐位判斷b的各個位。在判斷之後我們還需要對相應的結果進行操作,因此我們要維護一個變數,使之符合當前正在運算的數位,一旦判斷b當前的數位為1,則答案立即乘以維護好的變數。 給出上述思路的C++程式碼:
/* import guide: the macro NUM should be defined as a data type e.g. long long */ NUM quickPow(NUM a,NUM b){ NUM ans=1,curr=a; while(b!=0){ if(b&1!=0) ans*=curr; curr*=curr; b>>=1; } return ans; }
請注意快速冪本身並不處理上溢的錯誤,一定要按照使用時的要求合理定義變數型別!
快速冪的複雜度
快速冪演算法的時間複雜度是O(log n),因為快速冪只需要b的二進位制位數次操作。
快速冪演算法的空間複雜度是O(1),並不涉及到空間上的規模問題,因此是常數空間。