素数(质数)判断的五种方法

article/2025/9/23 13:13:24

素数判断的五种方法

素数判断是我们写程序过程中经常遇见的一个问题,于是今天我简单地整理一下常用的素数判断的方法。

素数的介绍

素数定义

质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。

根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。最小的质数是2。
                        --------360百科

第一种:暴力筛选法

思路分析

根据素数的定义,我们可以简单地想到:若要判断n是不是素数,我们可以直接写一个循环(i从2到n-1,进行n%i运算,即n能不能被i整除,如被整除即不是素数。若所有的i都不能整除,n即为素数)。

代码实现

boolean isPrime(int n){for(int i=2;i<n;i++){//如果n被i整除,则返回falseif(n%i==0){return false;break;}}return true;	// 反之则返回true 
}

时间复杂度:O(n)

这时间复杂度一看就不咋乐观,于是我们简单优化一下。

boolean isPrime(int n){for ( i=2; i<=(int)sqrt(n); i++ ){//如果n被i整除,则返回falseif(n%i==0){return false;break;}}return true;    // 反之则返回true 
}

时间复杂度:O(sqrt(n))

优化原理:素数是因子为1和本身, 如果num不是素数,则还有其他因子,其中的因子,假如为a,b.其中必有一个大于sqrt(num) ,一个小于sqrt(num) 。所以必有一个小于或等于其平方根的因数,那么验证素数时就只需要验证到其平方根就可以了。即一个合数一定含有小于它平方根的质因子。


1

第二种:素数表筛选法

素数表筛选法一看名字就知道是将素数存到一个表中,然后对需要判断的数在表中查找,找了就是素数,找不到的即不是素数。

思路分析

如果一个数不能整除比它小的任何素数,那么这个数就是素数

顺便嘀咕一句,这种方法的效率贼低,看看就好,学习一下思路就行。

代码实现

/*target:要查询的数字count:素数表中素数的个数PrimeArray:素数表数组
*/
boolean isPrime(int target, int count, int[] PrimeArray){for (i = 0; i < count; i++){if (target % PrimeArray[i] == 0){return false;break;}}return true;
}

时间复杂度:O(n)

第三种:埃拉托斯特尼(Eratosthenes)筛法

思路分析

创建一个比范围上限大1的数组,我们只关注下标为 1 ~ N(要求的上限) 的数组元素与数组下标对应。
将数组初始化为1。然后用for循环,遍历范围为:[2 ~ sqrt(N)]。如果数组元素为1,则说明这个数组元素的下标所对应的数是素数。
随后我们将这个下标(除1以外)的整数倍所对应的数组元素全部置为0,也就是判断其为非素数。
这样,我们就知道了范围内(1 ~ 范围上限N)所有数是素数(下标对应的数组元素值为1)或不是素数(下标对应的数组元素值为0)

例子(N=25)

详细列出算法如下:
1、列出2以后的所有序列:
 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
2、标出序列中的第一个素数,也就是2,序列变成:
 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
3、将剩下序列中,划掉2的倍数,序列变成:
 2 3 5 7 9 11 13 15 17 19 21 23 25
4、如果这个序列中最大数小于最后一个标出的素数的平方,那么剩下的序列中所有的数都是素数,否则回到第二步。
5、本例中,因为25大于2的平方,我们返回第二步:
6、剩下的序列中第一个素数是3,将主序列中3的倍数划掉,主序列变成:
 2 3 5 7 11 13 17 19 23 25
7、我们得到的素数有:2,3
8、25仍然大于3的平方,所以我们还要返回第二步:
9、序列中第一个素数是5,同样将序列中5的倍数划掉,主序列成:
 2 3 5 7 11 13 17 19 23
10、我们得到的素数有:2,3,5 。
11、因为23小于5的平方,跳出循环。

结论:2到25之间的素数是:2 3 5 7 11 13 17 19 23。

代码实现

/*target:要查询的数字isprime:素数数组,大小至少为n+1n:数值上界
*/
boolean isPrime(int target,int[] isprime, int n){isprime[2]=0;int k=2,tt=0;while(tt<n+1){for(int i=1; i<isprime.length; i++){ //将不是素数的数筛出if(i%k==0&&i!=k) isprime[i]=1;}for(int i=1; i<isprime.length; i++){ //将筛选后的第一个数当做新的筛子if(i>k&&isprime[i]==0){k=i;break;}}tt++;}if(isprime[target]==1)return  true;else return false;
}

时间复杂度:O(n^3)

在这里插入图片描述

第四种:线性筛选–欧拉筛法

思路分析

在埃拉托斯特尼(Eratosthenes)筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。

代码实现

void PrimeList(int* Prime, bool* isPrime, int n) {int i = 0, j = 0, count = 0;if (isPrime != NULL) {//确保isPrime不是空指针//将isPrime数组初始化为 1for (i = 2; i <= N; i++) {isPrime[i] = true;}}if (isPrime != NULL && Prime != NULL) {//从2遍历到范围上限Nfor (i = 2; i <= N; i++) {if (isPrime[i])//如果下标(下标对应着1 ~ 范围上限N)对应的isPrime值没有被置为false,说明这个数是素数,将下标放入素数数组Prime[count++] = i;//循环控制表达式的意义:j小于等于素数数组的个数 或 素数数组中的每一个素数与 i 的积小于范围上限Nfor (j = 0; (j < count) && (Prime[j] * (long long)i) <= N; j++)//将i强制转换是因为vs上有warning,要求转换为宽类型防止算术溢出。数据上不产生影响{isPrime[i * Prime[j]] = false;//每一个素数的 i 倍(i >= 2)都不是素数,置为false//这个是欧拉筛法的核心,它可以减少非素数置false的重复率//意义是将每一个合数(非素数)拆成 2(最小因数)与最大因数 的乘积if (i % Prime[j] == 0)break;}}}
}

时间复杂度:O(n)

第五种:欧拉筛法优化

由上面欧拉筛法的代码可见,欧拉筛法的代码也挺臃肿的,于是我们简单优化一下。

代码实现

boolean isPrime(int num) {if (num <= 3) {return num > 1;}// 不在6的倍数两侧的一定不是质数if (num % 6 != 1 && num % 6 != 5) {return false;}int sqrt = (int) Math.sqrt(num);for (int i = 5; i <= sqrt; i += 6) {if (num % i == 0 || num % (i + 2) == 0) {return false;}}return true;
}

在这里插入图片描述

结束语

本文部分参考以下文章:
https://zhuanlan.zhihu.com/p/104314640

如有问题,欢迎留言交流,共同进步


http://chatgpt.dhexx.cn/article/3LnpUZfE.shtml

相关文章

Java中判断质数的方法

Java中判断质数的几种方法 说明&#xff1a; 1.质数&#xff1a;又称素数。是一个大于1的自然数&#xff08;最小质数为2&#xff09;。除了1和它自身外&#xff0c;不能被其他自然数整除的数。 >质数&#xff1a;用n除[2,n-1]的所有数,不能整除就是n就是质数。 2.[2,n-1]缩…

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

前提准备 在开始质数的讨论之前&#xff0c;我们先预备一下&#xff1a; 质数的定义&#xff1a;若一个正整数除了1和它自身之外不能被任何自然数整除&#xff0c;则该数称为质数&#xff0c;也叫素数。否则为合数。 由定义可知&#xff0c;所有小于等于1的数既不是质数&…

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;整个数据集中的所…