python 质数筛

 埃氏筛和线性筛的python实现,祈祷用不上,,


"""埃拉托斯特尼筛法"""
def prime_sieve(n):
    primes = [True] * (n + 1)   # 用于标记
    primes[0] = primes[1] = False

    p = 2
    while p * p <= n:
        if primes[p] == True:   #p是质数,则将p的倍数标记为非质数
            for i in range(p * p, n + 1, p):
                primes[i] = False
        p += 1

    prime_numbers = [i for i in range(2, n + 1) if primes[i]]   # 遍历筛选出质数
    return prime_numbers


# 示例用法
n = 100
result = prime_sieve(n)
print(result)
"""线性筛法"""
"""
质因数是一个数的因数中,如果是质数就称为该数的质因数。
比如,6 的质因数是 2 和 3,因为它们都是质数且能整除 6。
寻找最小质因数有助于避免重复标记非质数
"""
def linear_sieve(n):
    is_prime = [True] * (n+1)   #用于标记每个数是否为质数
    primes = [] #存储已找到的质数列表
    smallest_prime_factor = [0] * (n+1) #记录每个数的最小质因数

    for i in range(2, n+1):
        if is_prime[i]:
            primes.append(i)
            smallest_prime_factor[i] = i
    # 将 i 与每个质数的乘积标记为非质数,并更新其最小质因数。
        j = 0
        while j < len(primes) and i * primes[j] <= n:
            is_prime[i * primes[j]] = False #表示将 i 与当前质数的乘积标记为非质数
            smallest_prime_factor[i * primes[j]] = primes[j]    #更新最小质因数信息

            if i % primes[j] == 0:
                break
            j += 1

    return primes

# 示例用法
n = 20
result = linear_sieve(n)
print(result)

 容易理解的一版:

def sieve_of_eratosthenes(n):
    # 创建一个标记数组,用于标记数字是否为质数
    is_prime = [True] * (n + 1)
    is_prime[0] = is_prime[1] = False  # 0 和 1 不是质数
    
    # 使用质数筛法,从小到大标记质数的倍数为非质数
    p = 2
    while p * p <= n:
        if is_prime[p]:
            for i in range(p * p, n + 1, p):
                is_prime[i] = False
        p += 1
    
    # 收集所有质数
    primes = []
    for i in range(2, n + 1):
        if is_prime[i]:
            primes.append(i)
    
    return primes

# 示例:找出 100 以内的所有质数
primes = sieve_of_eratosthenes(100)
print("质数列表:", primes)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值