埃式筛和欧拉筛算法(Python版)

介绍

埃式筛和欧拉筛是用于筛选一定范围内所有素数的算法‌。

埃式筛法‌的使用方法如下:

  1. 初始化一个布尔数组isprime,大小设为要筛选的范围n+1,并将所有元素初始化为true,表示假设所有数都是素数。然后将isprimeisprime‌:ml-citation{ref="1" data="citationList"}设为false,因为0和1不是素数‌。
  2. 从2开始遍历到n,对于每个数i,如果isprime[i]true,则说明i是素数。此时,将i的所有倍数(从2*i开始,直到n)在isprime数组中对应的值设为false,表示这些数不是素数‌。
  3. 遍历完成后,isprime数组中值为true的索引对应的数就是素数‌。

欧拉筛法‌是对埃式筛法的优化,使用方法如下:

  1. 初始化一个空数组prime用于存储素数,以及一个布尔数组isprime,大小同样设为n+1,并将所有元素初始化为true
  2. 从2开始遍历到n,对于每个数i
    • 如果isprime[i]true,则将i添加到prime数组中,表示i是素数。
    • 然后,遍历prime数组中已经找到的所有素数prime[j](注意j的取值范围,使得i*prime[j]不超过n),并将i*prime[j]isprime数组中对应的值设为false,表示这些数不是素数。特别地,如果i能被prime[j]整除,则跳出内层循环,因为此时i已经有了更小的素数因子,无需继续筛除‌。
  3. 遍历完成后,prime数组中存储的就是所有小于等于n的素数。

欧拉筛法的优点在于,每个合数只会被其最小的素数因子筛除一次,从而保证了线性的时间复杂度O(n)‌。

代码

当然,我可以为你提供埃式筛和欧拉筛的求解代码。以下是使用Python编写的两种算法的实现:

埃式筛法(Sieve of Eratosthenes)

def sieve_of_eratosthenes(n):
    # 初始化一个布尔数组,表示所有数都是素数
    is_prime = [True] * (n + 1)
    is_prime = is_prime = False  # 0和1不是素数

    # 从2开始筛选素数
    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(2, n + 1) if is_prime[i]]
    return primes

# 测试埃式筛法
n = 30
print("埃式筛法得到的素数:", sieve_of_eratosthenes(n))

欧拉筛法(Euler's Sieve)

def euler_sieve(n):
    # 初始化一个布尔数组,表示所有数都是素数
    is_prime = [True] * (n + 1)
    is_prime = is_prime = False  # 0和1不是素数
    primes = []  # 用于存储素数

    # 从2开始筛选素数
    for i in range(2, n + 1):
        if is_prime[i]:
            primes.append(i)  # 将i添加到素数列表中
        # 遍历已经找到的素数,筛除i与这些素数的乘积
        for j in range(len(primes)):
            if i * primes[j] > n:
                break  # 如果乘积超过n,则停止筛除
            is_prime[i * primes[j]] = False  # 标记乘积为非素数
            if i % primes[j] == 0:
                break  # 如果i能被当前素数整除,则跳出内层循环

    return primes

# 测试欧拉筛法
n = 30
print("欧拉筛法得到的素数:", euler_sieve(n))

这两段代码分别实现了埃式筛法和欧拉筛法,用于找出小于等于给定数n的所有素数。你可以通过修改n的值来测试不同范围内的素数筛选。埃式筛法的时间复杂度为O(n log log n),而欧拉筛法的时间复杂度为O(n),因此在大规模素数筛选时,欧拉筛法通常更高效。

你可能感兴趣的:(算法,埃式筛,欧拉筛)