素数41,可以写成六个连续素数之和: 41 =2+3+5+7+ 11 + 13这是相加在100以下的素数的最长和。在一千以下的连续素数的最长和,加到一个素数,包含21个项,等于953。哪一个素数,低于一百万,可以写成最连续素数之和?
我想出了这个代码,但它只适用于一万以下的素数。
对如何优化它有什么想法吗?
from pyprimes import *
def sequence_exists(l,ls,limit = 100):
for x in range(0,len(ls)-l):
if x+l > len(ls): return False
if any (ls[i] > limit/6 for i in range(x,x+l,1)) :
return False
test_sum = sum(ls[x:x+l:1])
if (test_sum <limit) and is_prime(test_sum) :
return True
return False
def main():
n = prime_count(10000)
prime_list = list(nprimes(n))
l = 6
for x in range(6,len(prime_list)):
if sequence_exists(x,prime_list,10000):
l=x
print l
if __name__ == '__main__':
main()发布于 2015-05-02 18:42:15
特别是如果模块不是标准库的一部分,人们就会感到困惑,也不明白该功能来自何处。您可以按以下方式减少键入:
import pyprimes as prdef sequence_exists(l,ls,limit = 100):在上面的l和ls中,什么都不告诉读者。
发布于 2015-05-03 08:50:07
对如何优化它有什么想法吗?
我不打算包含很多细节,因为这是一个Euler项目的问题,我不想透露太多。然而,这里有一些可能会帮助你的想法。
is_prime函数来测试计算出的素数求和。您没有向我们展示实现,但这肯定不是最优的。最低限度,您可以内联它并消除函数调用的开销(并且您正在进行大量的此调用)。但是,抛开开销不谈,几乎可以肯定有一个更好的方法来测试原始性。而不是像米勒拉宾表演每个候选人,有没有一些简单的,就地检查,你可以代替,看看你的候选人是否是已知的一组素数的一部分?你怎么能有效地构造这样的检查?limit/6。作为参考,我的python 3对这个问题的回答在一台质量较差的笔记本电脑上不到半秒钟就完成了,而且不使用预先计算的总和。我们的算法之间的巨大差异就是上面所暗示的。
风格
if x+l > len(ls): return Falseif (test_sum <limit) and is_prime(test_sum) : return Truefor i in range(x,x+l,1)for x in range(6,len(prime_list)):https://codereview.stackexchange.com/questions/88645
复制相似问题