0x31 质数

0x31 质数

定义:

若一个正整数无法被除了1和它自身之外的任何自然数整除,则称该数为质数(或素数),否则则称该正整数为合数。

在整个自然数集合中,质数的数量不多,分布比较稀疏,对于一个足够大的整数N,不超过 N N N的质数大约有 N / l n N N/lnN N/lnN个,即 l n N lnN lnN个数中大约有一个质数。

1.质数的判定

试除法

若一个正整数 N N N为合数,则存在一个能整除 N N N的整数 T T T,其中 2 ≤ T ≤ N 2\leq T \leq \sqrt{N} 2TN

我们只需扫描 2 ∼ N 2\sim \sqrt{N} 2N 之间所有的整数,依次检查它们能否整除 N N N,若都不能整除,则 N N N是质数,否则 N N N是合数。试除法的时间复杂度是 O ( N ) O(\sqrt{N}) O(N )。当然我们需要特判0和1这两个数,它们既不是质数也不是合数。

bool is_prime(int n)
{if(n<2)return false;for(int i=2;i<=sqrt(n);++i)if(n%i==0)return false;return true;
}

“试除法”作为最简单也最经典的确定性算法,是我们在算法竞赛中通常会使用的方法。有一些效率更高的随机性算法,例如“Miller-Robbin”等,有较小的概率把合数误判定为质数,但多次判定合起来错误概率趋近于0。

2.质数的筛选

给定一个整数N,求出 1 ∼ N 1\sim N 1N之间所有的质数,称为质数的筛选问题。

Eratosthenes筛法(埃式筛法)

Eratosthenes筛法基于这样的想法:任意整数 x x x的倍数 2 x 2x 2x 3 x 3x 3x,…都不是质数。

我们可以从2开始,由小到大扫描每个数 x x x,然后把它的倍数 2 x 2x 2x 3 x 3x 3x,…, ⌊ N / x ⌋ ∗ x \lfloor N/x \rfloor *x N/xx标记为合数。当扫描到一个数,若它未被标记,则说明它不能被 2 ∼ x − 1 2\sim x-1 2x1之间的任何数整除,该数就是质数。

Eratosthenes筛法如下:

在这里插入图片描述

我们发现,2和3都会把6标记为合数。实际上,小于 x 2 x^2 x2 x x x的倍数在扫描更小的数时就已经被标记过了。因此,我们可以对Eratosthenes筛法进行优化,对于每个数 x x x,我们只需要从 x 2 x^2 x2开始,把 x 2 x^2 x2 ( x + 1 ) ∗ x (x+1)*x (x+1)x ( x + 2 ) ∗ x (x+2)*x (x+2)x,…, ⌊ N / x ⌋ ∗ x \lfloor N/x \rfloor *x N/xx标记为合数即可。

void prime(int n)
{memset(v,0,sizeof(v)); //合数标记,全都标记为质数for(int i=2;i<=n;++i){if(v[i]) continue;cout<<i<<endl; //i是质数for(int j=i;j<=n/i;++j)v[i*j]=1;}
}

Eratosthenes筛法的时间复杂度为 O ( ∑ 质数 p ≤ N N P ) = O ( N l o g l o g n ) O(\sum_{质数p\leq N} \frac{N}{P})=O(Nloglogn) O(质数pNPN)=O(Nloglogn)。该算法实现简单,效率已经非常接近线性,是算法竞赛中最常用的质数筛法。

Euler筛法(欧拉筛法/线性筛法)

即使在优化后(从 x 2 x^2 x2开始),Eratosthenes筛法仍然会重复标记合数。例如12既会被2标记又会被3标记。其根本原因是我们没有确定出唯一的产生12的方式。

线性筛法通过“从小到大累计质因子”的方式标记每一个合数,即让12只有3*2*2一种方式产生。设数组 v v v记录每个数的最小质因子,我们按照以下步骤维护 v v v

1.依次考虑 2 ∼ N 2\sim N 2N中的每个数 i i i

2.若 v [ i ] = i v[i]=i v[i]=i,说明 i i i是质数,把它保存下来。

3.扫描不大于 v [ i ] v[i] v[i]的每个质数 p p p,令 v [ i ∗ p ] = p v[i*p]=p v[ip]=p。也就是在 i i i的基础上累积一个质因子 p p p。因为 p ≤ v [ i ] p\leq v[i] pv[i],所以 p p p就是合数 i ∗ p i*p ip的最小质因数。

在这里插入图片描述

每个合数只会被它的最小质因数 p p p筛一次,时间复杂度为 O ( n ) O(n) O(n)

int v[MAX_N],prime[MAX_N];
int m=0; //质数数量
void primes(int n)
{memset(v,0,sizeof(v)); //最小质因子for(int i=2;i<=n;++i){if(v[i]==0)v[i]=i,prime[++m]=i;//给当前的i乘上一个质因子for(int j=1;j<=m;++j){//i有比prime[j]更小的质因子或超出n的范围,停止循环if(prime[j]>v[i]||prime[j]*i>n)break;//prime[j]是合数prime[j]*i的最小质因子v[prime[j]*i]=prime[j];}}
}

