Тест первичности Миллера-Рабина дает неправильный ответ

Я пытаюсь сделать алгоритм RSA. Для этого мне нужен rabin-miller + свидетель + модульное возведение в степень (по крайней мере, я должен это использовать). Проблема возникает, когда я генерирую случайные числа, чтобы проверить с помощью rabin miller, являются ли они простыми числами, и в результате не простые числа являются простыми для алгоритма rabin-miller. Может ли кто-нибудь помочь мне увидеть, где я терплю неудачу?
Заранее спасибо.

int mod_exp(int a, int b, int n){

int d = 1,i,j=0;
int binary[15];
for(i=0;i<=15;i++){
binary[i] = -1;
}
i=0;
do{
binary[i]=(b%2);

if((b%2)==1)
b=(b-1)/2;
else
b=b/2;
i++;
}while(b!=0);

do{
d= (d*d)%n;
if(binary[i]==1)
d=(d*a)%n;
i--;
}while(i!=-1);
return d;

}

bool wittness(int a, int n){
int u=n-1,k=0;
long x, temp;
while(u%2== 0 ){
u=u/2;
k++;
}
x=mod_exp(a,u,n);
for(int i=1;i<=k;i++){
temp=x;
cout<< "primera x:"<<x<<endl;
x=long(x*x)%n;
cout<< "segunda x:"<<x<<endl;
if(x==1 && temp!=1 && temp != n-1)
return true;

}
if(x!=1)
return true;
return false;

}bool miller_rabin(int n, int s){

int a,j;
srand(time(NULL));

for(j = 0; j<=s;j++){

a=rand()%s+1;
if(!wittness(a,n))
return false;
}
return true;
}

0

Решение

Я не просмотрел весь код, но ваша функция mod_exp определенно неверна. Два выражения (d*d)%n а также (d*a)%n оба подвержены переполнению, и если произойдет переполнение, вы получите неверный результат.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]