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

Algorithmes et structures de données Discussion :

Algorithme quand tu nous tiens : conditions logiques


Sujet :

Algorithmes et structures de données

  1. #1
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut Algorithme quand tu nous tiens : conditions logiques
    Bonjour,

    je suis en train de ramer sur les conditions logiques. Je demande à l'utilisateur d'entrer deux nombres a et b tant que le PGCD(a,26) est différent de 1 et que l'inverse modulaire de a par 26 est égal à -1 (retour d'erreur).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      //Initialisation de la clé
      do{
        printf("Entrez la valeur \'a\' de la clef : ");
        scanf("%d",&a);
        printf("Entrez la valeur \'b\' de la clef : ");
        scanf("%d",&b);
      }while ((PGCD(a,26) != 1) && (inv_mod(a) == -1));
      printf("Clef validee ! \n");
    Ça à l'air tout simple, mais mon programme bug à cause de l'inverse modulaire un peu plus loin. Si ça bug, ça veut dire qu'il laisse passer des valeurs a et b non acceptables par la suite. J'ai beau faire des tables de vérité mais je ne trouve pas mon erreur.

    Y aurait-il une âme charitable pour m'aider?

    Merci d'avance

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 192
    Points : 231
    Points
    231
    Par défaut
    Avec ton code, la clé est jugée bonne si a et 26 sont premiers entre eux, ou si l'inverse modulaire de a ne renvoie pas -1 (ou les deux).
    C'est ce que tu veux ?
    Si la clé est bonne à condition que a et 26 soient premiers ET que inv_mod(a)!=-1, la condition est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while ((pgcd(a,26)!=1) || (inv_mod(a)==-1))

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Juste une remarque : b n'est pas utilisé dans le code!!!

  4. #4
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Il faut que les deux propositions soient respectées:
    -PGCD(a,26) ==1
    -inverse modulaire(a) != -1 (retour d'erreur de la fonction)

    Pourquoi le "ou"?

    Le b c'est normal, je m'en sers plus tard, mais il n'y a aucune vérification à faire dessus.

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    Citation Envoyé par v4np13
    Pourquoi le "ou"?
    regarde ce que tu veux : tu veux avoir "pgcd(a,26)==1 ET inv(a) !=-1)

    donc tu boucls tant que cette condition n'est pas verifiée, cad qu'il suffit que l'une des 2 ne soit pas verifiée pour que le a soit mauvais. donc il faut tourner tant que : "pgdc(a,26)!=1 OU inv(a)==-1"

  6. #6
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Je viens de tester avec le "ou", effectivement ça fonctionne mais il n'accepte plus aucune valeur à part 1 pour a. Est-ce normal?

    La fonction PGCD, je suis sur de son algorithme mais celle de l'inverse modulaire, je ne sais pas. Le prof nous a passé une fonction "bête et méchante" comme il dit pour le faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /**
     * Retourne l'inverse modulaire, en cas d'erreur -1
     */
    int inv_mod(int a){
      int i;
      for (i=0;i<26;i++){
        if (a*(i%26) ==1) return i;
      }
      return -1;
    }
    J'ai trouvé un de ses anciens slides de cours, où il donnait la clé K(15,7). Elle devrait marcher mais non ?!

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    essaie de remplacer :

    par

  8. #8
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    au passage, il y a mieux pour calculer l'inverse.. pour 26, a la limite, tu peux meme stocker outes les valeurs dans un tableau en les precalculant..

  9. #9
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Youpii !!!

    Ca marche !! Un gros merci pour le coup de pouce Je n'aurai jamais trouvé, on trouve peu d'informations sur l'inverse modulaire avec Google, même sur le forum, on n'en parle pratiquement pas.

    Encore merci et bonnes fêtes à vous

  10. #10
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    pour info : l'inverse d'un nombre se trouve en utilisant des calculs de PGCD successifs : on appelle cela l'algorithme d'euclide etendu. si a et 25 sont premier entre eux, on trouve u et v tels que :
    (identité de Bezout)
    et donc, a*u=1-25*v==1 modulo 25, donc u est l'inverse de a.

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

Discussions similaires

  1. [AJAX] Ajax quand tu nous tiens
    Par Florent08800 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/08/2007, 22h38
  2. [FRAME] Quand tu nous tiens
    Par hisy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 07/07/2006, 09h27
  3. [Sessions] Session quand tu nous tiens
    Par arti2004 dans le forum Langage
    Réponses: 10
    Dernier message: 27/05/2006, 20h19
  4. Regex quand tu nous tiens !!!
    Par calimero642 dans le forum Langage
    Réponses: 9
    Dernier message: 22/03/2006, 15h33
  5. [object HTMLSelectElement] IE quand tu nous tiens
    Par NeHuS dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/03/2006, 09h26

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