快速冪與快速冪取模

2021-10-02 05:17:44 字數 855 閱讀 9171

正常的求冪就是一直累乘如下

#include

intmain()

}

這種方法實現很簡單,但是有時候挺浪費時間,於是就有了快速冪。

關於快速冪,用乙個簡單的例子說明比較容易理解。

關於nm舉乙個實際,比如2^11。

通常我們使用累乘法需要運算10次。

211 = 2* 2* 2* 2* 2* 2* 2* 2* 2* 2* 2。

而我們可以將11轉化為二進位制可為1011,變成加權的表示式為

11 = 1* 20 + 1* 21 + 0* 22 + 1* 23。

211 = 2^(1* 20) * 2^(1* 21) * 2^(1* 23) 。

而我們只需要計算乘到23和三次累加操作即可,明顯降低了運算時間。

我們可以通過位運算直接逐位獲得m為尾值,遇0將2累乘,遇1將累乘的值乘到結果,即可得到結果。

**如下

#include

intmain()

}int

pow(

int n,

int m)

return ans;

}

快速冪取模需要用到數學裡的乙個公式:

ab % c = (a % c)b % c。

在快速冪的基礎上,我們可以很快將改進程式寫出。

#include

intmain()

}int

pow(

int n,

int m,

int c)

return ans;

}

如此即為快速冪取模

快速冪與快速冪取模

快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 o log?n 與樸素的o n 相比效率有了極大的提高。而快速冪取模就是對冪運算後結果進行取模運算。在程式設計過程中可能會遇到要求乙個很大的數的模,為了得到乙個能計算更大範圍,速度更快的演算法,快速冪取模演算法應運而生。一.計算冪,計算a ...

快速冪與快速冪取模

對大數時間複雜度的優化,具體操作是利用二進位制操作 11的二進位制是1011,11 2 1 2 0 2 1 2 1,因此,我們將a 轉化為算 a 20 a 21 a 23 看出來快的多了吧原來算11次,現在算三次 運算還可以判斷奇偶x 1 0為偶,x 1 1為奇 int ksm int a,int ...

快速冪與快速冪取模

intmi int a,int b return num 這種暴力求法的時間複雜度是o n 為了降低時間複雜度,我們引用快速冪,它的時間複雜度縮短到o logn 我認為快速冪之所以快,主要是運用到了位運算。對於位運算,我們舉個例子 比如 2 13 13的二進位制為1101,那我們可以得到1 2 0 ...