【发布时间】: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