高效素数算法指南 | AI生成和翻译

Home 2026.02

很高兴听到你在思考高效的质数算法——这是竞赛编程(CP)中的经典且重要的话题!以下是最常见任务及高效方法的分解,并附有 Python 示例。


1. 判断一个数是否为质数

快速方法:试除法(至 √n)

def is_prime(n: int) -> bool:
    if n <= 1:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    for i in range(3, int(n**0.5) + 1, 2):
        if n % i == 0:
            return False
    return True

2. 生成小于等于 s 的所有质数(埃拉托斯特尼筛法)

快速方法:埃拉托斯特尼筛法

def sieve(s: int) -> list[int]:
    if s < 2:
        return []
    sieve = [True] * (s + 1)
    sieve[0] = sieve[1] = False
    for i in range(2, int(s**0.5) + 1):
        if sieve[i]:
            sieve[i*i : s+1 : i] = [False] * len(sieve[i*i : s+1 : i])
    return [i for i, is_prime in enumerate(sieve) if is_prime]

3. 竞赛编程中常见的质数相关任务

常见问题:


4. 进一步优化


示例:质因数分解

def prime_factors(n: int) -> list[int]:
    factors = []
    while n % 2 == 0:
        factors.append(2)
        n //= 2
    for i in range(3, int(n**0.5) + 1, 2):
        while n % i == 0:
            factors.append(i)
            n //= i
    if n > 2:
        factors.append(n)
    return factors

总结表

任务 方法 时间复杂度
判断 n 是否为质数 试除法(√n) O(√n)
生成小于等于 s 的质数 埃拉托斯特尼筛法 O(n log log n)
质因数分解 试除法 O(√n)

你的想法?

你提到使用已有质数的倍数排除非质数——这正是埃拉托斯特尼筛法的核心!在 CP 中,预计算质数并重复使用,可以进一步提速。

你是否希望深入了解其中某些方法,或特定的 CP 质数问题?


Back Donate