PortailAccueilFAQRechercherCalendrierS'enregistrerMembresGroupesConnexion

Partagez | 
 

 Algorithme d'Euclide

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Admin
Admin


Masculin
Nombre de messages : 138
Age : 30
Date d'inscription : 02/09/2006

MessageSujet: Algorithme d'Euclide   Mer 13 Sep - 5:20

Voici une implementation tres simple de l'algorithme d'Euclide Etendu. L'algorithme consiste a trouver pour 2 entiers a et b , 2 autres entiers x et y tels que ax + by = pgcd(a,b). Cette formule est utile en cryptographie RSA, pour la generation de cle de decryptage pour une cle de cryptage E donnee

Code:
int find_pgcd(int a , int b)
{
    if(a==0)
        return b;
    if(a<b)
        return find_pgcd(b%a,a);
    else
        return find_pgcd(a%b,b);
}
 
void algorithme_euclide_ex(int a , int b, int* x, int* y)
{
    /******************************************************
    *
    * objectif : retourner x et y tels que
    *                ax + by = pgcd(a,b);
    *                avec a <= b
    *******************************************************/
 
        // posons y1 = -y
 
    int x1,y1;
    int x2,y2;
    int x3,y3;
    int status;
    int reste;
    int quotient;
 
    int pgcd;
    char positionChangeante;
 
    x1 = y1 = 0;
    x2 = y2 = 0;
    x3 = y3 = 0;
 
    //reordonnons a et b
    if(a>b)
    {
        a ^= b;
        b ^= a;
        a ^= b;
    }
    // a ce niveau a est inferieur ou egal a b
    pgcd = find_pgcd(a,b);
   
    reste        = b%a;
    quotient    = b/a;
 
    status = 1;    //prochaine mise a jour , les variables x1 , et y1;
 
        //on se met a la position bx + ay1 [ notre but c (ax + by1) <= positionChangeante = 0]
    positionChangeante = 1;
 
        //tant que l'on progresse vers la decouverte du pgcd de a et b sans atteindre 0 comme reste
    while((reste!=pgcd) && (reste!=0))
    {
        switch(status)
        {
            case 1://mise a jour des variables x1 , et y1;
                if(!x1)// il s'agit de la premiere mise a jour des variables x1 et y1
                {
                    x1 = 1;
                    y1 = quotient;
                }
                else
                {
                    x1 = x2 + quotient*y3;
                    y1 = quotient*x3 + y2;
                }
                status = 2;//prochaine mise a jour , les variables x2 , et y2;
                break;
 
            case 2://mise a jour des variables x2 , et y2;
                if(!x2)// il s'agit de la premiere mise a jour des variables x2 et y2
                {
                    x2 = 1+quotient*y1;
                    y2 = quotient;
                }
                else
                {
                    x2 = x3 + quotient*y1;
                    y2 = quotient*x1 + y3;
                }
                status = 3;//prochaine mise a jour , les variables x3 , et y3;
                break;
 
            case 3://mise a jour des variables x3 , et y3;
               
                x3 = x1 + quotient*y2;
                y3 = quotient*x2 + y1;
                status = 1;//prochaine mise a jour , les variables x1 , et y1;
                break;
        }
        // les prochains operateurs : a et b seront , le b%a et a
        b = a;
        a = reste;
        reste = b%a;
        quotient = b/a;
        positionChangeante = !positionChangeante;//on change la position des coefficients
    }
 
    if(status == 1) // si on sort avant la mise a jour de x1 et y1
    {
        if(!x1)//on est pas entre dans la boucle
        {
            if(b%a==0)// cas de a et b / a divise b
            {
                *x = 1;
                *y = 0;
            }
            else        // cas de b%a = pgcd(a,b)
            {
                *x = -1;
                *y = -1;
            }
        }
        else    //execute le calcul des variables x1, y1 mais dans *x et *y
        {
            *x = x2 + quotient*y3;
            *y = quotient*x3 + y2;
        }
    }
 
    else if(status == 2)    //execute le calcul des variables x2, y2
    {
        *x = x3 + quotient*y1;
        *y = quotient*x1 + y3;
    }
    else if(status == 3) //execute le calcul des variables x3, y3
    {
        *x = x1 + quotient*y2;
        *y = quotient*x2 + y1;
    }
 
    //si on est arrive a un changement de position , intervertir les coefficients
    if(positionChangeante && x1)
    {
        *x ^= *y;
        *y ^= *x;
        *x ^= *y;
    }
 
        // a ce niveau *y contient y1 / y1 = -y <=> *y = -y
        *y = 0 - *y; // reajuste y , ce qui donne *y = y
}
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://design.jeun.fr
 
Algorithme d'Euclide
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Algorithme d'évolution progressive d'une variable
» algorithme de classement
» [Résolu] Pathfinding Algorithme A* - exemple exe gmk
» Créé un installeur...pérféctionné !
» space ship sprite generator

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
DESIGN STUDIO FORUM :: programmation :: C,C++-
Sauter vers: