跳转至

素数筛法#
发布于2021-04-19
上次编辑2021-04-19

普通方法#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def primes_under_n(n: int) -> List[int]:
    primes = []
    for i in range(2, n + 1):
        j = 2
        is_prime = True
        while j * j <= i:
            if i % j == 0:
                is_prime = False
                break
            j += 1
        if is_prime:
            primes.append(i)
    return primes

埃拉托斯特尼筛法#

Sieve of Eratosthenes.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
def eratosthenes_sieve(n: int) -> List[int]:
    is_prime = [True] * (n + 1)
    i = 2
    while i * i <= n:
        if is_prime[i]:
            j = i
            while j * i <= n:
                is_prime[j * i] = False
                j += 1
        i += 1

    primes = []
    for i in range(2, n + 1):
        if is_prime[i]:
            primes.append(i)
    return primes

线性筛法#

欧拉筛法 (Euler's sieve).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def euler_sieve(n: int) -> List[int]:
    is_prime = [True] * (n + 1)
    primes = []
    for i in range(2, n + 1):
        if is_prime[i]:
            primes.append(i)
        for prime in primes:
            x = i * prime
            if x > n:
                break
            is_prime[x] = False
            if i % prime == 0:
                break
    return primes

使用 Python 时,最快的是用下面代码写的 埃拉托斯特尼筛法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def eratosthenes_sieve(n: int) -> List[int]:
    is_prime = [True] * (n + 1)
    i = 2
    while i * i <= n:
        if is_prime[i]:
            is_prime[i * i : n + 1 : i] = [False] * len(range(i * i, n + 1, i))
        i += 1
    primes = []
    for i in range(2, n + 1):
        if is_prime[i]:
            primes.append(i)
    return primes

例题#

返回顶部

在手机上阅读