其他分享
首页 > 其他分享> > 一种比较巧妙的高效率质数判断法

一种比较巧妙的高效率质数判断法

作者:互联网

文章目录


前言

质数,又名素数(prime number),是算法竞赛出题常用的一种角度。素数的定义是只能被1和它本身整除的数字叫做素数。算法竞赛中与此有关的知识点有素数判断、素数筛等。由于判断质数在比赛出题中常常作为解题的其中一小步,因此我们常常用写一个isprime函数的方式来进行素数判断。此函数的功能为接收一个整数,若此整数为素数,返回true,否则返回false。

在之前的文章里已经提到过了素数判断的一般方法,即遍历2到sqrt(n),寻找是否有n的因数。在介绍本篇文章的方法之前,我们先来进行必要的知识储备。

一、知识储备和证明

结论:除2,3以外素数必然临近6的倍数,即一个除了2,3以外的素数一定可以用6n+1或者6n+5来表示(n=1,2,3,4…)。

证明:将所有自然数为6n+0, 6n+1, 6n+2, 6n+3, 6n+4, 6n+5, 易证6n+0一定能被6整除,6n+26n+4一定能被2整除,6n+3一定能被3整除,因此这些数字一定不是素数,也就是说素数一定是6n+1或者6n+5

二、代码实现

因此在原来素数判断方法的基础上,我们可以先行判断这个数字是否可以用6n+1或者6n+5来表示,如果不能则必然不是素数,接下来在进行遍历的时候就可以以6为步长进行判断,且只需要判断区间中的所有6n+1和6n+5即可。

bool isprime(const int num)
{
	unsigned int i,half;
	if(num <= 1) return 0;
	if(num == 2 || num == 3) return 1;
	else if(num % 6 != 1 && num % 6 != 5) return 0;
	half=(unsigned int)sqrt(num);
	for(i = 5; i <= half; i += 6) if(num % i == 0 || num % (i + 2) == 0) return 0;
	return 1;
}

使用这种方法,在数字比较大时和原来的方法相比至少能提升6倍效率。

标签:判断,高效率,数字,质数,6n,素数,巧妙,整除
来源: https://blog.csdn.net/m0_62021646/article/details/121302918