Il s'agit d'un programme purement de math : soit n et p deux entiers. Le programme cherche à detreminer un entier m tel que n*m = 1 mod p.
Source / Exemple :
#include <stdio.h>
#include <stdlib.h>
long int minimum(long int a0,long int b0)
{
if (a0<b0)
{return a0;}
else
return b0;
}
long int maximum(long int a1,long int b1)
{
if (a1>b1)
{return a1;}
else
return b1;
}
long int premier_entre_eux(long int a2,long int b2)
{
long int r1, r2,rt;
r1=minimum(a2,b2);
r2=maximum(a2,b2);
while(rt>1)
{
rt=r1 % r2;
if (rt<0)
rt+=r2;
r1=r2;
r2=rt;
}
if (rt==1)
{return 1;}
else
return 0;
}
long int bezout(long int a3, long int b3)
{
long int coeffs1, coeffs2, coeffst, r1, r2, rt;
if (premier_entre_eux(a3,b3)==0)
{return 0;}
else
{
coeffs1=1; coeffs2=0;
r1=minimum(a3,b3);
r2=maximum(a3,b3);
rt=r1 % r2;
while (rt>1)
{
rt=r1 % r2;
if (rt<0)
rt+=r2;
coeffst=coeffs1-(r1/r2)*coeffs2;
coeffs1=coeffs2;
coeffs2=coeffst;
r1=r2;
r2=rt;
}
}
return(coeffs2);
}
long int inverse(long int a4,long int m)
{
long int result, a5;
a5= a4 % m;
result=bezout(a5,m);
result=result % m;
if (result<0)
result+=m;
return result;
}
void main()
{
long int nb, p;
printf("\nNombre a inverser : ");
scanf("%d",&nb);
printf("Le modulo: ");
scanf("%d",&p);
if (inverse(nb,p)==0)
{printf("Probléme : %d et %d ne sont pas premiers entre eux.\n", nb,p);}
else
printf("\n\nL'inverse de %d modulo %d est %d.\n", nb,p,inverse(nb,p));
system("pause");
}
Conclusion :
Eviter les nombres supérieurs à 2^31.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.