斐波那契数列
斐波那契数列(The Fibonacci sequence,OEIS A000045)的定义如下:
该数列的前几项如下:
卢卡斯数列
卢卡斯数列(The Lucas sequence,OEIS A000032)的定义如下:
该数列的前几项如下:
研究斐波那契数列,很多时候需要借助卢卡斯数列为工具。
斐波那契数列通项公式
第
解析解
解析解即公式解。我们有斐波那契数列的通项公式(Binet's Formula):
这个公式可以很容易地用归纳法证明,当然也可以通过生成函数的概念推导,或者解一个方程得到。
当然你可能发现,这个公式分子的第二项总是小于
这里的中括号表示取离它最近的整数。
这两个公式在计算的时候要求极高的精确度,因此在实践中很少用到。但是请不要忽视!结合模意义下二次剩余和逆元的概念,在 OI 中使用这个公式仍是有用的。
卢卡斯数列通项公式
我们有卢卡斯数列的通项公式:
与斐波那契数列非常相似。事实上有:
也就是说,
的全体解,恰好是
恰好是卢卡斯数列和斐波那契数列。因此有
矩阵形式
斐波那契数列的递推可以用矩阵乘法的形式表达:
设
于是我们可以用矩阵乘法在
快速倍增法
使用上面的方法我们可以得到以下等式:
于是可以通过这样的方法快速计算两个相邻的斐波那契数(常数比矩乘小)。代码如下,返回值是一个二元组
1 2 3 4 5 6 7 8 9 10 |
|
性质
斐波那契数列拥有许多有趣的性质,这里列举出一部分简单的性质:
- 卡西尼性质(Cassini's identity):
。 - 附加性质:
。 - 取上一条性质中
,我们得到 。 - 由上一条性质可以归纳证明,
。 - 上述性质可逆,即
。 - GCD 性质:
。 - 以斐波那契数列相邻两项作为输入会使欧几里德算法达到最坏复杂度(具体参见 维基 - 拉梅)。
斐波那契数列与卢卡斯数列的关系
不难发现,关于卢卡斯数列与斐波那契数列的等式,与三角函数公式具有很高的相似性。比如:
与
很像。以及
与
很像。因此,卢卡斯数列与余弦函数很像,而斐波那契数列与正弦函数很像。比如,根据
可以得到两下标之和的等式:
于是推论就有二倍下标的等式:
这也是一种快速倍增下标的办法。同样地,也可以仿照三角函数的公式,比如奇偶性、和差化积、积化和差、半角、万能代换等等,推理出更多有关卢卡斯数列与斐波那契数列的相应等式。
斐波那契编码
我们可以利用斐波那契数列为正整数编码。根据 齐肯多夫定理,任何自然数
并且
于是我们可以用
给
- 从大到小枚举斐波那契数
,直到 。 - 把
减掉 ,在编码的 的位置上放一个 1(编码从左到右以 0 为起点)。 - 如果
为正,回到步骤 1。 - 最后在编码末位添加一个 1,表示编码的结束位置。
解码过程同理,先删掉末位的 1,对于编码为 1 的位置
模意义下周期性
考虑模
皮萨诺周期
模
皮萨诺周期总是不超过
当需要计算第
容易验证,斐波那契数模
显然,如果
计算周期还需要以下结论:
结论 1:对于奇素数
证明:
此时
由二项式展开:
因为
结论 2:对于奇素数
证明:
此时
由二项式展开:
模
于是
结论 3:对于素数
证明:
这里的证明需要把
由于:
因此:
因为反方向也可以推导,所以
当
当
代入
因此也等价于
因为周期等价,所以最小正周期也等价。
三个结论证完。据此可以写出代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
习题
- SPOJ - Euclid Algorithm Revisited
- SPOJ - Fibonacci Sum
- HackerRank - Is Fibo
- Project Euler - Even Fibonacci numbers
-
本页面主要译自博文 Числа Фибоначчи 与其英文翻译版 Fibonacci Numbers。其中俄文版版权协议为 Public Domain + Leave a Link;英文版版权协议为 CC-BY-SA 4.0。
本页面最近更新:2023/9/5 22:13:33,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:Chrogeek, Enter-tainer, EntropyIncreaser, FFjet, Great-designer, ImpleLee, jifbt, Junyan721113, ouuan, sshwy, Tiphereth-A, Xeonacid
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用