实施替代斐波那契数列

Implementing alternative Fibonacci sequence

所以我正在为问题 3 苦苦挣扎。我认为 L 的表示将是一个类似这样的函数:

import numpy as np
def L(a,  b):
    #L is 2x2 Matrix, that is 
    return(np.dot([[0,1],[1,1]],[a,b]))


def fibPow(n):
    if(n==1):
        return(L(0,1))
    if(n%2==0):
        return np.dot(fibPow(n/2), fibPow(n/2))
    else:
        return np.dot(L(0,1),np.dot(fibPow(n//2), fibPow(n//2)))

鉴于 b 我很确定我错了。我应该做什么?任何帮助,将不胜感激。我认为我不应该使用斐波那契数列的黄金比例 属性。我的 a 和 b 应该是什么?

编辑:我更新了我的代码。由于某种原因,它不起作用。 L 会给我正确的答案,但我的指数运算似乎是错误的。谁能告诉我我做错了什么

首先,没有L(n, a, b)。只有 L(a, b),一个定义明确的线性运算符,可将向量 a, b 转换为向量 b, a+b

现在一个巨大的提示:线性运算符是一个矩阵(在本例中为 2x2,非常简单)。你能拼出来吗?

现在,通过矩阵魔法将此矩阵连续 n 次应用于初始向量(在本例中为 0, 1),相当于应用 n 次方L一次到初始向量。这就是问题 2 的内容。

一旦你确定了这个矩阵的样子,fibPow 就简化为计算它的 n 次方,然后将结果乘以 0, 1。要获得 O(log n) 复杂性,请检查平方求幂。

有了经过编辑的代码,您就快完成了。只是不要将所有内容都塞进一个函数中。这会导致细微的错误,我想您可能会乐于发现这些错误。

现在,L 不可用。正如我之前所说,它是一个矩阵。而问题的核心是计算它的n次方。考虑

L = [[0,1], [1,1]]

def nth_power(matrix, n):
    if n == 1:
        return matrix
    if (n % 2) == 0:
        temp = nth_power(matrix, n/2)
        return np.dot(temp, temp)
    else:
        temp = nth_power(matrix, n // 2)
        return np.dot(matrix, np.dot(temp, temp))

def fibPow(n):
    Ln = nth_power(L, n)
    return np.dot(L, [0,1])[1]

nth_power 与您的方法几乎相同,只是进行了一些微不足道的优化。您可以通过消除递归来进一步优化它。