首页 >后端开发 >C++ >我们如何高效地找到给定范围内的所有素数?

我们如何高效地找到给定范围内的所有素数?

DDD
DDD原创
2025-01-13 22:07:44513浏览

How Can We Efficiently Find All Prime Numbers Within a Given Range?

查找给定范围内的素数:优化方法

本文解决了有效识别指定范围内所有素数的挑战。 素数,根据定义,是大于 1 的自然数,除了 1 和它本身之外没有正因数。

有缺陷的方法及其修正

解决此问题的初步尝试在逻辑上存在严重缺陷。该代码从 0 开始迭代,错误地将 0 和 1 作为潜在素数,并使用了错误的素性测试。条件 if (i != j && i % j == 0) 识别合数,而不是素数。 正确的方法是检查一个数字是否不能被除 1 和它本身以外的任何数字整除。

使用试分筛的优化解决方案

一种更有效的方法是利用试分筛。 这种方法利用了几个关键的优化:

  1. 平方根极限:我们只需要测试目标数的平方根的整除性。如果一个数有一个大于其平方根的除数,那么它也必须有一个小于其平方根的除数。

  2. 倍数删除:一旦识别出素数,其倍数就会从候选列表中删除,大大减少后续检查的次数。

  3. 迭代估计:代码使用近似公式(π(x)

优化后的代码(为了简洁而使用LINQ)有效地实现了这一策略:

<code class="language-csharp">Enumerable.Range(0, Math.Floor(2.52*Math.Sqrt(num)/Math.Log(num))).Aggregate(
    Enumerable.Range(2, num-1).ToList(), 
    (result, index) => { 
        var bp = result[index]; var sqr = bp * bp;
        result.RemoveAll(i => i >= sqr && i % bp == 0); 
        return result; 
    }
);</code>

与简单的方法相比,这种改进的算法提供了显着的性能改进,特别是在处理广泛的范围时。 使用 Enumerable.RangeToListRemoveAllAggregate 可以实现紧凑且高效的实现。

以上是我们如何高效地找到给定范围内的所有素数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn