矩陣快速冪基礎講解

2021-08-25 11:14:27 字數 3127 閱讀 6870

1.基礎知識儲備篇

n階方陣(n階矩陣):行數m與列數n相同的矩陣,如下圖所示就是乙個4x4的方陣:*

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

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

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

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

矩陣加法:

矩陣乘法

2.矩陣快速冪引入篇

整數快速冪:

為了引出矩陣的快速冪,以及說明快速冪演算法的好處,我們可以先求整數的冪。

如果現在要算x^8:則 ******xx 按照尋常思路,乙個乙個往上面乘,則乘法運算進行7次。

(xx)(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)

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]。

python實現**:

小白回顧 矩陣快速冪講解

part i 首先理解一般的快速冪 為快速求a b,我們可以採用折半的思想 1 當b為偶數時,a b a b 2 a b 2 2 當b為奇數時,a b a a b 2 a b 2 int quick mi int a,int b a a a 偶數折半 b b 1 位運算折半,其實還可以寫為b b 2...

矩陣快速冪 模板與簡單講解

模板 快速冪模板 1 void solve matrix t,long longo 2 1617 o 1 18 19 t mul t,t 20 2122 long long res 0 23 24for int i 0 i d i 25 res res e.a 0 i f d i 1 m 2627 ...

快速冪(矩陣快速冪)

求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...