C++高效的质数的判断(2种方法)

article/2025/9/23 13:15:00

前提准备

在开始质数的讨论之前,我们先预备一下:

质数的定义:若一个正整数除了1和它自身之外不能被任何自然数整除,则该数称为质数,也叫素数。否则为合数

由定义可知,所有小于等于1的数既不是质数,也不是合数

质数的分布较为稀疏,对于一个足够大的数S,不超过S的质数大约有\frac{N}{InN}个,也就是说每InN个数约有一个质数,这点读者了解即可。

质数的判断(试除法)

对于质数的判断,最简单也最容易想到的方法就是一个一个的筛选,也叫试除法。

如果要判断一个数N,那么我们要对2~N-1的所有数都筛选一遍吗,显然不用。首先肯定的是N-1肯定不能整除N,那么是否能进一步缩小范围。我先给出答案:2~sqrt(N)

严谨的证明过程如下图:(注释:\left \lfloor \right \rfloor\left \lceil \right \rceil分别表示向下,向上取整)

 那好,利用这个性质,我们就可以写出一下代码:

Code(O(sqrt(N)))

#include<cstdio>
bool isprime(int num){if(num==2)return true;if(num%2==0 || num<2)return false;else{for(int i=3;i*i<=num;i+=2){if(num%i==0){return false;}}return true;}
}
int main(){int x;scanf("%d",&x);if(isprime(x)){printf("Yes");}else{printf("No");}return 0;
} 

尽管如此,这个代码还是优化了许多,我们单独考虑2这个情况,然后从3开始只枚举奇数。

难道这就是最快的算法吗?


Miller-Robbin算法

其实还有一个更厉害的算法,名为Miller-Robbin算法,要想学会,我们首先需要理解一个定理:

费马小定理:

                         对于一个质数 p,任意一个自然数a,那么: a^{p}\equiv a(mod p) ——1

证明如下图所示:

 证明完之后,我们可以左右同时除以一个a,变形成:

                                                                   a^{p-1}\equiv 1(mod p)——2

这个就不一定成立了,可以发现,当a是p-1的倍数时,左式一定是p的倍数,mod一个p就等于0了,不可能等于右边,所以我们必须加上一个条件

                                                                  a与p-1互质

好了,这就是费马小定理。值得注意的是,费马小定理是判断素数的必要不充分条件。如果一个数是质数,它必然满足一上的等式。但是,满足上列等式的数,并不一定是质数。如:

561
1105 
1729 
2465
2821
6601 
8911 
10585
15841
29341
41041 
46657
52633
62745
63973 
75361
101101
115921 
126217 
162401
172081
188461
252601
278545
294409
314821
334153
340561
399001
410041
449065
488881
512461

 这种合数称之为卡迈克尔数,561是最小的。他们并不满足费马小定理的逆定理!!!可迈克尔数http://oeis.org/A002997

但是,这种事情发生的概率还是比较小的,我们可以随机生成一批数,排除掉能被p-1整除的数,如果它满足费曼小定理的逆定理,那么该数很大程度上可以称之为质数,不确定就多判定几次。我们再配合一个快速幂求出 a^p-1 mod p的值,完美。

快速幂的详解https://blog.csdn.net/way_back/article/details/122760048?spm=1001.2014.3001.5501

Code(O(1))

#include<cstdio>
#include<cstdlib>
int x;
int pow(int a){int b=x-1;int ans=1;while(b>0){if(b & 1){ans=((ans%x)*(a%x))%x;}a=a*a%x;b>>=1;}return ans;
}
bool isprime(){int loop=10;while(loop--){int t=rand();while(t%x==0){t=rand();}if(pow(t)!=1){return false;}}return true;
}
int main(){scanf("%d",&x);if(isprime()){printf("Yes");}else{printf("No");}return 0;
}

用10个循环去判断那些卡迈克尔数,结果如下:

 没有问题,但我要循环5次的话,就出现问题了,如图所示:

 有几个数就判断错误了。我们在保证正确率的前提下再提高效率。


下一个内容我们要讨论如何在一个区间内把质数都筛选出来,不见不散

