使用Python实现埃拉托斯特尼筛法生成素数

埃拉托斯特尼筛法是一种很古老的用来寻找素数的算法,埃拉托斯特尼筛法的工作原理如下:

  • 给定一个正整数n,生成一个从2到n的连续正整数序列。
  • 将2标记为素数,并将其余的偶数标记为非素数。
  • 找到下一个未标记的奇数p,并将其标记为素数。
  • 将p的倍数标记为非素数。
  • 重复步骤3和4,直到找到所有大于p的素数,或直到到达n。

2、解决方案

这里列出三种不同的用Python编写的埃拉托斯特尼筛法,可以用来生成素数:

# 第一种实现

def sieve_of_eratosthenes(n):
  """
  使用埃拉托斯特尼筛法生成素数。

  参数:
    n: 正整数。

  返回:
    一个列表,其中包含从2到n的所有素数。
  """

  # 创建一个长度为n+1的布尔数组,其中所有元素都被初始化为True。
  is_prime = [True] * (n + 1)

  # 将0和1标记为非素数。
  is_prime[0] = False
  is_prime[1] = False

  # 找到下一个未标记的奇数p,并将其标记为素数。
  p = 2
  while p * p <= n:
    if is_prime[p]:
      # 将p的倍数标记为非素数。
      for i in range(p * p, n + 1, p):
        is_prime[i] = False
    # 找到下一个未标记的奇数p。
    p += 1

  # 创建一个列表,其中包含从2到n的所有素数。
  primes = [i for i in range(2, n + 1) if is_prime[i]]

  return primes


# 第二种实现

def sieve_of_eratosthenes_generator(n):
  """
  使用埃拉托斯特尼筛法生成素数的生成器。

  参数:
    n: 正整数。

  返回:
    一个生成器,其中包含从2到n的所有素数。
  """

  # 创建一个长度为n+1的布尔数组,其中所有元素都被初始化为True。
  is_prime = [True] * (n + 1)

  # 将0和1标记为非素数。
  is_prime[0] = False
  is_prime[1] = False

  # 找到下一个未标记的奇数p,并将其标记为素数。
  p = 2
  while p * p <= n:
    if is_prime[p]:
      # 将p的倍数标记为非素数。
      for i in range(p * p, n + 1, p):
        is_prime[i] = False
    # 找到下一个未标记的奇数p。
    p += 1

  # 创建一个生成器,其中包含从2到n的所有素数。
  def prime_generator():
    for i in range(2, n + 1):
      if is_prime[i]:
        yield i

  return prime_generator()


# 第三种实现

def is_prime(n):
  """
  检查一个数是否为素数。

  参数:
    n: 正整数。

  返回:
    如果n是素数,则返回True,否则返回False。
  """

  # 如果n小于2,则返回False。
  if n < 2:
    return False

  # 如果n是2,则返回True。
  if n == 2:
    return True

  # 如果n是偶数,则返回False。
  if n % 2 == 0:
    return False

  # 检查n是否能被3到sqrt(n)之间的奇数整除。
  for i in range(3, int(n ** 0.5) + 1, 2):
    if n % i == 0:
      return False

  # 如果n没有被任何奇数整除,则返回True。
  return True


def sieve_of_eratosthenes_optimized(n):
  """
  使用埃拉托斯特尼筛法生成素数的一种优化实现。

  参数:
    n: 正整数。

  返回:
    一个列表,其中包含从2到n的所有素数。
  """

  # 创建一个长度为n+1的布尔数组,其中所有元素都被初始化为True。
  is_prime = [True] * (n + 1)

  # 将0和1标记为非素数。
  is_prime[0] = False
  is_prime[1] = False

  # 找到下一个未标记的奇数p,并将其标记为素数。
  p = 2
  while p * p <= n:
    if is_prime[p]:
      # 将p的倍数标记为非素数。
      for i in range(p * p, n + 1, p):
        is_prime[i] = False
    # 找到下一个未标记的奇数p。
    p += 2

  # 创建一个列表,其中包含从2到n的所有素数。
  primes = [i for i in range(2, n + 1) if is_prime[i]]

  return primes

这些就是使用埃拉托斯特尼筛法生成素数的三种不同实现。您可以根据自己的需要选择合适的实现。

猜你喜欢

转载自blog.csdn.net/D0126_/article/details/143211966