📜  AKS原始性测试(1)

📅  最后修改于: 2023-12-03 14:59:12.865000             🧑  作者: Mango

AKS原始性测试

AKS原始性测试是用于判断一个无向图是否为素图(由素数个节点组成的图)的算法。它得名于其发明者Miklós Ajtai、József Komlós和Endre Szemerédi的姓氏首字母缩写。

算法原理

AKS算法的原理基于费马小定理和多项式的性质。它通过判断某些同余方程是否能够被一定程度上预处理的多项式整除来判断无向图是否为素图。

实现思路

AKS原始性测试的实现思路非常简单。具体的实现步骤如下:

  1. 预处理阶段:根据费马小定理,先选择一个素数 p > n,其中 n 是无向图的节点数。然后计算 (x + a)^p (mod x^r − 1, n),其中 a0p−1 之间的一个随机整数,r 是可以取得最小值的一个值。计算出这个多项式以后,取它在模 x^r − 1 的意义下的余数,计算复杂度是 O(log p log n log log n)

  2. 判定阶段:当无向图的节点数 n 是素数时,将 mod 多项式设为 (x + 1)^n − x^n − 1。当无向图的节点数 n 不是素数时,判定失败。将 mod 多项式代入计算复杂度为 O(log^3 n)

  3. 整数测试阶段:根据整数因数分解的知识,先判断 n 是否是完全平方数,如果是,则判定失败。然后求出 r 的值,根据 O(log n log log n) 的算法处理出它的全部质因数,遍历其中的每个质因数,判断 n 是否是这些质因数的幂,如果是,则判定失败。

算法复杂度

AKS原始性测试的时间复杂度公式为O(log^6 n),空间复杂度为O(log^5 n)。在实际应用中,该算法适用于小规模的素数判定程序,而对于大规模的素数判定程序则不建议使用。

参考资料
  1. AKS原始性测试

  2. An Elementary Proof of the Prime Number Theorem

# Python 代码实现
def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(n**0.5)+1):
        if n % i == 0:
            return False
    return True