费马小定理 素数判定 蒙哥马利算法

合集下载

数论费马小定理

数论费马小定理

数论费马小定理
数论费马小定理是数学中的一个重要定理,它是由法国数学家费马在
17世纪提出的。

该定理表明,如果p是一个质数,a是任意一个整数,那么a的p次方减去a,一定是p的倍数。

也就是说,a^p ≡ a (mod p)。

这个定理在密码学中有着广泛的应用。

例如,在RSA加密算法中,就是利用了费马小定理。

RSA算法的核心是选择两个大质数p和q,然
后计算它们的乘积n=pq。

接着,选择一个整数e,使得e与(p-1)(q-1)互质。

然后,选择一个整数d,使得ed ≡ 1 (mod (p-1)(q-1))。

最后,将n和e公开,而将d保密。

这样,任何人都可以使用公钥(n,e)对消息进行加密,但只有持有私钥d的人才能解密。

RSA算法的安全性基于一个假设,即分解n=pq是困难的。

因此,如
果有人能够分解n,就可以轻松地破解RSA加密。

费马小定理提供了
一种方法来验证n是否为质数。

如果n不是质数,那么就可以轻松地
分解n。

因此,费马小定理在RSA算法中起到了重要的作用。

除了在密码学中的应用,费马小定理还有许多其他的应用。

例如,在
组合数学中,费马小定理可以用来证明组合恒等式。

在计算机科学中,费马小定理可以用来加速模幂运算。

在数论中,费马小定理可以用来
证明欧拉定理和威尔逊定理等重要定理。

总之,费马小定理是数学中的一个重要定理,它在密码学、组合数学、计算机科学和数论等领域都有着广泛的应用。

无论是在理论研究还是
在实际应用中,费马小定理都发挥着重要的作用。

费马测试素数

费马测试素数

费马测试素数费马测试素数是一种用于判断一个数是否为素数的方法,它基于费马小定理。

费马小定理表明,如果p是一个素数,a是任意一个整数且a不被p整除,那么a^(p-1) mod p等于1。

而如果a^(p-1) mod p不等于1,那么p一定不是素数。

费马测试素数的原理如下:给定一个待判断的数p,随机选择一个小于p的整数a,计算a^(p-1) mod p的值。

如果结果等于1,则p 可能是素数;如果结果不等于1,则p一定不是素数。

然而,费马测试素数并不是绝对可靠的。

存在一些合数(非素数)也满足费马小定理,这些数被称为费马伪素数。

因此,在实际应用中,费马测试素数通常与其他素数测试方法结合使用,以提高判断的准确性。

费马测试素数的应用非常广泛。

在密码学中,素数的选择是非常重要的,因为素数的因数很难被找到,从而保证了加密算法的安全性。

费马测试素数可以用来快速判断一个数是否为素数,从而加速素数的生成过程。

费马测试素数还可以用于优化质数判定算法。

传统的质数判定算法如试除法、Miller-Rabin算法等,在面对大数时计算量较大。

而费马测试素数可以作为一个快速判定的步骤,将可能的素数快速筛选出来,再使用其他算法进一步判定。

然而,费马测试素数也存在一些限制。

首先,费马测试素数只能判断一个数是否为素数,无法给出质因数分解。

其次,费马测试素数对于小数的判定效果较好,但对于非常大的数,判断准确性会降低。

因此,在实际应用中,需要结合其他的素数测试方法,以提高判断的准确性。

费马测试素数是一种快速判断一个数是否为素数的方法。

它基于费马小定理,通过计算数的幂模来判断是否为素数。

虽然费马测试素数并非绝对可靠,但在实际应用中具有重要的意义。

通过与其他素数测试方法结合,可以提高素数判定的准确性,从而保证密码学算法的安全性。

在未来的研究中,可以进一步优化费马测试素数的算法,提高其判断的效率和准确性。

费马测试素数

费马测试素数

费马测试素数费马测试素数是一种用于判断一个数是否为素数的简单方法,它是以法国数学家费马的名字命名的。

费马测试素数的原理是基于费马小定理,该定理指出,如果p是一个素数,a是不被p整除的整数,那么a的p-1次方减去1一定是p的倍数。

费马测试素数的步骤如下:1. 随机选择一个正整数a,满足1 < a < n,其中n为待测试的数。

2. 计算a的n-1次方模n的结果,即计算a^(n-1) mod n。

