Algorithm 逆斐波那契算法?

Algorithm 逆斐波那契算法?,algorithm,math,fibonacci,Algorithm,Math,Fibonacci,对于任意n,有几十种计算F(n)的方法,其中许多都有很好的运行时和内存使用率 但是,假设我想问一个相反的问题: 如果F(n)为n>2,那么n是什么 (因为F(1)=F(2)=1,并且没有明确的逆,所以n>2限制在这里) 解决这个问题最有效的方法是什么?在线性时间内,通过枚举斐波那契数并在达到目标数时停止,很容易做到这一点,但是有没有比这更快的方法呢 编辑:目前,这里发布的最佳解决方案使用O(logn)内存在O(logn)时间内运行,假设数学运算在O(1)中运行,并且机器字可以在O(1)空间中保存

对于任意n,有几十种计算F(n)的方法,其中许多都有很好的运行时和内存使用率

但是,假设我想问一个相反的问题:

如果F(n)为n>2,那么n是什么

(因为F(1)=F(2)=1,并且没有明确的逆,所以n>2限制在这里)

解决这个问题最有效的方法是什么?在线性时间内,通过枚举斐波那契数并在达到目标数时停止,很容易做到这一点,但是有没有比这更快的方法呢


编辑:目前,这里发布的最佳解决方案使用O(logn)内存在O(logn)时间内运行,假设数学运算在O(1)中运行,并且机器字可以在O(1)空间中保存任何数字。我很好奇是否有可能降低内存需求,因为你可以使用O(1)空间计算斐波那契数。

已经证明fibn的公式是
fib(n)=((phi)^n-(-phi)^(-n))/sqrt(5)
其中
phi=(1+sqrt(5))/2
,黄金分割数。(见附件)

您可以尝试找到上述fib函数的数学逆函数,或者在32/64操作中进行二进制搜索(取决于可搜索的最大值有多大),以找到与该数字匹配的n(通过计算fib(n)并根据fib(n)与给定斐波那契数的比较将样本空间一分为二,尝试每个n)

编辑:@rcollyer的解更快,因为我的解在O(lgn)中,而他找到的解在O(1)中=常数时间。

给出了如下结果:

n(F) = Floor[ Log(F Sqrt(5) + 1/2)/Log(Phi)]

其中Phi是黄金比例。

所以我在考虑这个问题,我认为在O(lgn)时间内,使用O(lgn)内存是可以做到这一点的。这是基于以下事实:

F(n)=(1/√5) (Φn-φn)

式中Φ=(1+√5) /2和φ=1-Φ

第一个观察结果是,对于任何n>1的情况,φn<1。这意味着对于任何n>2,我们都有

F(n)=⌊ Φn/√5.⌋

现在,取n,用二进制写为bk-1bk-2…b1b0。这意味着

n=2k-1BK-1+2k-2BK-2+…+21 b1+20 b0

这意味着

F(n)=⌊ Φ2k-1 bk-1+2k-2 bk-2+…+21 b1+20 b0/√5.⌋

或者,更容易理解的是

F(n)=⌊ Φ2k-1 bk-1Φ2k-2 bk-2。。。Φ21 b1Φ20 b0/√5.⌋

这建议采用以下算法。首先,开始计算所有k的Φ2k,直到计算出一个数字Φz,使得⌊ Φz/√5.⌋ 这比你的数字F(n)大。现在,从这里开始,反向迭代通过这种方式生成的Φ的所有幂。如果当前数字大于Φ的指示幂,则将其除以Φ的幂,并记录该数字除以该值。这个过程实际上是通过一次减去最大的2次方来一次恢复一位n。因此,一旦你完成了,你就会找到n


该算法的运行时间为O(lgn),因为可以通过重复平方生成Φ2i,而我们只生成O(lgn)项。内存使用率是O(lg n),因为我们存储了所有这些值。

因为OP询问了不涉及任何浮点计算的矩阵解,这里就是了。我们可以通过这种方式实现
O(logn)
复杂性,假设数值运算具有
O(1)
复杂性

让我们假设2x2矩阵
A
具有以下结构

