埃氏筛法(高效素数筛选)

392 阅读2分钟

🧠 埃氏筛法(高效素数筛选)

✨ 本期带你掌握一个古老但高效的算法 —— 埃拉托色尼筛法(Sieve of Eratosthenes)

埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。

埃氏筛法

🧩 一、题目描述

给定一个正整数 n,请找出所有小于等于 n 的素数(质数)。

示例:

输入: n = 30
输出: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

🧠 二、解题思路:埃氏筛法简介

埃氏筛法的思想非常巧妙:

  1. 从最小素数 2 开始,标记其倍数为“非素数”;
  2. 找到下一个未被标记的数字,它一定是素数;
  3. 重复步骤 1 和 2,直到平方大于 n
  4. 最后剩下未被标记的数字就是素数。

👨‍💻 三、Python代码实现

def sieve(n):
    is_prime = [True] * (n + 1)
    is_prime[0] = is_prime[1] = False

    for i in range(2, int(n ** 0.5) + 1):
        if is_prime[i]:
            for j in range(i * i, n + 1, i):
                is_prime[j] = False

    return [i for i, val in enumerate(is_prime) if val]

📌 四、运行示例

print(sieve(30))
# 输出:[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

🧩 五、小结与要点

步骤说明
初始化布尔数组默认所有数为素数
从 2 开始把每个素数的倍数全部剔除
筛到 √n 即可因为更大的数其倍数已被处理

✅ 时间复杂度约为 O(n log log n),空间复杂度 O(n)


💡 六、进阶挑战

  • 📦 筛出 1 ~ 100000 的素数?(可做性能测试)
  • ⚡ 改进为线性筛法?
  • 🧠 扩展为欧拉筛、分段筛等高级变体?

❤️ 结语

埃氏筛法以“标记去除”的思路高效而优雅,是入门数论算法的经典之选!


👉 点个赞 👍 + 收藏 🌟,素数永远浪漫,算法永远年轻!