6.一种概率算法
缪内的结果虽然很好,但它毕竟是依赖于一个悬而未决的假设.因而在实用中,它是不能被采用的.故我们回到勒默的结果,看看从这个结果还能引伸出什么方法来.
勒默的结果说,若n是合数,则存在a,满足(a,n)=1使样的a至少有多少.
n是合数时,由勒默的结果定理2.12,Mn是Un的真子群,即Mn≠Un,因而Mn在Un中的指标至少是2,即(Un∶Mn)≥2.故Mn中的元素个数至多是Un中元素个数的一半,即Un中不在Mn中的元素个数至少
(modn).
证明 对1到n之间的数a,若(a,n)≠1,则显然a不满足
这个推论可以产生一种作“素性判别”的概率算法:
对任何输入n,从1到n之间随机地抽取k个数a1,a2,…,ak
是否成立,若有某个ai使此同余式不成立,则断言n是合数;若对a1,…,ak,同余式都成立,则断言n是素数.
在这个算法中,ai的选取是随机的,而且结论(断言)正确性不是完全确定的,故此算法叫概率算法.在这个概率算法中,当得到断言说输入n是合数时,由定理2.11,结论是正确的;当得到断言说输入是素数时,没有什么定理可以确保结论是正确的.也就是说,此算法在执行完毕后,可能将一个事实上是合数的输入断言为是素数了.但是,由以上定理2.15的推论,这种出错的概率是很小的.因为,若n事实上是合
乎为零(但不是零!),因此用此算法作素数判别21000次,仅可能出现一次错误(从统计的角度来说).然而,对某个特定的n,通过算法后被断言为素数,我们并不能确定这个断言一定不是错误的.因为以上的原因,这个算法常被称为“合数判别”算法而不称为素数判别算法.但是,因为这个算法的计算量很小,只有O(klog23n),故它确实常被采用.例如用它来寻找一组数,使其中绝大多数是素数.最近,还有人(如赖宾)用它来支持一些孪生素数和素数分布的猜想.
7.目前最有效的艾德利曼经—鲁梅利算法 1983年,素数判别的研究里,出现了突破性的进展,那就是艾德利曼和鲁梅尼提出来了一个方法.这个方法是一个近似多项式算法,它在实际应用中,对一千位以下的数而言,与多项式算法一样有效.
要系统地讲述这个算法,需要涉及到代数数论、乘法数论及多项式理论等多方面的专门知识.因而,我们这里只是概要地介绍这个算法,很多证明就略去了.但我们尽量保证读者能从介绍中对算法的基本思想、方法和技巧有个大概了解.我们将介绍的不是艾德利曼—鲁梅利原来的形式,而是由勒恩斯爵简化了的形式.
设p,q是两个素数,p|q-1,记ξp和ξq分别为p次和q次本原单位根.设gq是q的原根,即g是群Ug的生成元.定义映射Xpq:Uq→〈ξp〉(其中〈ξp〉为由ξp生成的循环群)为Xpq(gqj)=ξpj.因为p|q-1且Uq是q-1元循环群.则Xpq是同态映射.对于任给的整
ξpiξqi|aij∈Z}是一个环)
由高斯和的性质,有:若n是素数,则τ(Xpq)np-1-1≡Xpq(n)(modn)(注意:因为τ(Xpq)是Rpq中的元素,因而,我们是在环Rpq中讨论同余式的).易知,p=2时,这就是费马小定理,因此,上述的素数的这个性质,事实上就是费马小定理在环Rpq中的推广.我们来看看,当一个数n,对一些p,q,p|q-1满足τ(Xpq)np-1≡Xpq(n)(modn)时,能对n作出什么结论.勒恩斯爵对此给予了一个回答,他证明了下面的定理.
个集合满足,对任意的一个素数q∈Q有q-1|Z.若奇数n满足下列条件:
(i)对每个p∈P, q∈Q,若p|q-1,则τ(Xpq)np-1-1≡Xpq(n)(modn).
(ii)对每个p∈P和n的素因子r有pep|rp-1-1,其中pep||np-1-1.
则每个n的素因子r,有r≡ni(modw),其中i有0≤i<Z.w=
注 定理2.16中的条件(ii)看起来似乎难以验证,而事实下,可以证明,若对某个p,存在q(q不必在Q中)使p|q-1且Xpq(n)≠1,τ(Xpq)np-1-1≡Xpq(n)(modn),则条件(ii)就对p及任何n的素因子r成立.在实际应用时,对某个p要使Xpq(n)≠1对某个素数q(p|q-1)成立是很容易做得到的.
由勒恩斯爵的结果,我们可以如下编出一个算法,这个算法是基于艾德利曼—鲁梅利的思想,采用了勒恩斯爵的表述.
对任何输入n,n是奇数.第一步,寻找素数集合P,使得由其产
(Ⅰ)对每个p∈P,q∈Q使p|q-1,验证(即定理2.16中的条件(i)
(Ⅱ)对每个p∈P,寻找一个q(不必属于Q)使p|q-1且Xpq(n)≠1.(这是为了让定理2.16中的条件(ii )成立.)
如果(Ⅰ)对某对 p∈P,q∈Q(p|q-1)不成立或(Ⅱ)对某个p∈P不存在q使p|q-1,Xpq(n)≠1,,则n是合数.否则,即(Ⅰ),(Ⅱ)都通过了,由定理2.16知,n的任何一个素因子r满足r≡ni(modw),其中
对r=nimodw,i=1,2,…,Z-1,逐个检验r是否整除n.若
在上述算法中,第二步的计算量,可用高斯和的性质(它所满足的最小多项式)估计出来,它是log2n的多项式.第一步和第三步可以在O〔(log2n)C·log2log2log2n〕的计算量内完成,这个由下面的波门伦斯的结果得出.
满足. (log2n)C1log2log2log2n<Z<(log2n)C2·log2log2log2n
在第三步中,至多要验证Z个整除式,每个整除式的计算量是O(log23n),因而,完成第三步至多需要O〔(log2n)Clog2log2log2n〕的计算量.
总之,用上述算法验证一个数n是否素数,几乎只需要多项式时间.因为当n的位数不太大时(例如少于1000位),C(log2log2log2n)是很小的,故其计算量还不及一个多项式算法多.
8.一些特殊的素数及其判别
麦森勒素数
所谓麦森勒数是指形如2p-1(p是素数)的数,记为Mp,M2=3,M3=7,M5=31,M7=127等,麦森勒素数即是麦森勒数又是素数者.
早在1644年,麦森勒就对p=2,3,5,7,11,13,17,19计算了Mp,他证明了除p=11外,其它的Mp是素数,他由此断言,不大于257的各素数,只有p=2,3,5,7,13,17,19,31,67,127,257使Mp是素数.当时没有谁(包括他本人)证明了这个断言.直到1772年,欧拉经过多年探索,证明了是231-1=M31是素数,大约在1875年,努卡斯证明了2127-1是素数,但是证明了M67不是素数.因此,麦森勒的断言就不全对了.1886年,有人证明了261-1是素数,因而,人们怀疑麦森勒在抄写时,将61误抄成了67.然而,1911年,泡尔斯证明了289-1也是素数,三年后,又证明了2107-1也是素数.最后,1922年,葛莱启克证明了2257-1不是素数.这样就彻底说明了麦森勒的断言是不对的.但麦森勒的断言激发了人们对麦森勒素数的研究.到目前为止,已经得到的前29个麦森勒素数Mp是:p=2,3,5,7,13,17,19,31,61,89,107,127,521,607,1279,2203,2281,3217,4253,4423,9689,9941,11213,19937,21701, 23209,44497,86243, 132049.
M132049是一个39751位的素数,是目前已知的最大的素数.要对诸如M132049这么大的数判别其是否素数,肯定要用到数的特殊形式,用特殊的方法(艾德利曼—鲁梅利方法也无济于事了).另外,从上面看出,那些使Mp为素数的素数p的分布是不规则的.因而有必要对麦森勒数研究其特殊的素性判别方法.有一种目前最有效的、专门用于麦森勒数的素性检验方法是下述的努卡斯—勒默方法.
定理2.18 设p是一个奇素数,定义序列{Ln}如下:
L0=4,Ln+1=(Ln2-2)mod2p-1则Mp=2p-1是素数的充分必要条件是Lp-2=0.
证明定理2.18之前,需要罗列一下努卡斯序列
U0=0,U1=1,Un+1=4Un-Un-1
V0=2,V1=4,Vn+1=4Vn-Vn-1 的一些性质:
(i)Vn=Un+1-Un-1
(iv)Um+n=UmUn+1-Um-1Un
(v)U2n=UnVn,V2n=Vn2-2
(vi)若Un≡0(modpe),则Unp≡0(modpe+1)(p是任何一个素数)
(viii)对任一个整数m,定义m对{Un}的幻秩为使Un≡0(modm)成立的正整数n中的最小者.记为ρ(m),则有
Un≡0(modm)的充分必要条件是ρ(m)|n.
以上这些性质都可由努卡斯序列的定义用归纳法得到[1].
现在我们来证明定理2.18.
由{Ln}的定义及(v)易知:Ln≡V2n(mod2p-1).又由2Un+1=4Un+Vn及gcd(Un+1,Un)=1得gcd(Un,Vn)|2.进而知,Un和Vn无公共的奇因子.如果Lp-2=0,我们必有
U2p-1=U2p-2V2p-2≡0(mod2p-1)
又,如果ρ=ρ(2p-1)是2p-1对{Un}的幻秩,则ρ|2p-1
设n=P1e1…prer是n的标准分解式,则Pi>3[因为n=2p-1≡(-1)p-1≡-2(mod3)]i=1,…,γ,令t=Lcm[p1e1-1(pε-ε1),…,
所述有:
因此r≤2且t=ρ或2ρ,故t是2的幂数.因此诸ei=1,这时,若r=2,则n=2p-1=(2k±1)(2i±1),其中2k±1和2i±1是素数,这是不可能的.因而只有r=1,即n是素数.
反过来,若n=2p-1是素数,由Ln=V2nmod2p-1,直接验证,即知L2p-20.
到目前为止,人们得到的最大的素数M132049就是用这个努卡斯—勒默方法得到的,这是1983年9月由斯诺文斯基在大量计算后得到的.
近期,威廉斯对努卡斯—勒默的方法作了推广,他得到一些用于对诸如10n±10m+1,an-1/a-1等形式的数作素性判别的方法.
费马素数
形如22n+1的数称为费马数,记为Fn,若它又是素数,则称为费马素数.
早在17世纪,费马验证了F0=3,F1=5,F2=17,F3=257,F4=65537是素数.据此,他猜测Fn都是素数.但到1732年,欧拉分解了F5:
故费马的这个猜测不成立.自此之后,人们对n=6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,23,25,26,27,29,30,32,36,38,39,42,52,55,58,62,63,66,71,73,75,77,81,91,93,99,117,125,144,147,150,201,205,207,215,226,228,250,255,267,268,275,284,287,298,316,329,334,398,416,452,544,556,637,692,744,931,1551,1945,2023,2089,2456,3310,4724,6537,6835,9428,9448,23471证明了Fn是合数.然而,除前5个费马数为素数外, 再也没发现任何费马素数了.因而人们更倾向于认为费马素数只有有限个,但没人对此作出证明.近年来,人们把精力放在分解费马数上,没人研究特殊的判别法来对费马数作素性判别.
k·2n+1型素数
研究k·2m+1型素数,对分解费马数有着重要作用.熟知,费马数Fn的每个素因子都具有形状k·2m+1,其中m≥n+2,k是奇数.当已知某些k·2m+1是素数时,用它去试除Fn(n≤m-2),这样就可以找到一些费马数的因子.另外,在验证了某个k·2m+1是素数后,再对k·2m-1作素性判别,则可能找出一对孪生素数来,在这个方面的研究是从普罗丝开始的,他首先提出了一个判别k.2m+1(k<2m)型数是否素数的方法.
定理2.19 给定N=k·2m+1,k<2m,先寻找一个整数D
出一个合适的D),则N是素数的充分必要条件是D(N-1)/2≡-1(modN).
用普罗丝的这个结果及一些具体的方法,贝利、鲁宾逊、威廉斯等人对一些奇数k和m决定的数k·2m+1作了系统的考察,他们对1≤k≤150,1≤m≤1500,找出了所有k·2m+1型的素数.又对3≤k≤29和1500<m≤4000,列出了所有的k·2m+1型的素数,得出了7个新的费马数的因子,而且还得到了一对很大的孪生素数:297.2546+1和297·2546-1.(目前发现的最大的孪生素数是156·5202±1)
最后,介绍斯塔克的一个结果.若m固定,序列{ak}={k·2m+1}含有无限多个素数,这是由狄利克雷定理得出的.自然地,人们提出这样一个问题:当k固定时,序列{bm}={k·2m+1}是否含有无限多个素数呢?斯塔克对这个问题给了否定的回答,他给了一个k=2935363331541925531,它使序列{k·2m+1=bm}中每一项都是合数.
由1组成的素数
每位数都是1的n位数记为Rn,例如R1=1,R2=11,R7=1111111等等.熟知R2=11是素数.
因为当m|n时,Rm|Rn,故Rn是素数的必要条件是n是素数.然而,n是素数时,Rn不一定是素数,例如n=3时,R3=111=3×37不是素数.至今为止,只有得出当n=2,19,23,317,1031时,Rn是素数.其中R19已由前面的“n±1”判别法证明了,R23是1929年被证明为素数的.R317是1979年由威廉斯证明的,R1031是1986年由威廉斯和达内用第四节介绍的方法证明为素数的.这五个素数是Rn系统中的前五个素数,即其它不大于1031的素数n都使Rn为合数.事实上,达内还证明了,第六个R_素数必定大于R10000,也就是说,在1到R10000之间只有以上五个R_素数.
相关资源
9.在计算机上实施素数判别的战略
迄今为止,所有得到的素性判别法有简单明了的试除法,有赖宾等人的概率算法,有努卡斯到威廉斯的利用n±1,n2+1,n2±n+1的因子方法,还有艾德利曼—鲁梅利的最有效的近似多项式方法.这些方法各有利弊,它们各适用于适当的输入.上述第一种算法虽然很耗费
接了当,对较小的数n(最大不超过108)合适.第二种算法,用于作素性判别时,它可能出现差错,但出差错的可能性很小,因而可用它来确认哪些数最有可能是素数.努卡斯和威廉斯的n±1,n2+1,n2±n+1方法,对于20—50位的素数是有效的工具.艾德利曼—鲁梅利的方法是普遍的方法,它不依赖于待判别的数的特殊性,而且计算量是O((log2n)Clog2log2log2n),故一般利用它来对50位以上的数来作素性判别.我们摘抄波门伦斯的一个表,它表明了三种方法的优劣.
另外,对有些特殊的数作素数判别时,用特殊的方法(如对2P-1,用勒默的方法)就可能很便利,就不必用艾德利曼—鲁梅利的方法.下面,我们指出在计算机上作素性判别的三大步骤.
对于一个待判定的数n(设n不具有我们了解的特殊形式),实行下面三步:
(1)先用1到1000之间的素数(它们通常储存在计算机内)去试除.若n恰好有小的素因子,则不是素数,算法可停止;否则,进行下一步。
出结论说n是素数.下面的步骤就是证明n确为素数.
(3)若n具有20—50位以下,可使用努卡斯和威廉斯的方法.
若n具有30—1000位或以上,即使用艾德利曼和鲁梅利的方法.
注 对30—50位的数,用努卡斯和威廉斯的方法,还是用艾德利曼—鲁梅利的方法,要视计算机的性能和实际情况而定.
三 大数分解
大数分解是与素性判别紧密相关的课题.对于给定的一个自然数,先对它作素性判别.若它是素数则罢,若它是合数,我们还想知道它的因子分解式.历史上及现在都有这样的数,它被判别为合数,但是没有发现它的因子(即没有分解).例如,F8在1909年就被证明为合数,但直到1975年,才发现它的一个因子.又如,F14早在1963年就被证明为合数,但至今它的因子还不知是什么.因此,我们要系统地研究如何去分解一个已知是合数的数.下面,我们假定下面待分解的数是合数.为了方便起见,还假定,对待分解的数已经用试除法排除了它在1到10000(或105)范围内的因子.(这在计算机上是非常容易实行的事,因为1到105之间的素数和试除法都可以存储在计算机内.)
与素性判别法的产生一样,大数分解的方法的产生也是从注意合数的一些性质开始的.因而,我们要对合数的一些性质(特别是结构方面的性质)作考察和研究,由此引伸分解的方法。
1.经典的方法
费马方法
费马注意到,给定n,若n是两数平方差n=a2-b2,则n=(a +b)(a-b)是n的一个因子分解.于是,我们要设法将n表为两个平方差.用逐个考察方法,从b=1开始,依次考察n+b2是否平方数,若恰对某个b,有n+b2是平方数,设为a2,即n+b2=a2,故n=(a+b)(a-b).
用这个方法,只有当n有两个几乎相等的因子时,才比较快.因为
就很小,即从1开始作逐个试验的次数就少.另外,我们可以不须对所有的b来计算n+b2并考察它是否平方数.我们注意到,若n+b2是平
几乎相等(相对于n而言,相差log2n的常数倍数即算作几乎相等)时,用费马方法去分解n是很有效的.
例 分解385374826089807.
7,9,11,17,19,21,23,27,29,31,33,37,41,43,47,49,51,53,57,……,试验n+b2是否为平方数,结果发现n+572=196309662,故n=19630909×19631023.
一种筛法
对于给定的n,若已知n的一些较小的平方剩余,则就可以筛去一些n的不可能的因子,因而缩小了n的可能因子的范围,再进一步对它们进行试除.譬如,若a是n的一个二次剩余,则对每个n的奇素因子P,
即可.用这个方法,可以得到下面的一个有用的定理(前面第二章第八节中谈费马素数时曾提到这个定理).
定理3.1
2n+2·k+1.
证明 设p|Fn,则+1≡0(modp)即≡1(modp).故2对模p的次数为2n+1,因而,2n+1|P-1.故P=1+2n+1·k对某个k成立.当n≥2时,P≡1(mod8),因此2是P的二次剩余,
p=2n+2·k+1.□
当n的较小的二次剩余容易找到时(例如2,3,5等是n的二次剩余时),可用筛法去分解n,我们举一简单的例子,说明这个方法的用途.
例 分解1711.
因为162·7-92=1711,372·5-1=4·1711,故7和5都是
因此P≡±1,±9,±25(mod28),P≡±(mod5).因为满足这两组同余式的前几个数是1,9,19,29,…,经对它们依次试除1711知29|1711,故1711=29·59.
勒让德方法
勒让德首先注意到,若一个奇数n是合数且至少有两个不同的素因子,则x2≡a2(modn)至少有四个解.其中x≡±a(modn)是两个解,这两个解称为平凡解,另外的解就称为非平凡解.若对同余式x2≡a2(modn),能找到一个非平凡解b,则gcd(b+a,n)或gcd(b-a,n)都是n的真因子.因而,分解n就等价于要寻找形如x2≡a2(modn)的同余式的非平凡解.这便是以下的连分数方法和二次筛法所要解决的问题.
2.蒙特卡罗方法
设S是一个有限集,令Map(S)是S到S的映射全体.对于每一个ψ∈MaP(S)和X0∈S,由于S是有限集,则存在1≥1使X0=ψ0(X0),ψ(x0),…,ψ1-1(x0)(ψi表示ψ的i次的复合)互不相同.但ψ1(x0)与某个ψe(x0)(0≤1'≤1-1)相同,这时,称1为X0在ψ下的轨迹长度.当k≥1'时,序列{ψk(x0)}是一个周期为d=1-1'的循环序列.
设S有m个元素.x0∈S,则x0在ψ下的轨迹长度至少是1的充分必要条件是x0,ψ(x0),…,ψ1-1(x0)互不相同.因此,Map
在Map(S)中,使得x0在其下的轨迹长至少是(2λm)1/2+1的映射占的比例小于e-λ.故,只有很少的对(x0,ψ)使得x0在ψ下的轨迹长很大(譬如大于5m1/2的对只占e-12.5≈0.0000034),我们称使得x0在ψ下的轨迹长很大(譬如大于5m1/2)的对(x0,ψ)叫“例外”.
波纳德就是用上述的事实得到他的分解方法的.假定n是合数,设r是n的一个因子,令S=Zr为模r的完全剩余系,设x0是一个整数,ψ是一个整系数多项式,若(x0,ψ)不是个“例外”,则x0在ψ下的轨迹长不大于r1/2的一个较小的倍数(譬如5倍)。不过,我们还不知道r,故不能计算Xk=ψk(x0modr),但是,我们可以计算序列{yk}:y1=ψ(x0)modn,yk=ψ(yk-1)modn,k≥1.序列{yk}满足yk≡xk(modr),k=0,1,2,….
时,{Xk}是一个周期序列,其周期1≤cr1/2(c比较小),因而,令Gk
|gcd(Gk,n),即gcd(Gk,n)是一个n的大于1的因子.若幸运的话,gcd(Gk,n)就是n的一个真因子,即n被分解了.若对某个k,gcd(Gk,n)=n,则取另外的k试验;若万一对所有的k都有gcd(Gk,n)=n,则从新开始选择X0,ψ0,重复这样的过程,直到n被分出一个真因子为止.
以上,我们只知道有些k<cr1/2使gcd(Gk,n)可能产生n的真因子,但我们不知道哪些k.不过,我们知道,若Gk≡0(modr),则Gk+1≡0(modr),因而,从某个k=k0开始,之后的k都有gcd(Gk,n)>1,因此在寻找因子时,不必依次对k=1,2,3,…来试验gcd(Gk,n),而只需要有规则地取一些k,(如取k=1,2,4,8,16,32,64,128,…或k=1,5,20,50,100,200,400,….)来看gcd(Gk,n)是否产生n的真因子.
上面的{Gk}是波纳德原先用来寻找n的因子时作出的序列,后来布勒恩特改进了波纳德原先的积式,他用
取代Gk,从而使这种方法的效率提高了25%,即计算时间缩短了25%.
虽然上面已经说明,很少有对(x0,ψ)使x0在ψ下的轨迹长很大,但是,对于特定ψ,有可能对几乎所有的x0,都使(x0,ψ)成为“例外”,可以证明,当S=Zr时,ψ为一次线性多项式和ψ(x)=x2-2时,对所有的x0∈Zr都产生很多的“例外”来.另外,一方面,我们不能取ψ为很高次的多项式,否则,计算{yk}时,就要花费很大的计算量.经验表明,我们可以把ψ(x)取成二次多项式x2+a(其中a≠2,a∈Z),事实上,在实际中,我们总是用这个多项式.
波纳德算法的最大成功是分解了78位的第8个费马数F8=228+1,它在1909年就证明为合数.他得到了下列分解式
F8=1238926361552897×9346163971535797776916
-3558199606896584051237541638188580280321
此外,用波纳德的方法还得到下列数的因子:
612053256358933|10103+1
150220315444217|592+1
9906434529663163|771-1
441651480271681|10137+1
22086765417396827057|2433-1
122551752733003055543|2439-1
358228856441770927|2461-1
73208283304744901303|2587-1
3.连分数法
我们知道,利用勒让德方法的一个大困难就是寻找形如x2≡a2(modn)的同余式的非平凡解.如果我们可以找到一系列二次剩余:a12≡c1(modn),…,a2k≡ck(modn),而且恰巧c1…ck是一个完全平方数.设a=a1…ak,b2=c1…ck,则有a2≡b2(modn),若a±b(modn),则就找到了同余式x2≡a2(modn)的一个非平凡解.但这里又出现两个困难:其一,怎么产生这么多的二次剩余呢?其二,哪些二次剩余之积恰好是个平方数?
到1931年,勒默和泡尔斯首次用连分数解决了这两个困难,但是,因为当时还没有电子计算机,计算速度的缓慢使得这个连分数方法不被人们注意,直到1975年,莫利桑和卜利尔哈特,对勒默的方法作了深入的研究,将其发展成为一个较系统的好算法,并用此方法,在计算机上成功地分解了屡功不克的1=2128+1,从此以后,连分数法就被人们广泛应用于分解因子.到目前为止,它被认为是最有力的分解工具之一.用它可以方便地在计算机上分解50位左右的数.下面,我们对此方法作一介绍.
Qm,其中Qm可由一个可以简单计算的递归关系得出.因为对每个m, 剩余(modn),所以,这样就解决了第一个问题.
现在来讨论第二个问题的解决方法.从上列模n的二次剩余{(-1)m+1Qm+1}中,哪些二次剩余可以选出来成为一个集合使得其元素之积正好是一个完全平方数,从而得到形如x2≡a2(modn)的一个非平凡解.我们先看一个例子.
例 分解n=12007001.
这时将第0,11,27,33,40个同余式
另一方面,用连分数的渐进分数的递推公式,可以计算出A0,A11,A27,A33,A40,从而可以算出A0A11A27A33A40≡9815310(modn),因而,由勒让德的方法可求出n的因子:(9815310-29·31·71·97,12007001)=3001,即3001|12007001。
从上例可见,要确定哪些(-1)m+1Qm+1入选,先要将(-1)m+1Qm+1在某个确定的素因子(包括-1)集上分解,再将这些分解了的(-1)m+1Qm+1拼凑。这里,在某个集上分解是指在这个集中的因子全部分解出来。我们称上面那个确定的素因子(包括-1)集为分解基集。因为,若p|(-1)m+1Qm+1,则Am2-knBm2≡(-1)m+1Qm+1
的分解仍然是件麻烦的事情。因而,分解基集中的素数不宜取得太大太多。通常,按需要,指定一个素数pm,使得分解基集中的素数小于pm。有时,为了加快算法执行的速度或为了更有可能找到合适的一组二次剩
取定一个分解基集,若一个(-1)m+1Qm+1的素因子全在这个分解基集中,则称它在这个分解基集上可完全分解,也称它为(对这个基集的)B_数。设分解基集的元素是p0=-1和一系列素数p1,p2,…,ph,这时,每一个B_数可以表示为一个二元数组(即Z2h+1中的元)。若(-1)m+1Qm+1=p0u0p1u1…phuh,则表(-1)m+1Qm+1为(e(u0)
B_数之积的表示就是两个B_数的表示之和。若干个B_数之积为平方数等价于说它们对应的表示之和为(0,0,…,0)若有g个(在实际应用中,通常取g=h+2)B_数,设为c1,…cg,则可产生一个二元数组成的矩阵,这个矩阵的第i行为ci的二元数组表示,因而,这个矩阵有g行,h +1列。当g>h+1时,其行向量(诸ci的表示!)就必然对Z2线性相关。因此,有若干个行使其行向量之和为(0,0,…,0)(注意到Z2中唯一不为零的元只有1)这样一来,这若干个行对应的B_数之积就是一个完全平方数.因而,第二个问题就得以解决了.
在连分数算法中,计算量主要是在分解诸(-1)m+1Qm+1上.计算机往往在不太可能在基集上分解的(-1)m+1Qm+1上耗费很多运算.波门伦斯对此问题作了研究后,他找出了一个方法,用此方法可以排除那些不太可能在基集上分解的(-1)m+1Qm+1.他的方法更进一步提高了连分数法的速度.
有时,在给定的基集上,很多(-1)m+1Qm+1不太可能被分解以致于能分解的(-1)m+1Qm+1不够用,波门伦斯的方法可以让计算机尽早回头扩充基集.
有时会发生这样的情况:尽管我们由一组B_数乘起来得到了一个完全平方数,但它却导出二次同余式的一个平凡解.这时,我们可以找另外一组B_数来试验,若仍然屡次失败,则可以换或扩充分解基集以得到更多的、更合适的B_数,或换另外的k值再重复试验,直至成功。
莫利桑用连分数得到的F7分解式是
F7=5964958812749721·5704689200685129054721
最后提一下,波门伦斯对连分数方法作了一个分析,他证明了,连
较高深的算法分析中得到的,这里不多介绍。
4.二次筛法
二次筛法与连分数法是基于同样的想法和思路,只有两个差别,下面对此讲述。
首先,二次筛法不是用连分数产生二次剩余。而是直接产生二次剩 就是一系列模n的二次剩余,并且诸Q(x)modn不太大。
第二,给定一个分解基集,如何判别哪些Q(x)可以在这个分解基集上分解?哪些不能?这里的方法也有别于连分数方法。
我们注意到,若Q(x)≡0(modpα),即pα|Q(x),则Q(x+kpα)=(x+kpα+m)2-n≡Q(x)≡0(modpα),即pα|Q(x+kpα)。因此,只要确定一个x使得pα|Q(x),就可以得到其它的一系列Q(x)使其含有pα的因子。如何确定x使pα|Q(x),这就是解同余式Q(x)≡0(modpα),而这个同余的解归结为同余式Q(x)≡0(modp)的解。关于素数模的二次同余式的解这个问题,勒默于1969年发表的一篇文章中仔细讨论过,得到了一个很有效的解法。读者请参看[3]。
对于某个分解基集,设它的元素是素数p1,…,ph,我们只要依次解同余式Q(x)≡0(modpiαi)(i=1,…,h)然后,确定出h差序列,这个序列对应的Q(x)就是基本上在分解基集上可以完全分解的了。因而,基本上全是B_数。这里提供了一个找B_数的方法。
波门伦斯也对二次筛法作了算法分析,他得到二次筛法的渐近计算 量要小些,但这只是渐近的情况,实际上,这里的O_所示的常数比连分数算法的计算量中所示的常数要大。
用连分数方法和用二次筛法,人们都可以分解p≤257的麦森勒数Mp中的合数。见附表。
5.p-1法和p+1法
波纳德首先注意到这样一个性质:若给定n为合数,对于n的任一
理可知的,因而gcd(aQ-1,n)>1,若gcd(aQ-1,n)≠n,则它就是n的真因子了。因而gcd(aQ-1,n)就极可能产生n的真因子。然而,对待分解的数n,我们不知道n的任何素因子,因而不知道哪个哪些Q合适于使gcd(aQ-1,n)产生真因子。当然,我们可以对Q=1,2,…,φ(n)来试验,但这样要花费的时间就比试除法还多,因而,我们必须确定哪些Q最有可能使gcd(aQ-1,n)产生n的真因子,然后对这些Q进行试验。
我们假设,n含有这样一个素因子p,它的p-1是由比较多的小素数相乘而得的数。这时,我们可以取Q如下:给定一个上界B1(B1不必很大),设βi是使pi(pi表示第i个素数)满足piβi≤B1,piβi+1>B1的数,(i=1,2,…),这时,可设Qk=p1β1…pkβk(其中pk是小于B1的最大素数)。其次,取到Qk之后,依次计算bk+1
2,…),然后有规则地选取k,譬如k-1,2,4,8,16,50,100,150,…),计算gcd(Gk,n),直到得出n的真因子为止。
通常,若p-1的最大素因子是q(设q是第j个素数,即q=pj),
小就可以得到很大的因子,见下例.
例 分解1095+1.
取B1=30000或更小些,威廉斯用上述的p-1法得到了1095+1的素因子p=121450506296081,其中p-1=24·5·13·192·15773·20509(这里人们可以看出,为什么B1取30000就可以了).威廉斯是大约计算到Gk,(k≈2050)就由gcd(Gk,n)得到了因子p.
另外他还得到了3136+1的素因子q=267009-1735108484737,这里q-1=2·32·72·19·172·569·631·23993.
威廉斯通过对波纳德的p-1方法作细致研究后,利用努卡斯序列的一些类似于幂运算的性质,得到了一个p +1法.它适合于分解这样一些合数,它们含有某些素因子p使得p +1是由比较多的小素数相乘而得.由于,p +1方法牵涉到努卡斯序列的繁杂的计算,又因为p +1方法的思想与p-1方法相同,我们这里不作介绍.
威廉斯用p±1法,对很多合数作了分解,他认为p±1方法在很多情况下比连分数方法和二次筛法更有效。因为对于合数n而言,它经常含有这样一些素因子p,使得p-1或p +1由较多的小素数相乘而得,所以,p±1方法就合适于它了。
来源:CSDN
作者:zhouq1986
链接:https://blog.csdn.net/zhouq1986/article/details/2254797