矩阵乘法求解多项式递推问题
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(n−1)+f(n−2)
特别的, 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(n−1)+f(n−2)
对于这个公式,我们首先就是要构造一个矩阵乘积的等式,这个等式有以下特点:
- 矩阵等式刚好可以看成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(n−1)]=[f(n−1)f(n−2)][1110] - 在递推的等式中出现数字的矩阵不能和
n
相关,也就是必须全部为数字
构造这样的等式首先就是要得到需要递推的矩阵表达式,对于斐波那契数列来说,就是上面举例的一个矩阵等式,首先需要想到
[
f
(
n
)
f
(
n
−
1
)
]
\\beginbmatrix f(n)&f(n-1) \\endbmatrix
[f(n)f(n−1)](这个感觉确实没有办法解释怎么构造的,因为斐波那契是基础,更多的递推构造都是和斐波那契很相似的)
那么右边就是
[
f
(
n
−
1
)
f
(
n
−
2
)
]
\\beginbmatrix f(n-1)&f(n-2) \\endbmatrix
[f(n−1)f(n−2)]
然后在后边乘一个矩阵需要让等式成立,可以求出是
[
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(n−1)]=[f(n−1)f(n−2)][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(n−1)]=[f(1)f(0)][1110]n−1
这个
[
1
1
1
0
]
n
−
1
\\beginbmatrix 1 & 1 \\\\ 1 & 0 \\endbmatrix^n-1
[1110]n−1就可以用矩阵快速幂求解,最后根据矩阵的一一对应相等的性质,求出
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
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
以上是关于矩阵乘法求解多项式递推问题的主要内容,如果未能解决你的问题,请参考以下文章