📜  prime no (1)

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

素数(prime numbers)

素数是指除了 1 和它本身以外,没有其他因数的正整数。比如,2、3、5、7、11、13 等都是素数。素数在密码学、计算机科学、数学以及其他领域中扮演着重要的角色。

算法

判断一个数是否为素数有很多种方法,以下是几种常见的算法。

埃拉托斯特尼筛法

该算法的基本思想是:从 2 开始,将素数的倍数全部标记为合数,直到不再存在这样的数,则所有没有被标记的数均为素数。

def eratosthenes(n: int) -> List[int]:
    primes = [True] * (n+1)
    primes[0], primes[1] = False, False
    
    for i in range(2, int(n**0.5)+1):
        if primes[i]:
            for j in range(i*i, n+1, i):
                primes[j] = False
    
    return [x for x in range(n+1) if primes[x]]

该算法的时间复杂度为 $O(n\log\log n)$。

费马小定理

该算法的基本思想是使用费马小定理,如果 $n$ 是素数,则对于任意 $a < n$,都有 $a^{n-1}\equiv 1 \pmod n$。

import random

def is_prime(n: int, k: int = 3) -> bool:
    if n == 2 or n == 3:
        return True
    if n <= 1 or not n % 2:
        return False
    
    for _ in range(k):
        a = random.randint(2, n-2)
        if pow(a, n-1, n) != 1:
            return False
    
    return True

该算法虽然时间复杂度为 $O(k\log n)$,但通常情况下只需要 $O(\log n)$ 的时间就可以判断出一个数是否为素数。

素性测试

素性测试是一类更加高效的算法,能够判断 $n$ 是否为素数。这些算法的基本思想是利用数学方法来快速判断一个数是否为合数。

以下是一些常见的素性测试算法:

  • Miller-Rabin 算法
  • AKS 算法
  • Lucas-Lehmer 算法
  • Adleman-Pomerance-Rumely 算法

这些算法的时间复杂度从 $O((\log n)^2)$ 到 $O(\log n)$ 不等。

应用

素数在密码学中扮演着重要的角色。加密算法通常使用两个大素数的乘积作为密钥,这样能够有效防止攻击者通过暴力枚举的方式破解加密信息。

素数还有许多其他的应用,比如:

  • 生成随机数
  • 求最大公约数
  • 时间戳的处理
总结

素数是数学中的一个重要概念,具有重要的应用价值。判断一个数是否为素数有多种方法,其中埃拉托斯特尼筛法和费马小定理是比较常用的算法。素数在密码学、数学、计算机科学等领域中扮演着重要的角色。