查找给定范围内的素数:优化方法
本文解决了有效识别指定范围内所有素数的挑战。 素数,根据定义,是大于 1 的自然数,除了 1 和它本身之外没有正因数。
有缺陷的方法及其修正
解决此问题的初步尝试在逻辑上存在严重缺陷。该代码从 0 开始迭代,错误地将 0 和 1 作为潜在素数,并使用了错误的素性测试。条件 if (i != j && i % j == 0)
识别合数,而不是素数。 正确的方法是检查一个数字是否不能被除 1 和它本身以外的任何数字整除。
使用试分筛的优化解决方案
一种更有效的方法是利用试分筛。 这种方法利用了几个关键的优化:
平方根极限:我们只需要测试目标数的平方根的整除性。如果一个数有一个大于其平方根的除数,那么它也必须有一个小于其平方根的除数。
倍数删除:一旦识别出素数,其倍数就会从候选列表中删除,大大减少后续检查的次数。
迭代估计:代码使用近似公式(π(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.Range
、ToList
、RemoveAll
和 Aggregate
可以实现紧凑且高效的实现。
以上是我们如何高效地找到给定范围内的所有素数?的详细内容。更多信息请关注PHP中文网其他相关文章!