矩阵乘法求解多项式递推问题

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵乘法求解多项式递推问题相关的知识,希望对你有一定的参考价值。

  • 博客主页: https://blog.csdn.net/qq_50285142
  • 欢迎点赞👍收藏✨关注❤留言 📝 如有错误,敬请指正
  • 🎈虽然生活很难,但我们也要一直走下去🎈

1.斐波那契数列问题引入

对于求斐波那契数列第n项的问题,相信大家已经非常熟悉了,下面做一下简单的描述。

斐波那契数列数学问题:
对于一个斐波那契数列满足公式:
f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n) = f(n-1)+f(n-2) f(n)=f(n1)+f(n2)
特别的, f ( 0 ) = 0 , f ( 1 ) = 1 , f ( 2 ) = 1 f(0)=0,f(1)=1,f(2)=1 f(0)=0,f(1)=1,f(2)=1
求给定n,求 f ( n ) f(n) f(n)的值

当给定的n限制比较小时,我们可以采用递推的方式求解,但是当n给的范围比较大时,就显然不能采用递推的方式了。

对于斐波那契的其它求解方法,下面这篇文章有一个比较清楚的描述。
斐波那契的几种求解方法

本文着重探讨斐波那契的矩阵快速幂求解方式。

2.矩阵快速幂求解斐波那契数列

前导知识:矩阵乘法运算,快速幂思想

斐波那契递推公式: f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n) = f(n-1)+f(n-2) f(n)=f(n1)+f(n2)

对于这个公式,我们首先就是要构造一个矩阵乘积的等式,这个等式有以下特点:

  • 矩阵等式刚好可以看成Y(n)和Y(n-1)的递推公式
    比如 [ f ( n ) f ( n − 1 ) ] = [ f ( n − 1 ) f ( n − 2 ) ] [ 1 1 1 0 ] \\beginbmatrix f(n)&f(n-1) \\endbmatrix=\\beginbmatrix f(n-1)&f(n-2) \\endbmatrix\\beginbmatrix 1&1\\\\1&0 \\endbmatrix [f(n)f(n1)]=[f(n1)f(n2)][1110]
  • 在递推的等式中出现数字的矩阵不能和n相关,也就是必须全部为数字

构造这样的等式首先就是要得到需要递推的矩阵表达式,对于斐波那契数列来说,就是上面举例的一个矩阵等式,首先需要想到 [ f ( n ) f ( n − 1 ) ] \\beginbmatrix f(n)&f(n-1) \\endbmatrix [f(n)f(n1)](这个感觉确实没有办法解释怎么构造的,因为斐波那契是基础,更多的递推构造都是和斐波那契很相似的)
那么右边就是 [ f ( n − 1 ) f ( n − 2 ) ] \\beginbmatrix f(n-1)&f(n-2) \\endbmatrix [f(n1)f(n2)]
然后在后边乘一个矩阵需要让等式成立,可以求出是 [ 1 1 1 0 ] \\beginbmatrix 1&1\\\\1&0 \\endbmatrix [1110]
最后得到 [ f ( n ) f ( n − 1 ) ] = [ f ( n − 1 ) f ( n − 2 ) ] [ 1 1 1 0 ] \\beginbmatrix f(n)&f(n-1) \\endbmatrix=\\beginbmatrix f(n-1)&f(n-2) \\endbmatrix\\beginbmatrix 1&1\\\\1&0 \\endbmatrix [f(n)f(n1)]=[f(n1)f(n2)][1110]
这就是一个递推公式,求 f ( n ) f(n) f(n)的话,从 [ f ( 1 ) f ( 0 ) ] \\beginbmatrix f(1)&f(0) \\endbmatrix [f(1)f(0)]开始,那么 [ f ( n ) f ( n − 1 ) ] = [ f ( 1 ) f ( 0 ) ] [ 1 1 1 0 ] n − 1 \\beginbmatrix f(n)&f(n-1) \\endbmatrix=\\beginbmatrix f(1)&f(0) \\endbmatrix\\beginbmatrix 1&1\\\\1&0 \\endbmatrix^n-1 [f(n)f(n1)]=[f(1)f(0)][1110]n1
这个 [ 1 1 1 0 ] n − 1 \\beginbmatrix 1 & 1 \\\\ 1 & 0 \\endbmatrix^n-1 [1110]n1就可以用矩阵快速幂求解,最后根据矩阵的一一对应相等的性质,求出 f ( n ) f(n) f(n)
注意: 矩阵的乘法是不具有交换律的

代码:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 2;
int n,m;
//a是第一个乘数,b是第二个乘数,c是存结果的数组
void mul(int a[][N],int b[][N],int t[][N])

	static int c[N][N];
	memset(c,0,sizeof c);
	for(int i=0;i<N;i++)
		for(int j=0;j<N;j++)
			for(int k=0;k<N;k++)
				c[i][j]=(c[i][j]+(ll)a[i][k]*b[k][j]+m)%m;
	memcpy(t,c,sizeof c);//复制数组

int main()

	int a[N][N]=1,0;//f(1) 和 f(0)
	int b[N][N]=1,1,1,0;
	scanf("%d%d",&n,&m);
	int t = n-1;//矩阵的n-1次方
	while(t)
	
		if(t&1) mul(a,b,a);
		mul(b,b,b);
		t>>=1;
	
	int res = (a[0][0]%m+m)%m;//最后的结果存在a数组的第一行第一列
	printf("%d\\n",res);
	return 0;

3.构造矩阵求解多项式的递推公式

例题1

斐波那契的前n项和

f 1 = 1 , f 2 = 1 , f 3 = 2 , f 4 = 3 , … , f n = f n − 1 + f n − 2 f_1=1,f_2=1,f_3=2,f_4=3,…,f_n=f_n−1+f_n−2 f1=1,f2=1,f3=2,f4=3,,f以上是关于矩阵乘法求解多项式递推问题的主要内容,如果未能解决你的问题,请参考以下文章

特征多项式

利用Cayley-Hamilton theorem 优化矩阵线性递推

模板矩阵加速

矩阵快速幂

略谈矩阵乘法优化递推

一道简单的递推题(快速幂+矩阵乘法优化+滚动数组)