📜  python中的素数(1)

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

Python中的素数

在数学中,素数指的是仅能被1和自身整除的正整数。在编程中,我们经常需要用到素数,比如用于密码学、算法设计等领域。

那么在Python中,如何判断一个数是不是素数呢?有以下几种方法:

方法一:试除法

trial_division(n) 函数可以实现试除法。即从2开始,依次用每个小于等于n的正整数去除n,如果有能整除的数,则n不是质数。否则n是质数。这种方法的时间复杂度为O(n),效率较低。

def trial_division(n):
    for i in range(2, n):
        if n % i == 0:
            return False
    return True
方法二:埃拉托斯特尼筛法

Eratosthenes(n) 函数可以实现埃拉托斯特尼筛法。这种方法的思路是先用2筛去所有能被2整除的数,再用3筛去剩下能被3整除的数,以此类推,直至筛去完所有小于等于n的质数。这种方法的时间复杂度为O(n log log n),效率较高。

def eratosthenes(n):
    is_prime = [True] * (n + 1)
    is_prime[0] = False
    is_prime[1] = 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]]
方法三:Miller-Rabin算法

miller_rabin(n, k) 函数可以实现Miller-Rabin算法。该算法是一种基于费马小定理和二次探测定理的随机算法。在判断之前,需要选择一定的随机整数k,判断n是否为k次检验都为素数。这种方法的时间复杂度为O(k log^3 n),效率很高。

def miller_rabin(n, k):
    if n == 2 or n == 3:
        return True
    if n < 2 or n % 2 == 0:
        return False
    r, s = 0, n - 1
    while s % 2 == 0:
        r += 1
        s //= 2
    for i in range(k):
        a = random.randint(2, n - 2)
        x = pow(a, s, n)
        if x == 1 or x == n - 1:
            continue
        for j in range(r - 1):
            x = pow(x, 2, n)
            if x == n - 1:
                break
        else:
            return False
    return True

需要注意的是,该算法可能会出现误判,但可以通过选择一个足够大的k值来把概率降低到非常小。

以上是Python中判断素数的几种方法。大家可以根据自己的需要选择不同的算法来实现。