AI编程助手
AI免费问答

埃拉托斯特尼筛法:加速“交叉倍数”步骤

王林   2024-02-09 12:36   506浏览 转载

埃拉托斯特尼筛法:加速“交叉倍数”步骤

php小编苹果为您介绍埃拉托斯特尼筛法,这是一种用于快速计算素数的算法。该算法通过不断排除非素数的倍数,从而筛选出所有的素数。与传统的逐个判断素数方法相比,埃拉托斯特尼筛法能够大大加速计算过程。它的核心思想是从2开始遍历到n,将每个素数p的倍数标记为非素数,直到遍历完毕。这种方法在计算大量素数时表现出色,是一种高效的素数计算算法。

问题内容

我已经实现了一个使用埃拉托斯特尼筛法算法列出素数的函数,如下所示:

func ListPrimes(n int) []int {
    primeList := make([]int, 0)
    primeBooleans := SieveOfEratosthenes(n)
    for p := 0; p 
<p>但我发现效率低下:即 <code>CrossOffMultiples</code> 被调用的次数超出了必要的次数。 IOW,已经被“划掉”的整数将被划掉第二次或第三次(甚至更多次),因为任何多个 <code>m</code> 将有多个因素来划分它。但我似乎无法弄清楚如何利用这一点信息以允许我减少调用 <code>CrossOffMultiples</code> 的次数。我确信有办法做到这一点,但由于某种原因,我无法做到这一点。</p>
<p>有什么建议吗?</p><h2 class="daan">解决方法</h2><p>如果您减少 <code>CrossOffMultiples</code> 被调用的次数,即,您不对某些素数 <code>p</code> 调用它,则 <code>p * p</code> 不会被划掉。但你可以做的是从 <code>p * p</code> 而不是 <code>2 * p</code> 开始循环。</p>
<p>多次划掉数字是正常的,埃拉托斯特尼筛法就是这样做的。 <a href="https://www.php.cn/link/c13ffb792c2cc71a9202bea953215f5a" rel="nofollow noreferrer">线性筛法</a>是您可能感兴趣的类似算法。 p></p>
声明:本文转载于:stackoverflow,如有侵犯,请联系admin@php.cn删除