一.通过素数的基本性质

根据素数的性质(除了1和此整数(n)自身外,无法被其他自然数整除的数):即从2到n/2的数都不能整除n。

1 public static booleanisPrime(BigInteger num)2 {3 BigInteger two = BigInteger.valueOf(2);4 for(BigInteger i = two; !(i.compareTo(num.divide(two)) == 1); i =i.add(BigInteger.ONE))5 {6 if(num.remainder(i) == BigInteger.ZERO)7 {8 return false;9 }10 }11

12 return true;13 }

用大于2^63的数去测试,结果因为运算量太大,运行半个来小时也没有结果出现。

二.通过素数表

要提高速度就要减少进入判断方法中的循环:

1.偶数可以排除

2.大的合数(即素数的积)可以排除

排除偶数直接增加一个判断即可实现,而排除大的合数也通过产生一个素数表实现。

这里引援51CTO网友 梦朝思夕的BOLG,即“一般来说整除100以内的所有素数可排除76%不是素数的可能性整除256以内的所有素数可排除80%不是素数的可能性。” 而我同样地建大小为2000的表,private static BigInteger[] primeList = new BigInteger[2000]

primeList[1999] = 17389

for(int i = 0, j = 2; i < 2000; j++)

{if(isPrime(j))

{

primeList[i]=BigInteger.valueOf(j);

i++;

}

}

再来一个方法判断新生成的大数判断是否为几个素数的积

public static booleanisNotPrimeProduct(BigInteger num)

{for(int i=0;i< 2000; i++)

{if(num.remainder(primeList[i]) ==BigInteger.ZERO)

{return false;

}

}return true;

}

素数表太大也减慢速度,而且数值越大,素数表判别的确定性就越小。要知道,我们要的是2^63。

三.通过费马(Fermat)素数检验

在网上查阅资料,知道可以运用费马小定理检验一个数是否不是合数。

费马小定理是数论中的一个定理:假如a是一个整数,p是一个质数,那么

如果a不是p的倍数,这个定理也可以写成

根据费马小定理:如果p是素数,

,那么

如果我们想知道n是否是素数,我们在中间选取a,看看上面等式是否成立。如果对于数值a等式不成立,那么n是合数。如果有很多的a能够使等式成立,那么我们可以说n 可能是素数,或者伪素数。

在我们检验过程中,有可能我们选取的a都能让等式成立,然而n却是合数。这时等式

被称为Fermat liar。如果我们选取满足下面等式的a

那么a也就是对于n的合数判定的Fermat witness。

而在这里我从cnblogs的Knuth_档案学到了大量理论知识和算法的实现。(特别是蒙哥马利快速积模算法:计算大数(x^y)%z)

用java实现如下

public staticBigInteger Montgomery(BigInteger n, BigInteger p, BigInteger m)

{

n=n.remainder(m) ;

BigInteger k=BigInteger.ONE;while(p.compareTo(BigInteger.ONE) == 0)

{if(!(p.remainder(BigInteger.ONE) ==BigInteger.ZERO))

{

k=(k.multiply(n)).remainder(m);

}

n=(n.multiply(n)).remainder(m);

p= p.divide(BigInteger.valueOf(2));

}return(n.multiply(k)).remainder(m);

}

接下来,我们就可以对一个大数使用费马素数检验可以判定这个大数是伪素数。

从前2000素数一一检验,而费马素数检验只是随机化了。

public static booleanfermatPrimalityTest(BigInteger num)

{for(int i = 0; i < 2000; i++)

{if(!(Montgomery(primeList[i], num.subtract(BigInteger.ONE), num).compareTo(BigInteger.ONE) == 1)) //(x^y)%z

{return false;

}

}return true;

}

使用素数表的前十个结果:

9223372036854775809

9223372036854775811

9223372036854775813

9223372036854775815

9223372036854775817

9223372036854775819

9223372036854775821

9223372036854775823

9223372036854775825

9223372036854775827

使用费马素数检验过的前十个结果:

9223372036854775817

9223372036854775837

9223372036854775889

9223372036854775903

9223372036854775907

9223372036854775931

9223372036854775937

9223372036854775939

9223372036854775949

9223372036854775963

四.总结

现在我们可以通过结果简单的分析出出只是使用素数表的结果有很多都通不过费马素数检验,因为素数表总有上界。最后可以通过Knuth所说的 拉宾米勒测试排除掉那些卡尔麦克(Carmichael)数。

最后再次感谢 梦朝思夕和 Knuth 两位技术前辈,可以说我在这里只是把他们的心得进一步总结。权当笔记。

