Java 如何测试1000位长的素数?
我试图找出1000位数的数字是否为素数。我想使用的算法是6k+/-1 我面临的问题是如何在java中存储这么长的数字,它是以字符串作为输入的 或Java 如何测试1000位长的素数?,java,algorithm,Java,Algorithm,我试图找出1000位数的数字是否为素数。我想使用的算法是6k+/-1 我面临的问题是如何在java中存储这么长的数字,它是以字符串作为输入的 或 对于整除性,应该只考虑数字的最后几个位数。 如果需要处理32/64位空间以外的整数,请建议使用。不知道是否有实际的限制,你需要担心。一个1000位数字使用少于350字节的BigDecimal内存。你会发现你可以处理比这个大得多的数字 你会发现的问题是,你需要检查大量的数字,大约10^31,这需要很长的时间,大约10^18年。你可以一起使用一些想法 6
对于整除性,应该只考虑数字的最后几个位数。</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,则该号码肯定不是素数
但是,除非有神在玩弄运气,拉你的后腿或其他什么,否则你可能应该使用概率方法,这会更快。如果你不想寻找一种可编程的方法,你也许应该问一下 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则该数字不是素数。是的,它会产生很多误报,但不会产生任何误报。