Python:使用 Sieve of Eratosthenes 测试数字的素数时遇到问题

Python: Trouble testing primality of a number using Sieve of Eratosthenes

提问人:Jackson Vliet 提问时间:10/23/2023 更新时间:10/23/2023 访问量:28

问:

我正在尝试使用埃拉托色尼筛子计算第 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

Python Primes 筛子

评论

0赞 Barmar 10/23/2023
什么?primepi()
1赞 Barmar 10/23/2023
这听起来更像是你的数学期望的问题。数学会是一个更好的提问场所。
0赞 Jackson Vliet 10/23/2023
@Barmar 它是 sympy 的一个函数,用于计算小于或等于某个数字 n 的素数。我知道这可能使用预先确定的素数列表来找到它,但我找不到 Meisser-Lehmer 算法的体面解释来自己在 python 中实现它。
0赞 President James K. Polk 10/23/2023
你的逻辑行不通。埃拉托色尼的筛子要求你从一开始就开始筛分,你已经发现了这一点。没有捷径可以让你忽略早期的素数。您可以检查分段筛作为替代方案。
0赞 cards 10/23/2023
请修复所有导入,即也为 ,ceilsqrt

答: 暂无答案