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