日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线性代数 —— 矩阵快速幂

發布時間:2025/3/17 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线性代数 —— 矩阵快速幂 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【概述】

矩陣快速冪利用矩陣的乘法與整數快速冪的結合,能夠快速的算出?n 階方陣?A 的 M 次冪 A^b,其結果仍是一個矩陣,無具體含義,在信息學競賽中,矩陣快速冪常用于求解線性遞推關系。

關于矩陣的基礎知識:點擊這里

關于線性遞推關系:點擊這里

【n*m 矩陣的快速冪】

struct Matrix{LL s[N][N]; }; Matrix e;//單位矩陣E Matrix x;//構造矩陣 void init(int n){for(int i=1;i<=n;i++)//主對角線為1e.s[i][i]=1; } Matrix mul(Matrix A,Matrix B,LL n){//矩陣乘法,n代表A、B兩個矩陣是n階方陣Matrix temp;//臨時矩陣,存放A*B結果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; //構造矩陣的大小、階scanf("%lld%lld",&n,&m);init(n);//單位矩陣初始化for(int i=1;i<=n;i++)//輸入構造矩陣,也可通過題目的遞推公式來構造矩陣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;//構造矩陣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;//臨時矩陣,存放矩陣A*矩陣B的結果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++)//構造矩陣初始值,根據題目要求推導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 次冪的和】

原理:二分求和

  • 當 n 是奇數時:
  • 當 n 是偶數時:
struct Matrix{LL s[N][N]; }; Matrix add(Matrix A,Matrix B){//A+BMatrix temp;for(int i=0;i<n;i++)for(int j=0;j<n;j++)temp.s[i][j]=(A.s[i][j]+B.s[i][j])%mod;return temp; } Matrix sum(Matrix A,int k){//A+A^2+A^3+…+A^kif(k==1)return A;if(k%2){Matrix temp=sum(A,k-1);Matrix pow=quickPow(A,k);return add(temp,pow);}else {Matrix temp=sum(A,k>>1);Matrix pow=add(quickPow(A,k>>1),E);return mul(temp,pow);} }

【經典問題:共軛矩陣的構造】

1.問題

對于給出的 a、b、m、n,當滿足? 時,求:

2.思路

設?,配項?,并令?

由于 An、Bn 恰好共軛,因此 An、Bn 的和與積均為有理數

根據??,可知 Bn<1

因此?,那么?

故而可根據 Cn 來構造共軛矩陣,進行矩陣快速冪來求 Sn

3.共軛式的構造

根據??構造共軛矩陣

對 Cn 兩端同乘?,有:

進行化簡:

寫成矩陣形式:

再遞推一步:

其中,

然后根據構造的矩陣進行矩陣快速冪計算結果即可

【例題】

  • Fast Matrix Calculation(HDU-4965)(矩陣化簡):點擊這里
  • So Easy!(HDU - 4565)(共軛矩陣的構造):點擊這里
  • Partial Sums(CF-223B)(1*n 的矩陣快速冪):點擊這里
  • 總結

    以上是生活随笔為你收集整理的线性代数 —— 矩阵快速幂的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。