我试图找出数字是否为1000或更长的素数。我想使用的算法是6k +/- 1
我面临的问题是如何在java中存储这么长的数字,它是以字符串作为输入。
或
为了做可分性,应该只考虑数字的最后几位数。
请告知
答案 0 :(得分:12)
如果足以确定数字是否为PROBABLY prime,则可以使用内置的isProbablePrime函数
答案 1 :(得分:10)
您应该在基数2和3中使用Lucas pseudoprime test和Rabin-Miller strong pseudoprime test。如果所有三个都给出可能是素数的结果,那么出于所有实际原因,您应该考虑就这样。此测试没有已知的反例。如果你必须生成素数证书,那么你可以使用elliptic curve primality prover,但速度会慢得多。
答案 2 :(得分:7)
如果需要在32/64位空间之外处理整数,则应使用BigInteger。不知道你需要担心的是否存在实际限制。
答案 3 :(得分:4)
答案 4 :(得分:3)
6k +/- 1不是素性测试!如果你已经知道Q是素数(也就是更高 比7),知道它是6k +/- 1的形式告诉你它是否“安全” - 那 Q + 1和Q-1都有很大的因素,使得Q更难以因素(因此对于加密目的而言是“安全的”)。但是6k +/- 1形式的大多数数字都是复合数。
"Safe Prime" page from Wikipedia
如果想编写自己的例程来测试1000位数字的素数,你会想要像其他答案所建议的那样使用BigInteger类。你可以使用费马 先测试,它会告诉你这个数字是“绝对复合”还是“可能是素数”。 然后,您可以使用像Miller-Rabin或Solovay-Strassen这样的计算密集型测试 关于最终确定性测试的“可能是素数”数字。
答案 5 :(得分:2)
1000位数字使用BigDecimal少于350字节的内存。你会发现你可以处理比这大得多的数字。
你会发现问题是你需要检查很多的数字,大约10 ^ 31这需要很长时间,大约10 ^ 18年。
答案 6 :(得分:1)
如果您不喜欢概率方法,也可以使用deterministic polynomial algorithm。
但是,除非神灵正在冒险并拉扯你的腿或什么东西,你应该只使用更快的概率方法。
答案 7 :(得分:0)
你可以使用一些想法。
结合这些方法可以加快验证速度。
此链接可以帮助您: http://www.osix.net/modules/article/?id=791
当然使用BigInteger。
答案 8 :(得分:0)
如果你不寻找可编程方法,你应该问wolframalpha
F.X: “是1754179634151752538176965974334085811645204614256364837827967一个素数”
返回: “1754179634151752538176965974334085811645204614256364837827967是一个素数!”
答案 9 :(得分:0)
我认为您可以将BigInteger用于很大的数字。
但是,您应该注意一件事,所有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
因此生成质数时可能不太好使用