求Fibonacci数列通项公式
0. Intro
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_n=1\) ,求 \(f\) 的生成函数 \(F(x)\) 。
直接代到定义式里就好了
\]
发现这里其实就是一个等比数列求和
\]
研究生成函数时我们都假设级数收敛
如果你不知道级数收敛是什么意思 只需要知道生成函数中的 \(x\) 没有实际意义 所以我们可以任意取值 所以不妨设 \(0<x<1\)
那么当 \(i\) 趋向于无穷大时,\(x^i\) 显然趋于 \(0\)
于是就得到了一个很简单的式子
\]
同理可以得到三个关于等比数列的生成函数的结论:
数列 \(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数列通项公式
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)\) 求出来
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}\)
要从生成函数反推出原数列 我们只知道这三个相关的结论
那么我们以这三个结论为目标试着做一些代数变形
\]
分母显然要降次
设方程 \(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)\)
\]
而 \(\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)\) 很接近了
先把最前面的负号乘进去
\]
易知 \(x_1x_2=-1\) ,所以 \(x_2=-\dfrac1{x_1},x_1=-\dfrac1{x_2}\)
\]
由结论三可知,对于数列 \(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_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\) 代入
\]
这样就得到了通项公式
而如果是开头那个版本的斐波拉契数列:
0 & (n=0) \\
1 & (n=1) \\
f_{n-1}+f_{n-2} & (n>1)
\end{cases}\]
它的通项公式就是
\]
3. 总结
(与前面的内容可能有些出入)
数列 \(a_0,a_1,a_2,a_3,\cdots\) 的普通型生成函数(OGF)(以下称为生成函数)为
\]
首项为 \(a\) ,公比为 \(q\) 的等比数列(即 \(a,qa,q^2a,q^3a,\cdots\) )的生成函数为
\]
当 \(a=q\) 时可知数列 \(q,q^2,q^3,\cdots\) 的生成函数为
\]
这个结论可以用来推导斐波拉契数列的通项公式
斐波拉契数列的递推式:
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_0=0,f_1=1\) )
\]
求Fibonacci数列通项公式的更多相关文章
- 用PL0语言求Fibonacci数列前m个中偶数位的数
程序说明:求Fibonacci数列前m个中偶数位的数: 这是编译原理作业,本打算写 求Fibonacci数列前m个数:写了半天,不会写,就放弃了: 程序代码如下: var n1,n2,m,i; pro ...
- C++项目參考解答:求Fibonacci数列
[项目:求Fibonacci数列] Fibonacci数列在计算科学.经济学等领域中广泛使用,其特点是:第一.二个数是1,从第3个数開始,每一个数是其前两个数之和.据此,这个数列为:1 1 2 3 5 ...
- 程序员面试题精选100题(16)-O(logn)求Fibonacci数列[算法]
作者:何海涛 出处:http://zhedahht.blog.163.com/ 题目:定义Fibonacci数列如下: / 0 n=0 f(n)= ...
- 《面试题精选》15.O(logn)求Fibonacci数列
题目:定义Fibonacci数列例如以下: / 0 n=0 f(n)= 1 n=1 ...
- 用Python实现求Fibonacci数列的第n项
1. 背景——Fabonacci数列的介绍(摘自百度百科): 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacc ...
- 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) ...
- 牛客IOI周赛17-提高组 卷积 生成函数 多项式求逆 数列通项公式
LINK:卷积 思考的时候 非常的片面 导致这道题没有推出来. 虽然想到了设生成函数 G(x)表示最后的答案的普通型生成函数 不过忘了化简 GG. 容易推出 \(G(x)=\frac{F(x)}{1- ...
- 16.O(logn)求Fibonacci数列[Fibonacci]
[题目] log(n)时间Fib(n),本质log(n)求a^n. [代码] C++ Code 12345678910111213141516171819202122232425262728293 ...
- POJ ---3070 (矩阵乘法求Fibonacci 数列)
Fibonacci Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 ...
随机推荐
- 第二十三个知识点:写一个实现蒙哥马利算法的C程序
第二十三个知识点:写一个实现蒙哥马利算法的C程序 这次博客我将通过对蒙哥马利算法的一个实际的实现,来补充我们上周蒙哥马利算法的理论方面.这个用C语言实现的蒙哥马利算法,是为一个位数为64的计算机编写的 ...
- 第三十三个知识点:Bellcore攻击是如何攻击使用CRT的RSA的?
第三十三个知识点:Bellcore攻击是如何攻击使用CRT的RSA的? 注意:这篇博客是由follow论密码计算中消除错误的重要性(On the importance of Eliminating E ...
- Java初学者作业——编写JAVA程序,计算跳水运动员本次动作的最终得分。
返回本章节 返回作业目录 需求说明: 编写JAVA程序,计算跳水运动员本次动作的最终得分. 规则如下: 在跳水比赛中,共有六位裁判对运动员所完成的动作进行评分,每位裁判的评分在0-10之间,运动员最终 ...
- UML 基本模型元素
目录 1. 结构模型元素 (1)类(class) (2)接口(interface) (3)协作(collaboration) (4)用例(use case) (5)活动类(active class) ...
- XML解析的四种方式
1.说明 XML是EXtensible Markup Language, 即可扩展标记语言, 是一种通用的数据交换格式, 它的平台无关性.语言无关性.系统无关性, 给数据集成与交互带来了极大的方便. ...
- Oracle打怪升级之路二【视图、序列、游标、索引、存储过程、触发器】
前言 在之前 <Oracle打怪升级之路一>中我们主要介绍了Oracle的基础和Oracle常用查询及函数,这篇文章作为补充,主要介绍Oracle的对象,视图.序列.同义词.索引等,以及P ...
- 利用js 引用的方式 鼠标经过弹出效果
js引用的是此网站代码: https://www.cnblogs.com/jq-growup/p/15609469.html <!DOCTYPE html> <html lang=& ...
- 【ASP.NET Core】Blazor+MiniAPI完成文件下载
今天老周要说的内容比较简单,所以大伙伴们不必紧张,能识字的都能学会. 在开始之前先来一段废话. 许多人都很关心,blazor 用起来如何?其实也没什么,做Web的无非就是后台代码+前台HTML(包含J ...
- Go语言系列之包
Go语言的包(package) 一.包介绍 包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,如fmt.os.io等. 二.定义包 我们还可以根据自己 ...
- IE播放音频踩坑之路---待修改
在其他浏览器都是兼容的!在IE9就是显示一个黑色的框上面有个X 音乐无法播放 要显示播放界面的话,要添加 controls 属性(控件属性)例子:<audio src="xxx.m ...