📜  素数列表 (1)

📅  最后修改于: 2023-12-03 15:41:11.212000             🧑  作者: Mango

素数列表

简介

素数,又称质数,是指在大于1的自然数中,除了1和该数本身之外,无法被其他自然数整除的数。素数在密码学、质因数分解等领域具有广泛应用。本文将会介绍几种生成素数列表的算法。

常见算法
埃氏筛法

埃氏筛法,也称为爱氏筛法,是一种简单直接的素数筛法。该算法的基本思想是从2开始,将每个素数的倍数都标记成合数,以达到筛选素数的目的。其时间复杂度为O(n log log n)。

def sieve_of_eratosthenes(n):
    primes = [True] * (n+1)
    primes[0] = primes[1] = False
    for i in range(2, int(n**0.5)+1):
        if primes[i]:
            for j in range(i*i, n+1, i):
                primes[j] = False
    return [i for i in range(2, n+1) if primes[i]]
埃氏筛法优化

基于埃氏筛法,该优化方法使用了更高效的合数筛选法。其时间复杂度为O(n)。

def sieve_of_eratosthenes(n):
    is_prime = [True] * (n+1)
    is_prime[0] = is_prime[1] = False
    for i in range(2, int(n**0.5)+1):
        if is_prime[i]:
            for j in range(i*i, n+1, i):
                is_prime[j] = False
    return [i for i in range(2, n+1) if is_prime[i]]
欧拉筛法

欧拉筛法是一种对埃氏筛法的优化,比埃氏筛法更加高效。其基本思想是对每个数,只用其最小质因子筛选,避免重复。其时间复杂度为O(n)。

def euler_sieve(n):
    is_prime = [True] * (n+1)
    primes = []
    for i in range(2, n+1):
        if is_prime[i]:
            primes.append(i)
        for j in range(len(primes)):
            p = primes[j]
            if p * i > n:
                break
            is_prime[p*i] = False
            if i % p == 0:
                break
    return primes
结语

以上是三种常见的生成素数列表的算法。在实际应用中,应根据具体场景选择最适合的算法。