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 动态schema_在hibernate中动态切换Schema

/p>"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">上面的代码部分&#xff0c;就指定了Schema.如果在操作的时候想切换Schema.操作如下&#xff1a;默认的配置POI_BEIJING上面的映射文件改为&#xff1a;/p>"http://hibernate.source…

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…

jsch mysql_java JDBC 连接MySql

Java连接数据库(以MySQL为例)2007-04-05 02:23 这篇文章主要以MySQL为例讲下Java如何连接到数据库的。当然&#xff0c;首先要安装有JDK(一般是JDK1.5.X)。然后安装MySQL&#xff0c;这些都比较简单&#xff0c;具体过程就不说了。配置好这两个环境后&#xff0c;下载…

linux java 环境配置_linux下java开发环境配置

jdk1 下载jdk:jdk-6u22-linux-i586.bin2 增加可执行权限:chmod x jdk-6u22-linux-i586.bin3 复制到/usr下sudo cp jdk-6u22-linux-i586.bin /usr4 执行./jdk-6u22-linux-i586.bin5 设置环境变量vi ~/.bashrc在最后加入:#set java enviromentexport JAVA_HOME/usr/jdk1.6.0_22ex…

java阻塞锁_java – 阻止锁与非阻塞锁

以下是Java Concurrency in Practice关于该主题的内容&#xff1a;The JVM can implement blocking either via spin-waiting (repeatedlytrying to acquire the lock until it succeeds) or bysuspending theblocked thread through the operating system. Which is more effi…

python内存管理机制_python内存管理机制

python内存管理机制:引用计数垃圾回收(引用计数&#xff0c;标记清除&#xff0c;分带回收)内存池1. 引用计数当一个python对象被引用时 其引用计数增加 1 ; 当其不再被变量引用时 引用计数减 1 ; 当对象引用计数等于 0 时, 对象被删除(引用计数是一种非常高效的内存管理机制)增…

java 大文件下载_Java大文件下载不全问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼各位同学好&#xff0c;目前碰到一个问题&#xff0c;Java平台下载大文件下载一部分就结束不能全部下载&#xff0c;有可能是网络问题造成下载中断&#xff0c;请问大家有什么解决办法吗&#xff0c;或者有遇到类似问题的一起讨论一…

java告警系统设计_告警系统的设计

现在告警系统可以说是系统的必备部分&#xff0c;只要有监控&#xff0c;就需要一个告警系统来帮忙主动推送消息&#xff0c;以此减少人不停的主动查看监控的作用。在最初的告警系统中&#xff0c;基本主要就是设置阈值&#xff0c;达到阈值就发生告警。这个在机器数量少的时候…

java 接口和虚构_深入理解Java的接口和抽象类

深入理解Java的接口和抽象类对于面向对象编程来说&#xff0c;抽象是它的一大特征之一。在Java中&#xff0c;可以通过两种形式来体现OOP的抽象&#xff1a;接口和抽象类。这两者有太多相似的地方&#xff0c;又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用…

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

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

Java 接受reactjs数据_ReactJS:从API获取数据

我在使用简单的标准模板获取API数据的React应用程序中从API获取数据时遇到了困难 . 控制台日志返回的结果是空白数组 .import React, {Component} from react;import ./App.css;import Chart from ./components/chartconst API_URL "http://ergast.com/api/f1/2016/1/res…

java 串的顺序存储_算法入门之串的顺序存储表示

串&#xff0c;即字符串。计算机上的非数值处理的对象基本上是字符串数据。但是&#xff0c;由于现在我们使用的计算机硬件结构主要是反映数值计算的需要的&#xff0c;在处理字符串数据时比处理整数和浮点数要复杂的多。而且&#xff0c;对于不同类型程序&#xff0c;所处理的…

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

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

华为java8_Java8 Stream

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

c++ mysql 配置文件_C++操作数据库写入到json配置文件中

1. 这次加了对int和varchar的处理#include #include #include #include #include "json/json.h"#include #include using namespace std;int main(int argc, char* argv[]){MYSQL mysql;mysql_init( &mysql );mysql_real_connect(&mysql,"192.168.16.11…

求最长单调子序列java,单调减子序列(java实现)

题目&#xff1a;从一个由N个整数排列组成的整数序列中&#xff0c;自左向右不连续的选出一组整数&#xff0c;可以组成一个单调减小的子序列(如从{68 69 54 64 68 64 70 67 78 62 98 87}中我们可以选取出{69 68 64 62}这个子序列&#xff1b;当然&#xff0c;这里还有很多其他…

php输出12个月,php获取12个月内的开始时间和结束时间

$currentTime time();$cyear floor(date("Y",$currentTime));$cMonth floor(date("m",$currentTime));for($i0;$i<6;$i){$nMonth $cMonth-$i;$cyear $nMonth 0 ? ($cyear-1) : $cyear;$nMonth $nMonth < 0 ? 12$nMonth : $nMonth;$date $c…

java打开输入框,java – 在Android中打开输入对话框

我想在某个点打开一个输入对话框,我可以在其输入后存储和使用它.我在互联网上找到的所有例子都非常先进,我想它们并不像我想要的那样简单 – 我只需要类似于Java的东西&#xff1a;String name JOptionPane.showInputDialog("Enter your name");保留输入以供以后计算…

php 编译原理,编译原理

编译原理是计算机科学中历史最悠久&#xff0c;也是最高度发展的学科之一。编译器的设计与实现集中体现了计算机科学中的最核心的思想和技术&#xff0c;并且和计算机科学的其他研究领域&#xff0c;如形式语言与自动机、算法、数据结构、程序设计语言、计算机体系结构、软件工…