1 1
1 0

现在考虑向量<代码>(8, 5)< /代码>,存储两个连续的斐波那契数。如果你把它乘以这个矩阵,你会得到下一个斐波那契数 如果我们推广,

A^n*(1,0)=(f(n),f(n-1))

实际的算法需要两个步骤

  • 计算
    A^2
    A^4
    A^8
    ,等等,直到我们通过所需的数字
  • 通过
    n
    ,使用
    a
    的计算幂进行二进制搜索

  • 在旁注中,形式为
    f(n)=k1*f(n-1)+k2*f(n-2)+k3*f(n-3)+的任何序列kt*f(n-t)
    可以这样表示

    通过计算无界单词来衡量内存使用率有点傻,但只要这是一个模型,就有一个O(logn)time,O(1)word解决方案,类似于Nikita Rybak的解决方案,本质上是通过its计算
    n
    ,its基于斐波那契数(YO DAWG)

    定义矩阵

          1  1
    A  =       ,
          1  0
    
    满足

            F(m + 1)    F(m)
    A^m  =                      .
              F(m)    F(m - 1)
    
    我们将使用序列
    A^F(k)
    ,而不是序列
    A^F(k)
    。后一个序列的性质是我们可以通过矩阵乘法前进

    A^F(k + 1) = A^F(k - 1) * A^F(k)
    
    用矩阵求逆和乘法向后

    A^F(k - 1) = A^F(k + 1) (A^F(k))^-1,
    
    因此,我们可以构建一个双向迭代器,假设我们将所有内容都存储为有理数(以避免假设单位成本分割的存在),它只包含八个、六个、十二个字。其余的只是调整这个O(1)-空间算法来寻找Zeckendorf表示

    def zeck(n):
    a、 b=(0,1)
    而b>列表(zeck(0))
    [0]
    >>>名单(泽克(2))
    [1, 1]
    >>>名单(泽克(12))
    [8, 3, 1]
    >>>名单(泽克(750))
    [610, 89, 34, 13, 3, 1]
    
    如果你能很容易地用二进制解释F(n)

    您可能会怀疑常数1.7和1.1。这是因为d*1.44042009041+C永远不会非常接近整数

    如果有兴趣的话,我可以明天发布一个派生词

    这是一张n=2到91的表格,显示了铺地板前的公式结果:

     n  formula w/o floor     F(n) F(n) in binary
    
     2  2.540                    1 1
     3  3.981                    2 10
     4  4.581                    3 11
     5  5.421                    5 101
     6  6.862                    8 1000
     7  7.462                   13 1101
     8  8.302                   21 10101
     9  9.743                   34 100010
    10 10.343                   55 110111
    11 11.183                   89 1011001
    12 12.623                  144 10010000
    13 13.223                  233 11101001
    14 14.064                  377 101111001
    15 15.504                  610 1001100010
    16 16.104                  987 1111011011
    17 17.545                 1597 11000111101
    18 18.385                 2584 101000011000
    19 19.825                 4181 1000001010101
    20 20.425                 6765 1101001101101
    21 21.266                10946 10101011000010
    22 22.706                17711 100010100101111
    23 23.306                28657 110111111110001
    24 24.147                46368 1011010100100000
    25 25.587                75025 10010010100010001
    26 26.187               121393 11101101000110001
    27 27.028               196418 101111111101000010
    28 28.468               317811 1001101100101110011
    29 29.068               514229 1111101100010110101
    30 30.508               832040 11001011001000101000
    31 31.349              1346269 101001000101011011101
    32 32.789              2178309 1000010011110100000101
    33 33.389              3524578 1101011100011111100010
    34 34.230              5702887 10101110000010011100111
    35 35.670              9227465 100011001100110011001001
    36 36.270             14930352 111000111101000110110000
    37 37.111             24157817 1011100001001111001111001
    38 38.551             39088169 10010101000111000000101001
    39 39.151             63245986 11110001010000111010100010
    40 40.591            102334155 110000110010111111011001011
    41 41.432            165580141 1001110111101000110101101101
    42 42.032            267914296 1111111110000000110000111000
    43 43.472            433494437 11001110101101001100110100101
    44 44.313            701408733 101001110011101010010111011101
    45 45.753           1134903170 1000011101001010011111110000010
    46 46.353           1836311903 1101101011100111110010101011111
    47 47.193           2971215073 10110001000110010010010011100001
    48 48.634           4807526976 100011110100011010000101001000000
    49 49.234           7778742049 111001111101001100010111100100001
    50 50.074          12586269025 1011101110001100110011100101100001
    51 51.515          20365011074 10010111101110110010110100010000010
    52 52.115          32951280099 11110101100000011001010000111100011
    53 53.555          53316291173 110001101001111001100000101001100101
    54 54.396          86267571272 1010000010101111100101010110001001000
    55 55.836         139583862445 10000001111111110110001011011010101101
    56 56.436         225851433717 11010010010101110010110110001011110101
    57 57.276         365435296162 101010100010101101001000001100110100010
    58 58.717         591286729879 1000100110101011011011110111110010010111
    59 59.317         956722026041 1101111011000001000100111001011000111001
    60 60.157        1548008755920 10110100001101100100000110001001011010000
    61 61.598        2504730781961 100100011100101101100101101010100100001001
    62 62.198        4052739537881 111010111110011010000110011011101111011001
    63 63.038        6557470319842 1011111011011000111101100000110010011100010
    64 64.478       10610209857723 10011010011001100001110010100010000010111011
    65 65.078       17167680177565 11111001110100101001011110101000010110011101
    66 66.519       27777890035288 110010100001110001011010001001010011001011000
    67 67.359       44945570212853 1010001110000010110100101111110010101111110101
    68 68.800       72723460248141 10000100010010001000000000000111101001001001101
    69 69.400      117669030460994 11010110000010011110100110000101111111001000010
    70 70.240      190392490709135 101011010010100100110100110001101101000010001111
    71 71.681      308061521170129 1000110000010111000101001100010011100111011010001
    72 72.281      498454011879264 1110001010101011101011110010100001001111101100000
    73 73.121      806515533049393 10110111011000010110000111110110100110111000110001
    74 74.561     1304969544928657 100101000101101110011100110001010110000110110010001
    75 75.161     2111485077978050 111100000000110001001101110000001010111101111000010
    76 76.602     3416454622906707 1100001000110011111101010100001100001000100101010011
    77 77.442     5527939700884757 10011101000111010000111000010001101100000010100010101
    78 78.042     8944394323791464 11111110001101110000100010110011001101000111001101000
    79 79.483    14472334024676221 110011011010101000001011011000100111001001001101111101
    80 80.323    23416728348467685 1010011001100010110001111101111000000110010000111100101
    81 81.764    37889062373143906 10000110100110111110011011000111100111111011010101100010
    82 82.364    61305790721611591 11011001110011010100101010110110101000101101011101000111
    83 83.204    99194853094755497 101100000011010010011000101111110010000101000110010101001
    84 84.644   160500643816367088 1000111010001101100111110000110100111001010110001111110000
    85 85.244   259695496911122585 1110011010100111111010110110110011001001111111000010011001
    86 86.085   420196140727489673 10111010100110101100010100111101000000011010101010010001001
    87 87.525   679891637638612258 100101101111011101011101011110011011001101010100010100100010
    88 88.125  1100087778366101931 111101000100010011000000000110000011010000101001100110101011
    89 89.566  1779979416004714189 1100010110011110000011101100100011110011101111101111011001101
    90 90.406  2880067194370816120 10011111111000000011011101101010100001101110100111100001111000
    91 91.846  4660046610375530309 100000010101011110011111011001111000000001100100101011101000101
    

    编辑:没关系。提问者在评论中表示,指数运算绝对不是常数时间


    求幂是在恒定时间内允许的数学运算之一吗?如果是这样的话,我们可以通过。然后,给定一些F,我们就可以做下面的事情了
         n = int(2.0801 * ln(x) + 2.1408)
    
    Fn = Round(φ^n / Sqrt(5))
    
    F(-1)n= log(n*Sqrt(5))/logφ