• 矩阵快速幂,简单粗暴


    

    快速幂

    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);

     

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

     

  • 相关阅读:
    osg模型部分节点旋转
    IFC数据模型构件控制
    自定义基于IFC数据的施工进度数据结构
    QDateTime QString
    Qt获取屏幕分辨率
    Qt自定义类重写 copy
    removeEntry
    initGanttView
    IfcAxis2Placement3D IFC构件的位置和方向
    致我最爱的你
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934594.html
Copyright © 2020-2023  润新知