所以 7 是一个素数。当 n 是合数时这个式子不可能成立。因为如果 p 是 n 的一个素因子,而且小于 n ,则它也是 (n-1)! 的因子,所以不可能是 (n-1)!+1 的因子。这样就有了一个关于素性的板上钉钉的判据。然而威尔森的判据并不符合“计算起来很简单”的标准,因为我们不知道有什么计算阶乘 mod 另一个数的特别快速的方法。例如威尔森能预见到 268!=-1(mod 269) ,因为我们在前面已经知道了 269 是一个素数。但是如果我们不知道这件事,怎么能够知道 268! 除以 269 的余数呢?我们可以逐个因子地乘,这样来算出 268! ,但是比之试除到 17 ,计算的步数要多多了。
要证明某一件事不可能是很难的,事实上,没有一个定理说我们不可能在多项式时间内算出 a!(mod b) 。我们确实知道一些比完全硬算快得多的方法,但是,迄今为止,所有我们知道的方法都需要指数时间。所以,威尔森定理初看是有希望的,但是除非我们找到了快速计算 a!(mod b) 的方法,它是没有用处的。
费马小定理又如何?费马小定理指出,如果 p 是一个素数,且 a 是任意一个不被 p 整除的整数,那么 a 的 p-1 次方减去 11 能够被 p 整除,即:
换句话说,a^(p-1) 除以 p 的余数是 1 。
注意 2^7=128=7×18+2 ,所以比 7 的倍数多 2 。或者取 3^5=243 ,经过计算,知道它同余于 3(mod 5) 。费马小定理告诉我们,如果 n 是素数,而 a 是任意整数,则 a^n=a(mod n)。如果说计算一个大数的阶乘 mod n 是很困难的事情,那么计算一个大的幂 mod n 说不定也很难。
关于费马小定理还有两件有趣的事要作进一步的说明。第一件是负面的,有一些合数,例如 n=561=3×11×17 是一个合数,但是对于每一个整数 a ,费马同余式都成立。这种数 n 称为 Carmichael 数。从素性检验的角度来看,不幸的是这种数为数无穷。但是还有正面的情况,如果从适合以下条件的数对 (a,n) 中作随机的选择,几乎可以肯定,当 x 增大时,所选出的数对中,n 一定是素数。这个条件就是:
而且 n 被某个大数 x 所限制。
可以把费马小定理和素数的另一个初等的性质结合起来。如果 n 是一个奇素数(就是 n≠2 ),则同余式 x^2=1(mod n) 恰好有两个解,就是 x=±1 。其实,还有一些合数也有这个性质,但是可以被两个不同奇素数整除的合数就没有这个性质。
现在设 n 是一个奇数,而我们想要决定它是否素数,则可以这样做:设在区间 1≤a≤n-1 中取某个数 a 使得
在实际去做的时候也没有必要从大的指数倒退到小的指数。事实上,如果用前面概述的方法来计算 2^560 mod 561 ,则在计算过程中也就顺便算出了 2^140 和 2^280 ,所以前面的检验方法的这一个推广,更快也更有力。
这里举例说明一个一般原理。设 n 是一个奇素数,令 a 为一个不能用 n 整除的整数。记
t 为奇数,则把
称为强费马全同。这里发生一件奇妙的事情,就是由 Monier 和 Rabin 独立证明了的事:这里没有 Carmichael 数的类似物。他们证明了若在 1≤a≤n-1 中选择 a ,则至少有四分之三次选择得到的 a 会使得强费马全同不成立。
如果只是想在实际上区分素数与合数,而且不坚持想要证明,那么读到这里也就够了。就是说,现在可以操作如下:如果给了一个充分大的奇数 n ,则可以在区间 [1,n-1] 中随机地选 20 个数作为 a ,然后试着用这些 a 为底数,看一看会不会发生强费马全同。只要一旦某个 a 不适合强费马全同,就可以就此止步:数 n 一定是合数。而若对这 20 个 a 都发生了强费马全同,则可以猜测 n 一定是素数。
事实上,如果 n 是合数,Monier-Rabin 定理告诉我们,对于 20 个随机选择的底数 a ,都有强费马全同成立的概率最多是 4^(-20) ,这个机会小于万亿分之一。这样就有了一个很了不起的素性的概率检验方法。如果这个检验方法告诉我们 n 是合数,那么它就一定是合数,而如果告诉我们它是素数,那么,n 不是素数的概率小得完全可以忽略不计。
如果区间 [1,n-1] 中有四分之三的 a 都能够提供容易的确认奇合数确实为合数的检验方法的关键,那么真正找出一个 a 来也一定不难。我们能不能从小的 a 开始,一个一个地试,直到找到 a 为止?妙极了,但是什么时候停止搜索呢?让我们想一想。我们已经放弃了随机性的力量,而按照顺序从很小的数字开始逐个地寻找作试验的底数 a 。那么我们能够用似然的论据来论证这些 a 的性态都是随机的选择吗?它们之间是有联系的。
例如,设若取 a=2 并没有得出 n 为合数的证明,则取 2 的幂为 a 也不行。理论上说,有可能 2 和 3 都不能证明 n 为合数,但是取 a=2×3=6 却有可能管用,虽然这并不是很常见的事。所以,让我们把这种似然推理加以修正,并认为各个 a 取素数值是独立的事件。根据素数定理,到 logn log log n 为止有大约 log n 个素数,所以似然地说,n 为合数的概率是
虽然这些素数并不能帮助我们证明 n 为合数。但因为
是收敛的,所以选 logn log logn 为停止点说不定就行了,至少当 n 很大时是这样。
Miller 能够证明稍弱一点的结果,就是取 c(logn)^2 为停止点就够了,但是他的证明依赖于黎曼假设的一个推广。Bach 的进一步工作能够证明,可取 c=2 。总之,如果这个推广的黎曼假设成立,而且強费马全同对于每一个正整数 a≤2(logn)^2 都成立,则 n 为素数。所以,如果来自另一个数学领域的未曾证明的假设为真,就可以在多项式时间内,用一个决定论的算法来决定 n 是素数还是合数。
则 n 一定属于一个集合,其中有素数和一些合数,但是这些合数容易识别出来(并非每一个合数都难以识别,那些具有小素数因子的合数都容易识别)。这些思想合在一起就成了 Agrawal 等的素性检验方法。要想详细地给出全部论证,就要明确指出所用的辅助函数 f(x) 和常数 B ,还要严格地证明正是素数通过了检验。
Agrawal 给出了这个辅助函数,它就是简单得非常漂亮的函数
而这里的 r 有一个很简单的上界大约是 (logn)^5 。做完这些事情所需的算法的时间界限大约是 (logn)^10.5 。他们使用了一个数值上不太高效率的工具把时间减少到 (logn)^7.5 。Lenstra 和我提出了一个不那么简单但是效率较高的方法把 logn 的指数降到了 6 。我们做到这一点,是由于我们把所使用的多项式的集合扩大到形式为 x^r-1 的多项式以外,特别是使用了与高斯用直尺和圆规作正 n 边形的算法有关的多项式。能够用上高斯的著名工具来对他所提出的区别合数与素数这个问题说上什么,这使我们很高兴。