判断一个数是否为质数
结论:
(大于等于5的)质数一定和6的倍数相邻,即一定是 6 x + 1 6x + 1 6x+1或 6 x − 1 , x ∈ Z , x ≥ 1 6x - 1, x \in Z, x \ge 1 6x−1,x∈Z,x≥1。 利用这种特性,可以对整数进行筛选,只判断那些是 6 x + 1 6x + 1 6x+1或 6 x − 1 6x - 1 6x−1的整数是否为质数。
证明:
令 x ≥ 1 x \ge 1 x≥1, 将大于5的相邻6个的整数分为一组,即每组的整数有: { 6 x − 1 , 6 x , 6 x + 1 , 6 x + 2 , 6 x + 3 , 6 x + 4 } \{6x-1, 6x, 6x + 1, 6x + 2, 6x + 3, 6x + 4\} {6x−1,6x,6x+1,6x+2,6x+3,6x+4}, 在每组的整数中, 6 x , 6 x + 2 , 6 x + 4 6x, 6x + 2, 6x + 4 6x,6x+2,6x+4为偶数,一定不为质数,且 6 x + 3 = 3 ( 2 x + 1 ) 6x + 3 = 3(2x + 1) 6x+3=3(2x+1), 即 6 x + 3 6x + 3 6x+3也不为质数,因此质数只能是 6 x − 1 , 6 x + 1 6x -1, 6x + 1 6x−1,6x+1。
代码实现:
bool isprime(int n)
{
if(n <= 3) return n > 1;
//若不为6x+1或6x-1 不为质数
if(n % 6 != 1 && n % 6 != 5) return false;
int nsqrt = (int)sqrt(n);
for(int i = 5; i <= nsqrt; i += 6)
{
//因为已不存在因子为3的数,9+6i为3的倍数,因此跳过不用判断
if(n % i == 0 || n % (i + 2) == 0)
return flase;
}
return true;
}