埃氏筛法python
时间: 2024-04-12 13:25:03 浏览: 208
埃氏筛法(Sieve of Eratosthenes)是一种用于找出一定范围内所有素数的算法。它的基本思想是从2开始,将每个素数的倍数标记为合数,直到遍历完所有小于给定范围的数。以下是埃氏筛法的Python实现:
```python
def sieve_of_eratosthenes(n):
# 创建一个长度为n+1的布尔数组,用于标记数字是否为素数
is_prime = [True] * (n + 1)
is_prime = is_prime = False # 0和1不是素数
# 从2开始遍历到根号n
for i in range(2, int(n ** 0.5) + 1):
if is_prime[i]:
# 将i的倍数标记为合数
for j in range(i * i, n + 1, i):
is_prime[j] = False
# 收集所有素数
primes = [i for i in range(n + 1) if is_prime[i]]
return primes
```
使用示例:
```python
n = 100
primes = sieve_of_eratosthenes(n)
print(primes)
```
这段代码将输出小于等于100的所有素数。
相关问题
埃氏筛法与欧拉筛python
埃氏筛法:
```python
def Eratosthenes(n):
primes = [True] * (n + 1)
primes[0], primes[1] = False, False
for i in range(2, int(n ** 0.5) + 1):
if primes[i]:
primes[i * i: n + 1: i] = [False] * len(primes[i * i: n + 1: i])
return [i for i in range(n + 1) if primes[i]]
```
欧拉筛:
```python
def Euler(n):
primes = []
is_prime = [True] * (n + 1)
for i in range(2, n+1):
if is_prime[i]:
primes.append(i)
for p in primes:
if i * p > n:
break
is_prime[i * p] = False
if i % p == 0:
break
return primes
```
两者的时间复杂度都是 $O(n \log \log n)$,但在常数上欧拉筛比埃氏筛法小,因此欧拉筛法更快。
如何在Python中实现埃氏筛法?
在Python中实现埃拉托斯特尼筛法(Sieve of Eratosthenes),你可以按照以下步骤编写代码:
```python
def sieve_of_eratosthenes(n):
primes = [True] * (n + 1) # 初始化一个布尔列表表示每个数是否为素数,默认全为True
p = 2 # 首先考虑2作为第一个素数
while p * p <= n: # 只需要检查到√n,因为之后的合数肯定已经有小于它的因子被标记了
if primes[p]: # 如果p是素数
for i in range(p * p, n + 1, p): # 将p的倍数标记为非素数
primes[i] = False
p += 1 # 移动到下一个未被标记的数
# 输出结果,索引位置为素数,值为True
prime_numbers = [i for i in range(2, n+1) if primes[i]]
return prime_numbers
# 示例
n = 30
print(sieve_of_eratosthenes(n)) # 输出2到30之间的素数
```
这段代码首先创建了一个布尔数组表示从2到n的所有数,然后通过循环逐个排除合数,最后筛选出剩下的素数。
阅读全文