ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-11-13 13:04:55  阅读:207  来源: 互联网

标签:判断 高效率 数字 质数 6n 素数 巧妙 整除


文章目录


前言

质数,又名素数(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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有