0. Intro

\[f_n=\begin{cases}
0 & (n=0) \\
1 & (n=1) \\
f_{n-1}+f_{n-2} & (n>1)
\end{cases}\]

这个就是众所周知的Fibonacci数列

用生成函数可以求出该数列的通项公式

1. 生成函数

生成函数分为普通型生成函数(OGF)和指数型生成函数(EGF),后面默认提到生成函数都是OGF

若有一数列 \(A: a_0,a_1,a_2,a_3,\cdots\) ,则 \(A\) 的生成函数为

\[F(x)=\sum_{i=0}^{\infty}a_ix^i=a_0+a_1x+a_2x^2+\cdots
\]

为了熟悉生成函数,先来看一个很基础的例子:

已知数列 \(f_n=1\) ,求 \(f\) 的生成函数 \(F(x)\) 。

直接代到定义式里就好了

\[F(x)=\sum_{i=0}^{\infty}f_ix^i=\sum_{i=0}^{\infty}x^i
\]

发现这里其实就是一个等比数列求和

\[F(x)=\lim_{i\rightarrow \infty}\dfrac{1-x^i}{1-x}
\]

研究生成函数时我们都假设级数收敛

如果你不知道级数收敛是什么意思 只需要知道生成函数中的 \(x\) 没有实际意义 所以我们可以任意取值 所以不妨设 \(0<x<1\)

那么当 \(i\) 趋向于无穷大时,\(x^i\) 显然趋于 \(0\)

于是就得到了一个很简单的式子

\[F(x)=\dfrac1{1-x}
\]

同理可以得到三个关于等比数列的生成函数的结论:

数列 \(1,q,q^2,q^3,\cdots\) (下标从0开始,下同)的生成函数是 \(F_1(x)=\dfrac1{1-qx}\)

数列 \(0,1,q,q^2,q^3,\cdots\) 的生成函数是 \(F_2(x)=\dfrac x{1-qx}\)

数列 \(q,q^2,q^3,q^4,\cdots\) 的生成函数是 \(F_3(x)=\dfrac q{1-qx}=-\dfrac1{x-\frac1q}\)

2. Fibonacci数列通项公式

\[f_n=\begin{cases}
1 & (n=0) \\
1 & (n=1) \\
f_{n-1}+f_{n-2} & (n>1)
\end{cases}\]

注意这里的 \(f_0=f_1=1\) ,和开头的那个不一样,因为这样设推起来更方便

设 \(f_n\) 的生成函数为 \(F(x)\) ,那么我们肯定首先要把 \(F(x)\) 求出来

\[\begin{matrix}
x^2F(x) &=& & & & & f_0 x^2 & + & f_1 x^3 & + &\cdots & (1)\\
xF(x) &=& & & f_0 x & + & f_1 x^2 & + & f_2 x^3 & + &\cdots & (2)\\
F(x) &=& f_0 & + & f_1 x & + & f_2 x^2 & + & f_3 x^3 & + &\cdots & (3)\\
\end{matrix}\]

\((1)+(2)-(3)\) 得 \((x^2+x-1)F(x)=-1\)

所以 \(F(x)=\dfrac{1}{1-x-x^2}\)

然而我们并不能由此直接看出 \(f\) 的通项公式

数列 \(1,q,q^2,q^3,\cdots\) (下标从0开始,下同)的生成函数是 \(F_1(x)=\dfrac1{1-qx}\)

数列 \(0,1,q,q^2,q^3,\cdots\) 的生成函数是 \(F_2(x)=\dfrac x{1-qx}\)

数列 \(q,q^2,q^3,q^4,\cdots\) 的生成函数是 \(F_3(x)=\dfrac q{1-qx}=-\dfrac1{x-\frac1q}\)

要从生成函数反推出原数列 我们只知道这三个相关的结论

那么我们以这三个结论为目标试着做一些代数变形

\[F(x)=\dfrac1{1-x-x^2}
\]

分母显然要降次

设方程 \(1-x-x^2=0\) 的两根为 \(x_1=\dfrac{-1+\sqrt5}2,x_2=\dfrac{-1-\sqrt5}2\) ,则 \(1-x-x^2=-(x-x_1)(x-x_2)\)

\[F(x)=-\dfrac1{(x-x_1)(x-x_2)}
\]

而 \(\dfrac1{x-x_1}-\dfrac1{x-x_2}=\dfrac{(x-x_2)-(x-x_1)}{(x-x_1)(x-x_2)}=\dfrac{x_1-x_2}{(x-x_1)(x-x_2)}\)