3. 如果结果等于1,则n可能是素数,继续执行下一轮测试。

4. 如果结果不等于1,则n一定不是素数,可以直接判断n为合数。

根据费马测试素数的原理,我们可以通过多轮测试来增加结果的准确性。

通常情况下,进行15轮测试已经可以得到较为可靠的结果。

然而,费马测试素数并不是绝对可靠的判断方法。

有一些合数也可能通过费马测试,这种情况被称为费马伪素数。

为了提高判断的准确性,可以结合其他的素数测试方法,如米勒-拉宾素数测试、埃拉托斯特尼素数筛选等。

费马测试素数的应用广泛,特别是在加密算法中。

在RSA加密算法中,素数的选择对加密的安全性至关重要。

费马测试素数可以用于生成大素数,以增强RSA算法的安全性。

除了在密码学领域的应用,费马测试素数还可以用于素数的快速判断。

对于一个非常大的数,通过费马测试可以迅速判断其是否为素数,从而节省计算时间。

然而,费马测试素数也存在一些限制。

由于测试的可靠性不够高,可能会得到错误的判断结果。

因此,在实际应用中,需要结合其他的素数测试方法来提高判断的准确性。

费马测试素数是一种简单而快速的判断素数的方法。

虽然它不是绝对可靠的,但在实际应用中具有一定的价值。

通过结合其他的素数测试方法,可以提高判断的准确性,从而更好地应用于密码学和数论等领域。

费马小定理(算法)

费马小定理(算法)

费马小定理是数论中的一个重要定理,其内容为: 假如p是质数,且(a,p)=1,那么 a^(p-1) ≡1(mod p)假如p是质数,且a,p互质,那么 a的(p-1)次方除以p的余数恒等于1费马小定理的历史皮埃尔•德•费马于1636年发现了这个定理,在一封1640年10月18日的信中他第一次使用了上面的书写方式。

在他的信中费马还提出a是一个质数的要求,但是这个要求实际上是不存在的。

与费马小定理相关的有一个中国猜想,这个猜想是中国数学家提出来的,其内容为:当且仅当2^(p-1)≡1(mod p),p是一个质数。

假如p是一个质数的话,则2^(p-1)≡1(mod p)成立(这是费马小定理的一个特殊情况)是对的。

但反过来,假如2^(p-1)≡1(mod p)成立那么p是一个质数是不成立的(比如341符合上述条件但不是一个质数)。

因此整个来说这个猜想是错误的。

一般认为中国数学家在费马前2000年的时候就已经认识中国猜测了,但也有人认为实际上中国猜测是1872年提出的,认为它早就为人所知是出于一个误解。

费马小定理的证明一、准备知识:引理1.剩余系定理2若a,b,c为任意3个整数,m为正整数,且(m,c)=1,则当ac≡bc(mod m)时,有a≡b(mod m)证明:ac≡bc(mod m)可得ac–bc≡0(mod m)可得(a-b)c≡0(mod m)因为(m,c)=1即m,c互质,c可以约去,a–b≡0(mod m)可得a≡b(mod m)引理2.剩余系定理5若m为整数且m>1,a[1],a[2],a[3],a[4],…a[m]为m个整数,若在这m 个数中任取2个整数对m不同余,则这m个整数对m构成完全剩余系。

证明:构造m的完全剩余系(0,1,2,…m-1),所有的整数必然这些整数中的1个对模m同余。

取r[1]=0,r[2]=1,r[3]=2,r[4]=3,…r=i-1,1<i<=m。

常见的大素数判断算法

常见的大素数判断算法

常见的大素数判断算法
1. 埃氏筛法(Sieve of Eratosthenes):从2开始遍历到n,将每个数的倍数都标记为合数,最后剩下的就是素数。

2. Miller-Rabin算法:基于费马小定理的扩展和二次探测算法,结合了随机化和概率,运行速度较快。

3. 素性测试(Primality Test):通过判断n是否是某个范围内的质数的乘积来确定n是否为素数。

例如,对于n,可以检查2~√n范围内的数字是否可以整除n。

