除了简单的分治算法,有没有更快的矩阵指数计算方法来计算Mn(其中M是一个矩阵,n是一个整数)?
除了简单的分治算法,有没有更快的矩阵指数计算方法来计算Mn(其中M是一个矩阵,n是一个整数)?
你可以将矩阵分解为特征值和特征向量。这样,您就可以获得
M = V * D * V^-1
其中 V 是特征向量矩阵,D 是对角矩阵。将其提高至 N 次方,则可以得到如下结果:
M^n = (V * D * V^-1) * (V * D * V^-1) * ... * (V * D * V^-1)
= V * D^n * V^-1
因为所有的V和V^-1项都会抵消。使用Euler快速幂算法非常简单。按照以下算法进行操作。
#define SIZE 10
//It's simple E matrix
// 1 0 ... 0
// 0 1 ... 0
// ....
// 0 0 ... 1
void one(long a[SIZE][SIZE])
{
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
a[i][j] = (i == j);
}
//Multiply matrix a to matrix b and print result into a
void mul(long a[SIZE][SIZE], long b[SIZE][SIZE])
{
long res[SIZE][SIZE] = {{0}};
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
for (int k = 0; k < SIZE; k++)
{
res[i][j] += a[i][k] * b[k][j];
}
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
a[i][j] = res[i][j];
}
//Caluclate a^n and print result into matrix res
void pow(long a[SIZE][SIZE], long n, long res[SIZE][SIZE])
{
one(res);
while (n > 0) {
if (n % 2 == 0)
{
mul(a, a);
n /= 2;
}
else {
mul(res, a);
n--;
}
}
}
long power(long num, long pow)
{
if (pow == 0) return 1;
if (pow % 2 == 0)
return power(num*num, pow / 2);
else
return power(num, pow - 1) * num;
}
平方取幂法 经常用于获取矩阵的高次幂。
我建议使用计算斐波那契数列的矩阵形式。据我所知,它的效率为O(log(n))。