[演算法] Algorithm: Sieve of Eratosthenes 質數判斷
@([Udemy] Learning Algorithms in JavaScript from Scratch)[algorithm, javascript]
此系列筆記主要依照 [Udemy] Learning Algorithms in JavaScript from Scratch by Eric Traub 的課程脈絡加以整理,但部分程式碼是消化後以自己較易理解的方式重新撰 寫,因此和原課程內容有些出入。
問題描述
給予一個數值,把所有小於此數值的質數(Prime)都列出來:
// 以陣列的方式列出小於 number 的所有質數
function sieveOfEratosthenes (number) {...}
sieveOfEratosthenes(20) // [2, 3, 5, 7, 11, 13, 17, 19]
前置知識
質數與合數
數字可以分成質數(Prime)和合數(Composite),而質數的定義是:「一個大於 1 的整數,除了 1 和數本身以外,沒有其他的因數」,質數之外的都屬於合數。
2 = 1 * 2; // 2 是質數
3 = 1 * 2; // 3 是質數
4 = 1 * 4 = 2 * 2; // 4 是合數
5 = 1 * 5; // 5 是質數
6 = 1 * 6 = 2 * 3; // 6 是合數
判斷 N 以內的數是否為質數,只需判斷到 √N 之前有無除了 1 的質因數即可
在判斷一個數字是否為質數前,只需判斷該數目 n 的 1 ~ √n 中有無因數即可,這是什麼意思呢?
假設要判斷 4 以內的所有質數,只需判斷 1 ~ √4 之間有沒有除了 1 的質因數就好。也就是只要判斷 1 ~ 2 有沒有除了 1 是 4 的質因數:
4 = 1 * 4 = 2 * 2;
假設要判斷 25 以內的質數,只需要判斷 1 ~ √25 之間有沒有除了 1 的質因數就好。也就是只要判斷 1 ~ 5 有沒有除了 1 是 25 的質因數:
25 = 1 * 25 = 5 * 5;
簡單來說:
假如一個數 N 是合數,它有一個因數 a, a × b = N 則 a、b 兩個數中必有一個大於或等於 √N,一個小於或等於 √N。 因此,只要小於或等於 √N 的數中(1 除外)不能整除 N,則 N 一定是質數。 判斷質數合數的「開根號法」的數學原理?怎麼推導的? @ 百度