矩阵快速幂详解

2023-05-16

矩阵快速幂

在讲矩阵快速幂之前,先引入整数快速幂的概念。

整数快速幂

为了引出矩阵快速幂,以及说明快速幂算法的好处,我们可以先求整数的幂。如果现在要算X^8:
X*X*X*X*X*X*X*X*X 按照寻常思路,一个一个往上边乘,则乘法运算进行7次。
(X*X)*(X*X)*(X*X)*(X*X)这种求法,先进行乘法得X^2,然后对X^2再执行三次乘法,这样去计算则乘法运算执行4次。已经比七次少。所以为了快速算整数幂,就会考虑这种结合的思想。现在考虑应该怎么分让计算比较快。接下来计算整数快速幂。
例如:X^19
19的二进制为:1 0 0 1 1
(X^m)*(X^n)=X^(m+n)
X^19=(X^16)*(X^2)*(X^1)
那么怎么来求解快速幂呢。请看下列代码:
求解X^N的值
int QuickPow(int x,int N)
{
    int res = x;
    int ans = 1;
    while(N)
    {
        if(N&1)
        {
            ans = ans * res;
        }
        res = res*res;
        N = N>>1;
    }
    return ans;
}

矩阵快速幂

看了一个整数的快速幂,现在我们就正式介绍矩阵快速幂算法。假如现在有一个n*n的方阵A。所谓方阵就是行数和列数相等的矩阵,先给出一个数M,让算矩阵A的M次幂,A^M在此只要求计算并不需要去深究这个矩阵到底是什么含义。详细看下边的代码部分

代码部分

