阅读本知识点的基本条件
知道什么是矩阵,以及知道如何进行矩阵的乘法。
什么是矩阵快速幂
和快速幂一样,矩阵快速幂是一种可以在O(lognlogn)的时间复杂度内求出矩阵的nn次方的算法。
如何写矩阵快速幂
前提1
封装好一个矩阵
struct Matrix{
...
friend Matrix operator * (Matrix a, Matrix b) {
...
}
};
或者
class Matrix{
private :
...
public :
...
friend Matrix operator * (Matrix a, Matrix b) {
...
}
};
前提2
找到一个单位1矩阵,也就是说对于任何一个相同大小的矩阵,它乘上单位1矩阵得到的新矩阵都是它自己。
怎么找一个单位1矩阵呢
你可以自己尝试矩阵构造,这里不多做说明,直接给出结果。
对于一个的矩阵,设它的单位1矩阵为one,那么:
memset(one, 0, sizeof(one));
for (int i = 1; i <= x; i++) {
one[i][i] = 1;
}
之后就和普通的快速幂没什么区别了
递归代码(求anan) :
Matrix Kasumi(int n) {
if (n == 0) {
return one;
}
Matrix res = Kasumi(n / 2);
res = res * res;
if (n % 2 == 1) {
res *= a;
}
return res;
}
非递归代码:(求anan)
Matrix Kasumi(int n) {
Matrix res = one, base = a;
while (n) {
if (b % 2 == 1) {
ans = ans * base;
}
base = base * base;
b /= 2;
}
return res;
}
至于取膜
friend Matrix operator % (Matrix a, int mod) {
...
}
之后像快速幂一样取膜即可
矩阵快速幂有什么用
矩阵快速幂可以用来求一些数列的第几项的值:比如求斐波那契数列第1000000000位的值。
或者,用矩阵快速幂优化线性DP。
矩阵快速幂是一种高效的算法,能在O(lognlogn)的时间复杂度内计算矩阵的nn次方。该算法首先需要理解矩阵乘法和单位矩阵的概念。找到单位矩阵后,通过递归或非递归的方式实现快速幂运算。矩阵快速幂的应用包括解决数列问题,如斐波那契数列,以及优化线性动态规划问题。
711

被折叠的 条评论
为什么被折叠?



