繁体   English   中英

运行我的代码[BigInteger]没有任何反应

[英]Nothing happens when running my code [BigInteger]

所以我有一个可以计算两个素数的类,然后检查它们是否为素数

import java.util.*;
import java.math.*;

public class GeneratePrime{

  public static BigInteger calculatePPrime() {
    BigInteger pRandom;
    while (true) {
      pRandom = new BigInteger(512, new Random());
      pRandom = pRandom.setBit(0); 
      if(isPrime(pRandom)){
        System.out.println("Got Random Prime P: "+pRandom);
        break;
      }
    }
    return pRandom;
  }

  public static BigInteger calculateQPrime() {
    BigInteger qRandom;
    while(true){
      qRandom = new BigInteger(512, new Random());
      if(isPrime(qRandom)){
        System.out.println("Got Random Prime Q: "+qRandom);
        break;
      }
    }
    return qRandom;
  }

  public static boolean isPrime(BigInteger number) {
    if (!number.isProbablePrime(5))
        return false;

    BigInteger two = new BigInteger("2");
    if (!two.equals(number) && BigInteger.ZERO.equals(number.mod(two)))
        return false;

    for (BigInteger i = new BigInteger("3"); i.multiply(i).compareTo(number) < 1; i = i.add(two)) {
        if (BigInteger.ZERO.equals(number.mod(i)))
            return false;
    }
    return true;
  }
}

这或多或少是我在互联网上发现的东西的综合体。 此类最初不使用任何BigIntegers,但是后来我发现我必须使用它进行分配,因此我必须抓紧所有内容并执行此操作。

无论如何。 我无法使用任何内置函数来计算素数(即使有,也可以使用idk)。 我的问题是,当我在以下位置运行此代码时:

import java.util.*;
import java.math.*;

public class RSA{
    public static void main(String[] args) {
        BigInteger p, q;
        GeneratePrime gp = new GeneratePrime();
        p = gp.calculatePPrime();
        q = gp.calculateQPrime();
    }
}

两个类都可以正常编译,但是当我运行RSA类时,什么也没发生。 没有错误就没有。 我的终端只是空白。 有人知道为什么吗? 还是有人可以看到此代码是否在他们的计算机上工作? 我知道我可能在这里错过了一些愚蠢的东西。 谢谢

您想获得随机素数吗? 然后在代码中明确说明:

public BigInteger randomPrime(int bits, Random random) {
  return new BigInteger(bits, random).nextProbablePrime();
  // or
  // return BigInteger.probablePrime(bits, random);
}

在这种情况下,请使用您可以使用的方法: nextProbablePrime() 这种方法比您编写的方法集要高效得多。 这将大大提高您的应用程序。

然后,您的RSA类可以成为:

import java.util.*;
import java.math.*;

public class RSA{
    public static void main(String[] args) {
        BigInteger p, q;
        GeneratePrime gp = new GeneratePrime();
        Random random = new Random();
        int bits = 512;
        p = gp.randomPrime(bits, random);
        q = gp.randomPrime(bits, random);
    }
}

如果您愿意使用512位数字,并且希望随机获得它,并希望它是素数。 您的解决方案将不会成功。 这是太大的价值,无法用太多的可能性来处理。 即使可以certainty使用BigInteger构造函数。像这样:

new BigInteger(int bitLength, int certainty, Random random);

Java文档说:

certainty -呼叫者愿意容忍的不certainty的度量。 新的BigInteger表示质数的概率将超过(1-1 /(2 确定性 ))。

certainty越大,该数字不是素数的概率就越小。

仍然不会帮助您。 如果随机数不是@OlivierGrégoire建议的质数,或者只是减少位数,则可以考虑只取下一个质数。

新的BigInteger的最大bitLength的值非常大。 如果将其减少到较小的数目,它将起作用。 我指的是下面的代码中的值512。 尝试使用12之类的小数字。

pRandom = new BigInteger(512, new Random());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM