演算法:質數判斷
阿新 • • 發佈:2022-04-05
質數判斷方法
一、暴力法
定義:一個只能被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}\)
因為通過第一個判斷後,只剩下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