【算法篇-数论】线性筛法(欧拉筛法)筛 n 以内的质数

news2025/1/15 23:26:50

筛质数

  • 1.线性筛法(欧拉筛法)介绍
  • 2.欧拉筛法代码以及分析
  • 3.总结

本文参考自 B站董晓算法
在这里插入图片描述

1.线性筛法(欧拉筛法)介绍

我们的目标是筛出 2 ~ n 以内的质数 最最最暴力的方法就是一个数一个数判断是不是质数 但是这样的时间复杂度是非常高的 而我们本文的欧拉筛法可以做到时间复杂度仅为O(N)

主要的思想就是一个质数的倍数(倍数为1除外)肯定是合数,那么我们利用这个质数算出合数,然后划掉这个合数,下次就可以不用判断它是不是质数,节省了大量的时间。
其实合数的倍数也是合数,这点也可以利用,划去其他的合数

其实这种思想也有一种算法叫埃式筛法,但是埃式筛法会重复地划掉一些合数,相比于欧拉筛法,并不是那么好,所以我们本文只介绍欧拉筛法,感兴趣的小伙伴可以去了解一下埃式筛法。

2.欧拉筛法代码以及分析

在这里插入图片描述

const int N = 1000010;
bool v[N]; //记录是不是合数,全局变量默认false
int pri[N],cnt; //pri[i]表示存放的质数,cnt记录质数个数,全局变量默认是0
void get_pri(int n) //参数是求 n 以内的质数
{
  for(int i = 2; i <= n;i++) //从 2 开始筛
  {
      if(!v[i]) //如果没有被划掉(表示不是合数)就说明当前i是质数
      {
          pri[++cnt] = i;//从pri[1]开始存放,所以是++cnt,cnt开始是0
      }
      for(int j = 1; i * pri[j] <= n;j++)//开始枚举已记录的质数,利用这些质数划掉合数 
      {   //for循环里面,i * pri[j] <= n,首先要保证划掉的合数不能大于n,不然没意义
          v[i * pri[j]] = true;//划掉合数
          if(i % pri[j] == 0)//这段代码是精髓
          {
              break;
              //如果i是质数,则最多枚举到自身中断
              //如果i是合数,则最多枚举到自身的最小质数中断
          }
      }
  }
}

我们来模拟一下
在这里插入图片描述

const int N = 1000010;
bool v[N]; 
int pri[N],cnt; 
void get_pri(int n) 
{
  for(int i = 2; i <= n;i++) 
  {
      if(!v[i]) 
      {
          pri[++cnt] = i;
      }
      for(int j = 1; i * pri[j] <= n;j++) 
      {  
          v[i * pri[j]] = true;
          if(i % pri[j] == 0)
          {
              break;
          }
      }
  }
}

求30以内的质数

i = 2时,2不是合数,所以进入if ,pri[1] = 2。
然后开始准备划掉合数,最下面的for循环判断条件 2 * pri[1] = 2 * 2 = 4 <= 30,进入循环
v[2 * pri[1]] = v[2 * 2] = v[4] = true,所以4这个数被我们划掉了,下次不会判断它了。
然后 if(2 % pri[1] == 0) ,就是if(2 % 2 == 0),直接break,
满足i是质数,则最多枚举到自身中断。

在这里插入图片描述

接下来我们直接跳到 i = 4 是,4是合数
const int N = 1000010;
bool v[N]; 
int pri[N],cnt; 
void get_pri(int n) 
{
  for(int i = 2; i <= n;i++) 
  {
      if(!v[i]) 
      {
          pri[++cnt] = i;
      }
      for(int j = 1; i * pri[j] <= n;j++) 
      {  
          v[i * pri[j]] = true;
          if(i % pri[j] == 0)
          {
              break;
          }
      }
  }
}
i = 4 时,v[4] 上面被我们划掉了,不进入所以不加入到 pri数组里面去
然后开始准备划掉合数
for循环里面 4 * pri[1] == 8 < 30 ,满足条件进入循环
v[4 * 2] = v[8] = true,划掉8这个数
if(4 % pri[1] == 0),也就是if(4 % 2 == 0)满足条件,直接break
满足i是合数时,最多枚举到自身最小的质因子中断。

