📌  相关文章
📜  计算给定范围内的素数为素数的数(1)

📅  最后修改于: 2023-12-03 15:12:05.192000             🧑  作者: Mango

计算给定范围内的素数为素数的数

素数,也称质数,指除了1和其本身外没有其他因数的自然数。在实际应用中,素数有着广泛的应用,例如加密、哈希等领域。本文将介绍如何编写一个计算给定范围内的素数为素数的数的程序。

算法原理

常见的计算素数的算法有暴力算法和基于筛法的优化算法。

暴力算法

暴力算法是最简单的算法,其原理是对于每个待检验的数n,检验其是否能被2-n的开方(向下取整)的数整除。如果存在能整除n的数,则n不是素数,反之n是素数。

暴力算法的时间复杂度为O(n^1.5),效率较低,不适用于大规模计算素数。

基于筛法的优化算法

通过观察素数的一些性质,我们可以设计出一种高效的算法-- 基于筛法的优化算法。

该算法主要思想是:从2开始,将每个素数(已知的)和它的倍数都标记成合数,直到达到一定范围。

具体实现过程可以分为以下几个步骤:

  1. 首先将2-n的每个数都标记为素数;

  2. 从最小素数2开始,将其倍数都标记为合数(即非素数),直到2^2 > n

  3. 再从下一个未被标记为合数的数即3开始,重复步骤2;

  4. 重复步骤3,直到大于n。

最后,所有未被标记为合数的数即为素数。该算法的时间复杂度为O(nloglogn),效率较高。

代码实现

为了更加清晰地展示代码实现过程,以下将分别给出暴力算法和基于筛法的优化算法的代码实现片段。

暴力算法代码片段
def is_prime(n):
    if n <= 1:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    for i in range(3, int(n ** 0.5) + 1, 2):
        if n % i == 0:
            return False
    return True

def prime_in_range(start, end):
    res = []
    for i in range(start, end+1):
        if is_prime(i):
            res.append(i)
    return res
基于筛法的优化算法代码片段
def sieve_of_eratosthenes(n):
    is_prime = [True] * (n+1)
    is_prime[0], is_prime[1] = False, False
    for i in range(2, int(n ** 0.5) + 1):
        if is_prime[i]:
            for j in range(i*i, n+1, i):
                is_prime[j] = False
    return [i for i in range(n+1) if is_prime[i]]

def prime_in_range(start, end):
    primes = sieve_of_eratosthenes(end)
    return [i for i in primes if i >= start]
总结

本文分别介绍了计算素数的暴力算法和基于筛法的优化算法,并给出了相应的代码实现片段。在实际应用中,基于筛法的算法由于其高效性,更加适合计算大规模素数。