4. 费马素性测试(Fermat's Primality Test):利用费马小定理,将n分解为p = 2q+1,随机选择一个a,判断a^q ≡1 mod p和a^2q ≡-1 mod p是否成立,若成立,则n可能为素数,否则n一定不是素数。

5. 威尔逊定理(Wilson's Theorem):评估(n-1)!是否同余于-1 mod n,如果成立,则n为素数。

该算法虽然正确,但对于大数字来说效率不高。

以上算法都可以用于判断大素数,但每种算法的效率和精度不同,需要根据具体情况选择合适的算法。

算法实训-素数测试问题—费马小定律

算法实训-素数测试问题—费马小定律

素数测试问题一、问题定义【问题描述】输入2个正整数m、n(m<n),输出[m,n]间的素数。

【输入输出及示例】输入:测试范围的起止值m、n。

输出:输出[m,n]间的所有素数。

示例:请输入测试范围的起始值:100 200100到200间的素数有:101 103 107 109 113 127 131 137 139 149151 157 163 167 173 179 181 191 193 197199二、问题分析1、判断素数什么是素数?一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除,就叫素数。

因此判断一个整数m是否是素数最简单的方法只需把 m 被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数。

这种方法可以判断出一个数是否为素数,但这是一种暴力的方法,当一个数非常大的时候,用这种办法会花掉许多的时间。

所以在此题中使用蒙特卡罗法算法结合费尔马小定理结合二次探测定理来判断素数。

2、蒙特卡罗法算法蒙特卡罗方法,又称随机抽样或统计试验方法。

传统的经验方法由于不能逼近真实的物理过程,很难得到满意的结果,而蒙特卡罗方法由于能够真实地模拟实际物理过程,故解决问题与实际非常符合,可以得到很圆满的结果。

随机产生问题的解,但在产生的解中,有一部分可以判断真假,一部分不能判断真假。

对于不能判断的,则可能是错误的解。

随着多次调用此算法,由于每次调用都是独立的,因此产生错误解的概率越来越小。

在实验中,通过srand(0);,设计随机数种子,保证每次产生的随机数的随机性,令int a = rand() % (n - 2) + 2;通过rand函数每次产生2-n的随机数,为了保证产生错误解的概率越小,在实验中,对每一个范围内的数,产生100随机数,保证结果的正确性。

3、费马小定律的使用费马小定理:如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p)。

蒙哥马利(Montgomery)算法简介

蒙哥马利(Montgomery)算法简介

蒙哥马利(Montgomery)算法简介最近在看一款芯片的DataSheet的时候,在加密处理部分集成了蒙哥马利协处理器。

在我印象里,蒙哥马利不是个将军么,我又土了一回~google后才知道是做RSA打算运算中用以快速计算模乘的,收集了一篇不错的文章,以供参考:前言俺曾经查阅了网上找得到的各种用于实现RSA 的大数运算库,然而最终还是决定自己动手写一个。

因为凡是效率高速度快的代码(crypto++、miracl、freelip、rsaref等),要么使用的数据结构过于复杂,要么编码风格杂乱无章,俺的水平和耐心都实在是有限,以至于无法读懂这些东西。

而俺读得懂的一些代码,其实现方式却又过于幼稚,效率极低速度一塌糊涂。

俺觉得像俺这样的人不在少数,于是决心写一个清晰易懂,效率也过得去的东西奉献给大家。

这个函数库刚做好的时候,生成1024位的随机密钥耗时大约5 分钟,俺认为是可以接受的。

但后来找到一个叫tE! 的老外用miracl库写的RsaTools,发现其生成1024位的密钥耗时不超过三秒钟!于是俺针对俺的代码开始了艰苦的优化工作,希望能达到甚至超过这一水平。

一周之后1024位密钥的平均生成时间已经降至5 秒左右,但是单单依靠优化代码来进一步提高速度也非常困难了。

于是俺开始借助金山词霸来查阅能够通过google找到的一切与RSA 算法相关的论文,但是网上关于RSA算法的论述绝大多数都是用于硬件实现的,将其算法流程用软件设计语言来实现极其繁琐。

而且俺发现这样做下去俺只会离自己的初衷越来越远:俺的代码将不再清晰易懂。

所以俺一度准备放弃。

准备放弃之后,心态平静了许多,再回头去看那些原来不太能够理解的RSA 算法原理,却发现其实也不是那么高深莫测,不急不躁地慢慢看,慢慢想,突然就一下子全明白了。

一番改进之后,现在这个版本的函数库同样具有非常简单而清晰的结构,速度也不算慢,生成1024位的密钥在俺PIII 900的笔记本上平均耗时不超过两秒。

蒙特卡罗(费尔马小定理+二次探测联合算法判定1-200内的素数)算法的思想、原理和步骤

蒙特卡罗(费尔马小定理+二次探测联合算法判定1-200内的素数)算法的思想、原理和步骤

蒙特卡罗(费尔马小定理二次探测联合算法判定1-200内的素数)算法的思想、原理和步内容假如p是质数,且gcd(a,p)=1,那么a(p-1)≡1(mod p)。

证明先证两个引理:①:若a,b,c为任意3个整数,m为正整数,且(m,c)=1,则当ac≡bc(mod m)时,有a≡b(mod m)(这个很显然吧。

)②:设m是一个整数,且m>1,b是一个整数且(m,b)=1.如果a[1],a[2],a[3],a[4],…a[m]是模m的一个完全剩余系,则ba[1],ba[2],ba[3],ba[4],…ba[m]也构成模m的一个完全剩余系.证明:若存在ba[i]、ba[j]使得bai≡baj(mod m)bai≡baj(mod m),则ai≡aj(mod m)ai≡aj(mod m)。

然而根据完全剩余系的定义可知这并不存在。

然后再来证明费马小定理:构造P的完全剩余系:{1,2,3…,p−1}{1,2,3…,p−1}因为(a,p)=1(a,p)=1,根据引理②可得{a,2a,3a…,n}{a,2a,3a…,n}也是P的完全剩余系。

由完全剩余系的性质可得:(p−1)!≡(p−1)!ap−1(mod p)(p−1)!≡(p−1)!ap−1(mod p)两边同时除以(p−1)!(p−1)!,得ap−1≡1(mod p)ap−1≡1(mod p)证毕。

应用费马小定理是逆元的求解方法之一。

还可以快速计算形如ab≡c (mod p)ab≡c (mod p)这样的东西(当然p要是质数)还有就是MR素数判断MR素数判断一般的素数判断用的是筛法。

但是当素数比较大时,可能就无能为力了(判单个数最快是n−−√n)这时我们就可以考虑MR素数判断。

全名:Miller-Rabin素数测试,利用费马小定理判断一个数是否是质数。

当p为素数时,ap−1≡1(mod p)ap−1≡1(mod p),而当p不为素数时,上式有很大概率不成立。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

费马小定理素数判定蒙哥马利算法(强烈推荐)2009-11-07 12:42费马小定理素数判定蒙哥马利算法约定:x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数。

x^y表示x的y次方。

乘方运算的优先级高于乘除和取模,加减的优先级最低。

见到x^y/z这样,就先算乘方,再算除法。

A/B,称为A除以B,也称为B除A。

若A%B=0,即称为A可以被B整除,也称B可以整除A。

A*B表示A乘以B或称A乘B,B乘A,B乘以A……都TMD的一样,靠!复习一下小学数学公因数:两个不同的自然数A和B,若有自然数C可以整除A也可以整除B,那么C就是A和B的公因数。

公倍数:两个不同的自然数A和B,若有自然数C可以被A整除也可以被B整除,那么C就是A和B的公倍数。

互质数:两个不同的自然数,它们只有一个公因数1,则称它们互质。

费马是法国数学家,又译“费尔马”,此人巨牛,他的简介请看下面。

不看不知道,一看吓一跳。

/BasicStudy/LearnColumn/Maths/shuxuejiashi/j12.htm费马小定理:有N为任意正整数,P为素数,且N不能被P整除(显然N和P互质),则有:N^P%P=N(即:N的P次方除以P的余数是N)但是我查了很多资料见到的公式都是这个样子:(N^(P-1))%P=1后来分析了一下,两个式子其实是一样的,可以互相变形得到,原式可化为:(N^P-N)%P=0(即:N的P次方减N可以被P整除,因为由费马小定理知道N的P次方除以P的余数是N)把N提出来一个,N^P就成了你N*(N^(P-1)),那么(N^P-N)%P=0可化为:(N*(N^(P-1)-1))%P=0请注意上式,含义是:N*(N^(P-1)-1)可以被P整除又因为N*(N^(P-1)-1)必能整除N(这不费话么!)所以,N*(N^(P-1)-1)是N和P的公倍数,小学知识了^_^又因为前提是N与P互质,而互质数的最小公倍数为它们的乘积,所以一定存在正整数M使得等式成立:N*(N^(P-1)-1)=M*N*P两边约去N,化简之:N^(P-1)-1=M*P因为M是整数,显然:(N^(P-1)-1)%P=0即:N^(P-1)%P=1============================================积模分解公式先有一个引理,如果有:X%Z=0,即X能被Z整除,则有:(X+Y)%Z=Y%Z这个不用证了吧...设有X、Y和Z三个正整数,则必有:(X*Y)%Z=((X%Z)*(Y%Z))%Z想了很长时间才证出来,要分情况讨论才行:1.当X和Y都比Z大时,必有整数A和B使下面的等式成立:X=Z*I+A(1)Y=Z*J+B(2)不用多说了吧,这是除模运算的性质!将(1)和(2)代入(X*Y)modZ得:((Z*I+A)(Z*J+B))%Z乘开,再把前三项的Z提一个出来,变形为:(Z*(Z*I*J+I*A+I*B)+A*B)%Z(3)因为Z*(Z*I*J+I*A+I*B)是Z的整数倍……晕,又来了。

概据引理,(3)式可化简为:(A*B)%Z又因为:A=X%Z,B=Y%Z,代入上面的式子,就成了原式了。

2.当X比Z大而Y比Z小时,一样的转化:X=Z*I+A代入(X*Y)%Z得:(Z*I*Y+A*Y)%Z根据引理,转化得:(A*Y)%Z因为A=X%Z,又因为Y=Y%Z,代入上式,即得到原式。

同理,当X比Z小而Y比Z大时,原式也成立。

3.当X比Z小,且Y也比Z小时,X=X%Z,Y=Y%Z,所以原式成立。

=====================================================快速计算乘方的算法如计算2^13,则传统做法需要进行12次乘法。

/*计算n^p*/unsigned power(unsigned n,unsigned p){for(int i=0;i<p;i++) n*=n;return n;}该死的乘法,是时候优化一下了!把2*2的结果保存起来看看,是不是成了:4*4*4*4*4*4*2 再把4*4的结果保存起来:16*16*16*2一共5次运算,分别是2*2、4*4和16*16*16*2这样分析,我们算法因该是只需要计算一半都不到的乘法了。

为了讲清这个算法,再举一个例子2^7:2*2*2*2*2*2*2两两分开:(2*2)*(2*2)*(2*2)*2如果用2*2来计算,那么指数就可以除以2了,不过剩了一个,稍后再单独乘上它。

再次两两分开,指数除以2:((2*2)*(2*2))*(2*2)*2实际上最后一个括号里的2 * 2是这回又剩下的,那么,稍后再单独乘上它现在指数已经为1了,可以计算最终结果了:16*4*2=128优化后的算法如下:unsigned Power(unsigned n,unsigned p){unsigned main=n; //用main保存结果unsigned odd=1; //odd用来计算“剩下的”乘积while (p>1){//一直计算,直到指数小于或等于1if((p%2)!=0){// 如果指数p是奇数,则说明计算后会剩一个多余的数,那么在这里把它乘到结果中odd*=main; //把“剩下的”乘起来}main*=main; //主体乘方p/=2; //指数除以2}return main*odd; //最后把主体和“剩下的”乘起来作为结果}够完美了吗?不,还不够!看出来了吗?main是没有必要的,并且我们可以有更快的代码来判断奇数。

要知道除法或取模运算的效率很低,所以我们可以利用偶数的一个性质来优化代码,那就是偶数的二进制表示法中的最低位一定为0!完美版:unsigned Power(unsigned n, unsigned p){ // 计算n的p次方unsigned odd = 1; //oddk用来计算“剩下的”乘积while (p > 1){ // 一直计算到指数小于或等于1if (( p & 1 )!=0){ // 判断p是否奇数,偶数的最低位必为0odd *= n; // 若odd为奇数,则把“剩下的”乘起来}n *= n; // 主体乘方p /= 2; // 指数除以2}return n * odd; // 最后把主体和“剩下的”乘起来作为结果}========================================================蒙格马利”快速幂模算法后面我们会用到这样一种运算:(X^Y)%Z问题是当X和Y很大时,只有32位的整型变量如何能够有效的计算出结果?考虑上面那份最终的优化代码和再上面提到过的积模分解公式,我想你也许会猛拍一下脑门,吸口气说:“哦,我懂了!”。

下面的讲解是给尚没有做出这样动作的同学们准备的。

X^Y可以看作Y个X相乘,即然有积模分解公式,那么我们就可以把Y个X相乘再取模的过程分解开来,比如:(17^25)%29则可分解为:( ( 17 * 17 ) % 29 * ( 17 * 17 ) % 29 * ……如果用上面的代码将这个过程优化,那么我们就得到了著名的“蒙格马利”快速幂模算法:unsigned Montgomery(unsigned n, unsigned p, unsigned m){ // 快速计算(n ^ e) % m 的值,与power算法极类似unsigned r = n % m; // 这里的r可不能省unsigned k = 1;while (p > 1){if ((p & 1)!=0){k = (k * r) % m; // 直接取模}r = (r * r) % m; // 同上p /= 2;}return (r * k) % m; // 还是同上}上面的代码还可以优化。

下面是蒙格马利极速版:unsigned Montgomery(unsigned n,unsigned p,unsigned m){ //快速计算(n^e)%m的值unsignedk=1;n%=m;while(p!=1){if(0!=(p&1))k=(k*n)%m;n=(n*n)%m;p>>=1;}return(n*k)%m;}===================================================== 怎么判断一个数是否为素数?笨蛋的作法:bool IsPrime(unsigned n){if (n<2){ //小于2的数即不是合数也不是素数throw 0;}for (unsigned i=2;i<n;++i){ //和比它小的所有的数相除,如果都除不尽,证明素数if (n%i==0){//除尽了,则是合数return false;}}return true;}一个数去除以比它的一半还要大的数,一定除不尽,所以还用判断吗??下面是小学生的做法:bool IsPrime(unsigned n){if (n<2){//小于2的数即不是合数也不是素数throw 0;}for(unsigned i=2;i<n/2+1;++i){ // 和比它的一半小数相除,如果都除不尽,证明素数if ( 0 == n % i ){ // 除尽了,合数return false;}}return true; // 都没除尽,素数}一个合数必然可以由两个或多个质数相乘而得到。

那么如果一个数不能被比它的一半小的所有的质数整除,那么比它一半小的所有的合数也一样不可能整除它。

建立一个素数表是很有用的。

下面是中学生的做法:bool IsPrime2(unsigned n){if ( n < 2 ){ // 小于2的数即不是合数也不是素数throw 0;}static unsigned aPrimeList[] = { // 素数表1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 113,193, 241, 257, 337, 353, 401, 433, 449, 577, 593, 641,673, 769, 881, 929, 977, 1009, 1153, 1201, 1217, 1249,1297,1361, 1409, 1489, 1553, 1601, 1697, 1777, 1873,1889, 2017, 2081, 2113, 2129, 2161, 2273, 2417, 2593,2609, 2657, 2689, 2753, 2801, 2833, 2897, 3041, 3089,3121, 3137, 3169, 3217, 3313, 3329, 3361, 3457, 3617,3697, 3761, 3793, 3889, 4001, 4049, 4129, 4177, 4241,4273, 4289, 4337, 4481, 4513, 4561, 4657, 4673, 4721,4801, 4817, 4993, 5009, 5153, 5233, 5281, 5297, 5393,5441, 5521, 5569, 5857, 5953, 6113, 6257, 6337, 6353,6449, 6481, 6529, 6577, 6673, 6689, 6737, 6833, 6961,6977, 7057, 7121, 7297, 7393, 7457, 7489, 7537, 7649,7681, 7793, 7841, 7873, 7937, 8017, 8081, 8161, 8209,8273, 8353, 8369, 8513, 8609, 8641, 8689, 8737, 8753,8849, 8929, 9041, 9137, 9281, 9377, 9473, 9521, 9601,9649, 9697, 9857};const int nListNum = sizeof(aPrimeList)/sizeof(unsigned);//计算素数表里元素的个数for (unsigned i=2;i<nListNum;++i ){if(n/2+1<aPrimeList[i]){return true;}if(0==n%aPrimeList[i]){return false;}}/*由于素数表中元素个数是有限的,那么对于用素数表判断不到的数,就只有用笨蛋办法了*/for (unsigned i=aPrimeList[nListNum-1];i<n/2+1;i++ ){if (0==n%i){ // 除尽了,合数return false;}}return true;}还是太糟了,我们现在要做的对于大型素数的判断,那个素数表倒顶个P用!当然,我们可以利用动态的素数表来进行优化,这就是大学生的做法了。

相关文档
最新文档