📜  素数 - Python (1)

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

素数 - Python

什么是素数?

在数学中,素数(prime number)指的是大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数。也就是说,只有被1和它本身整除的数才能被称为素数。

素数被广泛地应用于计算机科学和密码学等领域中,主要因为它们具有不可分解性和不可重复性。在密码学中,素数的特性被用来构造公钥密码系统,例如RSA。

如何用 Python 求取素数?

下面是一个简单的 Python 程序,用于求取小于等于给定数值 n 的所有素数。这个程序使用了试除法,逐个测试每个自然数是否为素数。

def get_all_primes(n):
    """
    返回小于等于给定数值n的所有素数
    """
    primes = []
    for num in range(2, n+1):
        is_prime = True
        for i in range(2, int(num**0.5)+1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    return primes

上面的程序首先初始化了一个空列表 primes,用于存储找到的所有素数。然后它逐个测试从2到n的每个自然数是否为素数,如果是素数则将其加入到 primes 列表中。为了测试一个自然数是否为素数,程序通过试除法测试从2到该自然数的平方根范围内的所有数字是否能被整除。

这个程序可以很容易地扩展,以便只返回第n个素数或在给定范围内返回随机的素数。

def get_nth_prime(n):
    """
    返回第n个素数
    """
    primes = []
    num = 2
    while len(primes) < n:
        is_prime = True
        for i in range(2, int(num**0.5)+1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
        num += 1
    return primes[-1]
    
    
from random import randrange

def get_random_prime(start, stop):
    """
    返回在指定范围内的随机素数
    """
    num = 0
    while num < start or num > stop or not is_prime(num):
        num = randrange(start, stop+1)
    return num

上面的两个函数分别返回第n个素数和任意一个在指定范围内的随机素数。get_nth_prime 通过逐个加上自然数并测试其是否为素数的方式,一直循环直到找到第n个素数为止。get_random_prime 使用 randrange 函数随机生成在指定范围内的自然数,然后反复测试直到找到第一个素数。注意,这里的 is_prime 函数在下面的代码片段中给出。

def is_prime(n):
    """
    测试给定数值是否为素数
    """
    if n <= 1:
        return False
    elif n <= 3:
        return True
    elif n % 2 == 0 or n % 3 == 0:
        return False
    i = 5
    while i * i <= n:
        if n % i == 0 or n % (i + 2) == 0:
            return False
        i += 6
    return True

上面的 is_prime 函数使用了更加高效的算法,可以更快地测试一个给定的数值是否为素数。

总结

本文介绍了如何使用 Python 来求取素数,包括求取小于等于给定数值的所有素数、求取第n个素数、以及在给定范围内随机返回一个素数。这些函数可以很方便地用于计算机科学和密码学等领域中,例如生成公钥密码系统的密钥。