java生成大素数_用BigInteger实现大素数生成算法

一.通过素数的基本性质

根据素数的性质(除了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是一个质数,那么10af6afd443321d1cc585338757ec2bd.png

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

0800f88a4296d70f613b08e7c7da2c65.png

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

85b4cc25d04fac6e1efbb7e1ae4544a5.png,那么0800f88a4296d70f613b08e7c7da2c65.png

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

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

8720e7621f1234f7872f317e4ed314bc.png

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

3e0dc7b84768b4da754ef6a4e75314db.png

那么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 两位技术前辈,可以说我在这里只是把他们的心得进一步总结。权当笔记。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA shell export_Java 远程调用Shell

Java 远程调用Shell上一篇 /下一篇 2014-01-21 13:29:22/ 个人分类&#xff1a;JavaRemote Shell Scripts need to export the ENV variable again.public class JavaRemoteRunShell {private Connection conn;private String ipAddr;private String charset Charset.default…

JAVA不同类型数组重载_JAVA补课-DAY1:方法重载和数组

IDEA简单方法使用快捷键CtrlAltL&#xff0c;IDEA代码格式化Ctrl/单行注释&#xff0c;重复按取消CtrlShift/多行注释&#xff0c;重复可取消5.fori<>for (int i 0; i < 5; i)本日重点方法重载(overload)/*方法重载(Overload)&#xff0c;多个方法名称相同&#xff0…

华为s2600t java_华为S2600T存储+华为RH2288H V3服务器

面对复杂多变的国际形势和国内艰巨繁重的改革发展稳定任务&#xff0c;维持稳定就显得格外重要。平安城市视频监控建设项目为了保证城市交通和城市治安的安全&#xff0c;需要对人员集中的重要场所和道路上监控进行建设和改造。视频监控记录的数据必须具有很高的安全性&#xf…

华为java8_Java8 Stream

简单认识Java streamJava8出了一个stream流式编程&#xff0c;在开发中或多或少用到接触过。怎么说呢&#xff01;举个例子把&#xff0c;一起我们在遍历一个集合的时候&#xff0c;我们是从外部去遍历的&#xff0c;然后才能拿到结果&#xff0c;这样来效率就会变得相对低一点…

ascii码扩展 php,php与ascii码

首先 简单说一下历史&#xff0c;ascii码最开始是美国人搞出来的&#xff0c;用来干什么呢&#xff1f;我们知道&#xff0c;计算机只知道0和1&#xff0c;如果我们要计算机识别除了01之外的字符&#xff0c;例如 a&#xff0c;我们要先告诉计算机‘1100001’就是a。跟摩斯密码…

php手机电子相册,免费电子相册制作软件 手机电子相册制作软件

照片配上音乐加上炫酷的过渡效果点缀图片和文字说明&#xff0c;轻松制作成各种视频格式的电子相册。不需要专业的视频制作知识&#xff0c;点几下鼠标就可以把上百张数码照片制作成电子相册。视频相册可以在电脑上用播放器收看或者在高清电视上播放。也可以刻录成DVD、VCD光盘…

php+spl+栈,PHP SPL标准库之数据结构栈(SplStack)介绍

栈(Stack)是一种特殊的线性表&#xff0c;因为它只能在线性表的一端进行插入或删除元素(即进栈和出栈)SplStack就是继承双链表(SplDoublyLinkedList)实现栈。类摘要如下&#xff1a;简单使用如下&#xff1a;//把栈想象成一个颠倒的数组$stack new SplStack();/*** 可见栈和双…

深度理解java jvm,深度理解JVM

深入理解java虚拟机要讲的内容了解历史垃圾回收机制性能监控工具性能调优案例实战认识类的文件结构类加载机制字节码执行引擎虚拟机编译及运行时优化Java线程高级1. 环境搭建安装jdk2. 内存溢出场景模拟public class Test01 {public static void main(String[] args) {//测试内…

otb100matlab,ECO for tracking 在 OTB100 基准测试和 VOT2016 数据集中的实验结果

目前本文所涉内容均未使用图形处理器。运行在有图形处理器环境下的实验将在稍后补充&#xff0c;敬请关注。需要准备的文章和工具有&#xff1a;一、集成 OTB1001.1 下载基准测试在该目录中可以看到&#xff1a;trackers 目录中已经包含了若干跟踪算法。而我们要做的就是把 ECO…

如何设置oracle_home变量,oracle-如何在Ubuntu 9.x上正确设置ORACLE_HOME变量?

oracle-如何在Ubuntu 9.x上正确设置ORACLE_HOME变量&#xff1f;我遇到了与此处列出的问题相同的问题&#xff1a;尽管我没有丢失密码&#xff0c;但如何恢复或更改Oracle sysdba密码&#xff0c;我最初在configure脚本中输入了两次&#xff0c;然后登录(localhost&#xff1a;…

matlab遗传算法配送路径,基于Matlab物流配送路径优化问题遗传算法的实现

维普资讯 http://doc.docsou.com第2 9卷总第 1 1 3期物流商坛物流配送路径优化问题遗传算法的实现The Re lz to f Ge tc Al o ih o a ia i n o ne i g r t m f VRP Ba e o t e M a l b s d n h tap p p p p p p p p p p p p p p ) ≯≯ p p p p ≯ ≯ p≯≯≯≯≯≯≯弓晋丽 .程…

linux挂载目录到分区,Ubuntu7.10下挂载/home目录到一个分区的方法

最近在一个9.5G的旧硬盘上装了个Ubuntu7.10&#xff0c;在安装时选择了自动分区安装&#xff0c;结果只有两个分区&#xff0c;/和swap&#xff0c;后来觉得一妥&#xff0c;就用gparted重新调整了分区&#xff0c;现在想把砍出事的分区挂载/home目录。昨晚试了一晚都没有弄好&…

linux终端美化,如何美化你的命令行终端Terminal

Linux下的终端是很有魅力的&#xff0c;你可以进行些简单的配置让它变得更加华丽&#xff0c;让枯燥的命令行也变得生动起来。下面进行些配置是我使用的&#xff0c;先看下效果图命令行是以我非常喜欢的Avirl为背景的&#xff0c;同时把终端的字体放大了&#xff0c;字体颜色为…

linux重启服务挂载盘消失,如何处理ECS Linux服务器重启服务器、初始化系统后数据盘不见了的情况...

本文在介绍如何处理ECS Linux服务器重启服务器、初始化系统后数据盘不见了的情况的基础上&#xff0c;重点探讨了其具体步骤&#xff0c;本文内容紧凑&#xff0c;希望大家可以有所收获。ECS Linux服务器重启服务器、初始化系统后数据盘不见了问题现象&#xff1a;Linux系统服务…

linux webshell 页面管理,instantbox:30s内快速搭建可通过webshell管理的Linux系统

点击上方蓝色字体&#xff0c;关注我们如何快速搭建一个Linux环境&#xff0c;肯定非docker莫属。但通过instantbox&#xff0c;可以带给我们比docker更好的体验&#xff1a;在不到 30s 内快速搭建一个干净、开箱即用的多个临时的Linux 系统&#xff0c;如Ubuntu、Centos、Arch…

局域网共享工具_局域网文件共享

局域网文件共享的方式都有哪些&#xff1f;局域网文件共享的方式还是比较多的&#xff0c;有几种可参考操作&#xff1a; 在多台电脑上开启网上邻居共享&#xff0c;这样电脑直接打开网上邻居就可以访问对方的文件夹和资料了。 可以安装辅助软件&#xff0c;比如&#xff1a;坚…

sdp ddp内存怎么分_旗舰手机跑分66万+,缩短与PC差距,手机成生产力工具也许不是梦...

现在人们无论是在买电脑还是买手机的时候总是喜欢拿跑分来衡量产品的硬件性能&#xff0c;其实长时间的使用产品才是体验产品性能最真实的体验&#xff0c;但是往往需要先有机会拿到产品才行。除此之外也许跑分是最直观的手段。虽然跑分不代表最终体验&#xff0c;但是通过横向…

安卓虚拟机_安卓中的安卓虚拟机,那些闪退应用有救了

“我们坚持最优质的分享&#xff0c;努力做你身边的资源助手“VMOS VMOS堪称安卓中的安卓虚拟机&#xff0c;可以在手机里面再运行一个全新的安卓系统&#xff0c;由于是独立在运行的操作系统&#xff0c;可以运用的场景非常多&#xff0c;例如多开应用&#xf…

c语言表达式与变量区别,C语言实战开发————基础秘籍1(C与C++的区别,输入输出,函数,变量,运算符)...

(一)学前思考学习目标1 面试2 后期服务 :JNI(C语言)C JAVA 编程思想 编程能力(二)所学内容C语言与C的区别1.C是面向过程 C面向对象2.面向过程与面向对象最大的区别在于前者更直接&#xff0c;但后者略显含蓄&#xff0c;相较于前者而言&#xff0c;后者更为完善&#xff0c;正如…

电脑一开机出rebootand_北京联想电脑维修点【蓝伟博达笔记本维修吧】

联想笔记本电脑维修,多年从事联想笔记本的维修,我公司总结出联想leovo笔记本电脑常见故障,能准确快速判断出联想笔记本出现该故障的相应损坏部件&#xff0c;欢迎联想电脑维修 北京联想笔记本电脑主板维修。用户到店体验、免费检测、一对一维修服务、检测免费&#xff0c;修不好…