计算矩阵的第n个功率

Calculate nth power of a matrix

本文关键字:功率 计算      更新时间:2023-10-16

我正在尝试优化代码以计算矩阵的第n个功率。

我只打电话给multiplySquare n次,但这太慢了。问题是,它的构建良好,但是当我运行它时,我会在退出值1中获得故障。我相信我的算法是对的,所以是什么原因造成的?

[edit]添加了递归终止条件,但我仍然有相同的错误。

[再次编辑]我再次重新编写了递归部分,现在似乎有效,但仅适用于n的某些输入。我必须更多地玩它。任何帮助,将不胜感激。

void multiplySquare(long long A[2][2], long long B[2][2]){
    long long result[2][2];
    for (int i = 0; i < 2; i++){
        for (int j = 0; j < 2; j++){
            result[i][j] = 0;
            for (int k = 0; k < 2; k++){
                result[i][j] += A[i][k] * B[k][j];
            }
        }
    }
    for (int i=0; i<2; i++){
        for (int j=0; j<2; j++){
            A[i][j] = result[i][j]; 
        }
    }
}
void power(long long A[2][2], long long B[2][2], long long n){
    if(n/2 != 0){   
        power(A, B, n/2);
    }
    if(n%2 != 0){
        multiplySquare(A, B);
    }
}

计算 N的算法有效地 x的电源是:

如果N为零,请返回1
如果N是1,请返回x
计算(N/2)-电源。y = x^(N/2)
如果N均匀,返回y*y
如果N奇数,请返回x*y*y

如果将该逻辑转换为案例,则需要以下内容:

// Assuming that the result is returned in B.
void power(long long A[2][2], long long B[2][2], long long n)
{
   if ( n == 0 )
   {
      makeIdentity(B);
      return;
   }
   if ( n == 1 )
   {
      assign(A, B);  // Make B same as A.
      return;
   }
   power(A, B, n/2);
   multiplySquare(B, B);
   if(n % 2 != 0)
   {
      multiplySquare(B, A);
   }
}

我正在尝试优化我的代码以计算矩阵的第n个功率。

由于您的目标是优化,因此认为对角线矩阵具有微不足道的第n个功率,即主角元素的n-th-th-th-th-th-th-th-th-th-th-in-power。

因此,首先,您应该对角线矩阵。一种方法是找到您的初始矩阵,a的特征向量和特征值,并利用以下关系:

a = p d p -1

其中p是包含A,p -1 的(列(特征向量的矩阵 是它的逆,d是包含特征值的对角线矩阵。

然后:


上述方程式:

  1. 将一个升至第n个力量的地方很琐碎。
  2. 计算第n个功率。
  3. 返回原始位置。

看来您的摘要不是您的目标。我猜想你的意思是这样的:

void power(long long A[2][2], long long B[2][2], long long n){
    if (n == 1) {
        multiplySquare(A, B);
    }
    else if(n % 2 == 0) {
        power(A, B, n / 2);
        multiplySquare(A, A);
    }
    else {
        power(A, B, (n - 1) / 2);
        multiplySquare(A, A);
        multiplySquare(A, B);
    }