如何测试1000位数的素数?

时间:2009-08-15 16:38:27

标签: java algorithm

我试图找出数字是否为1000或更长的素数。我想使用的算法是6k +/- 1

我面临的问题是如何在java中存储这么长的数字,它是以字符串作为输入。

为了做可分性,应该只考虑数字的最后几位数。

请告知

10 个答案:

答案 0 :(得分:12)

如果足以确定数字是否为PROBABLY prime,则可以使用内置的isProbablePrime函数

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

答案 1 :(得分:10)

您应该在基数2和3中使用Lucas pseudoprime testRabin-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这样的计算密集型测试 关于最终确定性测试的“可能是素数”数字。

Primality testing algorithms from Wikipedia

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

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

但是,除非神灵正在冒险并拉扯你的腿或什么东西,你应该只使用更快的概率方法。

答案 7 :(得分:0)

你可以使用一些想法。

  • 算法6k +/- 1
  • 检查直到除数小于sqrt(素数)
  • 仅按素数进行检查

结合这些方法可以加快验证速度。

此链接可以帮助您: 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 

因此生成质数时可能不太好使用