项目Euler#7 Python错误输出

时间:2018-12-21 10:34:06

标签: python

我用Python编写了以下代码,我想找到第10001个素数。我得到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

1 个答案:

答案 0 :(得分:0)

您的isprime函数不正确。尽管它在许多情况下都能奏效,并且确实能对所有多达300个数字产生正确的结果,但这仍然只是一种启发。似乎您从Fermat's Little Theorem中接过该函数,但请注意,该定理说如果 p是素数,那么这对 all 数字a成立,所以您不能仅仅检查它是否满足a = 2然后确定p是素数。

Primality Tests的维基百科页面上进行Fermat素数测试:

  

给出一个整数n,选择一个整数作为n的互质数,并计算a ^(n-1)%n。如果结果不同于1,则n为合成。如果为1,则n 可能为素数。

对于适当的isprime函数,无法通过所有可能的除数进行试除。如果对于欧拉计画问题来说太慢了,您可以优化一些方法,例如仅测试不超过sqrt(n)的除数,并且仅在先前已将它们识别为质数的情况下进行。