欧拉问题27如下:
欧拉发现了显著的二次公式:
N平方+N+41
结果表明,这个公式将为
连续值n=0到39。然而,当n=402+40+41时=
40(40+1)+41可以被41整除,当然当n=41,41平方+
41+41显然可以被41整除。
我们发现了令人难以置信的公式n79n+1601,它产生了
连续值n=0到79的80个素数产品的
系数-79和1601为-126479。
考虑到形式的求积:
N_+A+B,其中A式中n是n的模量/绝对值,例如11=11和−4|=
4求二次型系数a和b的乘积
连续生成素数的最大数的表达式
n的值,从n=0开始。
这就是我的解决方案:
from math import sqrt, fabs
def eSieve(rnge):
rootedrange = int(sqrt(rnge))
mydict = dict([(_, True) for _ in range(2, rootedrange)])
for i in range(2, rootedrange):
if mydict[i] == True:
for j in range(i**2, rnge, i):
mydict[j] = False
mylist = []
for key in mydict.keys():
if mydict[key] is True:
mylist.append(key)
return mylist
primes = eSieve(87400)
def isPrime(n):
i = 0
while primes[i] <= n:
if primes[i] == n: return True
i+=1
return False
arange = 0
brange = 0
nrange = 0
for a in range(-1000, 1001):
for b in range(-1000, 1001):
n = 0
formula = n*n + a*n + b
print(formula)
while(isPrime(fabs(formula))):
n+=1
if n > nrange:
arange = a
brange = b
crange = c
print(arange * brange)
我不知道为什么它不断地抛出这个错误:
Traceback (most recent call last):
File "D:\Programming\ProjectEuler\p27.py", line 33, in <module>
while(isPrime(fabs(formula))):
File "D:\Programming\ProjectEuler\p27.py", line 20, in isPrime
while primes[i] <= n:
IndexError: list index out of range
有谁能告诉我的程序是如何超出列表范围的?这很不正常为什么会这样?
最佳答案
如果你想知道1000000是否是素数,我们来看看会发生什么:
i = 0
while primes[i] <= n:
if primes[i] == n: return True
i+=1
return False
没有一个筛选的素数大于1000000,因此您的
while
条件永远无法满足。python的第一条规则是永远不要使用while
循环(除非您不能使用任何其他循环)。在这里,您可以轻松地用for
替换它:for i in primes:
if i == n:
return True
return False
但这正是
in
运算符要替换的:return n in primes
除了重新实现Python核心特性之外
isPrime
随着项目数的增加而变慢。因此,对于键入最少的最快代码,您可以执行以下操作:
>>> primes = eSieve(87400)
>>> prime_set = set(primes)
>>> 13 in prime_set
True
>>> # or if you want a function:
>>> is_prime = prime_set.__contains__
>>> is_prime(13)
True
n in primes
如果给定值在item in list
中,则item in set
的magic方法返回true-直接使用它比在函数中包装__contains__
运算符快得多。关于python - 欧拉计划#27 Python,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25344612/