AKS 素性检验的简要介绍

AKS Primality Test

AKS 素性测试的基于这样一个结论:

对于 n2n \geq 2, 有同余多项式:

(x+a)n(xn+a)(modn)(x + a)^n \equiv (x^n + a) \pmod n

当且仅当 nn 为质数时, 对所有 gcd(a,n)=1\gcd(a, n) = 1aa 成立.

组合数和质数

为了说明上面这个式子的正确性, 我们需要先证明如下式子, 对 n2n \geq 2 当且仅当 nn 为质数时成立:

(nk)0(modn)    (0<k<n)\binom nk \equiv 0 \pmod n ~~~~ (0 < k < n)

整理式子:

(nk)0(modn)nkk!0(modn)\begin{aligned} \binom nk &\equiv 0 \pmod n\\ \frac{n^{\underline{k}}}{k!} &\equiv 0 \pmod n\\ \end{aligned}

对于质数 nn, 我们知道 k!k! 一定不含因数 nn, 而 nkn^{\underline{k}} 一定含因数 nn, 因此对于所有 kk 都有 nnkk!n | \dfrac{n^{\underline{k}}}{k!}. 因此该结论成立是 nn 是质数的必要条件.

对于合数 nn, 我们取它的一个质因子 pp, 假设 nn 中有 sspp, 那么一定有 k=psk = p^s 时, 上式不成立. 我们知道 ps!p^s!pp 的次数为 i=0s1pi\displaystyle{\sum_{i = 0}^{s - 1} p^i}, 而 nkn^{\underline{k}}pp 的次数也是 i=0s1pi\displaystyle{\sum_{i = 0}^{s - 1} p^i}, 因此 nkk!\dfrac{n^{\underline{k}}}{k!}pp 的次数为 00, 而 nnpp 的次数为 ss, 因为 ppnn 的质因数, 所以 s>0s > 0. 因此这时 nkk!0(modn)\dfrac{n^{\underline{k}}}{k!} \equiv 0 \pmod n 不成立, 该结论成立时 nn 是质数的必要条件.

综上, 对于 n2n \geq 2. 对所有 0<k<n0 < k < n, 满足 (nk)0(modn)\dbinom nk \equiv 0 \pmod nnn 为质数的充要条件.

AKS 的基础推论

因此可以证明一开始的结论:

(x+a)n(xn+a)(modn)i=0n(ni)xiani(xn+a)(modn)xn+an+i=1n1(ni)xiani(xn+a)(modn)an+i=1n1(ni)xiania(modn)\begin{aligned} (x + a)^n &\equiv (x^n + a) \pmod n\\ \sum_{i = 0}^n \binom ni x^ia^{n - i} &\equiv (x^n + a) \pmod n\\ x^n + a^n + \sum_{i = 1}^{n - 1} \binom ni x^ia^{n - i} &\equiv (x^n + a) \pmod n\\ a^n + \sum_{i = 1}^{n - 1} \binom ni x^ia^{n - i} &\equiv a \pmod n\\ \end{aligned}

nn 是质数的时候, 这个式子的正确性是显然的, 因为我们已经证明了这些二项式系数在 nn 为质数的时候为 00, 而且根据费马小定理有 ana(modn)a^n \equiv a \pmod n, 因此满足这个结论是 nn 为质数的必要条件.

nn 不是质数的时候, 情况有些复杂, 我思考了好久也没有证明出来. 而且这个证明在中英文维基百科上都没有写, 所以去《信息安全数学基础》上试图找到合理的解释.

对于同余多项式, 它们相等当且仅当 xx 每一个次方的系数在模对应模数意义下相等, 所以我们只要对于某一个满足 gcd(a,n)=1\gcd(a, n) = 1aa, 在某一项 xi,i(0,n)x^i, i \in (0, n) 中说明它的系数不为 00, 就可以说明对于合数 nn 这个条件不成立.

假设合数 nn 有质因子 pp, nn 中一共有 sspp 相乘. 那么 xpx^p 的系数为 (np)anp\dbinom np a^{n - p}. 前面已经得出了相关的结论, 得到 (np)\dbinom nppp 的次数为 s1s - 1, 而因为 aann 互质所以 aa 也不能提供因子 pp, 因此 (np)anp\dbinom np a^{n - p}pp 的次数也为 s1s - 1, 也就是模 nn 意义下不为 00. 所以满足这个结论是 nn 为质数的充分条件.

综上, 满足这个结论是 nn 为质数的充要条件. AKS 的原理就是从这个推论中导出的.

但是如果每次计算这个多项式会发现, 多项式有 nn 项, 所以需要 O(n)O(n) 的时间复杂度, 所以为了得到更优的复杂度, 有更强的推论.

定理的推广

如果我们把上面的式子对 xr1x^r - 1 这样形式的多项式进行取模, 然后判断是否成立, 一定可以判断出不成立的情况. 也就是说对于任意 xr1x^r - 1, 满足下面的式子是满足前面提出的式子的必要条件.

(x+a)nxn+a(modxr1,n)(x + a)^n \equiv x^n + a \pmod {x^r − 1, n}

AKS 得出了结论, 我们只要在 rr 是多项式 logn\log n 的情况下, 判断对于多项式 logn\log naa, 是否满足上面的同余式成立, 即可判断 nn 是否是质数的幂.

对互质的 nnrr 定义 nnrr 的阶 ordr(n)ord_r(n) 表示满足 nb1(modr)n^b \equiv 1 \pmod r 的最小的正整数 bb. 根据欧拉定理 (数论) 显然有 ordr(n)ϕ(r)ord_r(n) | \phi(r).

在论文中, 作者证明了 rr 可以在 log5n\log^5 n 的级别内找到, 而 aa 也可以仅判断前 ϕ(r)logn\sqrt {\phi(r)} \log n 级别的数.

关于这个结论的证明, 需要用到大量抽象代数的知识, 但是我不想学抽象代数, 怎么办呢?

所以略过这部分的证明.

AKS Algorithm

首先需要判断 nn 是整数 mm 的整数 kk 次方的情况. 我们可以枚举 kk, 容易发现只有 O(logn)O(\log n)kk, 然后用牛顿法nk\sqrt[k]n. 这个过程可以在多项式 logn\log n 的时间内进行.

我们找到最小的正整数 rr, 使得 ordr(n)>log2(n)ord_r(n) > \log^2(n), 并且试除 rr 以内的数字. 如果 rnr \geq n, 判定 nn 为质数.

ϕ(r)logn\sqrt {\phi(r)} \log n 以内的 aa 判断 (x+a)nxn+a(modxr1,n)(x + a)^n \equiv x^n + a \pmod {x^r − 1, n} 是否成立, 成立则 nn 为质数, 否则是合数.

这个算法最朴素的实现可以达到 O(log12npoly(loglogn))O(\log^{12} n \text{poly}(\log \log n)).

之后出现了优化到 O(log6npoly(loglogn))O(\log^6 n \text{poly}(\log \log n)) 的变体.

参考文献