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

时间:2016-11-23 12:12:49

标签: java 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类时,没有任何反应。没有错误没有什么。我的终端只是空白。有谁知道为什么?或者任何人都可以看到这些代码是否适用于他们的机器我知道我可能在这里错过了一些愚蠢的东西。感谢

3 个答案:

答案 0 :(得分:4)

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

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);
    }
}

答案 1 :(得分:2)

如果您愿意使用512位数,并且您想随机获取它并希望它将是一个素数。你会发现你的解决方案没有成功。这太大的价值,无法处理太多的可能性。即使您将BigInteger构造函数与certainty一起使用。就像这样:

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

java doc说的地方:

  

certainty - 衡量来电者愿意容忍的不确定因素。新BigInteger表示素数的概率将超过(1 - 1 /(2 确定性))。

您制作的certainty越大,该数字不是素数的可能性就越小。

仍然无法帮助你。你可以考虑在下一个素数时只考虑下一个质数,如果@OlivierGrégoire建议或者只是减少位数,那么它就不是素数。

答案 2 :(得分:0)

新BigInteger的最大bitLength值非常大。如果将其减少到较小的数量,它将起作用。我指的是下面代码中的值512。试试像12这样的小号。

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