1. 程式人生 > >完全理解乘法快速冪及其兩種寫法的解析

完全理解乘法快速冪及其兩種寫法的解析

an=?0n10105
沒錯,乘法快速冪就是解決上述問題的。

乘法快速冪的思想

可以看到,要求一個數的an次冪,而且這個n非常大,如果利用迴圈來處理,O(n)的時間複雜度對於計算機的處理速度來說是遠遠不夠的;

迴圈既然不能滿足要求,那我們能不能加速一下這個迴圈呢,比如O(n)O(logn)的優化呢?

迴圈的做法是把這個式子展開:

an=a×a×an

然後從左到右依次相乘,最後得到結果。但是仔細一看可以知道:

an=a×a×an2×a×a×an2×(a|1)=an2×an2×(a|1)

按照迴圈的做法,當求出了an2的時候,後面的an2你也就知道了,不需要再計算了,但是迴圈的做法還是會計算,這也就導致了效率低下,沒有用到之前的計算結果。

你是不是很快就會想到:在迴圈的做法中,當算出a1的時候馬上就可以知道a2,那麼很快就可以知道a4,……,沒錯,確實是這樣,但是問題來了,這樣的遞增如何才能保證你剛好就算到了an。有可能你跨過了an,這些都是存在的;

出現上面這種情況是因為你用到了倍增的想法(這個想法可以用在快速冪的非遞迴實現中),從小到大,而如果把這個問題倒過來看:要求

an,是不是要先求an2;要求an2,是不是要求an4,……,那麼這裡n有可能是奇數,沒關係啊,是奇數我們就把答案再多乘一個a,即a2k+1=ak×ak×a。這樣最終我們要解決的問題就是a0a0=1啊,這麼一說,乘法快速冪的遞迴寫法是不是就呼之欲出了。

快速冪的高效

不過這裡先說一下乘法快速冪的時間複雜度,由於遞迴版的乘法快速冪是基於二分遞迴的,因此時間複雜度為O(logn),那麼在文首的那個背景下,