有時程式需要計算某數的正整數次冪,這在該冪指數不大時容易完成。例如,73可以通過計算7×7×7很容易地得到結果343。對於較大的冪,例如7102×187×291,這種計算過程是十分緩慢的。
注 計算較大的冪如7102×187×291可能很緩慢。但如果不是這種求冪運算在某些重要密碼學中得到應用,人們也許不會十分關心它。
幸運的是,有一種較快的方法來執行這種運算。這種方法基於乘方運算的兩個關鍵法則:
當這個冪是二次冪時,第乙個法則可以迅速地計算出a的冪。
第二個法則能將這些a的冪結合以產生想要的結果。
以下偽**展示了這個演算法:
例如要計算出76。首先演算法計算出71、72、74。由於下乙個指數8比所需的6大,因此演算法停止。
接下來演算法使用第二個法則來從已經產生的二次冪中生成76。如果將6看作2的冪的和,6=2+4。使用第二個法則,得到76=72×74=49×2 401=117 649。
執行這個運算進行兩次乘法來計算72和74再加上一次乘法來獲得最終結果,即總共進行三次乘法運算。這比簡單計算7×7×7×7×7×7進行了更少的乘法運算,但在本例中這只是乙個小小的不同。
更普遍地,對於指數p,演算法進行log(p)次運算來得到a的p次冪。然後演算法檢驗a的二進位制位數來確定它應當將其中的哪些乘在一起以獲得最終結果。(如果p的二進位制位數是1,那麼最終的結果應當包含2的相應冪。在前例中,6的二進位制表示是110,因此需要計算2的二次冪和四次冪,即22和24。)
在二進位制中,數值p有log2(p)位,因此總共的執行時間複雜度是o(log p)+o(log p)=o(log p)。即使p為一百萬,log(p)大約只有20,因此這個演算法需執行20步左右(至多40次乘法)。這比一百萬要小得多。
這種演算法的乙個限制是當指數很大時,冪增長得過快。即使乙個如7300這樣「小」的值也有254個十進位制位。這意味著用來計算大指數冪龐大數相乘的過程是緩慢的,並且需要大量計算空間。
幸運的是,這種龐大的冪運算的最常見應用是加密演算法,這種演算法的運算限制在某個模中。儘管這個模通常較大,但仍能限制住運算數和結果的大小。例如如果某模有100位,兩個100位數的積就不會大於200位。那麼,接下來可以再次用這個模來得到乙個不大於100位的結果。雖然用模將每乙個數減小使得每步運算稍微變慢,但也意味著可以計算幾乎無限大的值。
大數求冪運算
題目 小明是個小學五年級的學生,為了早點去看自己愛看的 他想快點把作業做完。可是可惡的數學老師今天卻布置了一道難題,小明想了很久也不知道該怎麼做。你的任務就是幫小明解決掉這道數學題。題目是這樣子的,有乙個整數a 2 31 a 2 31 1 計算它的整數冪 a n,其中 1 n 99 第一行是乙個整數...
快速求冪演算法
我們知道在數學表示式中pow x,n 表示求x n的冪。一般情況下,如果我們要寫乙個程式的話,最簡單的程式可能是這樣的 int pow int x,int n return result 通過使用如上的程式,2 4 2 2 2 2,在程式中做了4 1 3次乘法,但是有沒有更高效的演算法來減少乘法的次...
快速求冪演算法
在寫乙個數的冪運算的時候我們通常會想到比較直觀的o n 演算法,如下 include int main printf d res 最近在做資料結構習題的時候學習到了一中快速求冪演算法,時間複雜度為log2 n 這個演算法運用到了二進位制數的除2運算,二進位制的除法與十進位制基本類似,下面舉乙個例子2...