AKS Primality Test
AKS 素性测试的基于这样一个结论:
对于 n ≥ 2 n \geq 2 n ≥ 2 , 有同余多项式:
( x + a ) n ≡ ( x n + a ) ( m o d n ) (x + a)^n \equiv (x^n + a) \pmod n
( x + a ) n ≡ ( x n + a ) ( m o d n )
当且仅当 n n n 为质数时, 对所有 gcd ( a , n ) = 1 \gcd(a, n) = 1 g cd( a , n ) = 1 的 a a a 成立.
组合数和质数
为了说明上面这个式子的正确性, 我们需要先证明如下式子, 对 n ≥ 2 n \geq 2 n ≥ 2 当且仅当 n n n 为质数时成立:
( n k ) ≡ 0 ( m o d n ) ( 0 < k < n ) \binom nk \equiv 0 \pmod n ~~~~ (0 < k < n)
( k n ) ≡ 0 ( m o d n ) ( 0 < k < n )
整理式子:
( n k ) ≡ 0 ( m o d n ) n k ‾ k ! ≡ 0 ( m o d n ) \begin{aligned}
\binom nk &\equiv 0 \pmod n\\
\frac{n^{\underline{k}}}{k!} &\equiv 0 \pmod n\\
\end{aligned}
( k n ) k ! n k ≡ 0 ( m o d n ) ≡ 0 ( m o d n )
对于质数 n n n , 我们知道 k ! k! k ! 一定不含因数 n n n , 而 n k ‾ n^{\underline{k}} n k 一定含因数 n n n , 因此对于所有 k k k 都有 n ∣ n k ‾ k ! n | \dfrac{n^{\underline{k}}}{k!} n ∣ k ! n k . 因此该结论成立是 n n n 是质数的必要条件.
对于合数 n n n , 我们取它的一个质因子 p p p , 假设 n n n 中有 s s s 个 p p p , 那么一定有 k = p s k = p^s k = p s 时, 上式不成立. 我们知道 p s ! p^s! p s ! 中 p p p 的次数为 ∑ i = 0 s − 1 p i \displaystyle{\sum_{i = 0}^{s - 1} p^i} i = 0 ∑ s − 1 p i , 而 n k ‾ n^{\underline{k}} n k 中 p p p 的次数也是 ∑ i = 0 s − 1 p i \displaystyle{\sum_{i = 0}^{s - 1} p^i} i = 0 ∑ s − 1 p i , 因此 n k ‾ k ! \dfrac{n^{\underline{k}}}{k!} k ! n k 中 p p p 的次数为 0 0 0 , 而 n n n 中 p p p 的次数为 s s s , 因为 p p p 是 n n n 的质因数, 所以 s > 0 s > 0 s > 0 . 因此这时 n k ‾ k ! ≡ 0 ( m o d n ) \dfrac{n^{\underline{k}}}{k!} \equiv 0 \pmod n k ! n k ≡ 0 ( m o d n ) 不成立, 该结论成立时 n n n 是质数的必要条件.
综上, 对于 n ≥ 2 n \geq 2 n ≥ 2 . 对所有 0 < k < n 0 < k < n 0 < k < n , 满足 ( n k ) ≡ 0 ( m o d n ) \dbinom nk \equiv 0 \pmod n ( k n ) ≡ 0 ( m o d n ) 是 n n n 为质数的充要条件.
AKS 的基础推论
因此可以证明一开始的结论:
( x + a ) n ≡ ( x n + a ) ( m o d n ) ∑ i = 0 n ( n i ) x i a n − i ≡ ( x n + a ) ( m o d n ) x n + a n + ∑ i = 1 n − 1 ( n i ) x i a n − i ≡ ( x n + a ) ( m o d n ) a n + ∑ i = 1 n − 1 ( n i ) x i a n − i ≡ a ( m o d n ) \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}
( x + a ) n i = 0 ∑ n ( i n ) x i a n − i x n + a n + i = 1 ∑ n − 1 ( i n ) x i a n − i a n + i = 1 ∑ n − 1 ( i n ) x i a n − i ≡ ( x n + a ) ( m o d n ) ≡ ( x n + a ) ( m o d n ) ≡ ( x n + a ) ( m o d n ) ≡ a ( m o d n )
当 n n n 是质数的时候, 这个式子的正确性是显然的, 因为我们已经证明了这些二项式系数在 n n n 为质数的时候为 0 0 0 , 而且根据费马小定理有 a n ≡ a ( m o d n ) a^n \equiv a \pmod n a n ≡ a ( m o d n ) , 因此满足这个结论是 n n n 为质数的必要条件.
当 n n n 不是质数的时候, 情况有些复杂, 我思考了好久也没有证明出来. 而且这个证明在中英文维基百科上都没有写, 所以去《信息安全数学基础》上试图找到合理的解释.
对于同余多项式, 它们相等当且仅当 x x x 每一个次方的系数在模对应模数意义下相等, 所以我们只要对于某一个满足 gcd ( a , n ) = 1 \gcd(a, n) = 1 g cd( a , n ) = 1 的 a a a , 在某一项 x i , i ∈ ( 0 , n ) x^i, i \in (0, n) x i , i ∈ ( 0 , n ) 中说明它的系数不为 0 0 0 , 就可以说明对于合数 n n n 这个条件不成立.
假设合数 n n n 有质因子 p p p , n n n 中一共有 s s s 个 p p p 相乘. 那么 x p x^p x p 的系数为 ( n p ) a n − p \dbinom np a^{n - p} ( p n ) a n − p . 前面已经得出了相关的结论, 得到 ( n p ) \dbinom np ( p n ) 中 p p p 的次数为 s − 1 s - 1 s − 1 , 而因为 a a a 和 n n n 互质所以 a a a 也不能提供因子 p p p , 因此 ( n p ) a n − p \dbinom np a^{n - p} ( p n ) a n − p 中 p p p 的次数也为 s − 1 s - 1 s − 1 , 也就是模 n n n 意义下不为 0 0 0 . 所以满足这个结论是 n n n 为质数的充分条件.
综上, 满足这个结论是 n n n 为质数的充要条件. AKS 的原理就是从这个推论中导出的.
但是如果每次计算这个多项式会发现, 多项式有 n n n 项, 所以需要 O ( n ) O(n) O ( n ) 的时间复杂度, 所以为了得到更优的复杂度, 有更强的推论.
定理的推广
如果我们把上面的式子对 x r − 1 x^r - 1 x r − 1 这样形式的多项式进行取模, 然后判断是否成立, 一定可以判断出不成立的情况. 也就是说对于任意 x r − 1 x^r - 1 x r − 1 , 满足下面的式子是满足前面提出的式子的必要条件.
( x + a ) n ≡ x n + a ( m o d x r − 1 , n ) (x + a)^n \equiv x^n + a \pmod {x^r − 1, n}
( x + a ) n ≡ x n + a ( m o d x r − 1 , n )
AKS 得出了结论, 我们只要在 r r r 是多项式 log n \log n log n 的情况下, 判断对于多项式 log n \log n log n 个 a a a , 是否满足上面的同余式成立, 即可判断 n n n 是否是质数的幂.
对互质的 n n n 和 r r r 定义 n n n 模 r r r 的阶 o r d r ( n ) ord_r(n) o r d r ( n ) 表示满足 n b ≡ 1 ( m o d r ) n^b \equiv 1 \pmod r n b ≡ 1 ( m o d r ) 的最小的正整数 b b b . 根据欧拉定理 (数论) 显然有 o r d r ( n ) ∣ ϕ ( r ) ord_r(n) | \phi(r) o r d r ( n ) ∣ ϕ ( r ) .
在论文中, 作者证明了 r r r 可以在 log 5 n \log^5 n log 5 n 的级别内找到, 而 a a a 也可以仅判断前 ϕ ( r ) log n \sqrt {\phi(r)} \log n ϕ ( r ) log n 级别的数.
关于这个结论的证明, 需要用到大量抽象代数的知识, 但是我不想学抽象代数, 怎么办呢?
所以略过这部分的证明.
AKS Algorithm
首先需要判断 n n n 是整数 m m m 的整数 k k k 次方的情况. 我们可以枚举 k k k , 容易发现只有 O ( log n ) O(\log n) O ( log n ) 个 k k k , 然后用牛顿法 开 n k \sqrt[k]n k n . 这个过程可以在多项式 log n \log n log n 的时间内进行.
我们找到最小的正整数 r r r , 使得 o r d r ( n ) > log 2 ( n ) ord_r(n) > \log^2(n) o r d r ( n ) > log 2 ( n ) , 并且试除 r r r 以内的数字. 如果 r ≥ n r \geq n r ≥ n , 判定 n n n 为质数.
对 ϕ ( r ) log n \sqrt {\phi(r)} \log n ϕ ( r ) log n 以内的 a a a 判断 ( x + a ) n ≡ x n + a ( m o d x r − 1 , n ) (x + a)^n \equiv x^n + a \pmod {x^r − 1, n} ( x + a ) n ≡ x n + a ( m o d x r − 1 , n ) 是否成立, 成立则 n n n 为质数, 否则是合数.
这个算法最朴素的实现可以达到 O ( log 12 n poly ( log log n ) ) O(\log^{12} n \text{poly}(\log \log n)) O ( log 1 2 n poly ( log log n ) ) .
之后出现了优化到 O ( log 6 n poly ( log log n ) ) O(\log^6 n \text{poly}(\log \log n)) O ( log 6 n poly ( log log n ) ) 的变体.
参考文献