作业介绍

📘 数论基础:素数判断与质数筛法总结


🔢 基本定义

  • 质数(素数):大于 1 的自然数,除了 1 和它本身,没有其他因数。
  • 合数:大于 1 且有除了 1 和自身外的因数的自然数。
  • 最小质因数:一个合数中最小的质因数。

🔍 素数判断方法

✅ 普通判断(试除法)

  • 从 2 到 √n 遍历,如果 n 能被整除则不是素数。
  • 时间复杂度:O(√n)
  • 用于判断单个整数是否为素数。
bool is_prime(int n) {
    if (n <= 1) return false;
    for (int i = 2; i * i <= n; ++i)
        if (n % i == 0) return false;
    return true;
}

🧹 质数筛法(批量找出素数) 📌 筛法简介 用于快速找出某个范围内所有的素数。

核心思想:通过标记合数来“筛”出素数。

🧮 筛法分类

1️⃣ 埃拉托斯特尼筛法(埃氏筛)

基本思想:从 2 开始,将每个数的倍数标记为合数。

实现简单,容易理解,但标记倍数存在重复。

时间复杂度:O(n log log n)


vector<bool> is_prime(n + 1, true);
is_prime[0] = is_prime[1] = false;
for (int i = 2; i * i <= n; ++i) {
    if (is_prime[i]) {
        for (int j = i * i; j <= n; j += i)
            is_prime[j] = false;
    }
}

2️⃣ 线性筛法(欧拉筛)

基本思想:每个合数只被其最小质因数筛去一次。

时间复杂度:O(n),效率更高。

稍微复杂但适合大规模素数筛选。

vector<int> primes;
vector<bool> is_prime(n + 1, true);
for (int i = 2; i <= n; ++i) {
    if (is_prime[i]) primes.push_back(i);
    for (int p : primes) {
        if (p * i > n) break;
        is_prime[p * i] = false;
        if (i % p == 0) break;
    }
}

⚙️ 筛法优化策略 范围优化:只筛到 √n 即可。

埃式筛:从 i*i 开始标记更高效。

欧拉筛:一旦 i % p == 0,就跳出内层循环,避免重复标记。

🧠 应用场景 求某范围内的质数总数

获取一个数的所有质因数

加密算法中生成大素数(如 RSA)

高效求解数论类竞赛题(如因子、最小质因数)

✅ 小结对比 方法 时间复杂度 是否重复标记 实现复杂度 适用范围 试除法 O(√n) N/A 简单 判断单个数是否为素数 埃式筛法 O(n log log n) 有 简单 小范围素数筛选 线性筛法 O(n) 无 中等 大范围高效筛选

题目

认领作业后才可以查看作业内容。
状态
正在进行…
题目
16
开始时间
2025-6-7 0:00
截止时间
2222-3-1 23:59
可延期
24 小时