埃氏筛

简介和实现

2 开始,将每个素数的倍数,标记成合数。一个素数 qq 的各个倍数,是一个差为 qq 的等差数列。注意对于一个新的被迭代到的素数 nn,其第一个应该标记的倍数不必从 nn 开始,而是可以优化成 n2n^2,因为 2n,3n,4n...(n1)n2n,3n,4n...(n−1)n 已经分别在迭代小于 nn 的其他素数时被标记了

下面的代码返回严格小于 nn 的所有素数的数目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func countPrimes(n int) int {
// find the number of all primes < n strictly
ans := 0
np := make([]bool, n)
for i := 0; i < n; i++ {
np[i] = true
}
for i := 2; i * i < n; i++ {
if np[i] {
ans++
for j := i * i; j < n; j += i {
np[j] = false
}
}
}
return ans
}

时间复杂度证明TODO


埃氏筛
https://exapricity.tech/Eratosthenes-Sieve.html
作者
Peiyang He
发布于
2023年6月12日
许可协议