判断质数的方法
经常遇到判断质数的题目,这里总结一下方法
一、 传统的简单的方法
先判断特殊情况1和2,在判断一般情况,中间间隔2相加
在这里插入代码片bool is_primer(int n){
int i;
//判断1and2
if(n == 1) return 0;
else if(n == 2) return 1;
//判断是否是偶数
else if(n % 2 == 0) return 0;
//判断一般情况,中间间隔2相加,只需判断到根号n就行
else{
for(i = 3; i < sqrt(n) + 1; i += 2){
if(n % i == 0) return 0;
}
return 1;
}
}
这种方法比较慢
二、埃氏筛法
要得到自然数n以内的全部素数,必须把不大于 的所有素数的倍数剔除,剩下的就是素数。
给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去… (百度百科)
三、数学结论结合
运用一些简单的孪生素数的定理
大于等于5的质数一定和6的倍数相邻。
证明:令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个为单元快进,即将方法(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整除,故不成立。