快速冪求x的n次方

2021-07-23 16:50:01 字數 1191 閱讀 7648

o(logn)的時間複雜度求x的n次方,x為自然數,n為整數?

如果 power=5 為奇數,result儲存當前的多餘的乙個4,並在返回結果時一併與結果相乘。

2^10 = (2*2) * (2*2) * (2*2) * (2*2) * (2*2)= 4 ^5 = 4^4 * 4

4^4 = (4*4) * (4*4) = 16 ^ 2

16^2 = 16 * 16 = 256

如果 power=1 時,結果返回base=256

256^1 = 256

求x^y?

y使用二進位制數表示:

y = 2^y0 + 2^y1 + 2^y2 + 2^y3 + ... + 2^yn

x^y = x^(2^y0 + 2^y1 + 2^y2 + 2^y3 + ... + 2^yn)

= x^(2^y0) * x^(2^y1) * x^(2^y2) * x^(2^y3) * ... * x^(2^yn-1) * x^(2^yn)

證明:x^(2^yn) = (x^(2^yn-1))^(2^yn-1), yn = 2 * yn-1 ?

x^(2^yn) = x^(2^(2 *yn-1))

= x^(2^yn-1 * 2^yn-1)

= (x^(2^yn-1))^(2^yn-1)

int fast_pow(int

base, int power)

int fast_pow2(int

base, int power)

return result * value;

}

f(n)函式為fast_power演算法的執行的基本操作的執行次數

f(1) = 0

f(n) = f(n/2)+1

= f(n/2^2) + 1 + 1

... = f(n/2^k) + k

當n/2^k = 1,k=logn,f(n) = logn

則fast_power演算法的時間複雜度為o(logn)

空間複雜度為o(1)

fast power algorithm: c/c++ and python code

快速冪 exponentiation by squaring | 黃鈺程

fast power

快速冪非遞迴實現(即求x的n次方)

如果用遞迴的方法求冪,可以是這樣的 double pow double x,unsigned int n 注意 n若為乙個奇數,那麼它對應的二進位制最後一位一定是1,與上1最終一定是1 上面的n為非負,如果要求負數次冪,可以先求正數次冪再用1除之 上述方法雖然簡單,但是效率並不高.因為函式呼叫的代價...

求x的N次冪

典型的減小時間複雜度的做法是記住程式已經做的事情,避免在做重複的事情,比如使用n 1個迴圈乘法就是一直在做重複的乘x。通過記住x,x2,x4,等資料,可以大大減小時間的複雜度。程式如下 包含標頭檔案 include include using namespace std double pow int...

快速冪(求a的b次方 求餘運算)

求a的b次方 public static intquickpower int a,int b base base base自乘,由a 2 n 變成a 2 n 1 b 1 位運算,b右移一位,如1010變成101 把最右邊的1移掉了 除以2 1 return ans 取餘運算 取餘運算有一些好用的性質...