【世界数学难题】素数判定与大数因子分解问题(上)

序言
  数论中一个最基本、最古老而当前仍然受到人们重规的问题就是判别给定的整数是否素数(简称为素数判别或素性判别)和将大合数分解成素因子乘积(简称为大数分解)。在历史上,这个问题曾经吸引了包括费马(Fermat)、欧拉(Euler)、勒让德(Legendre)和高斯(Gauss)在内的大批数学家,他们花费了大量的时间和精力去研究这个问题。高斯在其著名的《算术探讨》(《Disquisitiones Arithmeticae》)中称道:“把素数同合数鉴别开来及将合数分解成素因子乘积被认作为算术中最重要最有用的问题之一。”我国的《易经》中也对这个问题作了研究。
  素数判别和大数分解这个问题具有很大的理论价值。因为素数在数论中占有特殊的地位,鉴别它们则成为最基本的问题;而把合数分解成素因子的乘积是算术基本定理的构造性方面的需要。人类总是有兴趣问如下的问题:2131-1是否素数?由23个1组成的数是否素数?怎么分解31487694841572361?对素数判别和大数分解的研究必然会丰富人类的精神财富。更重要的是,素数判别和大数分解具有很大的应用价值。在编码中,需要讨论某类有限域及其上的多项式,这类有限域就是由素数
  在快速数论变换中,要讨论Z/nZ上的卷积运算,就要知道Z/nZ的乘法群的构造,而这就依赖于将n分解成素因子的乘积。下面介绍的RSA公开密钥码体制更加说明了这个问题的两个方面在实际应用中的作用。1977年,艾德利曼(Adleman)、希爱默(Shamir)和鲁梅利(Rumely)发明了一个公开密钥码体制。在这个密码体制中,对电文的加密过程是公开的,但是,你仅知道加密过程而未被告知解密过程则不可能对电文进行解密。他们的体制就是依靠这样一个事实:我们能够很容易地将两个大素数(譬如两个百位素数)乘起来;反过来,要分解一不大整数(譬如200位)则几乎不可能。(关于RSA体制的详细介绍,请参阅文献[1])。因此RSA体制就与素数判别和大数分解有密切联系。首先,要具体建立一个RSA体制就需要两个大素数,因而就涉及到寻找大素数的问题;而RSA体制的破译之可能性就依赖于分解一个大数可能性。于是,RSA体制的建立与破译就等价于素数判别与大数分解问题。近来,由于计算机科学的发展,人们对许多数学分支的理论体系重新用计算的观点来讨论。从计算的观点来讨论数论问题形成了当前很活跃的分支-—计算数论。而素数判别和大数分解成为这一分支的重要组成部分。在这一部分里提出了两个重要的、悬而未决的问题:是否存在判别素数的多项式算法?是否存在分解大整数的多项式算法?已知道“分解整数”这个问题是一个NP完全问题,因此对上面第二个问题的讨论是解决计算机科学中的难题:“NP完全问题是否一定是多项式算法可解的?”的一个突破口。因此,素数判别和大数分解对计算机科学来说也是很有价值的。
  最直接的素数判别和大数分解方法就是试除法,即对整数n,用2,…,n-1去试除,来判定n是否素数,分解式如何。这个方法是最简单的一个方法,古希腊时就被人所知,但这个方法对较大的数(20位左右)就要耗费很多时间。在本世纪四十年代电子计算机出现之前,尽管产生了许多素数判别和大数分解方法,但因为用手算,速度太慢,很多方法在实用中即使对十几位的数也需要好几天,而对更大的数就无能为力了。随着计算机的出现及发展,人们开始用这个有力的工具来研究素数判别和大数分解。到六十年代末期,已产生了许多新方法,历史上的许多方法也得到了应用,使得对四十几位数的素数判别可以很快得到结果。而到七十年代末,数论学家和计算机专家们已深入地研究了这个问题,得到许多实际有效的方法。用这些方法在较好的计算机上判别一个100位数是否素数只需不到一分钟;分解70位左右的整数也是日常工作了。这些成果已引起人们的普遍关注。在这个领域中的研究空前活跃。虽然离问题的彻底解决还很远,但在本领域中已取得了一个又一个的突破。在这方面的研究必有光辉的前景。
  我们写这个小册子的目的是要介绍素数判别和大数分解的发展历史、一般理论、各种方法及最新成果,是想让许多非专业的读者了解这个方向的内容和进展情况。当然,只有在这些定理的证明较为初等而又不太长时,我们才给出其证明。因为这个方向与计算机科学的密切关系,我们还要结合计算量来介绍一些数论中常用的基本算法。
  除了极个别内容,如第二章第七节,本书的绝大部分内容只需要某些初等数论的知识,它们可以在任何一本介绍初等数论的书中都能找到,如文献[1] 。对于广义黎曼猜想,我们写了一则简短的附录。作为“世界数学名题欣赏丛书”中的一本,如果读者在欣赏之余,还打算进一步学习和探讨的话,那么,后面所列的文章和书目,可供参考。
  限于水平,本书的缺点和错误一定不少,我们期待着读者的批评指正。
