数学知识——矩阵乘法
矩阵乘法
文章目录
- 矩阵乘法
- 引入
- 例题
- 斐波那契前 n 项和
- 思路
- 代码
- 佳佳的斐波那契
- 思路
- 代码
引入
由于线性递推式可以表示成矩阵乘法的形式,也通常用矩阵快速幂来求线性递推数列的某一项。
利用结合律,矩阵乘法可以利用 快速幂 的思想来优化。
例题
斐波那契前 n 项和
大家都知道 Fibonacci 数列吧,f1=1,f2=1,f3=2,f4=3,…,fn=fn−1+fn−2。
现在问题很简单,输入 n 和 m,求 fn 的前 n 项和 Snmodm。
输入格式
共一行,包含两个整数 n 和 m。
输出格式
输出前 n 项和 Snmodm 的值。
数据范围
1≤n≤2000000000
,
1≤m≤1000000010
输入样例:
5 1000
输出样例:
12
思路
已知递推公式 S n + 1 = S n + f n + 1 S_{n + 1} = S_n + f_{n + 1} Sn+1=Sn+fn+1,对于求 S n + 1 S_{n + 1} Sn+1我们要知道 S n 和 f n + 1 S_n和f_{n + 1} Sn和fn+1。
构造矩阵 F n = [ f n , f n + 1 , S n ] F_n = [f_n, f_{n + 1}, S_n] Fn=[fn,fn+1,Sn]。
对于 F n + 1 = [ f n + 1 , f n + 2 , S n + 1 ] F_{n + 1} = [f_{n + 1}, f_{n + 2}, S_{n + 1}] Fn+1=[fn+1,fn+2,Sn+1]等于 F n F_n Fn与矩阵 A = [ [ 0 , 1 , 0 ] , [ 1 , 1 , 1 ] , [ 0 , 0 , 1 ] ] A = [[0, 1, 0], [1, 1, 1], [0, 0, 1]] A=[[0,1,0],[1,1,1],[0,0,1]]相乘,
对于 F n = F 1 ∗ A n − 1 F_n = F_1 * A^{n - 1} Fn=F1∗An−1
代码
from copy import deepcopy
N = 3
F1 = [[0] * N for _ in range(N)]
F1[0] = [1, 1, 1]
A = [[0, 1, 0], [1, 1, 1], [0, 0, 1]]def mul(a, b) :tmp = [[0] * N for _ in range(N)]for i in range(N) : # i行for j in range(N) : # j列for k in range(N) :tmp[i][j] = (tmp[i][j] + a[i][k] * b[k][j]) % mreturn tmpdef qmi(a, k) :res = deepcopy(F1)while k :if k & 1 :res = mul(res, a)k >>= 1a = mul(a, a)return res
n, m = map(int, input().split())
res = qmi(A, n - 1)
print(res[0][2])
佳佳的斐波那契
佳佳对数学,尤其对数列十分感兴趣。
在研究完 Fibonacci 数列后,他创造出许多稀奇古怪的数列。
例如用 S(n) 表示 Fibonacci 前 n项和 modm
的值,即 S(n)=(F1+F2+…+Fn)modm,其中 F1=F2=1,Fi=Fi−1+Fi−2。
可这对佳佳来说还是小菜一碟。
终于,她找到了一个自己解决不了的问题。
用 T(n)=(F1+2F2+3F3+…+nFn)modm 表示 Fibonacci 数列前 n 项变形后的和 modm 的值。
现在佳佳告诉你了一个 n 和 m,请求出 T(n) 的值。
输入格式
共一行,包含两个整数 n 和 m。
输出格式
共一行,输出 T(n) 的值。
数据范围
1≤n,m≤2^31−1
输入样例:
5 5
输出样例:
1
样例解释
T(5)=(1+2×1+3×2+4×3+5×5)mod5=1
思路
T n + 1 = T n + ( n + 1 ) ∗ f n + 1 T_{n + 1}= T_n + (n +1)* f_{n + 1} Tn+1=Tn+(n+1)∗fn+1,矩阵乘法要使用快速幂推导,等式必须是线性的,也就是保证转移矩阵中只有常数。
对于求取 T n T_n Tn,必须构造一个线性的递推公式(必须包含 T n T_n Tn)的函数。
对于 P n = n S n − T n P_{n} = nS_n - T_n Pn=nSn−Tn有这样的递推公式 P n + 1 = P n + S n P_{n + 1} = P_n + S_n Pn+1=Pn+Sn
构造 F n = [ f n , f n + 1 , S n , P n ] F_n = [f_n, f_{n + 1}, S_n, P_n] Fn=[fn,fn+1,Sn,Pn], F n + 1 = [ f n + 1 , f n + 2 , S n + 1 , P n + 1 ] F_{n + 1} = [f_{n + 1}, f_{n + 2}, S_{n + 1}, P_{n + 1}] Fn+1=[fn+1,fn+2,Sn+1,Pn+1],
转移矩阵为 A = [ [ 0 , 1 , 0 , 0 ] , [ 1 , 1 , 1 , 0 ] , [ 0 , 0 , 1 , 1 ] , [ 0 , 0 , 0 , 1 ] ] A = [[0, 1, 0, 0], [1, 1, 1, 0], [0, 0, 1, 1], [0, 0, 0, 1]] A=[[0,1,0,0],[1,1,1,0],[0,0,1,1],[0,0,0,1]]
F n = F 1 ∗ A n − 1 F_n = F_1* A^{n - 1} Fn=F1∗An−1
代码
from copy import deepcopy
N = 4
F1 = [[0] * N for _ in range(N)]
F1[0] = [1, 1, 1, 0]
A = [[0, 1, 0, 0], [1, 1, 1, 0], [0, 0, 1, 1],[0, 0, 0, 1]]
def mul(a, b) :tmp = [[0] * N for _ in range(N)]for i in range(N) :for j in range(N) :for k in range(N) :tmp[i][j] = (tmp[i][j] + a[i][k] * b[k][j]) % mreturn tmpdef qmi(a, k) :res = deepcopy(F1)while k :if k & 1 :res = mul(res, a)k >>= 1a = mul(a, a)return resn, m = map(int, input().split())
res = qmi(A, n - 1)
print((n * res[0][2] - res[0][3]) % m)
数学知识——矩阵乘法相关推荐
- 算法提高课-数学知识-矩阵乘法-AcWing 1303. 斐波那契前 n 项和:矩阵乘法,快速幂,线性代数
题目分析 来源:acwing 分析: 先利用矩阵运算的性质将通项公式变成幂次形式,然后用快速幂的方法求解第 n项. 斐波那契数列的递推公式:f1=f2=1,fn=fn−2+fn−1(n≥3)f_1 = ...
- 【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]
数学作业 Time Limit: 10 Sec Memory Limit: 128 MB [Submit][Status][Discuss] Description Input 输入文件只有一行为用 ...
- [BZOJ2326] [HNOI2011] 数学作业 (矩阵乘法)
Description Input Output Sample Input Sample Output HINT Source Solution 递推式长这样:$f[n]=f[n-1]*10^k+n$ ...
- 【bzoj2326】[HNOI2011]数学作业 矩阵乘法
题目描述 题解 矩阵乘法 考虑把相同位数的数放到一起处理: 设有$k$位的数为$[l,r]$,那么枚举从大到小的第$i$个数(即枚举$r-i+1$),考虑其对$Concatenate(l..r)$的贡 ...
- 游戏开发中常用的数学知识---矩阵(一)
在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵.这一概念由19世纪英国数学家凯利首先提出. 矩阵是高等代数学中的常见工具,也常见于统计分 ...
- DeepMind攻克50年数学难题!AlphaZero史上最快矩阵乘法算法登Nature封面
新智元报道 编辑:David Joey [新智元导读]DeepMind碾压人类高手的AI围棋大师AlphaZero,下一个目标是数学算法!现已发现50年以来最快的矩阵乘法算法. 下围棋碾压人类 ...
- 0x34.数学 - 矩阵乘法
目录 矩阵 luogu P3390 [模板]矩阵快速幂 AcWing 205. 斐波那契 P1939 [模板]矩阵加速(数列) AcWing 206. 石头游戏 声明: 本系列博客是<算法竞赛进 ...
- 矩阵的基础知识回顾:矩阵乘法,矩阵的逆,伴随矩阵,矩阵的转置,行列式,相似矩阵,实对称矩阵
Agenda 1. 矩阵matrix 1.1 矩阵运算matrix operations 1.1.1 矩阵乘法matrix multiplication 1.1.1.1 简化矩阵乘法(facilita ...
- 压缩感知中的数学知识:投影矩阵(projection matrix)
题目:压缩感知中的数学知识:投影矩阵(projection matrix) ========================背景======================== 关注于投影矩阵主要是看 ...
最新文章
- python使用Spacy迁移学习库进行句法分析实战
- Linux中assert头文件,linux系统下如何使用assert函数
- JDK1.5-1.7 比较二
- python array操作,Python中数组的基本操作
- 计算机有哪两种绘图,能被计算机接受的数字图像有哪两种?它们分别由什么构成?...
- python中的常量是什么意思_第14p,Python中的常量与注释。
- 浮点数在计算机中起什么作用,浮点数在计算机中的存储表示
- STM32f407与STM32F103 串口采用DMA收发数据配置方法的异同
- 使用nmap查看web服务支持的http methods
- [Linux] ubuntu server sudo出现sudo:must be setuid root 完美解决办法
- paip.vs2010 开发ASP浏览时的设置
- 【JAVA】数据结构——二叉树 例题练习及代码详解
- 任正非:华为要做追上特斯拉的大乌龟
- 计算机U盘启动键,u盘启动按哪个键? 教你进入bios设置U盘启动
- Delphi CxGrid 用法详解
- element-ui 表格吸底固定最后一行
- linux系统英语词汇大全,linux系统中常命令和英语词汇.docx
- 【LeetCode】图解KMP算法
- 女孩上中专学财经类号还是计算机好,女生学财经类专业好吗
- oracle日文全角变化,日文windows系统 oracle数据库乱码的处理
热门文章
- java 下载微信图片_java 微信服务器下载图片到自己服务器
- linux查看进程并kill
- Python运用urllib2和BeautifulSoup爬取网站ZOL桌面壁纸上的精美电脑壁纸
- arm linux rcs文件分析,详细解析:如何制作嵌入式Linux文件系统【转载】
- Compose搭档 — Flow、Room
- 公有继承,私有继承,保护继承的区别
- ERP IPQC是什么意思 IPQC工作职责和IPQC工作流程
- HTTP状态码 ---- 100至600 情况含义
- html背景图片如何和div一样大,怎么让div的大小随着背景图片的大小变大
- Linux RCU锁简析