我们也可以直接把 v v v数组改为 i s _ p r i m e is\_prime is_prime数组,判断这个数是不是质数。

bool is_prime[MAX_N];
int prime[MAX_N];
int m;
void prime(int n)
{for(int i=2;i<=n;++i)is_prime[i]=true;for(int i=2;i<=n;++i){if(is_prime[i])prime[++m]=i;for(int j=1;j<=m&&i*prime[j]<=n;++j){is_prime[i*prime[j]]=false;//如果i整除prime[j],则说明prime[j]正好是i*prime[j]最小质因数//后面的prime[j+1]大于最小质因数,退出循环if(i%prime[j]==0)break;}}
}

但是这个写法的实际运行时间可能与优化后的埃式筛法近似,因为存在低效的取模运算。

3.质因数分解

算术基本定理

任何一个大于1的正整数都能唯一分解为有限个质数的乘积,可写作:
N = p 1 c 1 p 2 c 2 . . . p m c m N=p_1^{c_1}p_2^{c_2}...p_m^{c_m} N=p1c1p2c2...pmcm
其中 c i c_i ci都是正整数, p i p_i pi都是质数,且满足 p 1 < p 2 < . . . < p m p_1<p_2<...<p_m p1<p2<...<pm

试除法

结合质数判定的“试除法”和质数筛选的“Eratosthenes筛法”,我们可以扫描 2 ∼ ⌊ N ⌋ 2\sim \lfloor \sqrt{N} \rfloor 2N 的每个数 d d d,若 d d d能整除 N N N,则从 N N N中除掉所有因子 d d d,同时累计除去的 d d d的个数。时间复杂度为 O ( N ) O(\sqrt{N}) O(N )

void divide(int n)
{m=0;for(int i=2;i<=sqrt(n);++i){if(n%i==0)//i是质数{p[++m]=i,c[m]=0;while(n%i)n/=i,c[m]++;}}if(n>1) //n是质数p[++m]=n,c[m]=1;
}

Pollard's Rho”算法是一个比“试除法”效率更高的质因数分解方法。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教学类-06-19】20231217 (按“列”正序题)X-Y之间“加法题+题”(1页最多0-13。填满115空格)

作品展示&#xff1a;按列排序&#xff0c;从小到大正序&#xff08;没有大量空格&#xff09; 1.会有空格做分割线&#xff0c;上面部分是所有的小到大正序加法&#xff0c;下面的部分就是正序题目的不重复随机抽取题目&#xff08;乱序题&#xff09; 2、包含分割空格&…

【Java】智慧工地系统:让建筑行业管理更简单

概述 智慧工地管理平台面向房建、能源、交通各类工地的管理者&#xff0c;通过AI视频、物联感知技术对工地场景中的施工机械、建筑材料、施工规范、施工环境监管、完善施工现场项目管控。实现项目管控、特种设备管理、绿色施工、工地巡检等业务功能&#xff0c;沉淀工地监管数…

03_Web开发基础之综合应用

web开发基础之综合使用 学习目标和内容 1、能够描述jQuery的作用 2、能够使用jQuery的选择器获取元素 3、能够使用jQuery对HTML标签元素注册事件 4、能够使用jQuery对HTML元素的属性进行操作 5、能够描述Bootstrap的作用 6、能够使用Bootstrap创建简单网页 7、能够描述AJAX的作…

微信小程序置顶导航,替代原生导航栏

效果图&#xff1a; 思路&#xff1a;Navigation是小程序的顶部导航组件&#xff0c;当页面配置navigationStyle设置为custom的时候可以使用此组件替代原生导航栏&#xff0c;wx.getSystemInfoSync获取可使用窗口高度 wxml代码&#xff1a; <!-- 头部 --> <view cla…

MySQL执行流程_执行一条select语句,期间发生了什么

文章目录 执行一条select语句&#xff0c;期间发生了什么MySQL执行流程第一步&#xff1a;连接器第二步&#xff1a;查询缓存第三步&#xff1a;解析SQL第四步&#xff1a;执行SQL 执行一条select语句&#xff0c;期间发生了什么 MySQL执行流程 server层负责建立连接、分析和执…

windows下使用logstash同步跨网络集群的数据

我们在开发环境过程中&#xff0c;可能会遇到这样的场景。我们可以通过VPN访问远端的机房。有可能还要跨机房访问。这篇文章演示使用logstash&#xff0c;在windows上&#xff0c;去同步跨网络环境的不同机房之间的数据。 此方式受网络限制。适合同步小规模数据。 下载logstash…

HarmonyOS给应用添加消息通知

给您的应用添加通知 通知介绍 通知旨在让用户以合适的方式及时获得有用的新消息&#xff0c;帮助用户高效地处理任务。应用可以通过通知接口发送通知消息&#xff0c;用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用&#xff0c;通知主要有以下使用场景…

Leetcode的AC指南 —— 链表:面试题 02.07. 链表相交

摘要&#xff1a; Leetcode的AC指南 —— 链表&#xff1a;面试题 02.07. 链表相交。题目介绍&#xff1a;给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 文章目录 一、题目二、…

Windows安装Tesseract OCR与Python中使用pytesseract进行文字识别

文章目录 前言一、下载并安装Tesseract OCR二、配置环境变量三、Python中安装使用pytesseract总结 前言 Tesseract OCR是一个开源OCR&#xff08;Optical Character Recognition&#xff09;引擎&#xff0c;用于从图像中提取文本。Pytesseract是Tesseract OCR的Python封装&am…

LeetCode(68)翻转二叉树【二叉树】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 翻转二叉树 1.题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1…

计网 - TCP扫盲

文章目录 知识点TCP头格式TCP有限状态机&#xff08;FSM&#xff09;为何需要TCP协议TCP的定义TCP连接的概念如何唯一确定一个TCP连接TCP vs UDPTCP拥塞控制TCP流量控制 导图 知识点 TCP头格式 TCP头部包含多个字段&#xff0c;其中一些是必需的&#xff0c;而另一些是可选的…

AVL树-详细解析【数据结构】

AVL树是首个被发明的自平衡二叉查找树&#xff0c;在1962年由两位苏联科学家G.M. Adelson-Velsky和E.M. Landis提出。AVL树得名于发明者的首字母。在AVL树中&#xff0c;任何节点的两个子树的高度最大差别为一&#xff0c;确保了树的平衡度&#xff0c;使得查找操作相比于普通的…

2023 亚马逊云科技 re:Invent 大会探秘:Aurora 无限数据库的突破性应用

文章目录 一、前言二、Amazon Aurora 无限数据库2.1 亚马逊云科技数据库产品发展历程2.2 什么是 Amazon Aurora Limitless Database&#xff08;无限数据库&#xff09;2.3 Amazon Aurora Limitless Database 设计架构2.4 Amazon Aurora Limitless Database 分片功能2.5 使用 A…

微服务最佳实践:构建可扩展且高效的系统

微服务架构彻底改变了现代软件开发&#xff0c;提供了无与伦比的敏捷性、可扩展性和可维护性。然而&#xff0c;有效实施微服务需要深入了解最佳实践&#xff0c;以充分发挥微服务的潜力&#xff0c;同时避免常见的陷阱。在这份综合指南中&#xff0c;我们将深入研究微服务的关…

WEB 3D技术 简述React Hook/Class 组件中使用three.js方式

之前 已经讲过了 用vue结合three.js进行开发 那么 自然是少不了react 我们 还是先创建一个文件夹 终端执行 npm init vitelatest输入一下项目名称 然后技术选择 react 也不太清楚大家的基础 那就选择最简单的js 然后 我们就创建完成了 然后 我们用编辑器打开创建好的项目目…

wvp-GB28181-pro 2.0+ZLMediaKit 使用Dockerfile制作镜像以及部署【CentOS7】

说明 部署gb28181和zlm主要需要构建两个镜像&#xff0c;第一个为基础镜像&#xff0c;以centos7为基础构建新的基础镜像base.Dockerfile,第二个镜像为服务部署镜像server.Dockerfile&#xff0c;以第一个镜像base.Dockerfile构建出的镜像为基础镜像进行构建 整个基础镜像的构…

高效营销系统集成:百度营销的API无代码解决方案,提升电商与广告效率

百度营销API连接&#xff1a;构建无代码开发的高效集成体系 在数字营销的高速发展时代&#xff0c;企业追求的是快速响应市场的能力以及提高用户运营的效率。百度营销API连接正是为此而生&#xff0c;它通过无代码开发的方式&#xff0c;实现了电商平台、营销系统和CRM的一站式…

深度解读 Cascades 查询优化器

数据库中查询优化器是数据库的核心组件&#xff0c;其决定着 SQL 查询的性能。Cascades 优化器是 Goetz 在 volcano optimizer generator 的基础上优化之后诞生的一个搜索框架。 本期技术贴将带大家了解 Cascades 查询优化器。首先介绍 SQL 查询优化器&#xff0c;接着分析查询…

集群监控Zabbix和Prometheus

文章目录 一、Zabbix入门概述1、Zabbix概述2、Zabbix 基础架构3、Zabbix部署3.1 前提环境准备3.2 安装Zabbix3.3 配置Zabbix3.4 启动停止Zabbix 二、Zabbix的使用与集成1、Zabbix常用术语2、Zabbix实战2.1 创建Host2.2 创建监控项&#xff08;Items&#xff09;2.3 创建触发器&…

Kubernetes实战(十四)-k8s高可用集群扩容master节点

1 单master集群和多master节点集群方案 1.1 单Master集群 k8s 集群是由一组运行 k8s 的节点组成的&#xff0c;节点可以是物理机、虚拟机或者云服务器。k8s 集群中的节点分为两种角色&#xff1a;master 和 node。 master 节点&#xff1a;master 节点负责控制和管理整个集群…