强素数生成流程:
随机生成强素数算法流程如下:
(1)本文中以500 以内素数作为初始素数数组,在素数数组中随机选取一个素数h1。
(2)随机生成一个1~9 的整数x,结合第一步得到的素数h1,计算2ah1+1,a的取值从x开始逐渐加一,利用素数判断函数得到第一个出现的素数,记为h2。
(3)随机生成一个1~9 的整数y,计算2bh2+1,b 的取值从y开始逐渐加一,利用素数判断函数得到第一个出现的素数,记为h3。
(4)令P=2h3- 1,使用素数判断函数确定P 是否为素数,如果P并不是素数就执行(3),反之就执行(5)。
(5)输出P,P为生成的强素数值。
传入p为随机生成的1-512的素数,返回即为强素数,但就测试来看,p较小时确实实现了素数增强,大约扩大了8倍,但就测试来看直接生成较大位素数和素数增强的耗时几乎相同,甚至更快。当对256位素数或更大位数的素数进行增强的时候,耗时更久且有越界可能性,出现各种各样的错误,不太实用,有待改进。
public BigInteger gj(BigInteger p){
//1
Random r = new Random();
int x = r.nextInt(9)+1;
int y = r.nextInt(9)+1;
BigInteger h2 = null;
BigInteger h3 = null;
BigInteger P = BigInteger.valueOf(500);
h2 = p.multiply(BigInteger.valueOf(2*x)).add(BigInteger.valueOf(1));
while (!h2.isProbablePrime(256)) {
x++;
h2 = p.multiply(BigInteger.valueOf(2*x)).add(BigInteger.valueOf(1));
}
h3 = h2.multiply(BigInteger.valueOf(2*y)).add(BigInteger.valueOf(1));
while (!P.isProbablePrime(256)){
while (!h3.isProbablePrime(256)) {
y--;
h3 = p.multiply(BigInteger.valueOf(2*x)).add(BigInteger.valueOf(1));
}
P = h3.multiply(BigInteger.valueOf(2)).subtract(BigInteger.valueOf(1));
}
// while (!h3.isProbablePrime(256)) {
// y--;
// h3 = p.multiply(BigInteger.valueOf(2*x)).add(BigInteger.valueOf(1));
// }
// P = h3.multiply(BigInteger.valueOf(2)).subtract(BigInteger.valueOf(1));
return P;
//
}