转载自:https://blog.csdn.net/m0_37586991/article/details/79673837?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
判断一个数是否为质数/素数——从普通判断算法到高效判断算法思路
因为看了上面这篇文章,感觉思路很棒,但原文是用C++写的,所以想写个python的版本。本文的大体结构与原文类似。
质数的定义:在大于1的自然数中,除了1和它本身以外不再有其他因数。
1)直观判断法
-
def isPrime(num):
-
for i
in range(num):
-
for j
in range(
2, num):
-
if i % j ==
0:
-
break
-
else:
-
return
True
2)直观判断法改进
-
from math
import sqrt
-
def isPrime(num):
-
for i
in range(num):
-
for j
in range(
2, int(sqrt(num))):
-
if i % j ==
0:
-
break
-
else:
-
return
True
3)质数规律判断法
首先看一个关于质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;
证明:令x≥1,将大于等于5的自然数表示如下:
······6x-2,6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6x+6,6x+7······
也就是
······2(3x-1),6x-1,6x,6x+1,2(3x+1),3(2x+1),2(3x+2),6x+5,6(x+1),6(x+1)+1······
可以看到,不在6的倍数两侧,即6x两侧的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2),所以它们一定不是素数,再除去6x本身,显然,素数要出现只可能出现在6x的相邻两侧。这里要注意的一点是,在6的倍数相邻两侧并不是一定就是质数。
-
from math
import sqrt
-
-
def isPrime(num):
-
if num ==
2
or num ==
3:
# 两个较小的数进行处理
-
return
True
-
if num %
6 !=
1
and num %
6 !=
5:
# 不在6的倍数的两侧的一定不是质数
-
return
False
-
tmp = int(sqrt(num))
-
for i
in range(
5, tmp+
1):
# 在6的倍数两侧的也可能不是质数
-
if num % i ==
0
or num % (i+
2) ==
0:
-
return
False
-
return
True
# 剩下的全是质数
-
for i in range(2, 200): # 这里的range函数起始值必须为2,否则第3种方法运行时会把1当作质数输出
-
if isPrime(i):
-
print(i, end=' ')
方法三正确写法
from math import sqrt
def is_prime(n):
if n <= 3:
return n > 1
#因为6的倍数+2可以被2整除,6的倍数+3可以被3整除,6的倍数+4可以被2整除,6的倍数可以被6整除
#所以只有n = 6的倍数+1或者+5才有可能是素数
if n%6 != 1 and n%6 != 5:
return False
#除此之外,还要判断该数可否被6的倍数+1或者+5整除
#比如25虽然在24(4*6)的右边,但它可以被5(0+5)整除
#比如49虽然在48(8*6)的右边,但它可以被7(6+1)整除
for i in range(5,int(sqrt(n) + 1),6):
if n%i == 0 or n%(i+2) == 0:
return False
return True