C++ GMP错误朴素素性算法c++;
我为RSA程序实现了以下GMP功能。基本上,程序生成随机的C++ GMP错误朴素素性算法c++;,c++,algorithm,rsa,primes,gmp,C++,Algorithm,Rsa,Primes,Gmp,我为RSA程序实现了以下GMP功能。基本上,程序生成随机的mpz*t数字,直到其中一个返回此函数的true bool isPrime(const mpz_t bignum) { mpz_t modnum; mpz_init(modnum); if(mpz_cmp_ui(bignum,4)<0 && mpz_cmp_si(bignum,0)>=0) { fprintf(stderr,"Trivially prime.\n");
mpz*t
数字,直到其中一个返回此函数的true
bool isPrime(const mpz_t bignum)
{
mpz_t modnum; mpz_init(modnum);
if(mpz_cmp_ui(bignum,4)<0 && mpz_cmp_si(bignum,0)>=0) {
fprintf(stderr,"Trivially prime.\n");
return false;
}
else if(mpz_mod_ui(modnum,bignum,2)==0)
return false;
mpz_clear(modnum);
mpz_t i,rootnum;
mpz_inits(i,modnum,rootnum,NULL);
mpz_sqrt(rootnum,bignum);
mpz_set_str(i,"3",10);
for(;mpz_cmp(rootnum,i)>0; mpz_add_ui(i,i,2)) {
mpz_mod(modnum,bignum,i);
if(mpz_cmp(modnum,i)==0)
return false;
}
mpz_clears(modnum,i,rootnum,NULL);
return true;
}
程序编译和运行没有问题。但是,生成的数字不是素数,但是isPrime()
仍然为它们返回true。有人能指出我素性测试算法中的缺陷吗?下面是我的isPrime()
函数的常规int
版本,如果您想比较:
bool isPrime(uint64_t n)
{
//waste of time
if(n < 4) {
fprintf(stderr,"Trivially prime.\n");
return true;
}
//even #, not prime
else if(n%2==0) {
return false;
}
//check if divisible by all odd #s < sqrt(n)
for(uint64_t i=3; i<(uint64_t)sqrt(n+1); i+=2) {
if(n%i==0) {
return false;
}
}
return true;
}
bool isPrime(uint64\n)
{
//浪费时间
if(n<4){
fprintf(stderr,“平凡素数”。\n”);
返回true;
}
//偶数,非素数
否则如果(n%2==0){
返回false;
}
//检查是否可被所有奇数整除#s 对于(uint64_t i=3;i错误在我的for循环中
for(;mpz_cmp(rootnum,i)>0; mpz_add_ui(i,i,2)) {
mpz_mod(modnum,bignum,i);
if(mpz_cmp(modnum,i)==0) // <-----not supposed to do if(modnum==i)
return false;
for(;mpz_cmp(rootnum,i)>0;mpz_add_ui(i,i,2)){
mpz_mod(modnum,bignum,i);
if(mpz_cmp(modnum,i)==0)//0;mpz_add_ui(i,i,2)){
mpz_mod(modnum,bignum,i);
如果(mpz_cmp_ui(modnum,0)==0)//你能给出一个输出无效的示例数吗?找到了问题。但现在你知道了:p=1977882773,q=1932673697你知道gmplib中的mpz_nextprime函数吗?选择一个你想要的随机数,然后调用mpz_nextprime来获得下一个更大的素数。gmplib也有随机数生成器,如果你想使用的话。那就是这是我没有向教授证实的,不是数学专业的。所以我只需要检查所有素数?对于后一种说法,我使用GMP生成随机数。我仔细检查了mpz_nextprime()
,对于这个特定的实例,我必须使用朴素素性测试。您所指的函数使用概率素性。
for(;mpz_cmp(rootnum,i)>0; mpz_add_ui(i,i,2)) {
mpz_mod(modnum,bignum,i);
if(mpz_cmp(modnum,i)==0) // <-----not supposed to do if(modnum==i)
return false;
for(;mpz_cmp(rootnum,i)>0; mpz_add_ui(i,i,2)) {
mpz_mod(modnum,bignum,i);
if(mpz_cmp_ui(modnum,0)==0) // <-- if bignum % modnum == 0, return false
return false;