引言
生成函数有普通型生成函数和指数型生成函数两种,其中普通型用的比较多。形式上说,普通型生成函数用于解决多重集的组合问题,而指数型母函数用于解决多重集的排列问题。
因水平有限,此博客涉及的均是生成函数的初级应用,用于解决相关的算法竞赛题目。
斐波那契函数的通项公式
考虑一个经典问题:
求斐波那契函数的通项。
此问题的结论了解斐波那契函数的人都知道,那就是:
F ( n ) = 1 5 ∗ [ ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ] F(n) = \frac{1}{\sqrt5}*[(\frac{1+\sqrt5}{2})^n - (\frac{1-\sqrt5}{2})^n ] F(n)=51∗[(21+5)n−(21−5)n]
此结论初看好像在算法竞赛中没什么用,因为对于求斐波那契函数第n项的值,存在一个经典的算法,那就是矩阵快速幂。而且因浮点数存在误差,故计算机并不能精确计算出该公式的值。
但通过对此公式的深入了解和推导证明,我们将对斐波那契函数有更深的理解,并将矩阵快速幂和生成函数两个算法进行联系。
下面我们试着来推导这个公式。
首先从熟悉的矩阵快速幂来入手。
由递推关系式,可以构造矩阵:
[ 0 1 1 1 ] ∗ [ F ( n − 1 ) F ( n ) ] = [ F ( n ) F ( n + 1 ) ] \begin{bmatrix} 0 &1 \\1 & 1\end{bmatrix} * \begin{bmatrix} F(n-1)\\ F(n)\end{bmatrix} = \begin{bmatrix} F(n ) \\F(n+1)\end{bmatrix} [0111]∗[F(n−1)F(n)]=[F(n)F(n+1)]
通过观察已知,这其实也是一个递推式,逐层递推易得:
(1) [ 0 1 1 1 ] n ∗ [ F ( 0 ) F ( 1 ) ] = [ F ( n ) F ( n + 1 ) ] \begin{bmatrix} 0 &1 \\1 & 1\end{bmatrix}^n* \begin{bmatrix} F(0)\\ F(1)\end{bmatrix} = \begin{bmatrix} F(n ) \\F(n+1)\end{bmatrix} \tag1 [0111]n∗[F(0)F(1)]=[F(n)F(n+1)](1)
假设:
M n = [ 0 1 1 1 ] n M^n= \begin{bmatrix} 0 &1 \\1 & 1\end{bmatrix}^n Mn=[0111]n
故问题的关键便在于如何求解 M n M^n Mn
在算法竞赛中,常用的手段是利用计算机的强大计算能力和快速幂的思想来求解。
但实际上,在数学层面还有一个更加常用的方法来求解方阵的n次方,那就是矩阵的相似对角化。
由定义:
M = Q A Q − 1 M = QAQ^{-1} M=QAQ−1
故
M n = Q A Q − 1 ∗ Q A Q − 1 ∗ Q A Q − 1 ∗ . . . . M^n = QAQ^{-1} * QAQ^{-1} *QAQ^{-1}*.... Mn=QAQ−1∗QAQ−1∗QAQ−1∗....
因:
Q ∗ Q − 1 = E Q*Q^{-1} = E Q∗Q−1=E
故推出:
(2) M n = Q A n Q − 1 M^n = QA^nQ^{-1}\tag2 Mn=QAnQ−1(2)
下面我们便来尝试将M矩阵相似对角化:
由
d e t ( M − λ E ) = 0 = = > λ = 1 + 5 2 和 1 − 5 2 det(M - \lambda E) = 0 ==> \lambda = \frac{1+\sqrt5}{2} 和\frac{1-\sqrt5}{2} det(M−λE)=