1.算法及其计算量的概念
   通常,解决问题的方式有两种.其一是对问题的每个对象(也称作输入),直接给出答案,其二是给出一套规则,使得对问题的任何一个对象(输入),解答者可依照这些规则、机械地执行运算,能在有限步内得到答案.这里的第二种方式就是问题的算法解答,这时也称问题是算法可解的,而所给出的规则就称为算法.
   例 在复数范围内解一元二次方程.这个问题的输入即是具体给出的一元二次方程.任给一个方程种解答方式.
    例 判别任意给出的自然数是否素数.
  熟知,我们没有象上例那样的公式来表明哪个数是素数,哪个数不是素数.但是,我们可以以如下方式解答此问题:对任意给定的数n,用2,3 3,…,n-1去试除n,若其中有一个除尽n,则n不是素数;否则,n是素数.这就是问题的算法解答.注意,算法不可解的问题是存在的.希尔伯特的第十问题就是一个算法不可解的问题.这一点是马递佳塞维奇于1970年证明的.
    对算法可解的问题而言,解答的算法可能很多,我们在实际解决问题时究竟采取哪一种算法呢?这就要求对算法的好坏进行评判.算法的好坏与所谓的计算量有密切关系.人们注意到,对某类问题的解答依赖于一些基本运算.譬如,在排序问题中,比较运算——即比较两个元的先后——是一种基本运算.当然,“互换位置”也可以当作是一种基本运算.一个算法在对问题的某个输入解答所执行的基本运算次数,称为算法对此输入执行的计算量.算法对不同的输入执行的计算量一般不同.在把计算量描述为输入的函数之前,需要对输入给个度量,这就是所谓的输入尺寸.例如,在排序问题中,输入尺寸可定义为待排序的贯的长度.这样一来,计算量可以描述为输入尺寸的函数.算法对问题的所有输入执行的计算量的最大值称为算法在最坏性态下的计算量.如果解决一个问题有两个算法,其中一个算法在最坏性态下的计算量比另一个在最坏性态的计算量少,则称前者在最坏性态下比后者好.若一个问题存在一个算法解,其算法在最坏性态下的计算量是输入尺寸的多项式函数,则称此问题存在多项式算法,也说问题是P问题,否则称它不存在多项式算法.
  最后,我们谈谈概率算法和确定算法。所谓概率算法就是它的某些步骤是要依靠服从某种分布的随机抽样来完成的,这种随机过程应是有限步内可完成的,而且算法得出的结论应与所作的随机抽样无关,利用随机手段仅仅是为了加快算法的进程或为了方便.确定算法是相对于概率算法而言的,即它的每一步骤都是确定的,不须用随机手段就可完成的.以后,这两种算法都会遇上,凡没有用随机手段的都是确定算法,我们将不作特别说明了.
2.数论中的基本算法
   在数论问题中,输入一般是一个或几个自然数.如果输入是一个自然数n,则定义其输入尺寸为它的二进位表示的位数,即〔log2n〕 +1,有时也将log2n作为输入尺寸.熟知,数论问题的解答中,自然数的加减乘除这四则运算是基本的运算,而两个个位数的加法、减法和乘法及两位数除以个位数的除法又最基本.因此,我们如下定义数论问题的基本运算:假如我们是在r-进位制中讨论自然数的运算(通常在十进位下讨论,即r=10;而在计算机上,一般在二进位下讨论,即r=2),则基本运算就是个位数的相加、相减、相乘,两位数除以个位数的除法及向左移位运算(即乘上r).有了基本运算,就可以来讨论数论中的基本算法了.
   (1)四则运算加法:回忆一下小学里学多位数相加的情景,当时是列竖式再按老师教的规则去演算.这些竖式规则就是算法.我们依照用竖式演算的步骤将其用文字写出来即是:任意给定两个n位的r进位数(如有一个没够n位,可添一些零而达到n位).a=(an-1…a1a0)r=an-1rn-1+an-2rn-2+…+a1r+a0,b=(bn-1…b1b0)r=bn-1rn-1+bn-2rn-2+…+b1r+b0, =c0r+s0,其中0≤s0<r,c0=0或1视a0+b0<r或≥r而定.接着有a1+b1+c0=c1r+s1,0≤s1<r,因为0≤c0≤1,0≤a1,b1≤r-1,故c1=0或1视a1+b1+c0<r或≥r而定,继续对第2,3,……,n-1讨论得,存在c1,si使ai+bi+ci-1=ci·r+si,其中0≤si<r,ci=0或1(i=1,2,…,n-1),最后令cn-1=sn,则

