【数论】线性筛质数

线性筛质数

在之前的一篇筛质数的文章中只解释了埃式筛质数的方法,没有解释线性筛质数的方法

我们先看一下线性筛质数的代码

【例题】

给定一个正整数 n,请你求出 1∼n 中质数的个数。

输入格式

共一行,包含整数 n。

输出格式

共一行,包含一个整数,表示 1∼n 中质数的个数。

数据范围

1≤n≤ 1 0 6 10^6 106

输入样例:
复制代码
8
输出样例:
复制代码
4
java 复制代码
import java.io.*;
import java.util.*;
public class Main {
    static final int N = 1000010;
    static int prime[] = new int[N];
    static boolean st[] = new boolean[N];
    static int idx;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        function(sc.nextInt());
        System.out.println(idx);
        sc.close();
    }
    public static void function(int n) {
        for(int i = 2; i<= n; i++) {
            //如果i不是合数,则i为质数
            if(!st[i]) {
                prime[idx++] = i;
            }
            //从小到大枚举质数,循环条件为prime[j] <= n / i的原因是在循环体里面用prime[j]筛掉prime[j] * i的质数
            for(int j = 0; prime[j] <= n / i; j++) {
                st[prime[j] * i] = true;
                if(i % prime[j] == 0) {
                    break;
                }
            }
        }
    }
}

在这个代码中st数组记录的是合数,prime数组记录的是质数

其中每次都是从小到大枚举质数,所以会有两种情况

  • 情况1 i % prime[j] == 0

    在这种情况下,prime[j]一定是质数

    假设存在一个比 prime[j] 更小的质因子 prime[k] 能整除 i ,那么在之前遍历到 prime[k] 时,就会因为 i 能被 prime[k] 整除而提前跳出内层循环,不会到 prime[j] 这一步,所以当 i % prime[j] == 0 时,prime[j]i 的最小质因子。

    因为 pj 是质数,且 pji 的最小质因子,对于 pj * i 这个数,显然 pj 是它的质因子。并且不存在比 pj 更小的质因子能同时整除 pji ,所以 pjpj * i 的最小质因子 。

  • 情况2 i % prime[j] != 0

    在这种情况下,prime[j]一定比i的最小质因子还小, 因为primes 数组里的质数是从小到大排列的。如果 i 存在比 prime[j] 小的质因子,那么在之前遍历到那个更小的质因子时,就会发现它能整除 i ,即 i 对那个更小的质因子取模为 0

    而且在这种情况下,prime[j]也一定是prime[j] * i的最小质因子

对于一个合数x ,我们假设已经确定了它的最小质因子prime[j]

在筛法的循环过程中,我们会从较小的数开始枚举i 。当枚举到(i = x / prime[j]) 时,此时(prime[j] * i = x) 。这是因为根据数的因数关系,如果prime[j] 是x 的最小质因子,那么x 可以表示为(x = prime[j] * k) (k 为整数 ),这里的k 就是(x / prime[j])

相关推荐
LZQqqqqo17 分钟前
C# 中生成随机数的常用方法
java·算法·c#
葵续浅笑21 分钟前
LeetCode - 合并两个有序链表 / 删除链表的倒数第 N 个结点
java·算法·leetcode
2301_793086872 小时前
Springboot 04 starter
java·spring boot·后端
seabirdssss4 小时前
错误: 找不到或无法加载主类 原因: java.lang.ClassNotFoundException
java·开发语言
还是鼠鼠5 小时前
tlias智能学习辅助系统--SpringAOP-进阶-通知顺序
java·后端·mysql·spring·mybatis·springboot
哪 吒5 小时前
【2025C卷】华为OD机试九日集训第3期 - 按算法分类,由易到难,提升编程能力和解题技巧
python·算法·华为od·华为od机试·2025c卷
机器学习之心HML5 小时前
PSO-TCN-BiLSTM-MATT粒子群优化算法优化时间卷积神经网络-双向长短期记忆神经网络融合多头注意力机制多特征分类预测/故障诊断Matlab实现
神经网络·算法·cnn
数据与人工智能律师5 小时前
智能合约漏洞导致的损失,法律责任应如何分配
大数据·网络·人工智能·算法·区块链
君莫笑几人回5 小时前
关于记录一下“bug”,在做图片上传的时候出现的小问题
java·开发语言·spring boot
技术不支持5 小时前
Qt Creator 11.0.3 语法高亮bug问题
java·服务器·数据库·qt·bug