【发布时间】:2016-11-19 16:07:30
【问题描述】:
我正在用 Java 编写代码来查找素数,但要找到下一个,我需要使用这个具有 8761 位数字 [P] 的素数(使用此代码找到)和一个小于给定 P 的其他素数范围,现在我正在寻找 2.5 亿距离内的素数。
问题是找到这个范围内的所有素数。使用 Erasthostenes 的筛子,我得到了从 125M(奇数)到 600 万个可能的素数,然后才变慢。但这是我所得到的。
由于 BigInteger 的 .isPrime(1) 需要 3 分钟来计算每个数字,所以当我完成此操作时,我会在大学里有孩子。
在我的代码中,我使用 P 和 PRP 之间的距离来避免使用 bigIntegers。我也将它存储在一个 .txt 中,我从中读取和写入。这是我的一小部分代码:
//Stores PRPs to List<Long> Erros = new ArrayList();
BigInteger Primo = new BigInteger("1");
while (Primo.longValueExact() <= Max){
while(Erros_Eliminados.size() < 200000){
Primo = Primo.nextProbablePrime();
BigInteger R1 = BPrimo_Dado.mod(Primo); //[BPrimo_Dado = P = 8761 Digits number]
long R = R1.longValue();
while(R <= Max){ //Max = 250000000
if(R >= Min){ //Min = 0
Erros_Eliminados.add(R);
}
R += Primo.longValue();
}
}
...
//removes the ErrosEliminados from Erros List and save it again to .txt
}
**我也对 250M 和 10 亿之间的素数使用相似的代码,以及大于 10 亿(从位列表读取),但有一些细微的变化......
所以问题是:找到那些大素数的最快方法是什么?有没有比筛子更好的方法?我对任何事情都持开放态度......
PS:这是我的第一个问题,鉴于我的问题有点奇怪,我很有可能违反了一些行为规则,比如含糊不清或类似的东西,如果是这样,请原谅我,请告诉我可以解决任何问题。
【问题讨论】:
-
欢迎来到 StackOverflow!在您等待时,请随意阅读一些问题提示。 stackoverflow.com/help/asking。如果您认为缺少某些内容,请随时 edit
-
我可能会误解您的代码,但
BigInteger R1 = BPrimo_Dado.mod(Primo);行不应该是BigInteger R1 = Primo.subtract(BPrimo_Dado.mod(Primo));吗? -
你为什么要这样做?这听起来像是 X-Y 问题。
-
R1 是 BPrimo_Dado 的 mod 或 8761 Digits prime 的 mod。 Primo 是筛子中使用的素数,如 2,3,5,7...n。
-
我这样做是因为如果我能克服时间限制,我的程序可能会找到非常大的素数。 8761 位已经相当大了...虽然不知道 X-Y 是什么意思...
标签: java primes biginteger