Project Euler#7 Python输出错误



我用Python写了下面的代码,我想找到10001st素数。我的答案是103903,但正确答案是104743。我做错了什么?

def primes(n):
primes = [2]
i = 3
while len (primes) < n:
if isprime(i):
primes.append(i)
i = i + 1
return primes [-1]
def isprime(n):
i = 2
if ((i ** n) - i) % n == 0:
return True
else:
return False

您的isprime函数不正确。虽然它在许多情况下都能工作,并且确实能为300左右的所有数字产生正确的结果,但它仍然只是一种启发式方法。你似乎从费马小定理中得到了这个函数,但请注意,该定理说,如果p是素数,那么这对所有数字a都成立,所以你不能只检查它是否对a=2成立,然后决定p是素数。

来自维基百科关于Fermat原始性测试的原始性测试页面:

给定一个整数n,选择一个与n互素的整数,并计算一个^(n-1)%n.如果结果与1不同,则n是复合的。如果它是1,那么n可能是素数。

对于一个合适的isprime函数,没有办法用所有的潜在除数进行试除法。如果这对于Project Euler问题来说太慢,那么有一些事情可以优化,例如,只测试sqrt(n)以下的除数,并且只有在这些除数之前被确定为素数的情况下。

最新更新