我正在研究一种完全同态加密方案,需要生成非常大的素数(即200位或更多),目前我们的方法是我们程序中最大的瓶颈。我们正在使用Shoup的NTL库,我们引用的项目使用了相同的库,并且运行时间更快。
下面的函数用于选择随机素数Q0,使得lowLimit< Q0<限制。函数RandomPrime来自NTL,它需要一个特定数量的位,你的返回素数需要以二进制表示,所以我使用了另一个库函数PickRandom,它返回一个随机整数,然后我用这个整数来确定素数的位数。
这是迄今为止我们最大的运行时间瓶颈。是否有人熟悉NTL或任何其他更有效的素数生成方法?
ZZ chooseQ0(const ZZ &lowLimit, const long &lambda, const ZZ &productOfPrimes){
ZZ prime, limit, Two, i, Q0, temp, s, last, temp2;
Two = 2;
long bits;
long err = 10;
limit = power(Two, pow(lambda, 5))/productOfPrimes;
cout << "Q0 limit: " << limit << endl;
srand(time(NULL));
s = rand()%100;
SetSeed(s);
RePick:
temp = PickRandom(limit);
if(temp <= lowLimit){
cout << "Repicked Q0-1" << endl;
goto RePick;
}
cout << "Q0 Random Number: " << temp << endl;
redo:
bits = NumBits(temp);
RandomPrime(temp2, bits, err);
if(temp2 <= lowLimit || temp2 > limit){
cout << "Repicked Q0-2" << endl;
goto RePick;
}
cout<< "Q0: " << temp2<< endl;
return temp2;
}