矩陣乘法與斐波那契

2021-08-03 12:35:34 字數 1470 閱讀 5322

a*b,只有當a的列數等於b的行數時才有意義,即a為n∗

m 的矩陣,b為m∗

l 的矩陣。矩陣的乘法定義如下: [a

dbec

f]∗⎡

⎣⎢gi

khjl

⎤⎦⎥=

[ag+

bi+c

kdg+

ei+f

kah+

bj+c

ldh+

ej+f

l] 即

ci,j

=∑k=

1ma[

i][k

]+b[

k][j

] 由定義可知,矩陣乘法滿足結合律,但不滿足交換律。

矩陣乘法可以用來優化很多線性遞推式,下面以求斐波那契為例。

我們知道,f[

n]=f

[n−1

]+f[

n−2]

,可以構造乙個矩陣a,使得a*[f

[n]f

[n−1

]]=[

f[n]

+f[n

−1]f

[n]]

,這樣,初始矩陣[1

0]每乘一次a陣列,矩陣的第一位就往下推了乙個,那麼,要求第n項只要乘n-1次,而由於矩陣的乘法是滿足結合律的,所以可以用快速冪來求矩陣a的n-1次冪,複雜度大大降低。

那麼,如何設計矩陣a呢?

顯然,a是乙個2*2的矩陣,設a=

[acb

d]則a∗[

f[n]

f[n−

1]]=

[a∗f

[n]+

b∗f[

n−1]

c∗f[

n]+d

∗f[n

−1]]

,顯然,a=1,b=1,c=1,d=0,這樣,我們就構造出a=

[111

0]剩下的事就交給快速冪了。

下面附上poj3070的**:

#include

#include

#include

#define maxn 5

#define tt 10000

using

namespace

std;

inline

char nc()

inline

int _read()

struct matrix

return c;

}};int n;

matrix g,ans;

matrix power(matrix x,int y)

int main()

if(n==1)

g=power(g,n-1);

ans=g*ans;

printf("%d\n",ans.a[1][1]);

n=_read();

}return

0;}

斐波那契數列 矩陣乘法

f 1 1 f 2 1 f n f n 1 f n 2 n 2 且 n 為整數 題目描述 請你求出 f n mod 1000000007 的值。輸入輸出格式 輸入格式 第 1 行 乙個整數 n 輸出格式 第 1 行 f n mod 1000000007 的值 輸入輸出樣例 輸入樣例 1 5輸出樣例 ...

矩陣乘法 斐波那契數列II III IV

ii 求出斐波那契數列的第n項 1 n 2 31 模10000的值 iii 求出f n f n 2 f n 1 1模9973的值 iv 求出f n f n 2 f n 1 n 1模9973的值 f 1 f 2 1 ii 矩陣乘法,設矩陣 那麼顯然可以乘矩陣 得到矩陣 那麼得式子 a 即 a 1 同時...

矩陣乘法 求斐波那契數列

先簡單介紹一下矩陣乘法求斐波那契數列的原理 f n 是第n項的值。f 1 1 f 2 1 f n f n 1 n 2 下面的介紹是我從網上查到了,收益匪淺。分兩步推導 問題的求解就變成 二分法可用遞迴和非遞迴來求 下面是 定義矩陣 struct matrix 定義2 2的矩陣 void mul ma...