1. 程式人生 > >整數快速冪與矩陣快速冪算法詳解

整數快速冪與矩陣快速冪算法詳解

-m 技術分享 .com 需要 作用 鏈接 結合 奇數 title

轉載自:https://www.cnblogs.com/cmmdc/p/6936196.html

以防鏈接失效以失去如此好的博客,故復制一份以防丟失。

矩陣快速冪基礎講解

1.基礎知識儲備篇

矩陣的相關運算會再線性代數中學到。
1.1矩陣的定義:
技術分享圖片? N階方陣(N階矩陣):行數m與列數n相同的矩陣,如下圖所示就是一個44的方陣:*

技術分享圖片

行矩陣(行向量):只有一行的矩陣,下圖就是一個行矩陣:
? 技術分享圖片

列矩陣(列向量):只有一列的矩陣,下圖就是一個列矩陣:
?

技術分享圖片

同型矩陣:設先有矩陣A和矩陣B,矩陣A的行數與列數和矩陣B的相同,則矩陣A、B是同型矩陣。

技術分享圖片

?

單位矩陣:在矩陣的乘法中,有一種矩陣起著特殊的作用,如同數的乘法中的1,這種矩陣被稱為單位矩陣.它是個方陣,從左上角到右下角的對角線(稱為主對角線)上的元素均為1。除此以外全都為0。如下圖所示是一個3階的單位矩陣。


···

技術分享圖片

1.2矩陣的相關運算:
矩陣加法:
技術分享圖片

矩陣乘法
技術分享圖片

2.矩陣快速冪引入篇

整數快速冪:
為了引出矩陣的快速冪,以及說明快速冪算法的好處,我們可以先求整數的冪。
如果現在要算X^8:則 XXXXXXXX 按照尋常思路,一個一個往上面乘,則乘法運算進行7次。
(X
X)(XX)(XX)(XX)
這種求法,先進行乘法得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的值。
///整數快速冪,計算x^N

int QuickPow(int x,int N)
{
    int res = x;
    int ans = 1;
    while(N)
    {
        if(N&1)
        {
            ans = ans * res;
        }
        res = res*res;
        N = 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時,我們只讓resres使冪指數2.對應下一個二進制位的權值,當二進制位為1時,ans = ans*res 。則乘上了該乘的X冪次。
2.矩陣快速冪算法篇

看了一個整數數的快速冪,現在我們就正式介紹矩陣快速冪算法。假如現在有一個n*n的方陣A。所謂方陣就是行數和列數相等的矩陣,先給出一個數M,讓算矩陣A的M次冪,A^M.在此只要求計算並不需要去深究這個矩陣到底是什麽含義。則上面代碼可以化為。
技術分享圖片

上面只是簡單的計算矩陣的冪,大家會感覺很抽象,因為上述矩陣並沒有具體的含義,
現在就舉例說明矩陣快速冪在實際運用中的意義:
以最常見的斐波那契數列為例:眾所周知:斐波那契數列遞推公式為:
F[n] = F[n-1] + F[n-2]. 由f[0]=0,f[1]=1,可以遞推後面的所有數。
在以前,我們會常常用for循環,這是最直接的算法。
POJ 3070 題目,讓求斐波那契數列,其n更是高達10億。
直接遞推的局限性:
(1)本題讓你遞推的斐波那契數n高達10億。測試時間僅1秒的時間,for循環用遞推公式遞歸導致超時。
(2)想要打表實現隨機訪問根本不可能,先把斐波那契數列求到10億,然後想去進行隨機訪問。題目未給出那麽多內存,數組也開不到10億。
因此它可以用矩陣快速冪來寫。
觀察f[n] = f[n-1]+f[n-2] 第n相是由第n-1項和第n-2項遞推而來。
同理,第n+1項由第n項和第n-1項遞推而來。
因此可以用矩陣表示:
技術分享圖片

則,知道f[n-1]、f[n-2]則乘上左方矩陣,就能得到等號左側矩陣,第一個位置
即為要求的f[n]。

整數快速冪與矩陣快速冪算法詳解