乘以矩阵c ++

时间:2014-03-25 17:59:29

标签: c++ matrix linear-algebra

我想制作一个能够将2x2矩阵提升到k功率的程序。我知道如何制作一个能够解决它的问题,但是一旦我想达到更高的功率,我就很难保存我的结果并在下一个等式中使用它。 a,b,c,d是矩阵中的数字,n是我想要一次做的矩阵量,k是我希望矩阵被摄取的功率,m是我想要使用的模数在数字上。我知道有一种方法可以很简单地做到这一点,但我无法找到一种很好的方法来使用我之前在下一个等式中完成的等式的结果。

#include <iostream>

using namespace std;

int mnoz(int a, int b, int c,int d,int m){

    int a2 = (a*a + c*b) % m;

    int b2 = (a*b + b*d) % m;

    int c2 = (c*a + d*c) % m;

    int d2 = (c*b + d*d) % m;
    return a2, b2, c2, d2;
}

int main()

{

    int a, b, c, d, k, m, n;

    int e, f, g, h;

    int e2, f2, g2, h2;

    cin >> n;



    // a^k = (a^2)^k/2

    for (int i = 0; i<n; i++){

        cin >> a >> b >> c >> d >> k >> m;

        if (k == 1){

            cout << a << " " << b << " " << c << " " << d << endl;



        }



        else if (k == 2){

            e = (a*a + c*b) % m;

            f = (a*b + b*d) % m;

            g = (c*a + d*c) % m;

            h = (c*b + d*d) % m;

            cout << e << " " << f << " " << g << " " << h << endl;

        }
        else{

            if (k % 2 == 0){
                e = (a*a + c*b) % m;

                f = (a*b + b*d) % m;

                g = (c*a + d*c) % m;

                h = (c*b + d*d) % m;
                int z = (k/2)-1;

                for (int j = 0; j < z; j++){
                    int e2 = e;
                    int f2 = f;
                    int g2 = g;
                    int h2 = h;
                    mnoz(e2, f2, g2, h2, m);

                }
                cout << e << " " << f << " " << g << " " << h << endl;

            }
        }
    }
    system("pause");
    return 0;

}

1 个答案:

答案 0 :(得分:2)

要最小化乘法次数,可以使用递归方法。

要对实数进行类比,请说要计算a^n

  1. 检查n是偶数还是奇数。
  2. 如果均匀,请计算b = a^(n/2)。然后最终结果是b*b
  3. 如果是奇数,请计算b = a^((n-1)/2。然后最终结果是b*b*a
  4. 由于你在谈论矩阵而不是数字,你需要能够乘以任意两个矩阵。您可以为矩阵创建类/结构并添加operator*()函数。

    这是一些示例代码。

    #include <iostream>
    
    struct Matrix
    {
       Matrix(double pa, double pb, double pc, double pd) : a(pa), b(pb), c(pc), d(pd) {}
    
       Matrix operator*(Matrix const& rhs) const
       {
          double an = this->a*rhs.a + this->b*rhs.c;
          double bn = this->a*rhs.b + this->b*rhs.d;
          double cn = this->c*rhs.a + this->d*rhs.c;
          double dn = this->c*rhs.b + this->d*rhs.d;
          return Matrix(an, bn, cn, dn);
       }
    
       Matrix square() const
       {
          return (*this)*(*this);
       }
    
       double a;
       double b;
       double c;
       double d;
    };
    
    Matrix matrixPower(Matrix const& m, int k)
    {
       if ( k == 1 )
       {
          return m;
       }
    
       Matrix out = matrixPower(m, k/2).square();
       if ( k%2 == 1 )
       {
          return out*m;
       }
       else
       {
          return out;
       }
    }
    
    std::ostream& operator<<(std::ostream& out, Matrix const& m)
    {
       out << "[ " << m.a << " " << m.b << " ]\n";
       out << "[ " << m.c << " " << m.d << " ]\n";
    }
    
    int main()
    {
       Matrix m(0.4, 0.7, 0.7, 0.4);
       std::cout << matrixPower(m, 5) << std::endl;
       std::cout << matrixPower(m, 10) << std::endl;
       std::cout << matrixPower(m, 15) << std::endl;
    };
    

    输出:

    [ 0.80404 0.80647 ]
    [ 0.80647 0.80404 ]
    
    [ 1.29687 1.29687 ]
    [ 1.29687 1.29687 ]
    
    [ 2.08862 2.08862 ]
    [ 2.08862 2.08862 ]