java生成大素数_用BigInteger实现大素数生成算法相关推荐

  1. 用java写ods系统_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo是基于数据库的代码自动生成工具,低代码编程技术的实现,可以零代码自动生成SpringBoot项目工程.生成JavaBean.生成前后端分离的CRUD代码.生成MyBaits的Mapper ...

  2. java生成iso9660工具_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo_20210212 v7.0.0 正式版发布,此次版本更新如下: 1.新增对DB2数据库的支持 2.新增按字段生成文件,支持把字段.JSON.XML数据转换成任何代码 3.新增大量新的自 ...

  3. java random 伪随机_真/伪随机、以及随机算法

    伪随机性(英语:Pseudorandomness)是一个过程似乎是随机的,但实际上并不是.伪随机数是看似随机实质是固定的周期性序列,也就是有规则的随机. 什么是随机数 随机数在计算机应用中使用的比较广 ...

  4. python中编写函数素数_如何用Python编写素数程序?

    成为一个认证的专业素数是一个大于1的自然数,它没有除1以外的任何除数.你可以用Python编写一个代码来帮助你找到所有的素数.在本文中,我们将按照以下顺序在Python中编写一个素数程序:什么是素数? ...

  5. linux系统中自动生成snap文件_在Linux操作系统下自动生成Makefile的方法

    在Linux操作系统下进行开发,编写Makefile似乎是不可缺少的事情.但是对于一个比较大的工程,编写一个符合规范的Makefile并非易事.而且由于Makefile的各种显式,隐式规则,加之平时并 ...

  6. 生成drl文件_我如何通过编程方式生成.drl文件。任何示例对我都将有所帮助

    我搜索了很多站点,但找不到有关.drl文件生成的任何特定相关示例. .drl文件生成方面的文档也不值得. 解决方案 //- ---- package部分------- PackageDescr pkg ...

  7. java rowmapper 通用实现_必经之路!各大网站力推Java代码优化:77案例+28技巧

    优秀的代码品质是程序员走向架构师神圣殿堂的必经之路!!! Java是目前的主流开发技术,如何更好地发挥其技术优势实现最佳资源配置和获得更高商业价值,一直是Java技术发展的趋势.然而Java体系庞大. ...

  8. java privatekey输出字符串_根据字符串(String)生成公钥(PublicKey)和私钥(PrivateKey)对象...

    1.字符串生成公钥对象 PublicKey /** * 实例化公钥 * * @return */ private PublicKey getPubKey() { PublicKey publicKey ...

  9. 我的世界java版summon方块_我的世界/summon指令生成特殊怪物教程

    导读:在我的世界中,玩家可以利用不同的插件来创造全新的怪物,下面小编我就来就来为各位介绍一下/summon指令如何生成特殊怪物. 随机骷髅:/summon Skeleton ~ ~1 ~ 加名字:/s ...

最新文章

  1. _disable_logging 对于归档数据库的影响
  2. Hadoop(十)Hadoop IO之数据完整性
  3. MSSql存储过程高效应用
  4. 【乱侃】How do they look them ?
  5. android rs232串口协议,RS232串口协议详解-在路上.PDF
  6. 三菱FX3U-1PG模块与台达A2伺服连接用法
  7. ckplayer插件播放m3u8视频
  8. python入门学习—字典(FishC)
  9. java随机生成6位流水号,Java生成随机流水号
  10. Learning to Fuse Asymmetric Feature Maps in Siamese Trackers 论文与代码笔记
  11. 解决找不到 C 盘中的 AppData 文件夹的问题
  12. SQL 事务(Tran | Transation)与 Try...Catch 的使用
  13. 大数据之道 HMM系列
  14. 阿昆同学的Java学习日记Day3
  15. 陆金所计算年化收益率
  16. CSS盒子模型学习-02
  17. 常见EI会议出版商IOP出版计划供参考
  18. JS时间戳、日期互相转换
  19. 学霸计算机考试新闻,697分考入清华却退学,这个襄阳学霸高考二刷699分!一心入行人工智能...
  20. 武田将在即将召开的虚拟科学大会上呈报数据,强调肿瘤产品阵容和后续产品管线的广度

热门文章

  1. 第 2-4 课:克隆和序列化 + 面试题
  2. 高质量SQL的30条建议!(后端必备)
  3. 阿里一面 缓存穿透、缓存击穿、缓存雪崩和热点数据失效问题的解决方案
  4. 三、华为鸿蒙HarmonyOS应用开发HUAWEI DevEco Studio实现页面跳转
  5. java数组怎么倒循环_java – 用于数组倒计时的反向循环
  6. cmd在执行hadoop version时出现系统找不到指定的路径。 Error: JAVA_HOME is incorrectly set
  7. Oracle 4dae,如何处理Python-CXOracle中未知词的错误报告问题,pythoncxOracle,查询,到,生僻字,报错...
  8. workbook对象需要关闭_XSSFWorkbook对象 进行zip打包时 用write资源流自动关闭处理办法...
  9. python读取数据库数据类型_Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】...
  10. 如何解决Win11开始菜单无法固定的问题