找回密码
 欢迎注册
楼主: fly

[求助] 怎么样求N以下所有素数

[复制链接]
发表于 2011-6-16 11:02:07 | 显示全部楼层
9# fly 不知你用这么多这么大的素数做什么用?如果你做RSA加密,不需要100%绝对的素数,非确定性素数判定算法足够用而且足够快,实时生成素数应该能够满足需要。如果你想预先计算出大量的素数存起来,需要的时候随机挑选一个,这就陷入两难抉择了,存储的数少了,不够随机,存得太多了,硬盘开销太大,如何做到平衡也很烦人。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-6-16 11:09:52 | 显示全部楼层
10# liangbch 我用的是google浏览器,不知道他支不支持latex。 如果可以的话,请告知怎么开
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-6-16 11:23:24 | 显示全部楼层
11# liangbch 公钥加密体系的加密算法不仅仅有RSA而已,还有其他的很多,比如:ElGamal encryption.肯定是有加密算法这么要求啦 至于在这么大的素数做什么,那是用来做为加密的随机参数的。这个加密的随机参数要求是素数,那当然要求是N以下的素数了。 你说的“非确定性素数判定算法”来实时生成素数,你觉得这个对于2^2048这么大的范围还是有效率的吗?很在可能随机的数都不是素数。而且我的实验要求要生成10^20个随机素数,因为我要加密10^20次。这样,还不如我自己在一楼写的那个程序。 gmp_randinit_default(state); 设置随机初始状态 do { mpz_urandomm(r, state, N); 得到N以下随机一个数,赋给r mpz_nextprime(r, r); 求得r的下一次素数,赋给r } while(mpz_cmp(r, N)>=0); 如果r>N,返回循环重新生成 这应该要比“非确定性素数判定算法”来实时生成素数快(我直觉)。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-6-16 11:24:38 | 显示全部楼层
如果能用比较快的算法来随机生成2^2048以下的随机素数2^20个,也就解决了我的问题了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2011-6-16 12:49:17 | 显示全部楼层
13# fly 你可能误解了mpz_nextprime的用法,按我的理解, GPM 函数 mpz_nextprime 采用的非确定性素数判定算方法。op是入参,rop是出参。 比如,op=112, 得到的rop是113, op=127, 得到的rop是127,因为127是第一个比113大的素数。 GMP帮助文档 void mpz_nextprime (mpz t rop, mpz t op) Set rop to the next prime greater than op. This function uses a probabilistic algorithm to identify primes. For practical purposes it’s adequate, the chance of a composite passing will be extremely small. -------------------------------- 非确定性素数判定算法(Miller-Rabin 测试)快于确定性素数算法,这个早有定论,没有什么好争的。 100万个素数不多。事先计算出来的时间代价和存储代价都不多。可你为什么要求“怎么样求N以下所有素数”
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2011-6-16 13:47:15 | 显示全部楼层
13楼说10^20个,14楼又变成了2^20个。 到底要多少个? 2^20还好说,10^20建议还是放弃这个念头吧。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-6-16 21:06:47 | 显示全部楼层
17# 风云剑 是2^20,13楼是typo。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-6-16 21:16:41 | 显示全部楼层
16# liangbch 我觉得可能是你误解了mpz_nextprime的用法,你的理解可能是有点问题的。因为这个mpz_nextprime真 的可能不是按你说的做,因为他要比你说的还要快。 非确定性素数判定算法(Miller-Rabin 测试)快于确定性素数算法,这个早有定论,没有什么好争的 不是跟你争这个,而是跟你争怎么实时生成素数,你说的用“非确定性素数判定算法足够用而且足够快,实时生成素数应该能够满足需要。” 我希望你本着严谨的精神把代码写出来,然后跟我的代码比比看,到底是谁的快。 用事实来说话更加可靠。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2011-6-16 23:46:22 | 显示全部楼层
本帖最后由 liangbch 于 2011-6-17 10:47 编辑 21# fly 你说的和代码不一回事。 我强调的你下面的代码几乎是一个无限循环。 如果N=2^2048, r为N以内的一个随机数,q为比r只大一点点的素数,则q比N大的概率几乎为0。 按你的例子来,你的N是4000比特的一个数,而生成是随机数是一个2052比特的数,这个循环怎么能够终止呢?
注在6-17 10:47:上面的内容的确错了,sorry, 应该是只循环一次
而你说的是15分钟生成一个素数。
do { mpz_urandomm(r, state, N); 得到N以下随机一个数,赋给r mpz_nextprime(r, r); 求得r的下一次素数,赋给r } while(mpz_cmp(r, N)>=0);
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2011-6-17 01:10:24 | 显示全部楼层
楼主总是不相信我说的,我就给出我刚刚写的一个调用GMP寻找素数的程序吧。 不管楼主怎么想,是不相信也好还是激将也好,总之,楼主应该有所收获,这里在VC 6.0下使用GMP的一个完整的事例。 对GMP,我以前总是看的多实践的少,从没有写过一个调用GMP的程序。这次楼主的激将法起了作用,我不得不写一个调用GMP的程序了,从这点上,我还是非常感谢楼主。 写给出测试结论。 我这里的运行结果表明,计算2048bit以内的一个素数,仅需大约1秒的时间,GMP号称最快的大数运算库,我想,通过适当的优化算法,超过GMP应该是可能的,但改进的幅度应该不会太大。 下面是运行结果: ---------------------------------------------
  1. n= 32317006071311007300714876688669951960444102669715484032130345427524655138867
  2. 89089319720141152291346368871796092189801949411955915049092109508815238644828312
  3. 06308773673009960917501977503896521067960576383840675682767922186426197561618380
  4. 94338476170470581645852036305042887575891541065808607552399123930385521914333389
  5. 66834242068497478656456949485617603532632205807780565933102619270846031415025859
  6. 28641771167259436037184618573575983511523016459044036976132332872312271256847108
  7. 20209725157101726931323469678542580656697935045997268352998638215525166389437335
  8. 543602135433229604645318478604952148193555853611059596230655
  9. r= 27362146563138776857982728818380223201396348785705792191523687503949678108173
  10. 99940566127117505296267068718876291961676893039812711056372712009039337719266306
  11. 53399251063408964938569898570955949825765798105272822671259918839693479216917782
  12. 15703198021881656810310840682707715049113743235773157119149858759547571693709281
  13. 43927777452078944320654156473491634280636501265834734763623385553721109784489079
  14. 52215840890426806918941699802106381821686824635397622880353668553494998397486591
  15. 72105286746228695779975747577204898312976788706805092864351507296077048907174491
  16. 531725975477830513157574120773905306854649624870603675456789
  17. q= 27362146563138776857982728818380223201396348785705792191523687503949678108173
  18. 99940566127117505296267068718876291961676893039812711056372712009039337719266306
  19. 53399251063408964938569898570955949825765798105272822671259918839693479216917782
  20. 15703198021881656810310840682707715049113743235773157119149858759547571693709281
  21. 43927777452078944320654156473491634280636501265834734763623385553721109784489079
  22. 52215840890426806918941699802106381821686824635397622880353668553494998397486591
  23. 72105286746228695779975747577204898312976788706805092864351507296077048907174491
  24. 531725975477830513157574120773905306854649624870603675456839
  25. 计算时间:1.084s
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-22 13:59 , Processed in 0.026378 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表