Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何测试1000位长的素数?_Java_Algorithm - Fatal编程技术网

Java 如何测试1000位长的素数?

Java 如何测试1000位长的素数?,java,algorithm,Java,Algorithm,我试图找出1000位数的数字是否为素数。我想使用的算法是6k+/-1 我面临的问题是如何在java中存储这么长的数字,它是以字符串作为输入的 或 对于整除性,应该只考虑数字的最后几个位数。 如果需要处理32/64位空间以外的整数,请建议使用。不知道是否有实际的限制,你需要担心。一个1000位数字使用少于350字节的BigDecimal内存。你会发现你可以处理比这个大得多的数字 你会发现的问题是,你需要检查大量的数字,大约10^31,这需要很长的时间,大约10^18年。你可以一起使用一些想法 6

我试图找出1000位数的数字是否为素数。我想使用的算法是6k+/-1 我面临的问题是如何在java中存储这么长的数字,它是以字符串作为输入的

对于整除性,应该只考虑数字的最后几个位数。</P>


如果需要处理32/64位空间以外的整数,请建议使用。不知道是否有实际的限制,你需要担心。

一个1000位数字使用少于350字节的BigDecimal内存。你会发现你可以处理比这个大得多的数字


你会发现的问题是,你需要检查大量的数字,大约10^31,这需要很长的时间,大约10^18年。

你可以一起使用一些想法

  • 6k+/-1算法
  • 检查除数是否小于sqrt(素数)
  • 检查仅除以素数
结合这些方法,您可以大大加快验证速度

此链接可以帮助您:


当然要使用BigInteger。

6k+/-1不是素数测试!如果你已经知道Q是素数(甚至更大) 知道它的形式是6k+/-1告诉你它是否“安全”——即 Q+1和Q-1都有较大的因子,使得Q更难被因子化(因此对于加密目的来说是“安全的”)。但表格6k+/-1中的大多数数字都是复合的

如果您想编写自己的例程来测试1000位数字的素性,那么您应该像其他答案所建议的那样使用BigInteger类。你可以用费马 首先测试,它会告诉你这个数字是“绝对复合”还是“可能是素数”。 然后,您可以使用计算更密集的测试,如Miller Rabin或Solovay Strassen 关于最终确定测试的“可能素数”


如果足以确定一个数字是否可能是素数,则可以使用内置函数

  • 如果调用返回true,则该数字为素数的概率超过(1-1/(2^确定性))
  • 如果呼叫返回false,则该号码肯定不是素数

在基数2和基数3中应使用a和a。如果这三个都给出了可能素数的结果,那么出于所有实际的原因,你应该考虑它。这个测试没有已知的反例。如果您必须生成素性证书,则可以使用,但速度会非常慢。

如果您不喜欢概率方法,也可以使用


但是,除非有神在玩弄运气,拉你的后腿或其他什么,否则你可能应该使用概率方法,这会更快。

如果你不想寻找一种可编程的方法,你也许应该问一下

f、 x: “175417963415175253817696597433408585811164204614256364837827967是素数吗?”

返回:
“175417963415175253817696597433408585811164204614256364837827967是一个素数!”

我想你可以用大整数来表示真正的大数

但是,有一点您应该注意,格式为6k+1的所有数字都是素数。比如说

when k=341,
6k +1 = 6(341) +1 = 2046 + 1= 2047

Now 2047 can be divided by 23 like so

2047/23 = 89 

因此,在生成素数时使用它可能不太好

您有CPU能力这样做吗?这不是一个简单的任务。您可能想考虑使用已经存在的软件来执行这个计算。如果你能避免,重新发明轮子是没有意义的,而且之前存在的软件很可能会比你自己发明的更好。6k+/-1会告诉你它是否不是快速启动的,或者它是否可能是启动的。示例:k=6,35不是素数。然而,723==3(mod 6)很快被确定为不是素数。如果n=+-1(mod 6),您仍然需要一个prime测试。请注意,Java的isProbablePrime(int)使用Miller/Rabin-和Lucas/Lehmer算法。@Bart:这在哪里有文档记录?@JasonS-在函数源代码上方的注释中提到:)@xkcd-这不是文档记录。(实际上,您刚刚回复了一条六年半的评论?)您必须查看依赖于实现的源代码才能看到它。(例如,还有私有的
passesMillerRabin
passesLucasLehmer
methods.Hmmm。我是唯一一个发现BigInteger的可能素数方法的javadoc没有包含使用哪种算法的文档的人吗?@Jason-为什么会让你感到不安?javadoc的目的是帮助使用API的开发者知道如何使用它,而不是公开内部的实现细节。详细信息在源代码中有非常清楚的说明。该函数工作得非常好,速度也很快,我将它与gcd()一起使用对一个存储了两个大整数的有理数类不断进行因子运算,从而生成一个具有无限精度的有理数。它总是足够快,可以执行一些相当大的计算——即使是对由两个大有理数组成的虚数组成的两个小矩阵进行运算——大多数运算仍然几乎是瞬时的从用户的角度来看,它调用包私有方法
primetotocertainty(int确定性,Random随机)
,然后使用
passesmillerabin(rounds,Random)
passesLucasLehmer();
。这应该会给你一些线索:)所有大于3的prime的形式都是6k+/-1。你是正确的,这不是一个测试的素性,但它是一个有效的,合理的快速测试对素性。如果(p-1)%6!0和(p+1)%6!=0则该数字不是素数。是的,它会产生很多误报,但不会产生任何误报。