因为由ai,bi,ci-1经带余除法ai+bi+ci-1=cir+si,0≤si<r,ci=0或1确定ci,si至多需要5次基本运算,故用竖式算法计算两个n位数的计算量至多是5n,用O记号即是O(n).在二进位制中,r=2,输入n的位数是〔long2n〕+1,另外,对任意的r>1有〔longrn〕+1=O〔long2n〕,故得到下面的定理.
定理1.1 用竖式算法计算两个不大于n的数相加时,其计算量是O〔long2n〕.

  减法:同加法一样地讨论,只是将a+b、ai+bi等改成a-b,ai-bi,相应地,ci=0或-1视ai-bi+ci-1≥0或≤0而定.我们也可以得到下面的定理.

  定理1.2 用竖式算法计算两个不大于n的数相减时,其计算量是O(log2n).乘法:在用竖式算法作多位数的乘法时,先是做个位数与多位数相乘,然后再移位相加.于是,我们先来讨论个位数与多位数相乘.设

-2,依次有aib0+ci-1=cir+si,其中0≤si<r,因为0≤ai,b0≤r-1,0≤ci-1≤r-2,故0≤aib0+ci-1≤r(r-2)+(r-1),因而0≤ci≤r-2,以上i=1,…,n-1.再令sn=cn-1,则得ab=  

 

   
因为(a·bi)ri是a·bi的r进位表示式向左移i位,即在a·bi的r进位表示式之后添i个零.因此表达式(1)表示m个数移位相加,这就将多位数乘法归结为多位数与个位数相乘,然后再移位相加.
  注意到,在个位数与多位数相乘时,由ai,bi,ci-1经aibi+ci-1=cir+si,0≤si<r确定ci,si至多需要5次基本运算,故个位数与n位数相乘的计算量至多是5n,而(1)式表明,n位数与m位数相

位数与n+2位数、n+2位数与n+3位数、……、n+m-1位数
式算法做n位数与m位数(m≤n)相乘的计算量不多于13mn.设M(n)表示两个n位数相乘的计算量,则M(n)=O(n2).故可得下面的定理.
定理1.3 竖式算法做两个不超过n的数的相乘时,其计算量是O
带余除法:带余除法的竖式算法要用文字表述出来比先前的加法和乘法都要麻烦,但它只不过是将小学里做带余除法的过程详细地写出来而已,这里不准备重复这些枯燥的叙述,而只将带余除法的竖式算法的计算量写出来.
  定理1.4 用竖式算法作两个不超过n的数的带余除法时,其计
  实际上,我们是得到这样的结论:一个2n位数除以一个n位数所得的商和余数的计算需要计算量O(n2),之后,才有定理1.4.而且由此可得,对一个不超过m2的数a取模m得最小非剩余的计算量是O(log22m).
  关于自然数的乘法,我们还想介绍两个优美的结果,其证明已超出本书的范围.
  定理1.5 任给一个正数ε,无论如何小,都存在一个乘法算法,它做两个n位数相乘的计算量是O(n1+ε),或者说,它做两个不大于n的数相乘的计算量是O(log21+εn).
  定理1.6 存在乘法算法,使其作两个n位数相乘的计算量是O(n·log2n·long2log2n),或者说,它做两个不大于n的数相乘的计算量是O(log2n·log2log2n·log2log2log2n)
  定理1.6中的乘法所需的计算量被认为是作乘法运算的最优计算量,即不存在有更少计算量的乘法算法.[2]
  下面的定理表明,除法所需的计算量与乘法所需的计算量相当,它的证明也不在本书范围内,读者可参见[2].
  定理1.7 存在除法算法,它求一个2n位数除以一个n位数得的商和余数所需的计算量是O[M(n)],其中M(n)是做两个n位数乘法所需的计算量.
  尽管定理1.5和定理1.6说明了有比竖式算法快得多的乘法算法,但为方便起见,我们以后还是使用竖式算法的计算量来代表两个数相乘的计算量.
  (2)幂运算
  给定一个整数a,由ak=a·ak-1,a1=a,归纳地定义了a的任意次幂.在素数判别和大数分解的讨论中,我们常常遇到要计算anmod m.如果根据定义,先计算amod m,再依次计算akmod m=(amod m)·(ak-1mod m)mod m,则至少需要n次乘法才能得到anmod m,而n经常是很大很大,这时计算量也就很大,于是需要有更好的计算anmod m的方法.我们确实有更好的方法,先来看一个例子.
  例 计算3107(mod 134)
  将107写成二进位数,即107=(1101011)2.我们有31≡3(mod  

  
  上例中的方法可以推广到一般情况.当要计算an mod m时,先将n用二进位制表示,设n=(ak-1…a1a1),ai=0或1,i=0,1,…,k-1. 再
  再将使ai=1对应的ri连乘起来,取模m,则得akmod m(这里连乘是指每乘一个数取一次模m,然后用所得的结果再与另一乘数相乘).我们有下面的定理
    定理1.8 给定a,存在求幂取模的算法,使得其计算anmodm的计算量为O(log2nlog22m).
  证明 在上面所描述的算法中,r0=amod m.因为a是一个事先给定的常数,故r0的计算可以忽略.而ri=r2i-1mod m,i=1,…,n-1,因而计算每个ri的计算量是O(log22m)(其中,ri-1乘ri-1的计算量为O(log22mri-1)≤O(log22m),取模m的计算量为O(log22m)),而这里k=〔log2n〕+1=O(log2n),故计算r0,r1,…,rk-1的总共计算为O(log2n·log22m).在把对应于ai=1的ri连乘起来时,每作一次乘法取一次模m,在这串连乘积中,乘法次数至多〔log2n〕+1次,取模m的次数也至多〔log2n+1〕次,而且每次乘法的两个乘数都不超过m,故做连乘积的计算量是O(log2nlog22m).因此,计算an modm总共需要计算量O(log2n log22m).□
  (3)努卡斯序列的项的计算.
  所谓努卡斯序列是指

  
  其中α和β是以下整系数二次方程的根:x2-Px +Q=0,(P,Q)=1
  在以后讨论素数判别时,我们需要计算努卡斯序列的第n项取模m:Unmodm和Vnmodm.它们的计算可利用努卡斯序列的性质,象讨论anmodm的计算一样,得到比较好的算法,因为讨论它的基本思路与上一段一样,且要用到努卡斯序列的一些较繁杂的性质.这里,我们只叙述一个结果,读者有兴趣可自己证明这个结果。
  定理1.9 给定P、Q,(P,Q)=1,存在算法使其计算Unmodm和Vnmodm的计算量是O(log2nlog22m).

  (4)进位制表示的互化
  我们常常需要将一个自然数的一种进位制表示化为另一种进位制表示.譬如,日常给出的自然数是十进位数,要将它输到计算机中就必须将它化成二进位数,反过来,从计算机输出的结果又要从二进位数化为十进位数,才能使常人看懂结果.
  设自然数n,由r1进位制给出,要将它化为r2进位制,我们可以如下完成:在r1进位制体系中进行四则运算,特别是带余除法运算,有

  

  则(qk-1qk-2…q1q0)r2便是n在r2进位制中的表达式.由带余除法的计算量(见定理1.4)知,完成(2)的计算量是O(log23n).
  (5)最大公因数的算法
  求最大公因数的最普遍的算法是欧几里得算法,它最初是公元前由欧几里得提出来的,有时也称它为辗转相除法.表述如下:
  设给定m,n(m>n),令r0=m,r1=n,有

  

  则得rk=gcd(rk-1,rk)=gcd(rk-2,rk-1)=…=gcd(r2,r3)=gcd(r1,r2)=gcd(r0,r1)=gcd(m,n).

  欧几里得算法(3)中作带余除法的次数k可由m和n确定出来.我们介绍下面的定理.
  定理1.10 (3)式中的k<5log2n+1,即得辗转相除的次数不大于n的十进位表示的位数的5倍.

  证明 引入斐波那契序列F0=0,F1=1,Fn=Fn-1+Fn-2,n=2,

rk≥1=F2,rk-1>rk故rk-1≥rk+1≥2=F3,rk-2≥rk-1+rk≥

+1.设n的十进位数表示的位数是1,则有n<101,故k<51+1,而k和51+1都是整数,故k≤51.□
  推论 用欧几里得算法求m,n(m≥n)的最大公因数的计算量是O(log23m).
  证明 因为(3)式中的k<5log10n+1,而且,其中每次带余除法的被除数和除数都不大于m,故由定理1.4知,每次带余除法的计算量是O(log22m),再由定理1.10及n≤m即得,由(3)得到gcd(m,n)的计算量是O(log23m).□
  熟知,由(3)式的最后一个等式往回推演,可以得到u和v使gcd(m,n)=um +vn,而且计算出u,v的计算量也可以证明是O(log23m),故对一次不定方程ax +by=c(其中gcd(a,b)|c)和一次同余式ax≡c(modb)(gcd(a,b)| c)求解的计算量是O(log23m),这里m=max(a,b,c).
  另外,为了以后的需要及其本身的重要性,我们要讨论雅可比符
是可以显然地得出的,故仍需要一个算法.我们可以利用雅可比符号的两点性质:

  

  写出一个类似于欧几里得算法的算法如下.
  以下用e(x)表示自然数x的最高2因子的幂次,即2e(x),2e(x)+1,用x'表示x的最大奇因子,显然有x=2e(x).x'.现在,给定两个数m,n,这里m为奇数且设m>n.令r0=m,r1=n,
  则有

      (4)

  其中r2=r0modr'1,即r0除r′1得的余数.再将r2代换r1,

r'1代换r0重复(4)的手续,不断地重复(4)的演算,最后得到r2=1
  (m>n)的计算量是O(log23m).
  (6)中国剩余定理
  定理 1.11 设m,…,mr(mi>1)是两两互素的自然数,a1,…,ar是r个整数,M=m1…mr,则存在唯一的0≤a<M使得a≡ai(modmi)i=1,…,r.且有算法使得其计算a的计算量是O(r·log23M).

   
i=1,…,r;设a,b都满足0≤a<M,0≤b<M,a≡ai(modmi),b≡ai(modmi)(i=1,…,r),即a-b≡0(modmi),i=1,…,r,而m1,…,mr两两互素,因而a-b≡0(modM),再由0≤a<M,0≤b<M即得a=b.于是唯一性证得.
  按上面的方法计算a,先要计算M=m1…mr,因为m1…mi乘mi+1的计算量是O(log2m1…mi·log2mi+1),故计算M的计算量是O
  同样,计算Mi的计算量也不多于O(log22M).由上一段的讨论,求得ui的计算量是O(log23Mi)≤O(log23M).最后,由ui,Mi,ai计算a的计算量也是O(log23M),因而求a的总计算量是O(rlog32M).□
  关于数论中的基本算法的研究,是计算数论的最基本的研究,不仅是它本身很重要,它在很多其它分支如计算机科学、代数学等中有很大的用处.然而到目前为止,除了有些文章散见于某些杂志和书籍中,还没有较完全的书来专门讨论这些问题.在这一方面,最好的文章是勒默的“计算机技巧应用于数论”.
二 素性判别
  素数这个概念,早在公元前很多世纪就为人们所熟知.后来人们发现所有自然数都是由素数乘起来得到的.欧几里得证明了素数有无限多个,因此,任意大的素数都存在.可是,在自然数的序列1,2,3,……中,素数和合数混杂在一起,对前数千个素数的分布之考察发现素数的分布没有规则,因此,鉴别一个自然数是素数还是合数就成为问题.这个问题在中世纪就引起人们的注意.当时人们试图寻找素数公式.到高斯时代,基本上确认了简单的素数公式是不存在的.在那时,即使对一个十位数的整数来作素性判别都是相当困难的,因此,高斯认定素性判别是数论中最困难的问题之一.从此后,这个问题吸引了大批数学家,但当时的人们没有计算机这个有力的工具,对一般十位以上的数都束手无策.因此,他们或者只对很特殊的数作了些研究,或者,对素性判别作了一般性讨论.而真正用得出的结论去判别一个大数是否素数时,常常因为计算量太大而归于失败.到本世纪初,手摇计算机的产生帮助了象勒默等人发展素性判别.而在1950年之后,由于电子计算机的诞生,数学家们又将注意力转到素性判别的问题上来了.目前,这个分支已经产生了很多好结果.我们将在此作介绍.因为素性判别的理论真正得到发展是近几十年的事,因此,我们主要是介绍近几十年的工作.在本书中,素性判别和素数判别指的是同一件事.
1.素性判别的一般理论
  素性判别的算法是指一个算法,用它可以判别任意一个自然数是否素数.迄今为止,素性判别的方法有很多种,但它们有共同的形式,我们试将它们从总体上来讨论.
  欲要寻求一个素性判别的算法,应先注意到素数所应该满足的一些性质,即一些必要条件.根据这些性质设计出一个条件组(也称试验组).这个条件组有两个特点:凡是素数就满足条件组中的每个条件(也称为通过条件组),凡通过这组试验组数,若不是素数,则它必有一个真因子落在某个特定的集合中.现对任给的数n,先看n 是否通过试验组,如果不通过,则n是合数;如果通过,则其可能的真因子有一个落在特定的集合中.然后,用这个特定的集合的每个元素去试除n,若有某个元素不等于1和n且整除n,则n是合数,否则,n是素数.这样的素性判别算法的计算量由两部分构成:对n逐个检验它是否满足条件组中的条件的计算量和对特定的集合中的元素逐个试除n.设第一部分的计算量是O(f(n)),特定集合的元素个数是g(n),(一般这g(n)个元素是1到n之间的数)则这个算法的计算量是O(f(n)+g(n)log22n).
  例:威尔逊证明了n是素数的充要条件是(n-1)!+1≡0(modn).于是可设计试验组为“条件(n-1)!+1≡0(modn)”,而特定集合是{1,n}.若n通过试验组,则n的可能的真因子在{1,n}.但{1,n}中没有n的真因子,因此,n是素数.检验条件(n-1)!+1≡(modn)的计算量是O(nlog22n).因此,威尔逊的算法的计算量是O(nlog22n+2log22n)=O(nlog2n).下面知道,这个算法的计算量太大了,不是有效算法.
  到目前为止,仍然没有一个素性判别的多项式算法,换言之,没有一个素性判别的算法,它对n执行时的计算量是O(P(log2n)),其中P(x)是多项式函数.“是否存在素性判别的多项式算法?”是一个没有解决的公开问题.人们偏向于说存在素性判别的多项式算法,但至今没有找到.在已有的判别算法中,或者f(n)不是log2n的多项式,或者g(n)不是log2n的多项式.因而要得到一个素性判别的多项式算法,就需要设法使上述的f(n)和g(n)都是log2n的多项式
2.费马小定理和卡米歇尔数
  试除法出现之后,一直到16世纪,其间除了一些很特殊的、很局限的素性判别法外,没有什么重要的结果.但到1640年,法国数学家费马首先注意到素数的一个性质,那就是下面讲叙的费马小定理.这个性质是以后的所有素性判别法产生的根源.
定理2.2 (费马小定理) 若n是素数,则对所有不被n整除的a,有an-1≡1(modn).
  证明 因为(a,n)=1,则a,2a,…,(n-1)a分别按某个重排顺序模n同余于1,2,…,n-1.故有an-1·(n-1)!≡(n-1)!(modn).因为n是素数,因此n与(n-1)!互素,因此,an-1≡1(modn). □
  我们将费马小定理的另一个形式写成下面的推论.
  推论 若n是素数,则对任意的整数有an≡a(modn).
  由第一章第二节的讨论,我们知道,对某个自然数a,1≤a<n,要验证(a,n)=1和an-1≡1(modn)是否成立,需要计算量为O(log23n).因此,以对某些a,1≤a<n,(a,n)=1验证an-1≡1(modn)作为试验组,将可能产生较好的素数判别法.为此,我们要来看n通过试验组的话,n具备什么性质.这就要考察一下费马小定理的逆命题.
  大约2500年前,中国古代数学家就发现22-2是2的倍数,23-2是3的倍数,25-2是5的倍数,27-2是7的倍数,211-2是11的倍数,而2,3,5,7,11都是素数.故他们由此肯定:“若
  2n-2是n的倍数(即2n≡2(modn)),则n是素数”.莱布尼兹研究了《易经》中的这一记载之后,也相信了这个结果.假如这个结果是正确的,则对任给的自然数n>1,只要验证2n≡2(modn)是否成立,即可判定n是否素数,其计算量是O(log23n).这就有了素性判别的多项式算法.然而,很不幸运,这个结果不是正确的.1819年,法国数学家赛路斯指出,2341≡2(mod 341),但是341= 11×31是个合数.自此以后,人们发现了许多具有不同底值a的反例,如391≡3(mod 91)但91=7×13,415≡4(mod 15)但15=3×5等等.事实上,对于任意的a,都有这样的反例,而且有无限多个.我们将证明这一点,在此之前,先给出一个定义.
  定义 对整数a>1,满足an≡a(modn)的合数n称为底为a的伪素数.
  定理2.3 对每一个整数a>1,有无限多个底为a的伪素数.   
底为a的伪素数.我们有(a2-1)(n-1)=a2p-a2=a·(ap-1-1)(ap+a).由于ap与a的奇偶性相同,故2|ap+a;又由费马小定理和pa得p|ap-1-1;由于p是奇数,则a2-1整除ap-1-1;而pa2-1,故有p(a2-1)|ap-1-1.因此,2p(a2-1)|(a2-1)(n-1)即2p|n-1.令n=1 +2pm。现在有a2p=n·(a2-1)+1≡1(modn).故an-1=a2pm≡1m=1(modn).即an≡a(modn),因此n是底为a的伪素数.由于对每个a>1,满足p多个.因此,以a为底的伪素数有无限多个.
  虽然底为2的伪素数有无限多个,但是,它们相对于素数而言是相当少的,隆德大学的波赫曼证明了小于1010×2的素数有882206716个,而塞尔弗来季和瓦格斯塔夫计算出底为2的伪素数在1到2×1010之间只有19865个.因此,在大多数情况下,我们的断言“如果2n≡2(modn),则n是素数.”是正确的,用这个断言作素性判别,出错的概率很小,例如在n<2×1010的范围内,出错的概率小于19865/(882206716 +19865)≈0.0000025.不过,这样的结果,在实际用来作素性判别时,用处不大,尽管它出错的概率很小,但它毕竟是会出错的.而且,对于特定的一个n,用上面的断言去判别它的素性,就不能排除错误就在此出现.(对于其它底a,可以作同样讨论.)
  令人惊奇的是,存在这样的合数n,对任意的满足(a,n)=1的a>1,n都是底为a的伪素数.这样的合数的存在是费马小定理的逆命题不成立的最合适的例证.因为它说明,即使对所有满足(a,n)=1的a有an-1≡1(modn),仍不能断定n是素数.这样的合数是由卡米歇尔首先发现的,故叫卡米歇尔数.
  例 561是卡米歇尔数.这是卡米歇尔发现的第一个卡米歇尔数,也是最小的卡米歇尔数.
       因为561=3×11×17,若gcd(a,561)=1,
      则gcd(a,3)=gcd(a,11)=gcd(a,17)=1,
      由费马小定理知,a2≡1(mod3),a10≡1(mod11),a16≡1(mod17).
      由于Lcm(2,10,16)=80,
      故a80≡1(mod3),a80≡1(mod11),a80≡1(mod17),
      即得a80≡1(mod561),故a500≡(a80)7≡17=1(mod561).
      所以561是卡米歇尔数.

  一般地,我们有下面的定理.

  定理2.4 (卡米歇尔)n是卡米歇尔数的充分必要条件是:i)n无平方因子;ii)n的每一个素因子p有p-1|n-1;iii)n是奇数且至少有三个不同的素因子.
  证明 先证明充分性.设n满足条件i),
  ii),
       iii),令n=p1p2…pk(k≥3),p1,p2,…,pk是互不相同的奇素数.
      现对任意的a>1,若(a,n)=1,则(a,pi)=1,
      由费马小定理得api-1≡1(mod pi),i=1,2,…,k,而由条件ii),
      有Lcm(p1-1,p2-1,…,pk-1)|n-1,故得an-1≡1(modpi)(i=1,2,…,k),
      因而an-1≡1(modn).
      故n是卡米歇尔数. 
 
      i=1,…,k.先证明n是奇数.
      若n是偶数且含有一个奇素因子p.
      这时,取a是p的奇原根,
      由an-1≡1(modn)得an-1≡1(modp).
      因此,p-1|n-1,但p-1为偶数而n-1为奇数,这是不可能的.
      又若n=2t,t>1,取a=3,则(3,n)=1.1(mod2t).
        否则,,则,
      但假设不符.故n必是奇数,
       因而pi是奇素数,i=1,…,k.令gi是模piui的原根,i=1,…,k.

      由中国剩余定理,可求 得a使a≡gi(modpiui)(i=1,…,k).故gcd(a,n)=1.
      因为n是卡米歇尔数,则an-1≡1(modn),即有,an-1≡1(modpiui),另一方面an-1≡gin-1(mod piui),故有gin-1≡1(modpiui).由原根的定义得φ(piui)|n-1,即是piui-1(pi-1)|n-1,i=1,…,k.而n-1=plu1…pkuk-1,故ui=1,i=1,…,k,因此,条件i)证得.又pi-1|n-1,i=1,…,k,即条件ii)证得.对iii),若k<3,由n是合数,则k=2,则有n=p1·p2(p1≠p2),由于p1-1|p1p2-1,而p1p2-1=(p1-1)p2+p2-1,故得p1-1|p2-1,同理可得,p2-1|p1-1,由此可得p1-1=p2-1,即p1=p2,这与假设不符,因而k≥3,即iii)证得. □
  例 由定理2.4可得2821=7·13·31,10585=5·29·73,27845=5·17·29·23,172081=7·13·31·61都是卡米歇尔数.
  由于发现了卡米歇尔数,人们认识到利用费马小定理来作素性判别,不是件简单的事情.假如卡米歇尔数只有有限个,则可以给出一个上界M,这样,在n>M的范围内对n作素性判别就变得容易起来.然而,卡米歇尔数可能有无限多个,这只是一个猜想,至今无人给出证明,但人们大都认为这个结果是正确的.
3.素性判别与广义黎曼猜想
  1976年,缪内发现了素性判别与广义黎曼猜想(见附录)的一个深刻的关系.他得到的结果是:如果广义黎曼猜想(REH)成立,则有一个算法存在,它对每个n,可在log2n的多项式时间内判明n是否素数.即存在素性判别的多项式算法,而且可设计出这个算法.
  这个关系的发现,也是以研究费马小定理为出发点的.下面熟知的欧拉的结果是费马小定理的推广.
  定理2.11 若n是一个奇素数,则对任意的自然数a,na有
  1976年初,勒默发表了一篇短小精悍的文章,证明了定理1的逆定理也成立,他得到了.
  定理2.12 (勒默) 若n是奇合数,则存在自然数a,满足(a,
  证明 若n含有因子pα,p是奇素数,α>1.取a为pα的原根,   
  若n=p1p2…Pt,t≥2,P1,P2,…,Pt为互不相同的奇素数.由     
即2≡0(modp2),但p2是奇素数.这是不可能的.故必有a使(a,

  尽管勒默的这个结果说明了,若n是合数,则在1到n之间到少存
也没有指明a在何处.对某个数n,当然,我们可以对1到n之间的每 
  这个计算量太大了.因此,我们希望能够改进勒默的这个结果.如果对 
    时只要对较少的a检验.这样就可望得出较有效的素性判别法.
  缪内注意到,给定一个数n,在n的缩系组成的群Un={a(modn)
    全体构成一个子群,设其为Mn.于是就可以利用下面的安克尼和蒙特哥梅利的结果.
  定理2.13 (安—蒙)在广义黎曼猜想(REH)成立的条件下.存在一个常数C,对任何自然数n及Un到任何一个群G的非单位同态ψ,都存在q使1<q≤C(log2n)2且ψ(qmodn)≠1(其中1是G的单位元).
  由此,缪内得到了下面的结果:
  定理2.14 (缪内)在广义黎曼猜想的成立之前提下,存在一个常数C,对任何的自然数n,若n是合数,则存在1≤a≤C(logn)2

  
Un到Un的同态映射.因为n是合数,由定理2.12知,ψ不是单位同态映射.因此,由定理2.13,存在a使1<a≤C(log2n)2使ψ(amodn)

  
  注 定理2.14中的常数C可取作与定理2.13中的C相同.

  维路于1978年指出,定理2.14中的常数C可以定为70.
  由定理2.14,我们说,在广义黎曼猜想成立的前提下,素数判别的多项式算法是存在的.我们可以如下设计出这样一个算法:  

(modn)是否成立.若对其中的一个a成立,则停止检验,这时n是合数(由定理2.11),若对每一个a都不成立,也就是说,对a=1,2,…,
  上述算法可以完全确定地判别n是否素数, 其计算量就是作70

 

即工作量是O(log25),因而这是一个多项式算法.
  由此可见,只要广义黎曼猜想成立,则素性判别的多项式算法是找到了的.但证明广义黎曼猜想是相当困难的,这是数学家们一直关注的问题.这里的讨论也表明,素性判别是需要用较高深的方法来研究.

 
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值