剩下的大家可以自行代入上面的数值模拟一下。

3.总结

欧拉筛法

 if(i % pri[j] == 0)
{
 		break;
}

这段代码是精髓,每次划掉合数时,选择恰当的时机及时中断,避免了后面重复划掉合数,大大提高了算法的效率
i 是质数,而pri[j]里面都是质数,i 只有枚举到自己才能整除等于0,才能中断,也就是i是质数时,最多枚举到自身才中断
i 是合数i最多枚举到自身最小的质因子就中断

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java第31期】:Spring中存储Bean的注解以及用法

作者&#xff1a;有只小猪飞走了 博客地址&#xff1a;https://blog.csdn.net/m0_62262008?typeblog 这期内容&#xff1a;揭开Bean存储的神秘面纱 文章目录前言一&#xff0c;Controller&#xff08;控制存储&#xff09;二&#xff0c;Service&#xff08;服务存储&#xff…

过拟合问题(机器学习)

训练误差代表分类方法对于现有训练样本集的拟合程度 泛化误差代表此方法的泛化能力&#xff0c;即对于新的样本数据的分类能力如何 模型的训练误差比较高&#xff0c;则称此分类模型欠拟合 模型的训练误差低但是泛化误差比较高&#xff0c;则称此分类模型过拟合 对于欠拟合…

QGIS制作精美地图

