Python 高达400万的偶数斐波那契数之和
我用来尝试解决这个问题的方法是可行的,但我认为它不是很有效,因为只要我输入一个太大的数字,它就不起作用了Python 高达400万的偶数斐波那契数之和,python,math,fibonacci,Python,Math,Fibonacci,我用来尝试解决这个问题的方法是可行的,但我认为它不是很有效,因为只要我输入一个太大的数字,它就不起作用了 def fib_even(n): fib_even = [] a, b = 0, 1 for i in range(0,n): c = a+b if c%2 == 0: fib_even.append(c) a, b = b, a+b return fib_even def sum_fi
def fib_even(n):
fib_even = []
a, b = 0, 1
for i in range(0,n):
c = a+b
if c%2 == 0:
fib_even.append(c)
a, b = b, a+b
return fib_even
def sum_fib_even(n):
fib_evens = fib_even(n)
s = 0
for i in fib_evens:
s = s+i
return s
n = 4000000
answer = sum_fib_even(n)
print answer
例如,这不适用于4000000,但适用于400。有更有效的方法吗?不必存储所有中间斐波那契数,可能存储会导致性能问题。不必存储所有中间斐波那契数,可能存储导致性能问题。不必存储所有中间Fibonacci数,可能存储导致性能问题。不必存储所有中间Fibonacci数,存储可能会导致性能问题。不必计算所有斐波那契数 注意:对于斐波那契序列,我在后面使用更标准的初始值F[0]=0,F[1]=1。项目Euler#2以F[2]=1,F[3]=2,F[4]=3,…,开始其序列,。。。。对于这个问题,两种选择的结果都是一样的 所有斐波那契数之和(作为热身) 递推方程
F[n+1] = F[n] + F[n-1]
也可以理解为
F[n-1] = F[n+1] - F[n]
或
从1到n(记住F[0]=0,F[1]=1)求和,左边是斐波那契数的和,右边是所有内部项都相消的伸缩和
sum(n=1 to N) F[n] = (F[3]-F[2]) + (F[4]-F[3]) + (F[5]-F[4])
+ ... + (F[N+2]-F[N+1])
= F[N+2] - F[2]
所以对于使用问题N=4000000的和,我们只需要计算一下
F[4,000,002] - 1
使用计算单个斐波那契数的超快速方法之一。减半和平方,相当于迭代矩阵的指数化,或基于黄金比率的指数公式(以必要的精度计算)
由于大约每20个斐波那契数,您将获得4个额外的数字,因此最终结果将由大约800000个数字组成。最好使用能够包含所有这些内容的数据类型
偶数斐波那契数的求和 只要检查前10或20个斐波那契数,就会发现所有偶数成员的指数都是3*k。通过减去两个连续递归进行检查,得到
F[n+3]=2*F[n+2]-F[n]
所以F[n+3]总是具有与F[n]相同的奇偶性。投入更多的计算,我们会发现成员之间有三个指数的递归
F[n+3] = 4*F[n] + F[n-3]
背景
S = sum(k=1 to K) F[3*k]
对n=3*k的递归求和得到
F[3*K+3]+S-F[3] = 4*S + (-F[3*K]+S+F[0])
或
因此,所需的总和具有以下公式
S = (F[3*K+2]-1)/2
黄金分割公式的快速计算揭示了N应该是什么,使得F[N]刚好低于边界,因此K=N div 3应该是什么
N = Floor( log( sqrt(5)*Max )/log( 0.5*(1+sqrt(5)) ) )
欧拉问题的简化公式 在原始问题中,我们发现N=33,因此总和为
S = (F[35]-1)/2;
(F[1,333,335]-1)/2
减少问题中的问题及其后果 以问题中的错误表示问题为例,N=4000000,因此K=133333,总和为
S = (F[35]-1)/2;
(F[1,333,335]-1)/2
它仍然有大约533400个数字。是的,biginteger类型可以处理这样的数字,用它们计算只需要时间
如果以60行80位的格式打印,这个数字将填充112张纸,只是为了了解输出的内容。不必计算所有斐波那契数字 注意:对于斐波那契序列,我在后面使用更标准的初始值F[0]=0,F[1]=1。项目Euler#2以F[2]=1,F[3]=2,F[4]=3,…,开始其序列,。。。。对于这个问题,两种选择的结果都是一样的 所有斐波那契数之和(作为热身) 递推方程
F[n+1] = F[n] + F[n-1]
也可以理解为
F[n-1] = F[n+1] - F[n]
或
从1到n(记住F[0]=0,F[1]=1)求和,左边是斐波那契数的和,右边是所有内部项都相消的伸缩和
sum(n=1 to N) F[n] = (F[3]-F[2]) + (F[4]-F[3]) + (F[5]-F[4])
+ ... + (F[N+2]-F[N+1])
= F[N+2] - F[2]
所以对于使用问题N=4000000的和,我们只需要计算一下
F[4,000,002] - 1
使用计算单个斐波那契数的超快速方法之一。减半和平方,相当于迭代矩阵的指数化,或基于黄金比率的指数公式(以必要的精度计算)
由于大约每20个斐波那契数,您将获得4个额外的数字,因此最终结果将由大约800000个数字组成。最好使用能够包含所有这些内容的数据类型
偶数斐波那契数的求和 只要检查前10或20个斐波那契数,就会发现所有偶数成员的指数都是3*k。通过减去两个连续递归进行检查,得到
F[n+3]=2*F[n+2]-F[n]
所以F[n+3]总是具有与F[n]相同的奇偶性。投入更多的计算,我们会发现成员之间有三个指数的递归
F[n+3] = 4*F[n] + F[n-3]
背景
S = sum(k=1 to K) F[3*k]
对n=3*k的递归求和得到
F[3*K+3]+S-F[3] = 4*S + (-F[3*K]+S+F[0])
或
因此,所需的总和具有以下公式
S = (F[3*K+2]-1)/2
黄金分割公式的快速计算揭示了N应该是什么,使得F[N]刚好低于边界,因此K=N div 3应该是什么
N = Floor( log( sqrt(5)*Max )/log( 0.5*(1+sqrt(5)) ) )
欧拉问题的简化公式 在原始问题中,我们发现N=33,因此总和为
S = (F[35]-1)/2;
(F[1,333,335]-1)/2
减少问题中的问题及其后果 以问题中的错误表示问题为例,N=4000000,因此K=133333,总和为
S = (F[35]-1)/2;
(F[1,333,335]-1)/2
它仍然有大约533400个数字。是的,biginteger类型可以处理这样的数字,用它们计算只需要时间
如果以60行80位的格式打印,这个数字将填充112张纸,只是为了了解输出的内容。不必计算所有斐波那契数字 注意:对于斐波那契序列,我在后面使用更标准的初始值F[0]=0,F[1]=1。项目Euler#2以F[2]=1,F[3]=2,F[4]=3,…,开始其序列,。。。。对于这个问题,两种选择的结果都是一样的 所有斐波那契数之和(作为热身) 递推方程
F[n+1] = F[n] + F[n-1]
ca