IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Algorithme d'Euclide etendu


Sujet :

C

  1. #1
    Nouveau membre du Club Avatar de YASIR
    Profil pro
    Inscrit en
    Février 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 101
    Points : 25
    Points
    25
    Par défaut Algorithme d'Euclide etendu
    Bonsoir

    je cherche à coder une petite fonction qui grâce à l'algorithme d'euclide etendu, me donne l'inverse modulo M d'un entier...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    /**********************************************************/
    /**********************euclide etendu**********************/
    /*********************************************************/
     
     
    int euclide(int w,int m){
     
     
        int t0=0,t=1;
        int q;
        int r=w-q*m;
        int tmp;
     
     
            printf("\n\nEntrer W : ");
            scanf("%d",&w);
            printf("\nEntrer M (tous les calculs sont faits MOD M) : ");
            scanf("%d",&m);
     
        do{
            tmp=t0-q*t;
            if (tmp>=0) {
                        tmp=tmp % w;
                        }
    		else {
                 tmp = w-(-tmp % w);
                 }
    		t0=t;
    		t=tmp;
    		w=m;
    		m=r;
    		r=w-q*m;
        }
        while(r>0);
     
        if (m!=1) {
                   printf("%d n'a pas d'inverse modulo %d\n\n",m,w);
                   }
    	else 
        printf ("%d -1 MOD %d = %d",m,w,t);
    }
    j'ai fait ca à partir de l'algorithme pure mais il ya une erreur au niveau du

    if (m!=1) car il me donne toujours que ca n'a pas d'inverse modulo...

    L'algo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
    algo d'euclide etendu
     
    no := n
    bo := b
    to := 0
    t := 1
    q := nombre entier immédiatement inférieur ou égal à no / bo
    r := no - q • bo
    Tant que r > 0 faire
       Début
          temp := to - q • t
          Si temp 0 alors temp := temp mod n, sinon temp := n - ((-temp) mod n)
          to := t
          t := temp
          no := bo
          bo := r
          q := nombre entier immédiatement inférieur ou égal à no / bo
          r := no - q • bo
       Fin
    Si bo 1 alors b n'a pas d'inverse modulo n, sinon b-1 mod n = t
    Voila merci beaucoup si quelqu'un peut m'aider ou ne serait-ce que me pister!

  2. #2
    Membre habitué Avatar de bobmidou
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 121
    Points : 149
    Points
    149
    Par défaut
    Salut

    tu as juste oublié qq affaires
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    void euclide(int w,int m);
     
    void main(void)
    {
         int i,j;
         printf("\n\nEntrer W : ");
         scanf("%d",&i);
         printf("\nEntrer M (tous les calculs sont faits MOD M) : ");
         scanf("%d",&j);
         euclide(i,j);
    }
     
    void euclide(int w,int m)
    {
         int ww = w;
         int mm = m;
         int t0 = 0;
         int t = 1;
         int q = (int) mm/ww;
         int r = mm - q * ww;
         int tmp = 0;
     
       while(r > 0)
       {
            tmp = t0 - q * t;
     
            if (tmp >= 0)
    	 {
                  tmp = tmp % m;
             }
             else
             {
                 tmp = m - ((-tmp) % m);
             }
     
    	 t0 = t;
    	 t = tmp;
    	 mm = ww;
    	 ww = r;
    	 q = (int) mm/ww;
    	 r = mm - q * ww;
        }
     
        if (ww!=1)
        {
    	printf("%d   n'a pas d'inverse modulo   %d\n\n",w,m);
        }
        else 
           printf ("L'inverse de %d  MOD  %d  =  %d\n ",w,m,t);
    }
    désolé j'ai foutu de la merde dans ton code

    Bonne chance

  3. #3
    Nouveau membre du Club Avatar de YASIR
    Profil pro
    Inscrit en
    Février 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 101
    Points : 25
    Points
    25
    Par défaut
    Comment ca tu as foutu la merde ?
    Tu ne sais pas ce que tu as fait ?

  4. #4
    Nouveau membre du Club Avatar de YASIR
    Profil pro
    Inscrit en
    Février 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 101
    Points : 25
    Points
    25
    Par défaut
    de toute facon j'ai trouvé

    fallait changer une portion de code et remplacer par cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            int d=m,i=1,res;
            while((d+1)%n!=0){
                     i++;
                     d=m*i;
                     res=(d+1)/n;

  5. #5
    Membre habitué Avatar de bobmidou
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 121
    Points : 149
    Points
    149
    Par défaut
    je rigole

    au lieu de w et m j ai mis ww mm

  6. #6
    Nouveau membre du Club Avatar de YASIR
    Profil pro
    Inscrit en
    Février 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 101
    Points : 25
    Points
    25
    Par défaut
    Ce n'est pas grave lol j'ai fini par trouver une autre solution

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Algorithme d'euclide étendu
    Par eldiablo7 dans le forum Scheme
    Réponses: 1
    Dernier message: 25/10/2009, 10h11
  2. Algorithme d'Euclide et "plus grand commun diviseur"
    Par Jerome Briot dans le forum Téléchargez
    Réponses: 0
    Dernier message: 04/09/2009, 18h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo