- 摘要
本文提供了一个无条件确定性多项式时间算法,用于确定输入数字是素数还是合数。
- 简介
素数在数学中一般,特别是在数论中具有基本重要性。因此,研究素数的不同性质具有极大的意义。特别感兴趣的是那些能够有效确定一个数是否为素数的性质。这种有效的测试在实践中也很有用:许多密码协议需要大素数。
设 PRIMES 表示所有素数的集合。素数的定义已经给出了判断一个数 n 是否在 PRIMES 中的方法:尝试用小于等于 √n 的每个数 m 来除以 n —— 如果任何 m 能整除 n,则 n 是合数,否则它是素数。这种测试自古希腊时期即已知晓 —— 它是筛法(约公元前240年)的一个特例,可以生成小于 n 的所有素数。然而,这个测试是低效的:确定 n 是否为素数需要 Ω(√n) 步骤。一个有效的测试应该只需要多项式(与输入的大小 = log n 成正比)数量的步骤。一个几乎给出有效测试的性质是费马小定理:对于任何素数 p,以及任何不能被 p 整除的数 a,ap−1 ≡ 1 (mod p)。给定一个 a 和 n,可以通过重复平方计算 a 的 (n−1) 次幂来高效检查 an−1 ≡ 1 (mod n)。然而,这不是一个正确的测试,因为许多合数 n 也对一些 a 满足这个条件(所有 a 对于卡迈克尔数也是如此)。尽管如此,费马小定理成为许多高效素数测试的基础。
自20世纪60年代开始复杂性理论——当时复杂性的概念被正式化并定义了各种复杂性类别——
这个问题(称为素性测试问题)已经受到了深入的研究。很容易看出这个问题属于 co-NP 类:如果 n 不是素数,那么它有一个易于验证的短证书,即 n 的一个非平凡因子。1974年,Pratt观察到这个问题也属于 NP 类[Pra](从而将其置于 NP ∩ co-NP 中)。
1975年,Miller [Mil] 使用基于费马小定理的一个性质,假设延伸黎曼猜想(ERH),得到了一个确定性多项式时间算法,用于素性测试。不久之后,Rabin [Rab] 修改了他的测试,得到了一个无条件但随机化的多项式时间算法。独立地,Solovay 和 Strassen [SS] 在1974年得到了一个不同的随机化多项式时间算法,利用了一个性质:对于一个素数 n,对于每一个 a( 是雅可比符号),都有 a^(n) ≡ a^((n-1)/2) (mod n)。他们的算法在 ERH 假设下也可以变为确定性的。从那时起,基于许多不同性质提出了许多随机化多项式时间算法用于素性测试。
1983年,Adleman、Pomerance 和 Rumely 利用高互反律提出了一个在 (log n)^O(log log log n) 时间内运行的确定性算法,实现了素性测试的重大突破(以前的确定性算法都需要指数时间)。他们的算法在某种意义上是对 Miller 思想的一种推广。1986年,Goldwasser 和 Kilian [GK] 提出了一个基于椭圆曲线的随机化算法,预期在几乎所有输入上都能以多项式时间运行(在一个广泛相信的假设下,所有输入上都能运行),为素性提供了一个易于验证的短证书(直到那时,所有随机化算法只为合成提供证书)。基于他们的想法,Atkin [Atk] 开发了一个类似的算法。Adleman 和 Huang [AH] 修改了 Goldwasser-Kilian 算法,得到了一个在所有输入上预期多项式时间运行的随机化算法。这一系列研究的最终目标当然是获得一个无条件的确定性多项式时间算法用于素性测试。尽管迄今取得了令人印象深刻的进展,但这一目标仍然难以实现。
在本文中,我们实现了这一目标。我们提供了一个确定性的、O∼(log^(15/2) n) 时间复杂度的算法,用于测试一个数是否为素数。从启发上看,我们的算法表现更好:在一个广泛相信的有关 Sophie Germain 素数密度的猜想下(即质数 p 满足 2p + 1 也是质数),该算法只需要 O∼(log^6 n) 步骤。我们的算法基于对有限域上的多项式环的费马小定理的推广。值得注意的是,我们算法的正确性证明只需要简单的代数工具(除了对于具有大质因子 p - 1 的素数 p 密度的筛法结果的引用—即使这对于证明算法的一个较弱时间界 O∼(log^(21/2) n) 也不是必需的)。相比之下,早期算法产生素性证书的正确性证明[APR],[GK],[Atk]要复杂得多。
在第2节中,我们总结了我们算法背后的基本思想。在第3节中,我们确定所使用的符号表示法。在第4节中,我们说明了算法并展示了其正确性证明。在第5节中,我们得出了算法运行时间的界限。第6节讨论了改进算法时间复杂度的一些方法。
- 背后思想idea
该算法基于以下对于素数的身份验证,这是费马小定理的一个推广。这个身份验证是一种随机多项式时间算法的基础 [AB]:
引理 2.1. 设 a ∈ Z,n ∈ N,n ≥ 2,且 (a, n) = 1。则当且仅当 n 是素数时,
(X + a)^n ≡ X^n + a (mod n)。
证明。对于 0 < i < n,((X + a)^n - (X^n + a)) 中 xi 的系数是 a^n-i。
假设 n 是素数。那么 a^n ≡ a (mod n),因此所有系数为零。
假设 n 是合数。考虑 n 的一个因子为素数 q,且 q^k||n。那么 q^k 不整除 a^q,并且与 a^n-q 互质,因此 X^q 的系数不为零(mod n)。因此 ((X + a)^n - (X^n + a)) 在 Z_n 上不恒等于零。
上述身份验证提出了一个简单的素数测试方法:给定输入 n,选择一个 a 并测试是否满足同余式 (1)。然而,这需要 Ω(n) 的时间,因为在最坏情况下需要评估左侧的 n

最低0.47元/天 解锁文章
711

被折叠的 条评论
为什么被折叠?



