矩阵乘法

文章目录

  • 矩阵乘法
    • 引入
    • 例题
      • 斐波那契前 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)

数学知识——矩阵乘法相关推荐

  1. 算法提高课-数学知识-矩阵乘法-AcWing 1303. 斐波那契前 n 项和:矩阵乘法,快速幂,线性代数

    题目分析 来源:acwing 分析: 先利用矩阵运算的性质将通项公式变成幂次形式,然后用快速幂的方法求解第 n项. 斐波那契数列的递推公式:f1=f2=1,fn=fn−2+fn−1(n≥3)f_1 = ...

  2. 【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]

    数学作业 Time Limit: 10 Sec  Memory Limit: 128 MB [Submit][Status][Discuss] Description Input 输入文件只有一行为用 ...

  3. [BZOJ2326] [HNOI2011] 数学作业 (矩阵乘法)

    Description Input Output Sample Input Sample Output HINT Source Solution 递推式长这样:$f[n]=f[n-1]*10^k+n$ ...

  4. 【bzoj2326】[HNOI2011]数学作业 矩阵乘法

    题目描述 题解 矩阵乘法 考虑把相同位数的数放到一起处理: 设有$k$位的数为$[l,r]$,那么枚举从大到小的第$i$个数(即枚举$r-i+1$),考虑其对$Concatenate(l..r)$的贡 ...

  5. 游戏开发中常用的数学知识---矩阵(一)

    在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵.这一概念由19世纪英国数学家凯利首先提出. 矩阵是高等代数学中的常见工具,也常见于统计分 ...

  6. DeepMind攻克50年数学难题!AlphaZero史上最快矩阵乘法算法登Nature封面

      新智元报道   编辑:David Joey [新智元导读]DeepMind碾压人类高手的AI围棋大师AlphaZero,下一个目标是数学算法!现已发现50年以来最快的矩阵乘法算法. 下围棋碾压人类 ...

  7. 0x34.数学 - 矩阵乘法

    目录 矩阵 luogu P3390 [模板]矩阵快速幂 AcWing 205. 斐波那契 P1939 [模板]矩阵加速(数列) AcWing 206. 石头游戏 声明: 本系列博客是<算法竞赛进 ...

  8. 矩阵的基础知识回顾:矩阵乘法,矩阵的逆,伴随矩阵,矩阵的转置,行列式,相似矩阵,实对称矩阵

    Agenda 1. 矩阵matrix 1.1 矩阵运算matrix operations 1.1.1 矩阵乘法matrix multiplication 1.1.1.1 简化矩阵乘法(facilita ...

  9. 压缩感知中的数学知识:投影矩阵(projection matrix)

    题目:压缩感知中的数学知识:投影矩阵(projection matrix) ========================背景======================== 关注于投影矩阵主要是看 ...

最新文章

  1. python使用Spacy迁移学习库进行句法分析实战
  2. Linux中assert头文件,linux系统下如何使用assert函数
  3. JDK1.5-1.7 比较二
  4. python array操作,Python中数组的基本操作
  5. 计算机有哪两种绘图,能被计算机接受的数字图像有哪两种?它们分别由什么构成?...
  6. python中的常量是什么意思_第14p,Python中的常量与注释。
  7. 浮点数在计算机中起什么作用,浮点数在计算机中的存储表示
  8. STM32f407与STM32F103 串口采用DMA收发数据配置方法的异同
  9. 使用nmap查看web服务支持的http methods
  10. [Linux] ubuntu server sudo出现sudo:must be setuid root 完美解决办法
  11. paip.vs2010 开发ASP浏览时的设置
  12. 【JAVA】数据结构——二叉树 例题练习及代码详解
  13. 任正非:华为要做追上特斯拉的大乌龟
  14. 计算机U盘启动键,u盘启动按哪个键? 教你进入bios设置U盘启动
  15. Delphi CxGrid 用法详解
  16. element-ui 表格吸底固定最后一行
  17. linux系统英语词汇大全,linux系统中常命令和英语词汇.docx
  18. 【LeetCode】图解KMP算法
  19. 女孩上中专学财经类号还是计算机好,女生学财经类专业好吗
  20. oracle日文全角变化,日文windows系统 oracle数据库乱码的处理

热门文章

  1. java 下载微信图片_java 微信服务器下载图片到自己服务器
  2. linux查看进程并kill
  3. Python运用urllib2和BeautifulSoup爬取网站ZOL桌面壁纸上的精美电脑壁纸
  4. arm linux rcs文件分析,详细解析:如何制作嵌入式Linux文件系统【转载】
  5. Compose搭档 — Flow、Room
  6. 公有继承,私有继承,保护继承的区别
  7. ERP IPQC是什么意思 IPQC工作职责和IPQC工作流程
  8. HTTP状态码 ---- 100至600 情况含义
  9. html背景图片如何和div一样大,怎么让div的大小随着背景图片的大小变大
  10. Linux RCU锁简析