素数(质数)
定义
- 一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
- 0和1既不是质数也不是合数,最小的质数是2。
- 素数是构成所有正整数的基本构造元素,任何正整数n都可以表示成素数的乘积(并具有唯一性):
常用定理
定理1:当n≥5时,如果n为素数,那么n%6=1或n%6=5。即n一定出现在6x(x≥1)的两侧。
定理2:若n≥6且n-1和n+1为孪生素数,那么n一定是6的倍数。
质数判断的优化
优化1:对数m判断其是否为质数,判断其能否被[2, sqrt(m)]范围内的数字所整除即可,而不必时[2, m]的范围。
优化2:对优化1进行具体化,实际不用从2开始,直接从5开始,原因如下:
因为6x两边的数一定是奇数,那么一定不能被2整除,故而不用考虑2。
由于6x+1或者6x-1除以3,一定是2x+1/3或者2x-1/3,也不可能被3整除,故而不考虑3.
由于4是偶数,且6x+1和6x-1一定是奇数,即奇数一定不能被4这个偶数除尽,故而不考虑4。
综上,从5开始判断,也就是说判断范围是[5, sqrt(m)]。
优化3:在优化2的基础上,在范围[5, sqrt(m)]内,步长也不用是1,可以设置为6,原因如下:
代码
/*本程序判断是否为一个数是否为质数(素数)*/
include<bits/stdc++.h>
using namespace std;
bool isPrime(int n) {
if(n<=3) return n>1;
if(n%6!=1 && n%6!=5) return false; //如果不在6倍数附近,肯定不是素数
for(int i=5; i<=sqrt(n); i+=6) //但在6倍数附近并不是一定就是素数,需判断
if(n%i==0 || n%(i+2)==0) return false;
return true;
}
int main() {
int x;
cin>>x;
if(isPrime(x))
cout<<"This is a prime."<<endl;
else
cout<<"This is not a prime."<<endl;
}