struct Matrix ///结构体,矩阵类型
{
    int m[maxn][maxn];
}ans,res;
Matrix Mul(Matrix a,Matrix b,int n)
{
    Matrix tmp;//定义一个临时的矩阵,存放A*B的结果
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= n;j++)
        {
            tmp.m[i][j] = 0;
        }
    }
    for(itn 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];
            }
        }
    }
    return tmp;
}
///矩阵快速幂,求矩阵res的N次幂
void quickpower(int N,int n)
{
    //整数快速幂默认的ans是1,矩阵的话ans应为单位矩阵
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= n;j++)
        {
            if(i == j)
                ans.m[i][j] = 1;
            else
                ans.m[i][j] = 0;
        }
    }
    while(N)
    {
        if(N&1)
            ans = Mul(res,res);
        res = Mul(res,res);
        N = N>>1;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

矩阵快速幂详解 的相关文章

随机推荐

  • c++ 两数之和

    c 43 43 两数之和 题目 xff1a 给定一个整数数组 nums 和一个目标值 target xff0c 请你在该数组中找出和为目标值的那两个整数 xff0c 并返回他们的数组下标 你可以假设每种输入只会对应一个答案 但是 xff0c
  • Kubernetes学习笔记

    文章目录 基本概念 xff08 图解 xff09 问题汇总小坑记录node节点加入后 xff0c 网络插件问题connect connection refused 基本概念 xff08 图解 xff09 问题汇总 非常全的一篇 小坑记录 n
  • 解决方法:ChatGPT-OpenAI‘s services are not available in your country

    简单方法 xff1a 代理设置成全局代理 xff0c 并且使用可以访问OpenAI的国家节点 xff01 在浏览器中地址栏输入以下代码后回车 javascript window localStorage removeItem Object
  • Nacos2.2.0适配Oracle12C-建表ddl语句

    span class token keyword create span span class token keyword table span CONFIG INFO span class token punctuation span I
  • Docker快速入门

    1 基本概念 用途 核心思想 docker应用广泛 docker是一个用来装程序及其环境的容器 xff0c 属于linux容器的封装 xff0c 提供简单易用的容器使用接口 解决了环境配置的难题 xff0c 每台电脑环境都不一样 xff0c
  • Kettle-数据同步、将表数据导入到另一张表、不同数据库表数据导入

    Kettle 数据同步 将表数据导入到另一张表 不同数据库表数据导入 选择转换选择表输入双击表输入组件 xff0c 打开编辑框 xff0c 双击数据连接新建按钮添加对应数据库驱动输入源数据查询sql新增输出端表输出 xff08 全量新增 x
  • Oracle-ORA-01461:can bind a LONG value only for insert into a LONG column解决办法之二!

    ORA 01461解决办法 问题场景1 xff1a sql中使用from dual分析解决 场景2 xff1a 字符串超长解决 问题 在客户现场执行写入逻辑时遇到异常 ORA 01461 xff1a can bind a LONG valu
  • Kettle-excel数据同步

    Kettle excel数据同步 Excel输入组件编辑文件选择选择工作表内容字段预览记录 Excel输入组件 编辑 文件选择 选择工作表 内容 字段 若String类型不设置长度 xff08 或设置为 1 xff09 xff0c 则默认长
  • oracle中数据类型number(9,2)的意思

    9表示这个数据的有效位数 xff08 精度 xff09 xff0c 2表示两个小数位 xff08 刻度 xff09 例如 xff1a 1234567 89
  • mybatis-忽略实体对象的某个属性

    方法一 xff1a 在需要忽略的属性上增加 64 transient注解 javax persistence Transient transient是类型修饰符 xff0c 只能用来修饰字段 在对象序列化过程中 xff0c 被transie
  • Elasticsearch -删除索引(index)

    删除单个 DELETE index curl XDELETE 39 http 192 169 1 666 9200 index 你也可以这样删除多个索引 xff1a DELETE index one index two curl XDELE
  • STM32F103ZET6程序移植为C8T6+C8T6下载程序flash timeout的解决方案

    文章目录 一 程序移植 xff1a 程序移植还是蛮简单的二 程序下载 会出现问题 xff08 一 xff09 BOOT0和BOOT1 xff08 二 xff09 程序下载1 代码通用2 状况不断3 解决办法 xff08 三 xff09 ST
  • Android-Studio-Chipmunk版本解决gradle报错connection-refuse的问题

    Android Studio Chipmunk版本解决gradle报错connection refuse的问题 文章目录 Android Studio Chipmunk版本解决gradle报错connection refuse的问题一 问题
  • MapReduce编程-join算法实现

    假设有订单表t order和t product两张数据库表 xff0c 现在需要进行关联查询 这样的sql语句很容易写 select a span class hljs preprocessor id span a span class h
  • 《将博客搬至CSDN》

    将博客搬至CSDN
  • 3D打印Gcode文件命令详解

    目录 3D打印Gcode文件命令详解Gcode文件作用 常用命令 命令 注释G28命令 复位G90和G91命令 设置定位模式M82和M83命令 设定挤丝模式G1命令 运动命令G92命令 设置当前位置M104和M109命令 加热喷嘴M140和
  • 机器学习系统安全

    Abstract 机器学习 已经成为当前计算机领域研究和应用最广泛的技术之一 xff0c 在图像处理 自然语言处理 网络安全等领域被广泛应用 然而 xff0c 一些机器学习算法和训练数据本身还面临着诸多安全威胁 xff0c 进而影响到基于机
  • 汇编语言测试

    汇编测试
  • 汇编语言-DosBox环境搭建

    汇编语言 王爽 问题 xff1a debug 不是内部或外部命令 原因 xff1a 现在windows下不集成了 xff0c 我们可以利用DosBox工具帮助我们学习汇编 汇编语言环境搭建 参考帖子 xff1a https www cnbl
  • 矩阵快速幂详解

    矩阵快速幂 在讲矩阵快速幂之前 xff0c 先引入整数快速幂的概念 整数快速幂 为了引出矩阵快速幂 xff0c 以及说明快速幂算法的好处 xff0c 我们可以先求整数的幂 如果现在要算X 8 则X X X X X X X X X 按照寻常思