所以 \(F(x)=-\dfrac1{x_1-x_2}\cdot\left(\dfrac1{x-x_1}-\dfrac1{x-x_2}\right)\)

其中含 \(x\) 的部分和 \(F_3(x)\) 很接近了

先把最前面的负号乘进去

\[F(x)=\dfrac1{x_1-x_2}\cdot\left[-\dfrac1{x-x_1}-\left(-\dfrac1{x-x_2}\right)\right]
\]

易知 \(x_1x_2=-1\) ,所以 \(x_2=-\dfrac1{x_1},x_1=-\dfrac1{x_2}\)

\[F(x)=\dfrac1{x_1-x_2}\cdot\left[-\dfrac1{x-\frac1{-x_2}}-\left(-\dfrac1{x-\frac1{-x_1}}\right)\right]
\]

由结论三可知,对于数列 \(a_n=(-x_1)^{n+1}\) ,它的生成函数是 \(G(x)=-\dfrac1{x-\frac1{-x_1}}\)

对于数列 \(b_n=(-x_2)^{n+1}\) ,它的生成函数是 \(H(x)=-\dfrac1{x-\frac1{-x_2}}\)

\[F(x)=\dfrac{H(x)-G(x)}{x_1-x_2}
\]

这足以说明 \(f_n=\dfrac{b_n-a_n}{x_1-x_2}\) (请读者自行证明)

所以 \(f_n=\dfrac{(-x_2)^{n+1}-(-x_1)^{n+1}}{x_1-x_2}\)

将 \(x_1=\dfrac{-1+\sqrt5}2,x_2=\dfrac{-1-\sqrt5}2\) 代入

\[f_n=\dfrac{\left(\frac{1+\sqrt5}2\right)^{n+1}-\left(\frac{1-\sqrt5}2\right)^{n+1}}{\sqrt5}
\]

这样就得到了通项公式

而如果是开头那个版本的斐波拉契数列:

\[f_n=\begin{cases}
0 & (n=0) \\
1 & (n=1) \\
f_{n-1}+f_{n-2} & (n>1)
\end{cases}\]

它的通项公式就是

\[f_n=\dfrac{\left(\frac{1+\sqrt5}2\right)^n-\left(\frac{1-\sqrt5}2\right)^n}{\sqrt5}
\]

3. 总结

(与前面的内容可能有些出入)

数列 \(a_0,a_1,a_2,a_3,\cdots\) 的普通型生成函数(OGF)(以下称为生成函数)为

\[F(x)=\sum_{i=0}^{\infty}a_ix^i=a_0+a_1x+a_2x^2+\cdots
\]

首项为 \(a\) ,公比为 \(q\) 的等比数列(即 \(a,qa,q^2a,q^3a,\cdots\) )的生成函数为

\[F(x)=\dfrac{a}{1-qx}
\]

当 \(a=q\) 时可知数列 \(q,q^2,q^3,\cdots\) 的生成函数为

\[F(x)=-\dfrac1{x-\frac1q}
\]

这个结论可以用来推导斐波拉契数列的通项公式

斐波拉契数列的递推式:

\[f_n=\begin{cases}
0 & (n=0) \\
1 & (n=1) \\
f_{n-1}+f_{n-2} & (n>1)
\end{cases}\]

(也有 \(f_0=f_1=1\) 的版本,不唯一)

斐波拉契数列的生成函数(这里 \(f_0=f_1=1\) ):

\[F(x)=\dfrac1{1-x-x^2}=\dfrac1{\sqrt5}\left(-\dfrac1{x-\frac{-1+\sqrt5}2}+\dfrac1{x-\frac{-1-\sqrt5}2}\right)
\]

斐波拉契数列的通项公式(这里 \(f_0=0,f_1=1\) )

\[f_n=\dfrac1{\sqrt5}\left[\left(\frac{1+\sqrt5}2\right)^n-\left(\frac{1-\sqrt5}2\right)^n\right]
\]

求Fibonacci数列通项公式的更多相关文章

  1. 用PL0语言求Fibonacci数列前m个中偶数位的数

    程序说明:求Fibonacci数列前m个中偶数位的数: 这是编译原理作业,本打算写 求Fibonacci数列前m个数:写了半天,不会写,就放弃了: 程序代码如下: var n1,n2,m,i; pro ...

  2. C++项目參考解答:求Fibonacci数列

    [项目:求Fibonacci数列] Fibonacci数列在计算科学.经济学等领域中广泛使用,其特点是:第一.二个数是1,从第3个数開始,每一个数是其前两个数之和.据此,这个数列为:1 1 2 3 5 ...

  3. 程序员面试题精选100题(16)-O(logn)求Fibonacci数列[算法]

    作者:何海涛 出处:http://zhedahht.blog.163.com/ 题目:定义Fibonacci数列如下: /  0                      n=0 f(n)=      ...

  4. 《面试题精选》15.O(logn)求Fibonacci数列

    题目:定义Fibonacci数列例如以下: /    0                      n=0 f(n)=      1                      n=1          ...

  5. 用Python实现求Fibonacci数列的第n项

    1. 背景——Fabonacci数列的介绍(摘自百度百科): 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacc ...

  6. POJ-3070Fibonacci(矩阵快速幂求Fibonacci数列) uva 10689 Yet another Number Sequence【矩阵快速幂】

    典型的两道矩阵快速幂求斐波那契数列 POJ 那是 默认a=0,b=1 UVA 一般情况是 斐波那契f(n)=(n-1)次幂情况下的(ans.m[0][0] * b + ans.m[0][1] * a) ...

  7. 牛客IOI周赛17-提高组 卷积 生成函数 多项式求逆 数列通项公式

    LINK:卷积 思考的时候 非常的片面 导致这道题没有推出来. 虽然想到了设生成函数 G(x)表示最后的答案的普通型生成函数 不过忘了化简 GG. 容易推出 \(G(x)=\frac{F(x)}{1- ...

  8. 16.O(logn)求Fibonacci数列[Fibonacci]

    [题目] log(n)时间Fib(n),本质log(n)求a^n. [代码]  C++ Code  12345678910111213141516171819202122232425262728293 ...

  9. POJ ---3070 (矩阵乘法求Fibonacci 数列)

    Fibonacci   Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2  ...

随机推荐

  1. 第二十三个知识点:写一个实现蒙哥马利算法的C程序

    第二十三个知识点:写一个实现蒙哥马利算法的C程序 这次博客我将通过对蒙哥马利算法的一个实际的实现,来补充我们上周蒙哥马利算法的理论方面.这个用C语言实现的蒙哥马利算法,是为一个位数为64的计算机编写的 ...

  2. 第三十三个知识点:Bellcore攻击是如何攻击使用CRT的RSA的?

    第三十三个知识点:Bellcore攻击是如何攻击使用CRT的RSA的? 注意:这篇博客是由follow论密码计算中消除错误的重要性(On the importance of Eliminating E ...

  3. Java初学者作业——编写JAVA程序,计算跳水运动员本次动作的最终得分。

    返回本章节 返回作业目录 需求说明: 编写JAVA程序,计算跳水运动员本次动作的最终得分. 规则如下: 在跳水比赛中,共有六位裁判对运动员所完成的动作进行评分,每位裁判的评分在0-10之间,运动员最终 ...

  4. UML 基本模型元素

    目录 1. 结构模型元素 (1)类(class) (2)接口(interface) (3)协作(collaboration) (4)用例(use case) (5)活动类(active class) ...

  5. XML解析的四种方式

    1.说明 XML是EXtensible Markup Language, 即可扩展标记语言, 是一种通用的数据交换格式, 它的平台无关性.语言无关性.系统无关性, 给数据集成与交互带来了极大的方便. ...

  6. Oracle打怪升级之路二【视图、序列、游标、索引、存储过程、触发器】

    前言 在之前 <Oracle打怪升级之路一>中我们主要介绍了Oracle的基础和Oracle常用查询及函数,这篇文章作为补充,主要介绍Oracle的对象,视图.序列.同义词.索引等,以及P ...

  7. 利用js 引用的方式 鼠标经过弹出效果

    js引用的是此网站代码: https://www.cnblogs.com/jq-growup/p/15609469.html <!DOCTYPE html> <html lang=& ...

  8. 【ASP.NET Core】Blazor+MiniAPI完成文件下载

    今天老周要说的内容比较简单,所以大伙伴们不必紧张,能识字的都能学会. 在开始之前先来一段废话. 许多人都很关心,blazor 用起来如何?其实也没什么,做Web的无非就是后台代码+前台HTML(包含J ...

  9. Go语言系列之包

    Go语言的包(package) 一.包介绍 包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,如fmt.os.io等. 二.定义包 我们还可以根据自己 ...

  10. IE播放音频踩坑之路---待修改

    在其他浏览器都是兼容的!在IE9就是显示一个黑色的框上面有个X 音乐无法播放   要显示播放界面的话,要添加 controls 属性(控件属性)例子:<audio src="xxx.m ...