• 矩阵快速幂


    矩阵快速幂,是在快速幂的基础上运用矩阵乘法优化程序,典型例子有数据范围较大的斐波那契数列

    假设是n*s的矩阵乘以s*m的矩阵,得到n*m的矩阵

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    struct Matrix
    {
    int m[maxn][maxn];
    }ans,res;//定义矩阵结构体

    //矩阵乘法

    Matrix Mul(Matrix A,Matrix B,int n)//A、B分别代表两个矩阵,n是矩阵的行和列,这里A、B矩阵都是方阵,当然如果不是方阵补零也不影响结果,不是方阵一样可以得到正确结果
    {
    Matrix tmp;//定义矩阵
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    tmp.m[i][j]=0;//矩阵初始化
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    for(int k=1;k<=n;k++)
    tmp.m[i][j]+=A.m[i][k]*B.m[k][j];//这里是矩阵乘法的定义:Ci j=Ai 1*B1 j+Ai 2*B2 j+.......+Ai s*Bs j。并且三层循环在这里,不管是先循环哪一个后循环哪一个,对结果是没有影响的,所以不必太在意顺序
    return tmp;
    }

    //求矩阵res的n次幂
    void quickpower(int N,int n)//快速幂,N是指数,n是行列
    {
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
    if(i==j) ans.m[i][j]=1;将矩阵对角线上的值都变为1,其他位置赋值0,将它变成单位矩阵,因为对于任何矩阵,乘以单位矩阵的值等于它本身,也就是不变
    else ans.m[i][j]=0;
    }
    while(N)
    {
    if(N&1)//如果指数是奇数,那么就应该多乘一次
    ans=Mul(ans,res);
    res=Mul(res,res);//变成平方,快速幂,懂就行了
    N=N>>1;//N/2
    }//快速幂的代码
    }

    其实就是矩阵乘法加上快速幂,没有什么难的,斐波那契数列的例子紧随其后

  • 相关阅读:
    反转链表
    《Java JDK7 学习笔记》课后练习题1
    《Java JDK7 学习笔记》课后练习题2
    《java JDK7 学习笔记》课后练习题3
    SQL与NoSQL(关系型与非关系型)数据库的区别
    编程中编码的来源及发展
    JDK7学习笔记之基础类型
    《java JDK7学习笔记》之跨平台与路径设置
    《java jdk7学习笔记》之java三大平台
    VS2015安装之后加装SQL SERVER2014的步骤
  • 原文地址:https://www.cnblogs.com/57xmz/p/12549432.html
Copyright © 2020-2023  润新知