QGIS制作精美地图 1.首先新建一个Print Layout,并为其命名(PS:如果创建完不小心删了,点右面的Layout Manager即可~ 2.在右侧空白处,设置页面大小(也可以在空白页面右键——属性) 3.点击Items——Add Map,然后在空白页面框画一个范围,这与ArcGIS pro的操作类似(PS:如…

【UML】类图Class Diagram

1、面向对象 面向对象分析&#xff1a;OOA&#xff08;Object-Oriented Analysis&#xff09; 面向对象设计&#xff1a;OOD&#xff08;Object-Oriented design&#xff09; 面向对象分析和面向对象设计的核心问题是怎么抽象对象。类图就是用来表示对象&#xff0c;可以表示…

JavaScript 基础1:变量与数据类型及其转换

JavaScript 基础1&#xff1a;变量与数据类型及其转换 Date: September 17, 2022 了解变量、数据类型、运算符等基础概念&#xff0c;能够实现数据类型的转换&#xff0c;结合四则运算体会如何编程。 体会现实世界中的事物与计算机的关系理解什么是数据并知道数据的分类理解变…

Path.Combine的坑

最近在写一个自动生成代码到指定文件夹的代码需要让玩家指定文件夹紧接着就遇到问题了 可以看到两个路径并没有合并。我查了一下&#xff0c;原来问题是出在总之就是有很多坑。不要用

【USB】macOS usb内核驱动开发入门

文章目录一、环境准备1、背景说明2、SIP是什么&#xff1f;为啥要关闭SI&#xff1f;P3、关闭SIP&#xff08;intel处理器&#xff09;4、样例代码下载二、编译运行三、参考资料一、环境准备 不想我啰哩啰嗦的直接跳到第3点开始执行&#xff01;&#xff01;&#xff01; 1、…

维格云轮播组件入门教程

功能简介 维格云轮播组件是对内传达核心价值观、重要通知,对外宣传广告、推广信息的工具。 维格云轮播组件借助在图片中镶嵌链接,并将多张图片循环播放的方式,可让企业的信息更加突出、有效、快捷地传达。 设置步骤 功能入口 【选择任意应用】——【编辑门户】——【轮播…

基于Kubernetes与云原生的存储测试基准CNSBench

CNSBench A Cloud Native Storage Benchmark基础知识CNSBench的摘要与介绍Kubernetes BackgroundKubernetes的工作流程CNSBench提出的需求分析CNSBench设计与实现CNSBench的示意图CNSBench的基准自定义资源基准自定义资源定义基准自定义资源实例基准测试控制器性能测试与实验测…

gcc编译选项

gcc编译步骤 有下面一个源程序 main.c&#xff1a; #include "stdio.h"int main(void) {printf("Hello World !");return 0; }在使用gcc 将 源文件 main.c编译成 可执行目标程序 总共需要4步&#xff1a; 1、源文件 main.c 预处理后&#xff0c;生成mai…

OpenCV-Python小应用(四):红绿灯检测

OpenCV-Python小应用&#xff08;四&#xff09;&#xff1a;红绿灯检测前言前提条件实验环境红绿灯检测参考文献前言 本文是个人使用OpenCV-Python的应用案例&#xff0c;由于水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入 …

血氧仪方案组成结构设计分析

任何产品都需要外部结构作为载体&#xff0c;将产品使用化的&#xff0c;血氧仪一样。 在血氧仪方案开发中&#xff0c;我们发现&#xff0c;血氧仪仅仅做好电子功能设计&#xff0c;其实根本就不够&#xff0c;没有好的结构件配合&#xff0c;其实要实现功能&#xff0c;那是天…

Nginx入门笔记

目录 Nginx 快速入门 1. 启动&#xff0c;停止和重新加载 Nginx 配置 2. 配置文件的结构 3. 提供静态内容服务(静态网站) 4. 设置简单的代理服务器 5. 设置 FastCGI 代理 Nginx 进程和运行时控制 1. 主进程和工作进程 2. 控制 Nginx Nginx 配置文件 Nginx 配置 Web 服…

Jenkins 构建maven项目时提示:No compiler is provided in this environment.

在确保虚拟机中的maven已经安装且可以正常执行mvn install 的情况下&#xff0c;Jenkins构建时执行maven编译仍然提示 No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 首先请确保你的虚拟机上安装了JDK以及Maven&#…

MPU进化,多核异构处理器有多强?A核与M核通信过程解析

内容来源&#xff1a;www.forlinx.com随着市场对嵌入式设备功能需求的提高&#xff0c;市面上出现了集成嵌入式处理器和单片机的主控方案&#xff0c;以兼顾性能和效率。 在实际应用中&#xff0c;嵌入式处理器和单片机之间需要进行大量且频繁的数据交换&#xff0c;如果采用低…

医学图像处理——DeepDrr工具CT生成DRR

医学图像处理——DeepDrr工具CT生成DRR一、DeepDrr工具介绍二、DeepDRR工具使用三、测试DeepDRR工具3.1 测试数据集3.1.1 阿里云数据3.1.2 LIDC-IDRI肺结节dicom数据集3.1.3 LIDC-IDRI肺结节dicom数据集3.2 测试代码四、总结一、DeepDrr工具介绍 它可以将CT数据模拟X射线投影生…

[附源码]SSM计算机毕业设计政府公用车辆管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

VUE全家桶 (Vue-cli、Vue-route、Vuex)学习笔记

Es6 let 是变量2.const 1. 是常量不能修改 创建的时候一定要赋值 要不报错定义的类 里面的属性值可以修改3.对象创建 1.可以先定义const name1&#xff1b; Const a{name}; 输出a的话就是{“name”:1}; 可以直接放进去函数 Const a{ Run(){ }, Set(){ } } 4. 遍历 遍…

【附源码】计算机毕业设计JAVA校园餐厅管理

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

haproxy软件的日志输出到指定文件

默认haproxy的日志是输出到系统syslog中&#xff0c;查看起来不是非常方便&#xff0c;为了更好的管理haproxy的日志&#xff0c;我们在生产环境中一般单独定义出来。需要将haproxy的info及notice日志分别记录到不同的日志文件中。 需要修改rsyslog配置&#xff0c;为了便于管…