C++区间质数的筛选https://blog.csdn.net/way_back/article/details/122787801

End~~~

写作不易,谢谢大家支持


http://chatgpt.dhexx.cn/article/So6MtJ0S.shtml

相关文章

C语言 判断质数很简单

算法分析&#xff1a;假设对于一个正数a,如果a的约数只有两个&#xff0c;1和它本身&#xff0c;那这样数叫做素数。我们对a在2—a-1之间取余&#xff0c;如果还能找到第三个约数&#xff0c;使得余数为0&#xff0c;那a就不是素数&#xff0c;如果找不到第三个约数&#xff0c…

判断一个数是否为质数(素数)的4种方法

目录 1.什么是质数&#xff1f; 2.如何判断是否为质数&#xff1f; 方法1 方法2 方法3 方法4 1.什么是质数&#xff1f; 首先来看质数的概念&#xff1a; 质数&#xff08;Prime number&#xff09;&#xff0c;又称素数&#xff0c;指在大于1的自然数中&#xff0c;除了…

判断一个数是否为质数/素数——从普通判断算法到高效判断算法思路

定义&#xff1a;约数只有1和本身的整数称为质数&#xff0c;或称素数。 计算机或者相关专业&#xff0c;基本上大一新生开始学编程都会接触的一个问题就是判断质数&#xff0c;下面分享几个判断方法&#xff0c;从普通到高效。 1&#xff09;直观判断法 最直观的方法&#xf…

【C】C语言判断是否质数

类似帖子很多了&#xff0c;本文侧重循序渐进逐步优化的写出判断质数的代码。 1.质数定义 质数 (素数&#xff09;只能被 1 或自己整除。 同时它必须是大于 1 的整数。 1 不是质数也不是合成数。 常见的质数就是&#xff1a;2&#xff0c;3&#xff0c;5&#xff0c;7&…

判断质数(函数)

题目描述 质数是指除了1和本身之外没有其他约数的数&#xff0c;如7和11都是质数&#xff0c;而6不是质数&#xff0c;因为6除了约数1和6之外还有约数2和3。输入一个正整数&#xff0c;判断它是否为质数&#xff0c;如是质数则输出“Yes”&#xff0c;否则输出这个数的大于1的…

[C++]判断质数

最近做了几个判断质数的函数&#xff0c;记录一下&#xff1a; 一直接试除 bool is_prime3(unsigned long long n) { //slowfor (int i 2; i < n - 1; i) {if (n % i 0) {return 0;}}return 1; } note&#xff1a;比较慢 二一点优化 每次试除时其实只要除到 sqrt(n) 并且…

c++质数判断

循环和函数:质数判断 对于大于1的数,如果除了1和它本身,它不能再被其它正整数整除,那么我们说它是一个质数。要求编写程序判断给定的输入是否是质数。输入为一个整数N(1<N≤1000)。如果给出的整数N为质数,那么 输出YES;如果N不是质数,那么输出NO。

键入一个整数,判断是否是质数(两种方法)

判质数的原理就不过多赘述了&#xff0c;请移步C语言求100到500的所有质数&#xff0c;每10个数字一行打印_马拾捌的博客-CSDN博客_c语言每十个一行质数就是只能被1和他自己整除的数字第一次代码优化一个数字的因数里&#xff0c;除了1和自己以外最大的因数一定小于等于自身的一…

(三)混合边缘AI人脸对齐

目录 介绍 对齐算法 算法的实现 向检测器添加人脸对齐 修改对齐算法 下一步 在这里&#xff0c;我们将简要说明如何在Raspberry Pi上安装MTCNN、TensorFlow和Keras。然后我们在视频文件上启动人脸检测以测试性能&#xff0c;然后简要说明如何在实时模式下运行检测。最后&…

人脸对齐及关键点检测

严格定义上的人脸识别分为四个步骤&#xff1a; ①人脸检测&#xff1a;从图片中准确定位到人脸 ②人脸对齐&#xff1a; 自动定位出面部关键特征点&#xff0c; ③进行特征提取 ④对两张人脸图像的特征向量进行对比&#xff0c;计算相似度。 当今的人脸识别系统如下图所示…

