实施替代斐波那契数列
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
与您的方法几乎相同,只是进行了一些微不足道的优化。您可以通过消除递归来进一步优化它。
所以我正在为问题 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
与您的方法几乎相同,只是进行了一些微不足道的优化。您可以通过消除递归来进一步优化它。