#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
int myRandom();
int isPremier(int);
/**
main()
*/
int main(void) {
int _p, _q, _n, _indEuler;
int _e = 0;
int _d = 0;
int _flag = 0;
do {
_p = myRandom();
_q = myRandom();
} while((isPremier(_p) == 0) || (isPremier(_q) == 0) );
_n = _p * _q;
_indEuler = (_p - 1) * (_q - 1);
while( !_flag ) {
if( isPremier(_e) ) {
if( (_n % _e == 0) && (_e < _n) ) {
_e++;
} else {
// on a trouve l'exposant publique
// on sort du while
_flag = 1;
}
} else {
_e++;
}
}
_flag = 0;
// on cherche l'exposant prive
while( !_flag ) {
if( ( _e * _d - 1) % _n == 0 ) {
// on a trouve
_flag = 1;
} else
_d++;
}
printf("p = %d\n", _p);
printf("q = %d\n", _q);
printf("n = %d\n", _n);
//printf("Indice Euler = %d\n", _indEuler);
printf("e = %d\n", _e);
printf("d = %d\n", _d);
return (0);
}
/**
myRandom()
*/
int myRandom(void)
{
static int first = 0;
if (first == 0) {
srand (time (NULL));
first = 1;
}
return ( rand () % 10 );
}
/**
isPremier(int)
*/
int isPremier(int _entier) {
static int _premiers[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,
43,47,53,59,61,67,71,73,79,83,89,97};
int i, n;
double d;
/* 1 n'est pas premier */
if (_entier == 1)
{
return 0;
}
n = sizeof (_premiers) / sizeof (*_premiers);
/* D'abord on regarde si n est divisible par les nombres premiers dans le tableau */
for (i = 0; i < n; i++) {
if (_entier == _premiers[i]) {
return 1;
}
if (_entier % _premiers[i] == 0) {
return 0;
}
}
/* Ensuite, on doit regarder a partir du dernier element du tableau+2 jusqu'a sqrt(_entier)... */
d = sqrt (_entier) + 0.5; /* Le 0.5 permet de tester si c'est un carre parfait... */
i = _premiers[i-1] + 2;
while (i < d) {
if (_entier % i == 0) {
return 0;
}
i += 2;
}
return 1;
}
/**
*/
int pgcd(long _a, long _b)
{
long _dividende = labs(_a); /* le _dividende contient la valeur absolue de a */
long _diviseur = labs(_b); /* le _diviseur contient la valeur absolue de b */
long _quotient;
long _reste;
int _fin = 0;
/*
* on ne calcule le pgcd de deux nombres que s'ils sont diffŽrents de zŽro
*/
if(_a != 0 && _b != 0) {
while(!_fin) {
/* On applique la division euclidienne */
_reste = _dividende % _diviseur;
_quotient = (_dividende - _reste) / _diviseur;
/* Si le _reste est diffŽrent de 0, on continue l'algorithme */
if(_reste != 0) {
_dividende = _diviseur;
_diviseur = _reste;
}
else {
_fin = 1;
}
}
}
else {
/* Erreur ... */
_diviseur = 0;
}
return _diviseur;
}