【问题标题】:Find big primes numbers (~8000 Digits) in a given range在给定范围内查找大素数(~8000 位)
【发布时间】: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


【解决方案1】:

BigInteger 类可以为您生成大素数:BigInteger.probablePrime(),还可以找到下一个素数:BigInteger.nextProbablePrime()

【讨论】:

  • 是的,但是这个尺寸的素数需要很长时间。我测试了它,但在我放弃之前我什至无法得到结果......
  • 我怀疑你能不能写出更快的代码。测试大数字可能会很慢,这就是使用 Miller-Rabin 等方法的原因。
  • @BarriaKarl:查看BigInteger.nextProbablePrime() 的源代码。它先对埃拉托色尼进行筛分,然后是米勒拉宾。如果您可以在 Java 中做得更好,那么 Oracle 希望拥有您的代码。
  • 刚刚再次检查,615 分钟使用 .nextProbablePrime() 找到一个素数。所以不会发生...
猜你喜欢
  • 1970-01-01
  • 2020-10-03
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
相关资源
最近更新 更多