矩阵快速幂 与快速幂的求解

来源:互联网 发布:酷狗音乐软件版本 编辑:程序博客网 时间:2024/06/06 01:19

                                      矩阵快速幂 与快速幂的求解  


矩阵快速幂 ,这里之研究方阵就可以了;

矩阵运算 这里算乘法  要重载运算符  重载乘法运算符和求幂运算符
 
快速幂的思想简单
 例如 :
    

       求  a^7   那么   先求a  之后 求a^2  求 a^3 求 a^6 求a^7  即可得到结果 ,
     具体的看代码:

#include<iostream>using namespace std;int quickpow(int a, int n){    int p = 1;    int q = a;    while(n)    {        if(n&1)          p = q*p;          q = q*q;          n>>=1;    }    return p;}int main(){    int a ,n;    while(cin>>a>>n)    {        int ans = quickpow(a, n);        cout<<"计算 "<<a<<" 的"<<n<<"次方: "<<ans<<endl;    }    return 0;}


最后是矩阵快速幂的求解   这里都没有求模 
看代码:
#include<iostream>using namespace std;const  int len =3;struct Mat{    int mat[len][len];};Mat e = { 1,0,0,          0,1,0,          0,0,1};Mat operator*(Mat a, Mat b){//这里只是针对方阵相乘    int i , j , k;    Mat c;    for (i = 0 ; i < len ; i++)    {        for(j = 0 ; j < len ; j++)        {            c.mat[i][j]= 0;            for(k = 0 ; k < len ; k++)            {                c.mat[i][j] += a.mat[i][k]*b.mat[k][j];            }        }    }    return c;}Mat operator^(Mat a, int n){//矩阵快速幂 这里只算三阶    Mat p = e;    Mat q = a;    while(n)    {        if(n&1)        {            p = p*q;        }           q = q*q;        n>>=1;    }    return p;}int main(){//上面的意思友点类似于运算符重载    int i, j;    Mat  q = {1,0,1,              0,1,1,              2,3,3};    Mat p = q^3;    for(i = 0 ; i < 3;i++)    {        for(j = 0;j < 3;j++)        {            cout<<p.mat[i][j]<<" ";        }        cout<<endl;    }    return 0;}



0 0