【问题标题】:Fibonacci and Prime numbers Python斐波那契数和素数 Python
【发布时间】:2014-12-30 16:03:26
【问题描述】:

F[n]P[n] 分别是nth 斐波那契数和素数。有一些n 的值,其中F[n] % P[n] = 0

让满足此条件的第一个k 索引为n_1 < n_2 < ... < n_k

我想计算第一个k 索引的总和(即n_1 + ... + n_k)。该程序适用于k = 2,但对于k = 5 来说太慢了(如下所示)。

有什么办法可以加快速度吗?

def primelist(n):
  prime = [True]*n
  for p in range(3,n,2):
    if p**2>n:
    break
  if prime[p]:
    for i in range(p*p,n,2*p):
      prime[i]=False
 return [2]+[p for p in range(3,n,2) if prime[p]]
l= primelist(100000)
l.insert(0,0)
fib = [0,1]
for i in range(2,len(l)):
fib.append(fib[i-1]+fib[i-2])

k=0
sum_=0
i=1
while i<len(l):
  if fib[i]%l[i]==0:
    k=k+1
    sum_=sum_+i
  if k==5:
    i=len(l)-1
  i=i+1
print sum_

【问题讨论】:

  • 所以?有什么问题?
  • 问题是我想尽可能减少获得结果所需的时间。
  • 100000 素数上限是不够的。你需要的不止这些。但它并没有那么远(肯定少于一百万个第一个素数),所以你应该能够在合理的时间内计算出来(斐波那契数列应该非常快速且易于计算,因为你有一个内置的 -在 Python 中的 bignum 中) - 但你不应该全部保留它们,你一次只需要 两个 。斐波那契数很快变大,将它们全部保存在一个数组中将需要大量内存。只是有两个变量。

标签: python math primes fibonacci


【解决方案1】:

这两个系列都是计算密集型的,换句话说,计算值需要这么多时间,尤其是 Python 是一种解释性语言,这让我在这些类型的计算中速度较慢,这并不让我感到惊讶。我建议您使用库 numpy 进行所需的计算。这将使您的计算速度更快。

【讨论】:

    【解决方案2】:

    首先,你应该重新定义你的变量,比如;

    i+=1
    

    不是;

    i=i+1
    

    第二,元组处理比列表快。因此,如果您不打算更改任何内容,则可以使用元组而不是列表。

    也在此声明中;

    for p in range(3,n,2):
        if p**2>n:
            break
    

    如果 p 大于 n 的平方根,您可能想要这样做。所以您应该将该行更改为;

    for p in range (3,int(n**0.5+1),2):
    

    【讨论】:

      猜你喜欢
      • 2014-05-23
      • 2017-04-21
      • 2018-01-30
      • 2013-08-03
      • 2013-02-24
      • 2011-02-16
      • 2015-06-05
      • 2014-05-03
      • 1970-01-01
      相关资源
      最近更新 更多