我必须找到所有Fibonacci数的第一个k数字,直到斐波那契数列2 * 10 ^ 6.
很明显,我们不能将斐波纳契数的值存储在任何变量中。即使计算所有斐波那契数本身也需要大量的计算时间。那么,有没有办法获得斐波纳契数的第一个k位而不产生整数?
答案 0 :(得分:3)
由于您只需要前导数字,因此Fibonacci数的近似就足够了。因此,您可以使用 n th斐波纳契数的闭合公式,
F n =(φ n - (-φ) - n )/√5, 其中φ=(1 +√5)/2≈1.6180339887
...然后四舍五入到所需的精度。
答案 1 :(得分:1)
这是一种不会生成所有数字的方法。在快速查找斐波纳契数时,有一个O(k log n)
过程,其中O(k)
是将F(n)
与F(n-1)
相乘所需的时间。它利用了F(n)
正是矩阵a[0][1]
的{{1}}元素的事实,它是简单矩阵a
(reference)的n-th
幂。 。所以你可以使用exponentiation by squaring。这是一个示例python实现:
[[1, 1], [1, 0]]
对于def matrix_mult(a, b):
return ((a[0][0]*b[0][0] + a[0][1]*b[1][0],
a[0][0]*b[0][1] + a[0][1]*b[1][1]),
(a[1][0]*b[0][0] + a[1][1]*b[1][0],
a[1][0]*b[0][1] + a[1][1]*b[1][1]))
def matrix_pow(a, k):
if k == 0:
return ((1, 0), (0, 1))
t = matrix_pow(a, k//2)
t2 = matrix_mult(t, t)
if k % 2 == 0:
return t2
return matrix_mult(t2, a)
def fib(n):
a = ((1, 1), (1, 0))
return matrix_pow(a, n)[0][1]
def get_first_k(n, k):
return str(fib(n))[:k]
for n in range(10 ** 2, 10 ** 2 + 10):
print(get_first_k(n, 3))
#output
#first 3 digits actual number
354 #354224848179261915075
573 #573147844013817084101
927 #927372692193078999176
150 #1500520536206896083277
242 #2427893228399975082453
392 #3928413764606871165730
635 #6356306993006846248183
102 #10284720757613717413913
166 #16641027750620563662096
269 #26925748508234281076009
,考虑到问题的性质,计算n = 2 * 10 ** 5
需要5s
,这是合理的。
这是Java的替代方案
F_n