矩阵快速幂
矩阵乘法
两个矩阵要想相乘必须一个矩阵的行等于另一个矩阵的列
矩阵乘法的性质:单位矩阵 * 矩阵 = 原矩阵
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <stdbool.h>
#define u unsigned
#define ll long long
#define sc scanf
#define pr printf
#define fr(i, j, n) for (int i = j; i < n; i++)
#define N 10
int main(int argc, char* argv[])
{
int ans[2][2] = { 0 };
int a[2][2] = {
{1, 3}, {2, 3}
};
int b[2][2] = {
{1, 0}, {0, 1}
};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
for (int k = 0; k < 2; k++) {
ans[i][j] += a[i][k] * b[k][j];
}
}
}
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
pr("%d ", ans[i][j]);
}
pr("\n");
}
return 0;
}
这个就是矩阵相乘的代码,那么矩阵的幂怎么算呢?其实和快速幂是一样的思想,利用倍增的思想。
但在数字的快速幂中,有一个起始值也就是1,那么在矩阵快速幂中这个起始值就是单位矩阵。
那么对于一个固定的一维k阶的递推式,我们可以利用矩阵快速幂来在log的时间下求出来。
例如:斐波那契数列
这个就是关于斐波那契的推导,但对于其他的一维k阶也成立只要是固定关系的