斐波那契数列
斐波那契数列:1,1,2,3,5,8,13,21,34,55,89...
斐波纳契数列以如下被以递归的方法定义:
Fn=Fn−1+Fn−2
这个数列从第三项开始,每一项都等于前两项之和。
这里我们直接给出通项公式:
Fn=51⎣⎡(21+5)n+1−(21−5)n+1⎦⎤
具体求解方式可以看百度百科-斐波那契数列
使用通项公式的问题
- 涉及浮点数运算,不利于计算机处理
- 涉及 O(N) 复杂度的幂次运算
为处理浮点数问题,我们引入模P数域,将问题由实数运算转变为整数运算,转为整数运算后便可用快速幂算法在 O(logN) 复杂度求解。
模P数域
定义运算
f(x)=⎩⎨⎧x mod P,a×b−1a+b×c if x∈Z if x=ba∈Q∖Z if x=a+bc, a,b∈Q, c∈Na+b=f(a+b)a×b=f(a×b)−a=r, if a+r=0a−1=r, if a×r=1a−b=a+(−b)a÷b=a×b−1a=r, if r×r=a
使用条件
- 原式结果为整数
- 原式结果小于P
- 没有多个不同值根式参与运算
在模P数域的通项公式
我们选择 P = 84906529, 于是
5→5=3589559351→35895593−1=5812303621+5→(1+35895593)×2−1=1794779721−5→(1−35895593)×2−1=66958733Fn=58123036×(17947797n+1−66958733n+1)
例子,取 n=10
F10=58123036×(1794779711−6695873311)=58123036×(69036466−15870262)=58123036×53166204=89
参考资料
【最讨厌做算法题的时候出现浮点数了,有什么方法可以避免?斐波那契数列和FFT均可适用!】 www.bilibili.com/video/BV1EM…