算法解析——矩阵快速幂
算法解析——矩阵快速幂
一.简介
矩阵快速幂是一种对于矩阵连乘非常有效的算法
以矩阵AAA为例,对于AnA^nAn,如果按照正常的方法,时间复杂度为O(n)O(n)O(n),可如果考虑矩阵快速幂,我们可以将时间复杂度优化到O(logn)O(\log n)O(logn)
二.快速幂
先考虑常数的情况,设有常数xxx,对于xnx^nxn,不妨如下考虑:
假如n=100110n=100110n=100110,那么xn=x100110=x100000∗x000100∗x000010x^n=x^{100110}=x^{100000}*x^{000100}*x^{000010}xn=x100110=x100000∗x000100∗x000010,对于这种情况,我们可以采用如下方法进行优化
if __name__ == '__main__':n = 10x = 2sum = xans = 1while n > 0:a = n & 1if a == 1:ans *= sumsum *= sumn >>= 1print(ans)
其原理就是用ansansans记录答案,再用一个变量sumsumsum记录当前是xxx的几次方(如:x100000,x000100,x000010x^{100000},x^{000100},x^{000010}x100000,x000100,x000010),对于nnn的每一位进行判断,判断其是否为111,每次是nnn的该位为111就拿ansansans乘以该sumsumsum,最后ansansans的结果即为所求
等于说,本题的算法复杂度实际上是nnn的二进制位数,即O(logn)O(\log n)O(logn)
三.矩阵快速幂
如果常数可以进行快速幂,那么矩阵同样可以,唯一不同的就在于每次进行的sum∗sum,ans∗sumsum*sum,ans*sumsum∗sum,ans∗sum是矩阵之间的乘法,而不是常数之间的乘法,虽然会增加一定的复杂度,但这些复杂度的增加是常数级别的,最终的时间复杂度仍然为O(logn)O(\log n)O(logn)
四.矩阵快速幂的应用
矩阵快速幂可以用于斐波那契数列的求和中
斐波那契数列的公式如下:f(n)=f(n−1)+f(n−2)f(n)=f(n-1)+f(n-2)f(n)=f(n−1)+f(n−2),对其进行一定的改写,我们可以得出{f(n)=f(n−1)+f(n−2)f(n−1)=f(n−1)\begin {cases} f(n)=f(n-1)+f(n-2) \\ f(n-1)=f(n-1)\end{cases}{f(n)=f(n−1)+f(n−2)f(n−1)=f(n−1)
将其转换成矩阵乘法,我们有[f(n)f(n−1)]=[1110][f(n−1)f(n−2)]=[1110]n−2[f(2)f(1)]\left[\begin{matrix} f(n) \\ f(n-1)\end{matrix}\right] = \left[\begin{matrix} 1 \ 1 \\ 1 \ 0\end{matrix}\right] \left[\begin{matrix} f(n-1) \\ f(n-2)\end{matrix}\right]=\left[\begin{matrix} 1 \ 1 \\ 1 \ 0\end{matrix}\right]^{n-2} \left[\begin{matrix} f(2) \\ f(1)\end{matrix}\right][f(n)f(n−1)]=[1 11 0][f(n−1)f(n−2)]=[1 11 0]n−2[f(2)f(1)]
即我们可以直接通过公式+矩阵快速幂得到斐波那契数列的解,时间复杂度为求解[1110]n−2\left[\begin{matrix} 1 \ 1 \\ 1 \ 0\end{matrix}\right]^{n-2}[1 11 0]n−2的时间复杂度,即O(logn)O(\log n)O(logn)
算法解析——矩阵快速幂相关推荐
- 快速幂算法(矩阵快速幂还不是很会。。日后会更新)
PS:转载,自己写的不如人家,怕误导.转载地址:http://www.cnblogs.com/CXCXCXC/p/4641812.html 首先,快速幂的目的就是做到快速求幂,假设我们要求a^b,按照 ...
- mysql 矩阵运算_MySQL实现算法:矩阵快速幂
前几日在地铁上和好友讨论起MySQL数据库,由于MySQL数据库不支持复合类型变量,就想到能否用MySQL去实现一些算法呢.最近在学习MySql存储程序,昨天闲来无事,就动手写写吧,借此巩固一下存储过 ...
- P3390矩阵快速幂
题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格式: 输出A^k ...
- 51nod 算法马拉松18 B 非010串 矩阵快速幂
51nod 算法马拉松18 B 非010串 矩阵快速幂 非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串 ...
- 算法分类整理+模板①:矩阵快速幂
一直有一个想法,感觉自己很多基础算法不是很扎实,想要找个机会写一些算法的整理,顺便自己总结一些实用的模板. 最近偶然在训练赛中连续做了2道思维+矩阵快速幂的题目,碰巧有时间,就以矩阵快速幂作为这个系列 ...
- 杭电ACM-LCY算法进阶培训班-专题训练(矩阵快速幂)
杭电ACM-LCY算法进阶培训班-专题训练(矩阵快速幂)[模板] 传送门 杭电ACM-LCY算法进阶培训班-专题训练(矩阵快速幂)[模板] 矩阵快速幂模板 Count Problem Descript ...
- python【数据结构与算法】快速幂and矩阵快速幂取模(看不懂你来打我)
文章目录 1 解释快速幂 2 代码(这里就不考虑指数为小于0的情况了) 3 下面是矩阵快速幂,区别只是底数换成了矩阵 1 解释快速幂 传统的幂运算,是对底数进行连乘,时间复杂度为o(n),例如:2^1 ...
- 蓝桥杯 算法提高 递推求值(矩阵快速幂)详解
传送门 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3 ...
- 2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)- 分组(矩阵快速幂套NTT优化dp)
题目链接:点击查看 题目大意:给出 nnn 个连续的小球,每次可以选择单独的一个或者相邻的两个小球分成一组,允许有剩余的小球,问恰好分成 k∈{1,2,3,⋯,m}k\in\{1,2,3,\cdots ...
- 疯子的算法总结(五) 矩阵乘法 (矩阵快速幂)
学过线性代数的都知道矩阵的乘法,矩阵乘法条件第为一个矩阵的行数等与第二个矩阵的列数,乘法为第一个矩阵的第一行乘以第二个矩阵的第一列的对应元素的和作为结果矩阵的第一行第一列的元素.(详解参见线性代数) ...
最新文章
- 通过windows系统封杀IP与端口
- pox 中 openflow.webservice 组建的学习与使用
- 剑指offer:二叉树的镜像
- SM30需要传输请求
- android 对话框
- Python将数据插入到数据库时遇到单引号插入错误的问题
- server2019远程服务器ipv4地址_Windows Server 2019远程桌面服务配置和授权激活
- .net core上 K8S(七).netcore程序的服务发现
- webpack设置应用缓存_如何使用Webpack在Rails应用程序中设置TinyMCE
- 容器中用uwsgi协议部署注意的问题以及用flask部署
- shell中的括号(小括号,大括号/花括号)
- Visual C++ MSDEV.exe 应用程序错误
- Excel 如何批量查询快递单号
- ecshop常见漏洞
- python语音识别 开源_DaCiDian是一个开源的中文普通话词汇,用于自动语音识别(ASR)...
- 数据结构之广义表(C语言)
- python装饰器(详解)
- mysql lag over_数据库sql 使用 lag 和OVER 函数和 like 使用 小技巧
- FL中隐私和安全性问题
- MySQL创建民族表
热门文章
- 密码学家王小云:十年破解MD5和SHA-1两大国际密码
- 量化噪声的大小与什么成正比_量化信噪比的公式?量化级数与每个样值的比特数之间的关系是什么?...
- 关于ATM机的JAVA实验报告书,Java实习报告(ATM自动柜员机)
- 计算机管理及维护培训考试题,计算机考试题库和答案_浅析高校公共计算机机房管理与维护...
- 基于matlab的QPSK系统仿真及应用
- cad补全三视图_机械制图课程中补全三视图的解题方法
- Postman下载安装及汉化
- WPS 连接 H2 Database
- 《分布式系统架构:技术栈详解与快速进阶》导读
- java 定时任务的实现_Java定时任务实现的几种方式