素数筛选算法一种改进.docVIP

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

素数筛选算法一种改进   摘要:本文对传统的素数筛选算法的缺点进行了分析和改进。并在埃拉托斯特尼筛法(sieve of Eratosthenes)的基础之上,设计了一种基于已知素数来寻找未知素数的区间筛法。区间筛法突破了由计算机内存分配造成的数量级限制,大幅提升了寻找素数的范围,并通过优化筛选过程提升了算法运行速度。实验结果表明,经过改进的区间筛法在筛选范围上远大于传统筛法,并且具有较好的时间复杂度。   关键词:素数;筛法;区间筛法;筛选范围   中图分类号:TP301 文献标?R码:A 文章编号:1009-3044(2018)17-0075-02   1 引言   素数,是数论中最古老、最基本但至今仍受到广泛关注的话题之一。围绕着素数产生了一系列世界级的难题,吸引了历史上一大批著名的数学家参与其中,其中有很多问题至今仍未解决。筛法是寻找素数的一种常见而又高效的方法。寻找与判别素数的算法在现代信息科学与程序设计中起着相当重要的作用。   2 经典的素数筛选法   2.1 埃拉托斯特尼筛法   埃拉托斯特尼筛法(sieve of Eratosthenes)简称埃氏筛或爱氏筛, 是一种由埃及数学家埃拉托斯特尼所提出的一种简单检定素数的算法。他的方法是:先将2~[n]从小到大排列。选中2,然后将2的其他倍数筛去;再选中下一个未被筛去的数3,将3的其他倍数都筛去;下一个未被筛除的数是5,将5的其他倍数筛去……以此类推,一直到没有数可以被选择为止,剩下未被筛除的数即为2~[n]中的所有素数。埃氏筛法原理简单,实现起来比较容易。它的算法复杂度为[O(nloglogn)]。   2.2 线性筛法――欧拉筛法   埃氏筛法虽然原理简单,速度较快,但是筛选过程中任意一个合数都会被它的[k]个素因子处[k]理次,造成大量不必要的计算。因此,欧拉筛法就是对这点不足的改进。对于从2开始的每个自然数[i],先将每个发现的素数归入集合[P]中,然后将集合[P]中的每一个素数的[i]倍筛去。当[i]被[P]中某个素数整除时,便立即进入下一轮筛选,直到所有[n]以内的数都被处理过为止。这时,[P]中就包含了[n]以内的所有素数。这种算法保证了每一个合数都只被自己的最小素因子处理一次,大幅减少了多余的运算,提高了运算效率。欧拉筛法的时间复杂度为[O(n)],因此又被称为线性筛法。   2.3 传统筛法的不足之处   在传统筛法算法中,获取[n]以内的素数需要消耗与[n]等量大小的内存。这导致[n]过大时,计算机无法提供足够的内存,导致程序崩溃。传统筛法的另一个缺点是只能一次性获取2~[n]之间的素数,而不能仅仅获取任一个区间内素数。若只要求某一区间内的素数则会造成程序在运行时大量不必要的内存消耗,并且极大地限制了区间的可行范围。   3 筛法的改进   对于传统筛法的上述缺点,本文提出了分区间筛选的思想并对算法的以下几处进行改进优化,使得通过筛法可以获得更大范围内的素数,并且不受起始数的限制。   3.1 使用已知素数进行筛选   定理1 若[n≥2]是合数,则必有质数[p|n],[p≤n].   通过算数基本定理可知,每个合数都可以分解成若干个素数的乘积,因此只要验证一个数是否被某个素数整除就可以判断它是否为合数,这是就筛法的基本思想。根据定理1,该数的最小的素因子不会超过它的平方根。因此,若现在已知前2~[n]范围内素数,则通过遍历一次整个素数集合可以快速计算出[n2]以内全部的素数。   3.2 分区间筛选   传统筛法寻找素数时,由于没有任何已知素数,因此需要从第一个素数2开始计算,筛选序列的构造也必须从2开始,很大程度上限制了筛选的范围。由之前的讨论可知,若已知2~[n]范围内素数,则可以对筛法算法进行适当的改进,从而获得[n2]以内任一区间里的素数。这种方法有效的摆脱了传统筛法对筛选起点的限制。   图1展示了区间筛法的计算过程。其中[n]以内的素数集可以通过传统筛法程序事先得到。由于线性筛法的算法原理在分区间的筛法上并不适用,因此这里使用了埃氏筛法的算法原理进行筛选。对于区间[[m,n]],需使用[n]内的素数进行筛选,所以该算法的时间复杂度为[O((n-m)loglogn)],比埃氏筛法的复杂度稍低一些。   3.3 区间筛法的优化   对于区间筛法,在实际的编程中还可以对以下几部分进行优化,以加快速度并减少空间占用率。   3.3.1 去偶存奇   除2以外的偶数都不是素数,因此在筛选时可以直接略去偶数,只考虑奇数。对筛选数组的相应下标做映射[S]:[n→2n+1],在判定时通过做逆映射修改相应下标的值来完成筛选,这样做使筛选数组的大小比原来缩小了一倍。去偶操作不仅降低了程序的内存占用率,同

文档评论(0)

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

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

1亿VIP精品文档

相关文档