我用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
答案 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)
的除数,并且仅在先前已将它们识别为质数的情况下进行。