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

article/2025/9/23 14:04:18
定义:约数只有1和本身的整数称为质数,或称素数。
计算机或者相关专业,基本上大一新生开始学编程都会接触的一个问题就是判断质数,下面分享几个判断方法,从普通到高效。

1)直观判断法

最直观的方法,根据定义,因为质数除了1和本身之外没有其他约数,所以判断n是否为质数,根据定义直接判断从2到n-1是否存在n的约数即可。C++代码如下:

bool isPrime_1( int num )
{int tmp =num- 1;for(int i= 2;i <=tmp; i++)if(num %i== 0)return 0 ;return 1 ;
}

2)直观判断法改进

上述判断方法,明显存在效率极低的问题。对于每个数n,其实并不需要从2判断到n-1,我们知道,一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),据此,上述代码中并不需要遍历到n-1,遍历到sqrt(n)即可,因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数。C++代码如下:
bool isPrime_2( int num )
{int tmp =sqrt( num);for(int i= 2;i <=tmp; i++)if(num %i== 0)return 0 ;return 1 ;
}

3)另一种方法

方法(2)应该是最常见的判断算法了,时间复杂度O(sqrt(n)),速度上比方法(1)的O(n)快得多。最近在网上偶然看到另一种更高效的方法,暂且称为方法(3)吧,由于找不到原始的出处,这里就不贴出链接了,如果有原创者看到,烦请联系我,必定补上版权引用。下面讲一下这种更快速的判断方法;
首先看一个关于质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;

证明:令x≥1,将大于等于5的自然数表示如下:
······ 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ······
可以看到,不在6的倍数两侧,即6x两侧的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2),所以它们一定不是素数,再除去6x本身,显然,素数要出现只可能出现在6x的相邻两侧。这里有个题外话,关于孪生素数,有兴趣的道友可以再另行了解一下,由于与我们主题无关,暂且跳过。这里要注意的一点是,在6的倍数相邻两侧并不是一定就是质数。
此时判断质数可以6个为单元快进,即将方法(2)循环中i++步长加大为6,加快判断速度,原因是,假如要判定的数为n,则n必定是6x-1或6x+1的形式,对于循环中6i-1,6i,6i+1,6i+2,6i+3,6i+4,其中如果n能被 6i,6i+2,6i+4整除,则n至少得是一个偶数,但是6x-1或6x+1的形式明显是一个奇数,故不成立;另外,如果n能被6i+3整除,则n至少能被3整除,但是6x能被3整除,故6x-1或6x+1(即n)不可能被3整除,故不成立。综上,循环中只需要考虑6i-1和6i+1的情况,即循环的步长可以定为6,每次判断循环变量k和k+2的情况即可,理论上讲整体速度应该会是方法(2)的3倍。代码如下:
bool isPrime_3( int num )
{//两个较小数另外处理if(num ==2|| num==3 )return 1 ;//不在6的倍数两侧的一定不是质数if(num %6!= 1&&num %6!= 5)return 0 ;int tmp =sqrt( num);//在6的倍数两侧的也可能不是质数for(int i= 5;i <=tmp; i+=6 )if(num %i== 0||num %(i+ 2)==0 )return 0 ;//排除所有,剩余的是质数return 1 ;
}
算法性能测试:
编写测试代码,使用较多数据测试比较几种方法的判断效率,数据量40w,代码如下:
#include <iostream>
#include <string>
#include <ctime>
#include <vector>
using namespace std;
bool isPrime_1( int num );
bool isPrime_2( int num );
bool isPrime_3( int num );
int main()
{int test_num =400000;int tstart ,tstop; //分别记录起始和结束时间//测试第一个判断质数函数tstart=clock ();for(int i= 1;i <=test_num; i++)isPrime_1(i );tstop=clock ();cout<<"方法(1)时间(ms):" <<tstop- tstart<<endl ;//ms为单位//测试第二个判断质数函数tstart=clock ();for(int i= 1;i <=test_num; i++)isPrime_2(i );tstop=clock ();cout<<"方法(2)时间(ms):" <<tstop- tstart<<endl ;//测试第三个判断质数函数tstart=clock ();for(int i= 1;i <=test_num; i++)isPrime_3(i );tstop=clock ();cout<<"方法(3)时间(ms):" <<tstop- tstart<<endl ;cout<<endl ;system("pause" );return 0 ;
}

运行结果如下;


可以看出,判断到40w,效率上方法(1)明显要差得多,方法(2)和方法(3)在这种测试数量下时间相差2倍多

单独对比方法(2)和(3),数据量加到1000w,结果如下:

可以看出,方法(2)和方法(3)在这种测试数量下时间相差依然是2倍多,不过已经是很不错的提升。
对了,附上运行环境,CPU-i5-3210,内存4G,win7,vs2012。

好了,判断质数的方法暂时就到这里,不足之处欢迎各道友指出。






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

相关文章

【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…

基于OpenCV的人脸对齐步骤详解及源码实现

目录 1. 前言2. 人脸对齐基本原理与步骤3. 人脸对齐代码实现 1. 前言 在做人脸识别的时候&#xff0c;前期的数据处理过程通常会遇到一个问题&#xff0c;需要将各种人脸从不同尺寸的图像中截取出来&#xff0c;再进行人脸对齐操作&#xff1a;即将人脸截取出来并将倾斜的人脸…

人脸识别 (4) 人脸对齐

参考&#xff1a;FaceDetector/face_align.ipynb at master faciallab/FaceDetector GitHub 中文&#xff1a;从零开始搭建人脸识别系统&#xff08;二&#xff09;&#xff1a;人脸对齐 - 知乎 Face Alignment Step-by-Step 1、Align Faces by Spatial Transform Operati…

OpenCV实现人脸对齐

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 一、人脸对齐介绍 在人脸识别中有一个重要的预处理步骤-人脸对齐&#xff0c;该操作可以大幅度提高人脸识别的准确率与稳定性&#xff0c;但是早期的OpenCV版本不支持人…