矩陣快速冪之整數快速冪

如果現在要算X^8:則 X*X*X*X*X*X*X*X 按照尋常思路,一個一個往上面乘,則乘法運算進行7次。
但如果我們這樣算 (X*X)(X*X)(X*X)*(X*X)
這種求法,先進行乘法得X^2,然後對X^2再執行三次乘法,這樣去計算,則乘法運算執行4次。已經比七次要少。所以爲了快速算的整數冪,就會考慮這種結合的思想。
現在的問題是如何分配才能讓乘法運算的次數最少。
例如:X^19次方。
19的二進制爲:1 0 0 1 1 。
由(X^m)*(X^n) = X^(m+n)
則X^19 = (X^16)(X^2)(X^1)
那麼怎麼來求解快速冪呢。請看下列代碼:
求解X^N的值。

int QuickPow(int x,int N)
{
    int ans = 1,res = x;
    while(N){
        if(N&1)
            ans *=res;
        res *= res;
        N>>=1;
    }
    return ans;
}

那麼讓我們來看看下面這段代碼到底對不對:
對於X^19來說:
19的二進制爲:1 0 0 1 1
初始:ans = 1; res = x;
則10011最後一位是1,所以是奇數。
ans = res*ans = x;
res = res*res = x^2;
然後右移一位,1 0 0 1
則1001最後一位是1,所以是奇數
ans = res*ans = x*(x^2) = x^3
res = res*res = x^2*x^2 = x^4
然後右移一位,1 0 0
則最後一位是0,所以當前的數爲偶數。
res = res*res = x^4*x^4 = x^8
然後右移一位,1 0
最後一位是0,當前數是偶數。
res = res*res =x^8*x^8= x^16
然後右移一位,1
最後一位是1,當前數是奇數
ans = ans*res = (x^3)*(x^16) = x^19
res = res*res = x^32
可以看出res = X^m,m 始終是與二進制位置上的權值是相對應的。當二進制位爲0時,我們只讓res*res使冪指數*2.對應下一個二進制位的權值,當二進制位爲1時,ans = ans*res 。則乘上了該乘的X冪次。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章