zoukankan      html  css  js  c++  java
  • 斐波那契数

    一、定义

      斐波那契数,又称黄金分割数列,是指数列:(0,1,1,2,3,5,8,……)。表示后一个数由前两个数的和组成,递归上定义为(f[0]=0,f[1]=1,f[i]=f[i-1]+f[i-2])

    二、通项公式

      接下来用推导斐波那契数的通项公式:

      假设常数s、r满足:

        (f[n]-r*f[n-1]=s*(f[n-1]-r*f[n-2]))

      再结合斐波那契数的定义,我们可以得到:

        (r+s=1,rs=-1)

      所以,对于(n≥3)时,有:

        (f[n]-r*f[n-1]=s*(f[n-1]-r*f[n-2]))

        (f[n-1]-r*f[n-2]=s*(f[n-2]-r*f[n-3]))

        (……)

        (f[3]-r*f[2]=s*(f[2]-r*f[1]))

      我们联立这n-2个式子,可以得到:

        (f[n]-r*f[n-1]=s^{n-2}*(f[2]-r*f[1]))

      因为:

        (s=1-r,f[1]=f[2]=1)

      所以可以化简:

        (f[n]=s^{n-1}+r*f[n-1])

           (=s^{n-1}+r*s^{n-2}+r^2*f[n-2])

           (=s^{n-1}+r*s^{n-2}+r^2*s^{n-3}+r^3*f[n-3])

           (……)

           (=s^{n-1}+r*s^{n-2}+r^2*s^{n-3}+……+r^{n-1})

      这就是一个以(s^{n-1})为首项,(r^{n-1})为末项,(frac{r}{s})为公比的等比数列,直接运用等比数列求和公式:

    [原式=frac{s^{n-1}-r^{n-1}*frac{r}{s}}{1-frac{r}{s}} ]

    [=frac{s^n-r^n}{s-r} ]

      因为前文求出的两个关于(r、s)的式子其中一组解为:

    [s=frac{1+sqrt{5}}{2},r=frac{1-sqrt{5}}{2} ]

      所以通项公式为:

    [f[n]=frac{sqrt{5}}{5}*[(frac{1+sqrt{5}}{2})^n-(frac{1-sqrt{5}}{2})^n] ]

    例1 普通递归关系

      给出以下定义在非负整数n下的递归关系:

    [f[n]= egin{cases} f_0 qquad qquad qquad qquad qquad qquad n=0 \ f_1 qquad qquad qquad qquad qquad qquad n=1 \ a*f[n-1]+b*f[n-2] qquad otherwise end{cases} ]

      其中(a、b)是满足以下两个条件的常数:

      (一)(a^2+4b>0)

      (二)(|a-sqrt{a^2+4b}|≤2)

      给出(f_0,f_1,a,b,n),求(f[n])

      我们考虑直接暴推公式,用类似斐波那契数的方法求得公式为:

    [f[n]=frac{s^n(f_1-mf_0)-r^n(f_1-kf_0)}{s-r} ]

      其中:

    [s、r=frac{a±sqrt{a^2+4b}}{2} ]

      直接快速幂求解就行了。

      然而推完式子后发现这实际上是复杂度理论上和矩阵快速幂一样的,而且矩阵快速幂好写很多,然后就不想写代码了。

    例2 数字迷阵

      题面太长,懒得打了,自己去看吧。数字迷阵

      我们考虑每一行都相当于是斐波那契数,只要求出前两项即可,所以我们考虑前两项的规律。

      由于我们知道(A[i,2]=2A[i,1]-(i-1)),只要考虑找出(A[i,1])的规律即可。

      对于(A[i,1]),我们分析它的差值可以知道:

        (1sim2)行:(3)

        (3sim4)行:(2-3)

        (5sim7)行:(3-2-3)

        (8sim12)行:(2-3-3-2-3)

      所以每次的差值就是由前两项的差值拼接起来,接下来就是求通项公式;

      但我们发现直接求通项公式很复杂,代码也难以在合适的时间复杂度内模拟,我们考虑求出它的前两项((0)列和(-1)列):

    列数 -1 0 1 2 3 4 5 6 7 8
    0 1 2 3 5 8 13 21 34 55
    1 3 4 7 11 18 29 47 76 123
    2 4 6 10 16 26 42 68 110 178
    3 6 9 15 24 39 63 102 165 267
    4 8 12 20 32 52 84 136 220 356

      所以我们可以发现第(-1)列的规律是自然数依次递增,而这个第(0)列,看着十分眼熟,实际上这与(Wythoff)博弈有关,我们知道(Wythoff)博弈的必胜态为:

    [(1,2),(3,5),(4,7),(6,10),(8,13)…… ]

      而Wythoff博弈后手必胜态的通项为:

    [(lfloor{phi} floor,lfloorphi^2 floor),(lfloor2phi floor,lfloor2phi^2 floor),(lfloor3phi floor,lfloor3phi^2 floor),(lfloor4phi floor,lfloor4phi^2 floor)……\ 其中phi=frac{sqrt{5}+1}{2} ]

    定理:Wthyoff博弈的必胜态为序列(W)(即上述序列),通项公式为((lfloor nphi floor,lfloor nphi^2 floor))

    证明:我们先证明序列W满足这三个性质:

      (1、W无重复且不遗漏包含了所有整数)

      (2、W中两数之差依次为1,2,3,4,……)

      (3、W中的较小数依次递增)

      性质1:

    Beatty-Rayleigh 定理
    对于任意两个正无理数满足(frac{1}{alpha}+frac{1}{eta}=1),那么数列(lflooralpha floor,lfloor2alpha floor,lfloor3alpha floor,……)和数列(lflooreta floor,lfloor2eta floor,lfloor3eta floor,……)既无重复有无遗漏的包含了所有的正整数

      而(phi)(phi^2)恰好就是满足条件的两个正无理数(定理的具体证明就不写了)

      性质(2)(3)比较显然,我们可以直接由通项公式知道

      由这三个性质我们可以知道三个关于W的条件

      (1、W中的任意一个数对都无法一步变成终止状态(0,0))

      (2、W中的任意一个数对都无法通过一步变成W中的另一个数)

      (3、W外的任何一个数对都可以一步变成(0,0)或W中的数对)

      所以显然W是满足要求的数对

      不过关于(Fibonacci)数列和(Wthyoff)还有很多更深的联系,就不再赘述了,大家想了解可以看这位大佬的博客

      所以我们从一道(Fibonacci)+矩阵快速幂题成功扯到了博弈,而事实关系远不止如此,题目中要我们求得表实际上就是(wthyoff)表,而这又和(Zeckendorf)表达有关,不得不感叹数学海洋的辽阔。

      扯到这里,第(1)列的通项公式就出来了,由于第(-1)列的通项为(i-1),第(0)列的通项为(lfloor iphi floor),所以第(1)列的通项就为(lfloor iphi+i-1 floor)

      已知前两项的斐波那契数做法就很多了,我们可以直接代入之前的公式,也可以用矩阵快速幂求解。

      代码就不贴了,知道结论挺好写的。

  • 相关阅读:
    Excel电子表格操作
    word文档编辑
    中英文输入
    个人借款合同范本
    Day-8:汇总数据
    Day-7:使用函数处理数据
    Day-6:创建计算字段
    Day-5:通配符过滤
    Day-4:高级数据过滤
    Day-3:过滤数据
  • 原文地址:https://www.cnblogs.com/fangbozhen/p/11755699.html
Copyright © 2011-2022 走看看