埃氏筛和线性筛的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)