# 判斷 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結尾
所以與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)),對所要判斷數開平發,來獲取上限。