标签:判断 return 6i 质数 算法 倍数 6x 左右两端
质数判断方法
一、暴力法
定义:一个只能被1和自身整除的数为质数
算法:从2开始遍历至数字本身减一,若可被其他数整除则不是质数
点击查看代码
def isPrime(x):
if x==1:
return False
for i in range(2,x):
if not x%i:
return False
return True
二、遍历优化
特点:任意一个非质数n,其任一因式二元组中的两个数,一个小于 \(\sqrt{n}\),另一个大于 \(\sqrt{n}\)
优化:遍历区间只需用到\(\sqrt{n}\)
点击查看代码
def isPrime(x):
if x==1:
return False
#floor():向下取整
for i in range(2,floor(sqrt(x))+1):
if not x%i:
return False
return True
三、深度优化
特点:质数总是等于6x-1或6x+1,其中x为自然数
即质数总是6的倍数的左右两端的数,但反之不一定(6的倍数的左右两端的数不一定是质数)
而不是6的倍数的左右两端的数一定不是质数(可证)
则优化过程是:
1. 先判断是否为6的倍数的左右两端的数,若不是,则一定不是质数
2. 以6为步长,从5开始,到 \(\sqrt{n}\),通过6x-1和6x+1来排除在6的倍数的左右两端的数中不是质数的数
因为通过第一个判断后,只剩下6的倍数的左右两端的数即6x-1和6x+1。第二个判断即判断数字n这个6的倍数的左右两端的数是否为质数。
① 对于循环中6i-1,6i,6i+1,6i+2,6i+3,6i+4,其中如果n能被 6i,6i+2,6i+4整除,则n至少得是一个偶数,但是(n=6x-1或6x+1)的形式明显是一个奇数,
故不成立,因此判断时不需用这三种数。
② 对于6i+3,因为可被3整除,若n可以整除6i+3则n也为3的倍数,但n=6x-1或6x+1,n必不为3的倍数,因此也不用该数
③ 则最终剩下6i-1和6i+1,判断二者是否为n的除数即可。下面程序中i从5开始,则表示6i-1,则6i+1为i+2
点击查看代码
def isPrime(n):
if n==2 or n==3:
return True
#不是6的倍数的左右两端的数一定不是质数
if n==1 or (n%6!=1 and n%6!=5):
return False
#判断6的倍数的左右两端的数是否为质数
for i in range(5,floor(sqrt(n))+1)[::6]:
if not n%i or not n%(i+2):
return False
return True
标签:判断,return,6i,质数,算法,倍数,6x,左右两端 来源: https://www.cnblogs.com/ZghzzZyu/p/16103603.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。