首页 > 其他分享 >矩阵乘法,矩阵快速幂

矩阵乘法,矩阵快速幂

时间:2024-02-19 21:22:55浏览次数:26  
标签:begin end 矩阵 times bmatrix 快速 乘法

矩阵乘法

说白了就是

c[i][j] = a[i][k] * b[k][j]

矩阵快速幂

就是把快速幂中整数乘法换成了矩阵乘法

struct ma
{
	int m[5][5];
}ans,base;
ma cal(ma a,ma b)
{
	ma tmp;
	for(int i = 1;i <= 2;i++)
	{
		for(int j = 1;j <= 2;j++)
		{
			tmp.m[i][j] = 0;
			for(int k = 1;k <= 2;k++)	tmp.m[i][j] += a.m[i][k] * b.m[k][j];
		}
	}
	return tmp; 
}//矩阵乘法 
int qpow(int ci)
{
	base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
	base.m[1][1] = 0;
	ans.m[0][0] = ans.m[1][1] = 1;
	ans.m[0][1] = ans.m[1][0] = 0;//初始化矩阵(因题而异) 
	while(ci)
	{
		if(ci & 1)
		{
			ans = cal(ans,base);
		}
		base = cal(base,base);
		ci >>= 1;
	}	
	return ans.m[0][1];
}//快速幂,把整数乘法换成矩阵乘法 

或者在结构体中重载运算符

求\(Fibonacci\)数第\(n\)项

用矩阵运算

先写与斐波那契数递推式直接相关:

\[\begin{bmatrix}f_n \\\\ \end{bmatrix}=\begin{bmatrix}1&1\\&\end{bmatrix} \times \begin{bmatrix}f_{n-1}\\f_{n-2}\end{bmatrix} \]

再补齐左边

\[\begin{bmatrix}f_n \\f_{n-1}\end{bmatrix}=\begin{bmatrix}1&1\\&\end{bmatrix} \times \begin{bmatrix}f_{n-1}\\f_{n-2}\end{bmatrix} \]

补齐矩阵

\[\begin{bmatrix}f_n \\ f_{n-1}\end{bmatrix}=\begin{bmatrix}1&1\\1&0\end{bmatrix} \times \begin{bmatrix}f_{n-1}\\f_{n-2}\end{bmatrix} \]

再递归下去:

\[\begin{aligned}\begin{bmatrix}f_n \\ f_{n-1}\end{bmatrix}&=\begin{bmatrix}1&1\\1&0\end{bmatrix} \times \begin{bmatrix}f_{n-1}\\f_{n-2}\end{bmatrix} \\&= \begin{bmatrix}1&1\\1&0\end{bmatrix} \times \begin{bmatrix}1&1\\1&0\end{bmatrix} \times \begin{bmatrix}f_{n-2} \\ f_{n-3}\end{bmatrix} \\&= \cdots \\&= \begin{bmatrix}1&1\\1&0\end{bmatrix}^{n-1}\times \begin{bmatrix}f_{1} \\ f_{0}\end{bmatrix}\end{aligned}\]

前面部分使用矩阵快速幂解决

更多肥不拉几

前缀和\(S_n(s_n)\)

由\(s_n = s_{n-1}+f_n\)得

\[\begin{bmatrix}s_n \\\\\\\end{bmatrix}=\begin{bmatrix}1&1&\\\\&\end{bmatrix} \times \begin{bmatrix}s_{n-1}\\f_n\\\\\end{bmatrix} \]

右边两者下标差\(1\),补矩阵

\[\begin{bmatrix}s_n \\f_{n+1}\\\\\end{bmatrix}=\begin{bmatrix}1&1&0\\0 & 1 & 1\\&\end{bmatrix} \times \begin{bmatrix}s_{n-1}\\f_n\\f_{n-1}\\\end{bmatrix} \]

再按下标关系搞

\[\begin{bmatrix}s_n \\f_{n+1}\\f_n\end{bmatrix}=\begin{bmatrix}1&1&0\\0 & 1 & 1\\0&1&0\end{bmatrix} \times \begin{bmatrix}s_{n-1}\\f_n\\f_{n-1}\\\end{bmatrix} \]

递归

\[\begin{bmatrix}s_n \\f_{n+1}\\f_n\end{bmatrix}=\begin{bmatrix}1&1&0\\0 & 1 & 1\\0&1&0\end{bmatrix}^{n-1} \times \begin{bmatrix}s_{1}\\f_2\\f_{1}\\\end{bmatrix} \]

求\(T_n = \sum\limits_{i = 1}^n(if_i)\)

\[\begin{aligned}T_n &= f_1 + 2f_2 + 3f_3 + \cdots + nf_n\\&=nS_n - S_{n-1} - S_{n-2} - \cdots - S_1\\&=nS_n - \sum\limits_{i = 1}^{n-1}S_{i}\end{aligned} \]

设\(P_n = \sum\limits_{i = 1}^{n-1}S_{i}\),则

\[T_n = n \times S_n - P_n \]

用矩阵计算\(S_n,p_n\),然后求\(T_n\)

由\(P_n = P_{n - 1} + S_{n-1}\)

\[\begin{bmatrix}P_n \\\\\\\end{bmatrix}=\begin{bmatrix}1&1&&\\\\&\end{bmatrix} \times \begin{bmatrix}P_{n-1}\\S_{n-1}\\\\\end{bmatrix} \]

