Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GMP错误朴素素性算法c++;_C++_Algorithm_Rsa_Primes_Gmp - Fatal编程技术网

C++ GMP错误朴素素性算法c++;

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

我为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");
        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;