矩阵快速幂

355 字
2 分钟
矩阵快速幂

快速幂#

int qp(int a, int b) { //quick_power
int ans = 1;
for (; b; b >>= 1) {
if (b & 1) ans = (long long)ans * a;
a = (long long)a * a;
}
return ans;
}

矩阵乘法#

设A为m×pm \times p的矩阵,B为p×np \times n的矩阵,那么称m×nm \times n的矩阵C为矩阵A与B的乘积,记作C=ABC = AB,其中矩阵C中的第ii行第jj列元素可以表示为: Ci,j=∑k=1pai,k×bj,kC_{i,j}=\sum\limits_{k=1}^p a_{i,k} \times b_{j,k} 如下所示: [abcdef]×[ghijkl]=[ag+ch+ei,aj+ck+elbg+dh+fi,bj+dk+fl]\begin{bmatrix}a&b\\c&d\\e&f\end{bmatrix} \times \begin{bmatrix}g&h&i\\j&k&l\end{bmatrix} = \begin{bmatrix}ag+ch+ei,&aj+ck+el\\bg+dh+fi,&bj+dk+fl\end{bmatrix}

代码#

jz operator*(const jz& x, const jz& y) //为了方便快速幂采用运算符重载
{
jz z;
z.n = x.n;
for (int = 1; i <= z.n; ++i)
for (int j = 1; j <= z.n; ++j)
z.e[i][j] = INF;
for (int k = 1; k <= z.n; ++k)
for (int i = 1; i <= z.n; ++i)
for (int j = 1; j <= z.n; ++j)
z.e[i][j] += x.e[i][k] + y.e[k][j];
return z;
}

所以,矩阵快速幂即为作若干次矩阵乘法,代码如下:

完整代码#

#define N 1010
struct jz //矩阵
{
short n;
long long e[N][N];
} a;
jz operator*(const jz& x, const jz& y)
{
short i, j, k;
jz z;
z.n = x.n;
for (i = 1; i <= z.n; ++i)
for (j = 1; j <= z.n; ++j)
z.e[i][j] = INF;
for (k = 1; k <= z.n; ++k)
for (i = 1; i <= z.n; ++i)
for (j = 1; j <= z.n; ++j)
if (x.e[i][k] + y.e[k][j] < z.e[i][j])
z.e[i][j] = x.e[i][k] + y.e[k][j];
return z;
}
jz qp(jz a, int b) { //quick_power
jz ans = 1;
for (; b; b >>= 1) {
if (b & 1) ans = (long long)ans * a;
a = (long long)a * a;
}
return ans;
}

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

矩阵快速幂
https://azusaaa.com/posts/matrix-quick-power/
作者
dsyfb_437
发布于
2020-08-15
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
dsyfb_437
与你的日常,就是奇迹
公告
欢迎来到我的博客!这里主要记录算法竞赛与工程相关的内容。
分类
标签
最新动态
站点统计
文章
7
分类
3
标签
11
总字数
29,352
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录