1. 程式人生 > 其它 >演算法:質數判斷

演算法:質數判斷

質數判斷方法

一、暴力法

定義:一個只能被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}\)

,通過6x-1和6x+1來排除在6的倍數的左右兩端的數中不是質數的數

因為通過第一個判斷後,只剩下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