矩阵运算及 快速幂求矩阵

来源:互联网 发布:中国农业银行软件 编辑:程序博客网 时间:2024/05/17 03:53

                                                      矩阵运算

矩阵运算(这里主要是针对方阵)是很重要的一个环节,先说加法吧:

加法比较简单,同行同列想加就可以运算的
代码:
Mat operator+(Mat a, Mat b){    int i , j , k ;    Mat    for(i = 0 ; i < len ; i++)    {        for(j = 0 ; j < len ; j++)        {            c.mat[i][j] = a.mat[i][j] + b.mat[i][j];        }    }}

其次就是乘法
原理也简单: 线性代数应该学过, a[i][k] 和 b[k][j] 和做乘积运算得到c[i][j] 
代码:
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])%MOD;            }        }    }    return c;}

至于快速幂在ACM 中是非常重要的,当我上ACM的第一天我就知道了当时是个毛头小子什么都不懂的
先说下快速幂快速幂算法旺旺和求模放在一起 这里将输入的n 看做是二进制数因此进行while (n) 判断是否为0 
看代码:
int model_exp(int a, int n){    int ret = 1;    while(n)    {        if(n&1)//奇偶判断            ret = ret*a%MOD;        n>>=1;//右移一维操作        a = a*a ;    }    return ret;}

完整测试代码:
#include<iostream>using namespace std;const int MOD = 1000000;int model_exp(int a, int n){    int ret = 1;    while(n)    {        if(n&1)//奇偶判断            ret = ret*a%MOD;        n>>=1;//右移一维操作        a = a*a ;    }    return ret;}int main(){    int a , n;    while(cin>>a>>n)    {        int ans = model_exp(a, n);        cout<<ans<<endl;    }    return 0;}


到这里其实矩阵也差不多
看代码:
Mat operator^(Mat a, int x){//这里p为单位阵    Mat p = e, q = a;    while(x)    {        if(x&1)            p = p*q;        x>>=1;        q = q*q;    }    return p;}

以上就是快速幂的算法的主要内容,还有遇到以后补充。。。


0 0