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. 洛谷 P1439 【模板】最长公共子序列(DP,LIS?)

    题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...

  2. @Transactional 注解实现

    @Transactional注解简介 @Transactional是spring中声明式事务管理的注解配置方式,相信这个注解的作用大家都很清楚.@Transactional注解可以帮助我们把事务开启. ...

  3. Java基础(八)——IO流2_缓冲流、转换流

    一.缓冲流 1.介绍 缓冲流:不能直接作用在文件上,需要包一层,它是一种处理流.用于提高文件的读写效率.它在流的基础上对流的功能进行了增强.提高读写速度的原因:内部提供了一个缓冲区.缺省使用 8192 ...

  4. 云南农职 - 互联网技术学院 - 美和易思大一SCME JAVA高级结业考试机试试题

    目录 一.语言和环境 二.实现功能 1.文件复制功能(IO) 2.消息接受站建设 三.评分标准 四.实现代码 一.语言和环境 实现语言:Java. 开发工具:eclipse. 使用技术:IO流+网络编 ...

  5. dart系列之:dart代码最佳实践

    目录 简介 命名规则 import中的顺序 格式化 总结 简介 每种语言都有自己的代码风格,这种代码风格是跟语言特性息息相关的.如果在编码的过程中遵循这种统一的编码规则,会给我们的业务带来非常多的便利 ...

  6. Kubernetes-Kuboard

    前言 本篇是Kubernetes第十五篇,大家一定要把环境搭建起来,看是解决不了问题的,必须实战. Kubernetes系列文章: Kubernetes介绍 Kubernetes环境搭建 Kubern ...

  7. CSS基础-3 文字知识

    文字知识 一.浏览器文字默认大小为16px; 行高默认大小为18px; 行高 = 文字大小 + 文字上边距 + 文字下边距 或者是 行高 = 两条基线之间的距离                    ...

  8. CSS基础 定位相关属性的使用方法

    1.相对定位:position:relative: 属性名:position 属性值:relative: 特点:1.相对自己的位置移动 2.配合方位名词移动,如:top.left.right,bott ...

  9. 『德不孤』Pytest框架 — 1、Pytest测试框架介绍

    目录 1.什么是单元测试框架 2.单元测试框架主要做什么 3.单元测试框架和自动化测试框架有什么关系 4.Pytest测试框架说明 5.Pytest框架和Unittest框架区别 (1)Unittes ...

  10. python 中的省略号

    在查看django源码时遇到下列内容:sweat: 这个省略号是什么意思? 来自为知笔记(Wiz)