素数筛法详解:埃氏筛和欧拉筛

主要讲解怎么判断一个数字是否是素数:

埃式筛

学习埃氏筛之前,我们先看一下暴力筛法,即对每个数都用试除法判断其是不是质数:

暴力筛法:

# include <stdio.h>int main()
{int st[N]; // 初始化为0, 0表示质数,1表示合数for(int i = 2; i <= n; i++){for(int j = 2; j <= i / j; j++){//试除法if(i % j == 0){st[i] = 1; // 合数,标记为1 }}
}

这种方式无疑是最慢的,我们看一下如何加快,换一种思路:一个质数的倍数一定是合数,所以,假设P是质数,那么就可以筛选掉2~100之间所有P的倍数。

先看个例子,对于数列1~11:

先筛去2的倍数:

然后筛去3的倍数:

然后筛去5的倍数:

至此,1~11内的所有合数都被筛完了, 2 3 5 7 11是数列中的质数。

为什么这样能筛去所有的合数呢,因为一个合数一定能被分解为几个质数的幂的乘积,并且这个数的质因子一定是小于它本身的,所以当我们从小到大将每个质数的倍数都筛去的话,当遍历到一个合数时,它一定已经被它的质因子给筛去了

埃氏筛代码:

# include <stdio.h>
int main()
{int n = 100;int st[100] = {0};for (int i=2; i<=n; ++i){if (st[i] == 0){for (int j=2*i; j<=n; j=j+i)st[j] = 1;// j是i的一个倍数,j是合数,筛掉。}}
}

以上的时间复杂度为

我们还可以对其进行优化:

        1.我们会先筛2的所有倍数,然后筛3的所有倍数,但筛除3的倍数时,我们还是从3的2倍开始筛,其实3 * 2 ,已经被2 * 3时筛过了。

        又比如说筛5的倍数时,我们从5的2倍开始筛,但是5 * 2会先被2 * 5筛去, 5 * 3会先被3 * 5会筛去,5 * 4会先被2 * 10筛去,所以我们每一次只需要从i*i开始筛,因为(2,3,…,i - 1)倍已经被筛过了。

       

优化后的埃式筛:

# include <stdio.h>
# include <math.h>
int main()
{int n = 100;int st[100] = {0};for (int i=2; i<=int(sqrt(n)); i++){if(st[i] == 0){for(int j = i * i; j <= n; j += i)st[j] = 1; // j是i的一个倍数,j是合数,筛掉。}}
}

优化后的时间复杂度可以近似看成O ( n ) 了。

但是,我们还可以更快,那就是欧拉筛。

欧拉筛

欧拉筛,又称为线性筛,时间复杂度为O ( n )

欧拉筛之所以能这么快,是因为不重复筛选,特点是合数都是被它的最小质因子筛去的

代码:

# include <stdio.h>
# include <stdio.h>int main()
{int n = 100;int st[100];//用于表示i是否是素数,如果是则为1,不是则为0for (int i=0; i<100; ++i)st[i] = 1;// 初始化int primes[100];//用于存储素数。int k = 0;for (int i=2; i<=int(sqrt(n)); ++i){if (st[i] == 1){primes[k] = i;k = k + 1;}for (int j=0; j<k; ++j){st[primes[j]*i] = 0; //筛去合数 if (i % primes[j] == 0) // 若 primes[j]是(合数)i的最小素因子,结束本轮遍历,防止重复标记 break;}} 
} 

欧拉筛的核心思想就是确保每个合数只被最小质因数筛掉。

可以参考对欧拉筛的解释视频:

欧拉筛,几行就行,一次就好_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1LR4y1Z7pm/?spm_id_from=333.337.search-card.all.click&vd_source=617dcf7ed08ed9625bdfcadc93c4fac7

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

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

相关文章

GitLab代码库提交量统计工具

1.说明 统计公司所有项目的提交情况&#xff0c;可指定分支和时间段&#xff0c;返回每个人的提交新增数、删除数和总数。 2.API 文档地址&#xff1a;http://公司gitlab域名/help/api/README.md 项目列表查询 返回示例&#xff1a; [{"id": 1, //项目ID"http…

Microsoft 365自定义安装软件

如图&#xff0c;在安装类型的步骤的时候&#xff0c;可以勾选自己想要的软件&#xff08;而非一股脑儿的安装一大堆自己不需要的&#xff09;。

搜索引擎是如何工作的?

搜索引擎是如何工作的&#xff1f; 本文转自 公众号 ByteByteGo&#xff0c;如有侵权&#xff0c;请联系&#xff0c;立即删除 搜索引擎是如何工作的&#xff1f; 搜索引擎在互联网时代扮演着至关重要的角色&#xff0c;它们不仅极大地影响了人们获取信息的方式&#xff0c;还…

RSA加密原理

2024.2.23 密钥对的生成过程 1、随机找两个质数 P 和 Q &#xff0c;P 与 Q 越大&#xff0c;越安全 本例取 P 67 &#xff0c;Q 71 计算他们的乘积 N P * Q 4757 转化为二进为 1001010010101&#xff0c;该加密算法即为 13 位&#xff0c;实际使用中的算法是往往是 …

基于RK3399 Android11适配OV13850 MIPI摄像头

目录 1、原理图分析2、编写和配置设备树3、调试方法4、遇到的问题与解决5、补丁 1、原理图分析 从上图可看出&#xff0c;我们需要关心的&#xff0c;①MIPI数据和时钟接口使用的是MIPI_TX1/RX1 ②I2C使用的是I2C4总线 ③RST复位引脚使用的是GPIO2_D2 ④PWDN使用的是GPIO1_C7 ⑤…

kali xrdp

Kali Linux 使用远程桌面连接——xrdp&xfce_kali xfce桌面-CSDN博客 Ubuntu/Debian/Kali xrdp远程桌面黑屏/空屏/无画面解决办法 - 知乎 (zhihu.com) sudo apt-get install xrdp -y sudo apt-get install xfce4 -ysudo systemctl enable xrdp --now systemctl status xrd…

RabbitMQ监控方法以及核心指标

RabbitMQ监控方法以及核心指标 1. 监控指标采集2. 使用rabbimq插件采集指标2.1 3.8.0之前版本&#xff0c;使用外部插件暴露2.2 3.8.0之后版本&#xff0c;使用内置插件暴露 3. 使用rabbitmq_exporter采集指标3.1 部署rabbitmq_exporter3.2 prometheus采集rabbitmq_exporter的暴…

【知识分享】自动化测试首选接口自动化?

在分层测试的“金字塔”模型中&#xff0c;接口测试属于第二层服务集成测试范畴。 相比UI自动化测试而言&#xff0c;接口自动化测试收益更大&#xff0c;且容易实现&#xff0c;维护成本低&#xff0c;有着更高的投入产出比。因此&#xff0c;项目开展自动化测试的首选一般为接…

OpenHarmony—UIAbility组件间交互(设备内)

UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时&#xff0c;会涉及到启动特定的UIAbility&#xff0c;该UIAbility可以是应用内的其他UIAbility&#xff0c;也可以是其他应用的UIAbility&#xff08;例如启动三方支付UIAbility&#xff09;。 本章节将从如下场…

MFC 多文档程序的基本编程

下载了一个openGL mfc的多文档程序,以此来学习mfc多文档模式的编程; 1 基本编程 它每次新建一个文档,会在窗口绘制一个三角形、一个矩形;如果没有了图形刷新一下; 先看一下为什么每次打开新文档会绘制图形; 生成工程之后主要有5个类,比单文档程序多了一个子框架类; 可…

主流开发语言和开发环境:探索编程世界的基础

在当今这个快速发展的技术时代&#xff0c;软件开发已经成为推动创新的重要力量。无论是构建下一代应用、开发先进的算法还是创建复杂的系统&#xff0c;选择合适的编程语言和开发环境都是至关重要的。在本文中&#xff0c;我们将探讨当前流行的几种主流开发语言以及它们常用的…

从零学习Linux操作系统第二十六部分 shell的基础知识

一、脚本存在的意义及幻数的作用 什么是shell &#xff1a;保护内核 脚本中命令的解释器 shell脚本的意义 1.记录命令执行的过程和执行逻辑&#xff0c;以便以后重复执行 2.脚本可以批量处理主机 3.脚本可以定时处理主机 如何创建shell脚本 #!/bin/bash ##幻数 幻数是最优…

C# CAD2016 cass10宗地Xdata数据写入

一、 查看cass10写入信息 C# Cad2016二次开发获取XData信息&#xff08;二&#xff09; 一共有81条数据 XData value: QHDM XData value: 121321 XData value: SOUTH XData value: 300000 XData value: 141121JC10720 XData value: 权利人 XData value: 0702 XData value: YB…

jenkins配置ssh的时候测试连接出现Algorithm negotiation fail

背景&#xff1a;当jenkins升级后&#xff0c;同时ssh插件也升级&#xff0c;测试ssh连接的时候 出现的问题&#xff1a; com.jcraft.jsch.JSchAlgoNegoFailException: Algorithm negotiation fail: algorithmName"server_host_key" jschProposal"ecdsa-sha2-n…

pikachu靶场-SQL-Inject

介绍&#xff1a; 在owasp发布的top10排行榜里&#xff0c;注入漏洞一直是危害排名第一的漏洞&#xff0c;其中注入漏洞里面首当其冲的就是数据库注入漏洞。一个严重的SQL注入漏洞&#xff0c;可能会直接导致一家公司破产&#xff01; SQL注入漏洞主要形成的原因是在数据交互中…

Android中Transition过渡动画的简单使用

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 一、布局xml文件代码如下&#xff1a; <?xml version"1.0" encoding&quo…

C#与VisionPro联合开发——INI存储和CSV存储

1、INI存储 INI 文件是一种简单的文本文件格式&#xff0c;通常用于在 Windows 环境中存储配置数据。INI 文件格式由一系列节&#xff08;section&#xff09;和键值对&#xff08;key-value pairs&#xff09;组成&#xff0c;用于表示应用程序的配置信息。一个典型的 INI 文…

德州红马来酰亚胺,Texas Red-Mal,标记反应反应迅速、选择性高

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;德州红马来酰亚胺&#xff0c;Texas Red maleimide &#xff0c;Texas Red Mal&#xff0c;Texas Red-maleimide &#xff0c;Texas Red-Mal 一、基本信息 【产品简介】&#xff1a;Texas Red maleimide is a fluor…

论文笔记:利用词对比注意增强预训练汉字表征

整理了 ACL2020短文 Enhancing Pre-trained Chinese Character Representation with Word-aligned Att&#xff09;论文的阅读笔记 背景模型实验 论文地址&#xff1a;论文 背景 近年来&#xff0c;以 BERT 为代表的预训练模型在 NLP 领域取得取得了非常显著的效果。但是&…

前端数据可视化:ECharts使用

可视化介绍 ​  ​  应对现在数据可视化的趋势&#xff0c;越来越多企业需要在很多场景(营销数据&#xff0c;生产数据&#xff0c;用户数据)下使用&#xff0c;可视化图表来展示体现数据&#xff0c;让数据更加直观&#xff0c;数据特点更加突出。   ​  数据可视化主要目…