埃拉託斯特尼篩法（，），簡稱 zhcn 埃氏篩；zhtw 埃氏篩；zhhk 愛氏篩，是一種用來質數的篩法，得名於古希臘數學家埃拉託斯特尼。其基本步驟是從最小的質數 2 開始，將該質數的所有倍數標記成合數，而下一個尚未被標記的最小自然數 3 即是下一個質數。如此重複這一過程，將各個質數的倍數標記為合數並找出下一個質數，最終便可找出一定範圍內所有質數。 埃拉託斯特尼篩法可能在埃拉託斯特尼的時代之前就已經為人所知，並記載於另一位古希臘數學家尼科馬庫斯的《》中，儘管該著作中的這一篩法是從 3 開始，從奇數中依次篩去奇數的倍數，而非從自然數中篩去質數的倍數。 運用與示例 埃拉託斯特尼篩法透過不斷地標記當前質數的所有倍數為合數，從而取得最小的未標記整數為下一個質數。不過，在實際使用此篩法尋找一個範圍內的質數時，不需要檢查範圍內所有整數，也不需要對每個質數都標記其所有的倍數。 尋找 N 以內的質數時，若找到了一個大於 sqrt N 的質數，則剩餘的所有尚未標記的數也都是質數。 證明：若這些尚未標記的數中有任意一個為合數，設之為 m，則 m 必定是除 1 與自身以外的兩個因數的乘積。但既然 m 尚未被標記，則所有小於等於 sqrt N 的數均不是 m 的因數。故這兩個因數必然都大於 sqrt N，則 m 不可能在 N 以內。 標記某一質數 p 的倍數時，不需要每次皆從 2 p 3 p ldots 開始，而可直接從 p2 開始標記。 證明：所有較 p2 更小的 p 的倍數必然擁有一個更小的質數為其因數，故在標記之前的質數的倍數時它們已經被標記過了。 若要找出 25 以內的所有質數，使用如上述改進過的埃拉託斯特尼篩法的具體過程如下： 列出 2 以後所有數： 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 記錄質數 2，由 24 開始劃去 2 的倍數： 2 3 5 7 9 11 13 15 17 19 21 23 25 記錄下一質數 3，由 39 開始劃去 3 的倍數： 2 3 5 7 11 13 17 19 23 25 記錄下一質數 5，由 525 開始劃去 5 的倍數： 2 3 5 7 11 13 17 19 23 下一質數為 7，而 74925，故剩餘所有未標記的數皆為質數： 2 3 5 7 11 13 17 19 23 由此得到 25 內的質數為 2，3，5，7，11，13，17，19，23。 以上的演算法可用以下 zhcn 虛擬碼；zhtw 虛擬碼； 表示： zhcn 輸入：整數 n 1 設 A 為布林值矩陣，下標是 2 至 n 的整數， 初始時全部設成 true。 for i 2 3 4 不超過： if A i 為 true： for j i2 i2i i22i i23i 不超過 n： A j false 輸出：使 A i 為 true 的所有 i。zhtw 輸入：整數 n 1 設 A 為布林值陣列，指標是 2 至 n 的整數， 初始時全部設成 true。 for i 2 3 4 不超過： if A i 為 true： for j i2 i2i i22i i23i 不超過 n： A j false 輸出：使 A i 為 true 的所有 i。 埃拉託斯特尼篩法的時間複雜度為 O nlog log n；相比之下，若是透過對範圍內每個整數進行試除法來找出範圍內的質數，則其時間複雜度為 O nsqrt n。 程式碼 Python 36310 def eratosthenes n is_prime True n 1 for i in range 2 int n 05 1 if is_prime i for j in range i i n 1 i is_prime j False return x for x in range 2 n 1 if is_prime x print eratosthenes 120 C 語言 int prime 100005 bool is_prime 1000005 int eratosthenes int n int p 0 for int i 0 i n i is_prime i true is_prime 0 is_prime 1 0 for int i 2 i n i if is_prime i prime p i if 1ll i i n for int j i i j n j i is_prime j 0 return p C 語言新版 include stdioh include stdlibh N positive integer verbose 1 print all prime numbers N 0 no print return total number of prime numbers N return 1 when there is not enough memory int eratosthenesSieve unsigned long long int N int verbose prime numbers are positive better to use largest unsiged integer unsigned long long int i j total total number of prime numbers N _Bool a malloc sizeof _Bool N if a NULL printf No enough memoryn return 1 a i equals 1 i is prime number a i equals 0 i is not prime number From beginning set i as prime number Later filter out nonprime numbers for i 2 i N i a i 1 mark multiples N of i as nonprime numbers for i 2 i N i if a i a i is prime number at this point for j i j N i 1 j mark all multiple of 2 2 2 3 as nonprime numbers do the same for 345 23 is filter out when i is 2 so when i is 3 we only start at 3 3 a i j 0 count total print prime numbers N if needed total 0 for i 2 i N i if a i i is prime number if verbose printf llun i total 1 return total int main unsigned long long int a1 0 a2 0 N 10000000 a1 eratosthenesSieve N 1 print the prime numbers printf Total of prime numbers less than llu is llun N a1 a2 eratosthenesSieve N 0 not print the prime numbers printf Total of prime numbers less than llu is llun N a2 return 0 C include vector auto eratosthenes int upperbound stdvectorbool flag upperbound 1 true flag 0 flag 1 false exclude 0 and 1 for int i 2 i i upperbound i if flag i for int j i i j upperbound j i flag j false return flag R eratosthenes function n if n 1 return NULL if n 2 n 3 return 2n numbers 2n primes rep TRUE n1 for i in 2floor sqrt n if primes i1 for j in seq i i n i primes j1 FALSE return numbers primes JavaScript const countPrimes function n const isPrime new Array nfill true for let i 2 i Mathsqrt n i if isPrime i for let j i i j n j i isPrime j false let count 0 for let i 2 i n i if isPrime i count return count 參見 篩法 盧卡斯 萊默檢驗法 米勒 拉賓檢驗 試除法 費馬素性檢驗 孿生素數 三胞胎素數 四胞胎素數 素數判定法則 表兄弟素數 六素數 X²1 素數 勒讓德篩法 參考文獻 拓展閱讀 Interactive animation 需要 JavaScript 列印質數的各種演算法 篩法小結 EratosthenesEuler 尤拉函式線性篩法詳解 （尤拉函式線性篩） 一般篩法求素數 快速線性篩法求素數 較好理解 Category 素性測試 Category 帶有虛擬碼示例的條目 Category 演算法