由\(S_n = S_{n-1}+f_n,f_{n+1} = f_n + f_{n-1}\)补

\[\begin{bmatrix}P_n \\S_n\\f_{n+1}\\f_n\end{bmatrix}=\begin{bmatrix}1&1&0&0\\0&1&1&0\\0&0&1&1\\0&0&1&0\end{bmatrix} \times \begin{bmatrix}P_{n-1}\\S_{n-1}\\f_n\\f_{n-1}\end{bmatrix} \]

递归

\[\begin{bmatrix}P_n \\S_n\\f_{n+1}\\f_n\end{bmatrix}=\begin{bmatrix}1&1&0&0\\0&1&1&0\\0&0&1&1\\0&0&1&0\end{bmatrix}^{n-1} \times \begin{bmatrix}P_{1}\\S_{1}\\f_2\\f_{1}\end{bmatrix} \]

标签:begin,end,矩阵,times,bmatrix,快速,乘法
From: https://www.cnblogs.com/MLP123/p/18021993

相关文章

  • 算法学习笔记(45): 快速沃尔什变换 FWT
    遗憾的是math里面一直没有很好的讲这个东西……所以这次细致说说。FWT的本质类似于多项式卷积中,利用ntt变换使得卷积\(\to\)点乘,fwt也是类似的应用。定义某种位运算\(\oplus\),那么fwt处理的位运算卷积形如:\[H=F*G\impliesH_k=\sum_{i\oplusj=k}F_iG_......
  • 晚上调代码时写对拍程序之——为了不手写平衡树而乱搞的可支持随机访问、快速插入、快
    前言由于需要一个可支持随机访问、快速插入、快速删除的数据结构,但是我除了平衡树实在是想不到别的东西了,于是就乱搞出了一个这样的东西——abstract数组。但是,这玩意好像码量和平衡树差不多......不过!我认为她还是有优点的:相比起平衡树,她应该更不容易出锅?总之,不管怎么样,还是......
  • vite+vue3+ts+ element-plus 5分钟快速搭建高端大气上档次的企业级网站前端框架
    原文地址:https://mp.weixin.qq.com/s/BANsRtNn5u-4521nFwF3FA一、安装需要的包:1、 element-plus 安装命令:npminstallelement-plus--save  2、vue-router安装命令:npminstallvue-router --save  安装完成后,需要到main.ts注册:import{createApp}from......
  • 整数乘法的长征
    可以点开pdf.问题和计算模型整数乘法无疑是再熟悉不过的问题了,但是出于严谨性,我们先在本文开头明确一下问题以及计算模型.输入为两个非负整数\(a,b\),它们都是\(n\)位的二进制数.我们的目标是计算它们的乘积\(a\cdotb\),也是按顺序输出它的各位数码.原则上说,......
  • sublime 选择有规律的数据,同时快速编辑多行内容 去除重复行或者只保留唯一值
     同时快速编辑多行内容:五种方式:1,鼠标选中多行,按下CtrlShiftL(CommandShiftL)即可同时编辑这些行;2,鼠标选中文本,反复按CTRLD(CommandD)即可继续向下同时选中下一个相同的文本进行同时编辑;3,鼠标选中文本,按下AltF3(Win)或CtrlCommandG(Mac)即可一次性选择全......
  • 5.NET中GRPC服务端快速入门,服务端与客户端
    gRPC是一个现代的开源高性能远程过程调用(RPC)框架,可以在任何环境中运行。它可以有效地连接数据中心内和跨数据中心的服务,支持负载均衡、跟踪、健康检查和身份验证。它也适用于分布式计算,将设备、移动应用程序和浏览器连接到后端服务1.创建一个空项目GrpcServer安装包:Grpc.AspNe......
  • {fastcluster}:快速分层聚类程序(Fast Hierarchical Clustering Routines)
    1.函数代码该R包中最主要的函数是 hclust ,代码如下:>fastcluster::hclustfunction(d,method="complete",members=NULL){if(method=="ward"){message("The\"ward\"methodhasbeenrenamedto\"ward.D\&quo......
  • 矩阵快速幂
    矩阵快速幂定义使用矩阵乘法加速递推注意点可以预处理\(2^k\)次乘方的转移数组,到询问时,只需要乘\(log(n)\)次即可要注意矩阵的赋值不要覆盖赋值,有的时候慎用=要用+=要注意矩阵中的符号,会使取模操作出问题要注意加速递推时f[i]=f[i-1]处于i位的数应当保留,因为下一......
  • 矩阵幂求和
    这道题目看起来很像“sumdiv”这道题目,所以是可以用分治做的但是这里是矩阵,所以我们用矩阵来做一下我们之前的矩阵乘法都是数量是元素,现在是矩阵是元素了,不用慌,套用分块矩阵的思想就好了当然如果我们是这么写的递推式:\(S_n=AS_{n-1}+A\),我们的转移矩阵就不是这么写的了,可以写......
  • 快速幂
    法一:运用位运算简化计算以\(3^{22}\)为例,它的底数为\(3\),指数为\(22\)。指数的二进制形式为10110。通过二进制与十进制的转换,我们可以把\(22\)分解为\(22=2^4*2^2*2^1\)。因此,\(3^{22}=3^{2^4}*3^{2^2}*3^{2^1}\)。我们有以下几点发现:1、\(2^4\),\(2^2\)......