判断素数最快方法python,素数判断 python,python高效的素数判断算法

判断素数最快方法python,素数判断 python,python高效的素数判断算法

本文主要介绍python高效的素数判断算法。学算法的同学一定要看看。

高效素数判断算法

算法概述

这个算法集成了其他博主对基本素数算法的一些改进,包括以下三条规则:

1.大于3的质数必须在6的倍数之前或之后(如质数37在36之后)

2.判断n是不是素数,只要让n从2开始,依次除以根号n就可以了。

3.在“让N从2开始,依次除以根号N”的过程中,如果N除以2的余数不为0,可以直接跳过[2,sqrt(n)]中的所有偶数

博主中文素养不高,表达也不是很准确。这三个规则后面会解释。

规则详解

1.大于3的质数必须在6的倍数之前或之后(如质数37在36之后)

数学证明:

任意整数n都可以表示为n=6a b (0=b=5,a=0)。接下来,当n等于0到5时,这个结论被证明:

当n=6a 0=6a时,n有一个不为1的因子(素数判断条件)6,这样的数不是素数。

当n=6a 2=2( 3a 1)时,n有一个不是1的因子(素数判断条件)2,这样的数不是素数。

当n=6a ^ 3=3(2a ^ 1)时,如上,有一个因子为3,这样的数不是素数。

当n=6a 4=2( 3a 2)时,有一个因子为2,这样的数不是素数。

但当n=6a 1或n=6a 5时,n是否是素数并不是绝对确定的,要考虑a的值。显然,此时的n值是6的倍数之前或之后的那个值。

总结:大于3的素数必须分布在6的倍数附近。

这个规则可以直接筛选素数,不符合这个规则的数可以直接判断为非素数,直接减少了2/3的计算量,提高了效率。

注意,小于等于3的质数(2,3)需要另外判断。

2.判断n是不是素数,只要让n从2开始,依次除以根号n就可以了。

判断素数最基本的方法是将n从2除以n-1。如果每个除法的余数不为0,那么这个数n就是质数。

其实不需要把[2,n-1]范围内的整数都除,除以[2,sqrt(n)]就可以了。

3.当n除以区间[2,sqrt(n)]中的所有整数时,如果2不是n的因子,那么区间[2,sqrt(n)]中的所有偶数之后可能都无法判断。

数学证明:当n/2不可整除时,n除以[2,sqrt(n)]的区间内的所有偶数都不可整除。

所以,如果n不能整除2,那么后面的偶数也不能整除,可以直接整除。

如果2被除,N就不是质数,所以直接排除。

如果2没有被整除,后续的计算量直接减半,肉眼可见的效率提高。

算法时间复杂度复杂度

1.最基本的算法:就是让n从2一直判断到n-1。

如果遇到的数是质数,需要判断n-2次。

当不是质数时,要判断a(2an-2)次。

也就是说时间复杂度是n。

2.改进的算法:

根据规则2,可以从[2,sqrt(n)]判断素数,复杂度为sqrt(n)。

根据规则3,无论如何,2之后的偶数都可以判断(当n大于2时,当n除以2时,n不是素数,之后不需要判断,如果n除以2,之后的偶数不需要判断)。

假设n被2整除的概率等于n被2整除的概率,复杂度为sqrt(n)/4。

根据规则一,只需判断1/3的数,复杂度为sqrt(n)/12。

即时间复杂度为sqrt(n)/12。

计算过程中所做的假设和计算过程并没有那么严谨,这个结果仅供参考。

Python代码实现

定义初级法官:

#先把数字分成三类,小于等于1,大于1小于5,大于等于5。

#所有非整数都不是质数

如果不是isinstance(n,int):返回False

#小于1等于没有质数。

如果n=1:返回False

#大于1小于5

elif n==2或n==3:返回True

# 5或更高

elif n=5:

#先确定是否在6附近。

如果n % 6==5或n % 6==1:

#然后判断2是否能整除。

#如果可以,不是质数

如果n % 2==0:返回False

否则:

#不除2,直接跳过所有偶数。

对于范围(3,int(sqrt(n) 1),2)中的I:

如果n % i==0:返回False

#经过筛选,是一个素数。

返回True

#不接近6不是质数

否则:返回False

以上是python高效的素数判断算法的细节。更多关于python的素数算法,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: