提问人:Jackson Vliet 提问时间:10/23/2023 更新时间:10/23/2023 访问量:28
Python:使用 Sieve of Eratosthenes 测试数字的素数时遇到问题
Python: Trouble testing primality of a number using Sieve of Eratosthenes
问:
我正在尝试使用埃拉托色尼筛子计算第 n 个素数。但是,对于较大的 n 值,它会加快生成一些下限的过程,然后只筛选高于此下限的值,直到找到第 n 个素数。我在这里使用的下限是 ,其中 .这为 n >= 2 的值提供了不错的估计。然后我会使用埃拉托色尼的筛子从这个下限开始筛分,直到找到第 n 个素数。我已经使用以下代码完全实现了这一点:lower_bound = n * (ln + log(ln, e))
ln = log(n, e)
def find_nth_prime(n, lower=3):
primes = [2]
previous_primes = primepi(lower)
candidate = lower
while len(primes) < (n - previous_primes + 2):
is_prime = True
for prime in primes:
if candidate % 5 == 0:
is_prime = False
break
if prime > ceil(sqrt(candidate + 1)):
break
if candidate % prime == 0:
is_prime = False
break
if is_prime:
primes.append(candidate)
candidate += 2
return primes[-1]
此代码的问题在于它没有使用低于此下限的素数来测试素数。例如,如果我尝试这样做,它将输出 23(第 9 个素数),因为它认为 9 是素数,因为它不测试可被 3 整除,因为它低于下限,因此不包括在它测试可整除的数字中。我尝试计算素数直到下界,然后将其用作我的素数列表,但这首先违背了拥有下限的目的。我不能之前只添加素数,因为我的目标是将这个函数用于相当大的 n 值,所以每次都手动添加它们是不切实际的。我也不想导入素数列表,因为这也违背了目的,我可以使用该列表来查找第 n 个素数。我读过一些类似的其他问题,比如这个问题,但给出的解释并没有解释如何从下限筛选,它只是简单地说要这样做。该答案底部给出的链接也不再有效。感谢您的帮助。find_nth_prime(10, 5)
find_nth_prime
答: 暂无答案
评论
primepi()
ceil
sqrt