演算法筆記 1 判斷乙個數是否為質數

2022-09-07 16:54:09 字數 1691 閱讀 5766

1、質數的定義為如下兩條:

2、實現

(1)設給定的乙個數為 x 

,從2開始遍歷到 x-1

,判斷該數能否整除這些數。

1

defis_prime(x):

2if x == 1:

3return

false

4for i in range(2, x):

5if x % i ==0:

6return

false

7return true

(2)其實無需從2到x-1遍歷,而是只需要從2遍歷到√x即可。其原因是,假設x是合數,那麼他可以寫成兩個整數的積,即:x

= a × b

,則必定有 a

≤ √x

且 b≤ √x,

因此可以將複雜度進一步降低。

1

def isprime(self, n: int) ->bool:

2if n == 1:

3return

false

4 tmp = n ** 0.5

5for i in range(2, int(tmp) + 1):

6if n % i ==0:

7return

false

8return true

(3)其實質數還有乙個特點,就是它總是等於 6n+1 或者 6n+5,其中 n 是大於等於1的自然數。這條也是很好被證明的,假設 y = x % 6,y 無非就是以下幾種情況:0, 1, 2, 3, 4, 5

y01

2345

備註被6整除

被2整除

被3整除

被2整除

合數/質數

合數合數

合數合數

因此我們有如下推論:

對於第二條推論也很好證明:

(2)中我們遍歷了 [2,√x ] 中的所有數,依次判斷了 x 能否除盡這些數。但是是否真的有必要逐個判斷呢?我們把 [2,√x ] 中的所有數按模6的餘數分為以下6類:6n, 6n+1,6n+2,6n+3,6n+4,6n+5。

假設 x 能除盡 6n, 6n+2,6n+4,那麼 x 必然是乙個偶數,但是根據第一條推論,如果 x 是質數則 x = 6n+1 或者 6n+5,顯然 x 也必然是奇數,這與 x 是偶數矛盾,所以假設 x 是質數,則 6n, 6n+2,6n+4 不必判斷也知道是除不盡的。

6n+3也同理。換言之我們只需要檢查 [2,√x ] 中 6n+1,n ≥ 1 或者 6n+5,n ≥ 0 是否是 x 的約數即可。如果都不能整除則 x 是質數,否則為合數。

1

defis_prime(x):

2if x == 1:

3return

false45

if x % 6 != 1 or x % 6 != 5:

6return

false

78 root = int(x ** 0.5)

9for i in range(5, root+1, 6):

10if x % i == 0 or x % (i+2) ==0:

11return

false

1213

return true

JS判斷乙個數是否為質數

非正則實現function isprime num 因為2是比較特殊的質數,所以先拿出來 if num 2 else if num 2 0 依次判斷是否能被奇數整除,最大迴圈為數值的開方 let squareroot math.sqrt num 因為2已經驗證過,所以從3開始 且已經排除偶數,所以每...

判斷乙個數是否為質數(素數)

從鍵盤上輸入乙個數,判斷這個是數是否為質數 素數 質數 素數 除了1和它本身不能被其它數整數的數。如果 i,n 都是整數,那麼 i n 0,那麼就稱 i 是 n 的倍數,n 是 i 的約數或者因數,n 整除 i,i 被 n 整除。演算法 判斷乙個數是否質數 素數 只需判斷有沒有乙個數可以整除這個數就...

java判斷乙個數是否為素數 質數

質數 prime number 又稱素數,定義為乙個大於1的自然數,除了1和它本身外,不能被其他自然數整除,換句話說就是該數除了1和它本身以外不再有其他的因數。第乙個思路 假如我們需要判斷數字是33,因為所有的數都可以被1整除,所以我們從2開始,一直到33 1 32進行遍歷,看看這個數可以被哪些數整...