矩阵快速幂,简单粗暴



快速幂

  1. 数的快速幂;

    计算x^n,n=10000000

    递归算法

    intpow(int x,int n)

    {

        if(n==1)

            return x;

        else if(n%2==1)

        {

            return x*pow(x,n/2);

        }

        else

        {

            return pow(x,n/2);

        }

    }

    非递归算法

     

    intpow(int x,int n)

    {

        int temp=1;

        if(n%2==1)

        {

            temp*=x;

            n-=1;

        }

        while(n)

        {

            x=x*x;

            n/=2;

        }

        return x;

    }

 

  1. 矩阵快速幂

     

    1*.矩阵乘法的实现;

    structasd{

        int a[N][N];

    };

    asdcheng(asd q,asd w,int n)

    {

        asd r;

        int i,j,k;

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

        {

            for(j=0;j<n;j++)

            {

                r.a[i][j]=0;

                for(k=0;k<n;k++)

                {

                    r.a[i][j]+=q.a[i][k]*w.a[k][j];

                }

            }

        }

        return r;

    }

2*.类比于数的快速幂做出矩阵的快速幂

#include <stdio.h>

#include <string.h>

#define Matr 110 //矩阵大小

struct mat//矩阵结构体

{

    inta[Matr][Matr];

    mat()//构造函数

    {

       memset(a,0,sizeof(a));

    }

};

int Size,mod;

 

mat multi(mat m1,mat m2)//两个相等矩阵的乘法

{

    mat ans=mat();

    for(inti=0;i<Size;i++)

        for(intj=0;j<Size;j++)

            for(intk=0;k<Size;k++)

               ans.a[i][k]=(ans.a[i][k]+m1.a[i][j]*m2.a[j][k])%mod;

    return ans;

}

 

mat quickmulti(mat m,int n)//二分快速幂

{

    mat ans=mat();

    int i;

   for(i=0;i<Size;i++)ans.a[i][i]=1;

    while(n)

    {

       if(n&1)ans=multi(m,ans);

       m=multi(m,m);

       n>>=1;

    }

    return ans;

}

 

void print(mat m)//输出矩阵信息

{

    int i,j;

   printf("%d ",Size);

   for(i=0;i<Size;i++)

    {

       for(j=0;j<Size;j++)

            printf("%d ",m.a[i][j]);

       printf(" ");

    }

}

int main()

{

 

        int n,p;

        while(~scanf("%d%d",&n,&p))

        {

               matA;

               for(inti=0;i<n;i++)

                   for(int j=0;j<n;j++)

                       scanf("%d",&A.a[i][j]);

               Size=n;

               mod=p;

               A=quickmulti(A,n);

               print(A);

        }

        return 0;

}

-------斐波那契前四位(主要代码),用公式做的————不知道百度

doublet1=log10((double)(1.0+sqrt(5.0))/2);

            double t2=log10(sqrt(5.0));

            double t;

            int ans1;

            t=n*t1-t2;

            t=t-(int)t;

            ans1=pow(10.0,t)*1000;

            printf("%d ",ans1);

 

 ------矩阵的一些变换

 

原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934594.html