线性代数 —— 矩阵快速幂
生活随笔
收集整理的這篇文章主要介紹了
线性代数 —— 矩阵快速幂
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【概述】
矩陣快速冪利用矩陣的乘法與整數(shù)快速冪的結(jié)合,能夠快速的算出?n 階方陣?A 的 M 次冪 A^b,其結(jié)果仍是一個(gè)矩陣,無(wú)具體含義,在信息學(xué)競(jìng)賽中,矩陣快速冪常用于求解線(xiàn)性遞推關(guān)系。
關(guān)于矩陣的基礎(chǔ)知識(shí):點(diǎn)擊這里
關(guān)于線(xiàn)性遞推關(guān)系:點(diǎn)擊這里
【n*m 矩陣的快速冪】
struct Matrix{LL s[N][N]; }; Matrix e;//單位矩陣E Matrix x;//構(gòu)造矩陣 void init(int n){for(int i=1;i<=n;i++)//主對(duì)角線(xiàn)為1e.s[i][i]=1; } Matrix mul(Matrix A,Matrix B,LL n){//矩陣乘法,n代表A、B兩個(gè)矩陣是n階方陣Matrix temp;//臨時(shí)矩陣,存放A*B結(jié)果for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)temp.s[i][j]=0;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++)temp.s[i][j]=((temp.s[i][j]+A.s[i][k]*B.s[k][j])%MOD+MOD)%MOD;return temp; } Matrix quickPower(Matrix a,LL b,LL n){//矩陣快速冪,求n階矩陣a的b次冪Matrix ans=e;while(b){if(b&1)ans=mul(ans,a,n);//ans=e*aa=mul(a,a,n);//a=a*ab>>=1;}return ans; } int main(){LL n,m; //構(gòu)造矩陣的大小、階scanf("%lld%lld",&n,&m);init(n);//單位矩陣初始化for(int i=1;i<=n;i++)//輸入構(gòu)造矩陣,也可通過(guò)題目的遞推公式來(lái)構(gòu)造矩陣for(int j=1;j<=n;j++)cin>>x.s[i][j];Matrix res=quickPower(x,m,n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)printf("%lld ",res.s[i][j]);printf("\n");}return 0; }【1*n?矩陣的快速冪】?
struct Matrix{LL s[N];//1*n的矩陣 }; Matrix e;//單位矩陣E Matrix x;//構(gòu)造矩陣x void init(int n){//單位矩陣的第一行for(int i=1;i<=n;i++)e.s[i]=0;e.s[1]=1; } Matrix mul(Matrix A,Matrix B,LL n){//矩陣乘法Matrix temp;//臨時(shí)矩陣,存放矩陣A*矩陣B的結(jié)果for(int i=1;i<=n;i++)temp.s[i]=0;for(int i=1;i<=n;i++)for(int j=1;j<=i;j++)temp.s[i]=(temp.s[i]+(A.s[j]*B.s[i-j+1])%MOD)%MOD;return temp; } Matrix quickPower(Matrix A,LL k,LL n){//矩陣快速冪Matrix res=e;while(k){if(k&1)res=mul(A,res,n);//res=A*eA=mul(A,A,n);//A=A*Ak>>=1;}return res; } int main(){LL n,k;scanf("%lld%lld",&n,&k);init(n);for(int i=1;i<=n;i++)//構(gòu)造矩陣初始值,根據(jù)題目要求推導(dǎo)x.s[i]=1;Matrix res=quickPower(x,k,n);//k次冪for(int i=1;i<=n;i++)printf("%d ",res.s[i]);printf("\n");return 0; }【矩陣 1~k 次冪的和】
原理:二分求和
- 當(dāng) n 是奇數(shù)時(shí):
- 當(dāng) n 是偶數(shù)時(shí):
【經(jīng)典問(wèn)題:共軛矩陣的構(gòu)造】
1.問(wèn)題
對(duì)于給出的 a、b、m、n,當(dāng)滿(mǎn)足? 時(shí),求:
2.思路
設(shè)?,配項(xiàng)?,并令?
由于 An、Bn 恰好共軛,因此 An、Bn 的和與積均為有理數(shù)
根據(jù)??,可知 Bn<1
因此?,那么?
故而可根據(jù) Cn 來(lái)構(gòu)造共軛矩陣,進(jìn)行矩陣快速冪來(lái)求 Sn
3.共軛式的構(gòu)造
根據(jù)??構(gòu)造共軛矩陣
對(duì) Cn 兩端同乘?,有:
進(jìn)行化簡(jiǎn):
寫(xiě)成矩陣形式:
再遞推一步:
其中,
然后根據(jù)構(gòu)造的矩陣進(jìn)行矩陣快速冪計(jì)算結(jié)果即可
【例題】
總結(jié)
以上是生活随笔為你收集整理的线性代数 —— 矩阵快速幂的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Color the ball(HDU-1
- 下一篇: 小木棍(洛谷-P1120)