人脸对齐 matlab,常用几种人脸对齐算法ASM/AAM/CLM/SDM

常用几种人脸对齐算法ASM/AAM/CLM/SDM 常用几种人脸对齐算法ASM/AAM/CLM/SDM 转载&#xff1a;http://blog.csdn.net/huneng1991/article/details/51901912 SDM原理 转载&#xff1a;http://blog.csdn.net/linolzhang/article/details/55271815 人脸对齐算法 一、ASM算法 ASM(A…

人脸识别篇---人脸对齐

人脸对齐 安装环境dlib 脚本实现运行代码实现效果运行问题 安装环境 dlib windows10安装dlib 在anaconda3下激活相应的环境 conda install -c conda-forge dlib参考 脚本实现 from imutils.face_utils import FaceAligner from imutils.face_utils import rect_to_bb impo…

人脸对齐算法常用评价标准总结

转载请注明作者和出处&#xff1a; http://blog.csdn.net/john_bh/ 文章目录 1. I O N 和 I P N ION和IPN ION和IPN2. M N E MNE MNE (the mean normalized error)3 A U C a AUCa AUCa(the area-under-the-curve)4. C E D CED CED (the Cumulative Errors Distribution curve)…

python练习3 人脸对齐以及dir、inspect的用法

一、人脸对齐 训练好的模型库文件&#xff08;替换你的模型文件位置&#xff09; import cv2 import dlib import matplotlib.pyplot as pltpath"D:\python\Lib\site-packages\cv2\photo.jpg" imgcv2.imread(path) graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#人脸分…

人脸识别中常用的人脸检测和人脸对齐

人脸检测和人脸对齐是人脸识别的前提&#xff0c;也是进行一切人人脸相关的人脸项目的开始步骤&#xff0c;本文将从常用的人脸检测的数据集&#xff0c;以及现在公用的比较好的方法开始讲述。 人脸检测常用的数据集 人脸检测的测试数据库有很多&#xff0c;这里仅选择FDDB和…

人脸对齐—级联回归模型和深度学习模型

人脸对齐任务即根据输入的人脸图像&#xff0c;自动定位出面部关键特征点&#xff0c;如眼睛、鼻尖、嘴角点、眉毛以及人脸各部件轮廓点等&#xff0c;如下图所示。 这项技术的应用很广泛&#xff0c;比如自动人脸识别&#xff0c;表情识别以及人脸动画自动合成等。由于不同的姿…

MTCNN 人脸检测 人脸对齐

MTCNN 人脸检测 人脸对齐 flyfish 总体 Loss Stage 0:Image Pyramid 假设图片的宽度是640,高度是480 MIN_DET_SIZE12 minsize70 factor0.709 0.1714285710.709 那么金字塔窗口大小分别是 wh:110,83 wh:78,59 wh:56,42 wh:40,30 wh:28,21 wh:20,1计算过程如下 从640和480…

人脸检测实战终极:使用 OpenCV 和 Python 进行人脸对齐

使用 OpenCV 和 Python 进行人脸对齐 这篇博文的目的是演示如何使用 OpenCV、Python 和面部标志对齐人脸。 给定一组面部标志&#xff08;输入坐标&#xff09;&#xff0c;我们的目标是将图像扭曲并转换为输出坐标空间。 在这个输出坐标空间中&#xff0c;整个数据集中的所…

人脸预处理:人脸检测+人脸对齐

1 简介 对于人脸识别任务&#xff0c;人脸预处理至关重要。首先我们需要检测出图像中的人脸&#xff0c;然后通过人脸相似性变换得到对齐后的标准人脸。然后在对其进行人脸识别。在人脸识别过程中&#xff0c;往往检测到的人脸是倾斜的。相似性变换根据检测到的关键点和目标点…

dlib人脸配准(人脸对齐)

dlib人脸配准有两种方式。 一种是使用 get_face_chip()方法&#xff0c;使用5个关键点模型来进行配准&#xff0c;这种方法Dlib已经提供了完整的接口(imutils里也有类似函数&#xff0c; face_utils.FaceAligner&#xff0c;代码放在最后面)另一种是自己使用68点关键点模型&am…