素数检测算法.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
素数检测算法

素数检测的几种算法 素数,又称质素,除了能表示为它本身和1的乘积以为,不能表示为任何其它两个整数的乘积。 试除法 根据素数的定义,假设要判断的自然数为n,那么最简单的方法便是用2~(n-1)之间的数字依次枚举试除一遍,如果能整除,那说明这个数不是素数,显然,此种算法的效率极低。初学C语言的人会使用另一种改进的试除法,那便是除数不用取遍2~(n-1),而是取2~(int)sqrt(n),但是当n很大时,此种算法的时间消耗也很大,也是不可取的。 筛选法 筛选法事一种比较高校的判断素数的方法,能够一次性的筛选除某个区间的素数。算法的基本原理也是利用了素数的定义,在某个范围内,依次去掉2的倍数,3的倍数,5的倍数……以此类推,一直到所有小于或等于n的数字的倍数都被去掉为止。这就像一面筛子,把某个区间范围内满足条件的数留下来,其余的数字去掉,最后判断此区间内的某个数是否为素数时,时间复杂度就为O(1)。很显然,时间的主要消耗都在于数字的筛选上。利用给数组单元置零的方法来实现,创建一个数组a[i],i=1、2、3……,用memset()函数将其全部置1,当i不是素数,则将a[i]置零。 代码实现如下: #define MAX N /*N为设置的某个数,确定一个判断区间*/ int isprime[MAX]; void is_prime1() { int i,j; memset(isprime,1,sizeof(isprime)); for(i=2;iMAX;i++) { if(isprime[i]) for(j=2*i;jMAX;j+=i) isprime[i]=0; } } 此种筛选算法可以优化为二次筛选,就是要求n以内的素数,就先把sqrt(n)内的素数求出来,再用已经求得的素数来筛选后面的合数。 2007年,复旦的xreborner将筛选法进一步改进为真正的线性时间复杂度,改进算法是增加了一个数组,记录已经找到的素数,通过这些已经找到的素数,来筛掉后面的数。 费马测试 费马算法是利用数学结论来进行素数检验的方法,利用了费马定理得到推论,若n1,存在,使得,则是合数。费马算法正是利用这个推论判断合数,对于素数的判断和可靠性的判断依据以下定理: 定理:或者所有的或者之多一半的满足 和(a,n)=1的整数a满足。 费马测试是判断一个数是否为素数的一个基于概率的测试。费马测试的具体实现是,对于n,从素数表中取出任意的素数对其进行费马测试,如果取了很多个素数,n仍未测试失败,那么则认为n是素数。当然,测试的次数越多越准确,但一般来讲50次就足够了。另外,预先构造一个包括500个素数的数组,先对n进行整除测试,将会大大提高通过率。 代码实现如下: int montgomery(int n,int p,int m) { int k=1; n%=m; while(p!=1) { if(0!=(p1)) k=(k*n)%m; n=(n*n)%m; p1; } return(n*k)%m; } void prime(int n) { np=0; for(int i=2;i=n;i++) { if(!isprime[i])p[np++]=i; for(int j=0;jnpp[j]*i=n;j++) { isprime[p[j]*j]=1; if(i%p[j==0])break; } } } bool isprime(int n) { if(n2)return false; for(int i=0;inp;++i) { if(1!=montgomery(p[i],n-1,n)) { return false; } } return true; } 米勒-拉宾测试 米勒拉宾测试是一个不确定的算法,只能从概率意义上判定一个数可能是素数。 输入奇数n,判断n为素数或者合数。 步骤: 计算r和R,使得,R奇。 随即选择a,。 for i=0 to r,计算。 若,则输入合数。 若,则输入素数。 设j=max{i:},则输入素数。 若,则输出素数,否则输出合数。 代码如下: long long pow_mod(long

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档