用python写出30种求30万以内的素数,并将他们列举出来的不同算法
时间: 2024-11-18 17:27:37 浏览: 15
Python中有多种方法可以编写找出30万以内素数的程序,以下是几种常见的算法:
1. **暴力筛选** (Brute Force):
```python
def sieve_of_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]:
for j in range(i*i, n+1, i):
primes[j] = False
return [i for i, prime in enumerate(primes) if prime and i > 1]
# 示例:找到30万以内的素数
primes_under_300k = sieve_of_eratosthenes(300000)
```
2. **埃拉托斯特尼筛法** (Sieve of Eratosthenes):
见上述的 `sieve_of_eratosthenes` 函数。
3. **质因数分解** (Prime Factorization):
```python
def is_prime(n):
if n <= 1:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
def find_primes_below_300k():
primes = []
for num in range(2, 300001):
if is_prime(num):
primes.append(num)
return primes
```
4. **Miller-Rabin primality test** (Probabilistic Test):
需要引入外部库 `random` 和 `math`,因为这是一种概率较大的测试。
```python
from random import randint
def miller_rabin(n, k=5): # 使用多次测试提高可靠性
...
primes_by_miller_rabin = [num for num in range(2, 300001) if miller_rabin(num)]
```
5. **线性筛法** (Linear Sieve):
比埃拉托斯特尼更高效,适用于大量数据。
```python
def linear_sieve(limit):
sieved = [False] * limit
sieve = [2]
for i in range(3, int(limit**0.5)+1, 2):
if sieved[i]:
continue
for j in range(i*i, limit, i):
sieved[j] = True
sieve.append(i)
primes = [x for x, is_prime in zip(range(2, limit), sieved) if not is_prime]
return primes[:300000]
linear_primes = linear_sieve(300000)
```
每种算法都有其适用场景,你可以根据需求选择合适的实现。如果你想了解更多信息,比如算法原理、性能分析等,我可以提供相应的解释。
阅读全文