# 判断 candidate 是否是素数
def IsPrime(candidate):
if ((candidate&1)==0): # 是偶数,除了2,其他偶数全部不是质数
return candidate==2
limit=int(math.sqrt(candidate))
print('limint',limit)
for i in range(3,limit+1,2):
if candidate%i==0:
return False
return True
判断是否是偶数
十进制 0 1 2 3 4 5 6....
二级制 0 1 10 11 100 101 110....
奇数的二进制数:1结尾
偶数的二进制数:0结尾
所以与1 &运算 ,如果奇数为1,如果为偶数为0
素数:
2^2 3^2 4
^2 5^2
3,5,7, 9,11,13,15, 17,19,21,23, 25,27,29,31
素数定义:一个数只能被1和本身整除
所以偶数除2外都不是素数
例如:判断21是否是素数:
21?3*7
21?5*x # 注意x不能是偶数,那么被判断数就是偶数。那就在最顶端截获了。
21?7*3
21?9*x
21?11*x
21?13*x
21?17*x
21?19*x
21?21*1
这是完整的判断
大家看到从7*3后,其他运算要么不能可能,要么21*1必定成立。7*3以后的运算可以省去。
大家在看7*3与3*7是对称,也是冗余运算。我们能不能找到这个对称结构的中点,只需判断一半即可判定是否是素数。
两个数相乘,转折点在相乘两数相当,即:5*5.所以我们只需判断(不包含)
21?3*7
即可完整判断是否为素数。
算法性能大大提高。所以我们用limit=int(math.sqrt(candidate)),对所要判断数开平发,来获取上限。