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 :

generateur de nombre premier


Sujet :

Algorithmes et structures de données

  1. #21
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 949
    Points : 730
    Points
    730
    Par défaut
    voila mes algo, je paut aps encore les tester, je les corrigerait si jamais ils sont faux :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    /*
     * fait passer le test de miller  rabbin a la variable
     * <a href="http://fr.wikipedia.org/wiki/Test_de_primalit%C3%A9_de_Miller-Rabin" target="_blank">http://fr.wikipedia.org/wiki/Test_de...e_Miller-Rabin</a>
     */
    bool encrypt::miller_rabbin(long n) //n doit toujours etre pair
    { 
     long d;
     d = n -1;
     long s;
     s = 0;
     while ( d % 2 == 0 ) {
      d = x/2; 
      s++;
     }
     //arrivé ici, on a :   n - 1 = 2^s * d
     //maintenant, on va tester k fois si le nombre est premier
     int k = 10;
     int aleatoire;
     long r;
     for (i = 0; i < k; i++) {
      //on prend un nombre aléatoire compris entre 1 et var-1 
      aleatoire = rand() % ( n - 1 );
      if ( pow(aleatoire, d) % n != 1 )
       return false;
      for (r = 0; r < s; r++) {
       if ( pox(aleatoire, ( 2 * r * d ) ) % n != -1)
        return false;
      }  
     }
     //si le chiffre a passé tous les tests, alors i l est probablement premier.
     return true;  
    }
    /*
     * fait passer le test de primalitée de fermat
     * <a href="http://fr.wikipedia.org/wiki/Test_de_primalit%C3%A9_de_Fermat" target="_blank">http://fr.wikipedia.org/wiki/Test_de...3%A9_de_Fermat</a>
     */
    bool encrypt::Fermat(long n)
    {
      int tabPrem[4];
      tabPrem[0] = 1;
      tabPrem[1] = pow(2, n - 1);
      tabPrem[2] = pow(3, n - 1);
      tabPrem[3] = pow(5, n - 1);
      tabPrem[4] = pow(7, n - 1);
     
      int i, j;
      int x;
      for (i = 0; i < 5; i++) {  // on  parcouir le tableau tabPrem
       x = 0;
      while ( tabPrem[i] > x ) {
       if ( tabPrem[i] == x*n ) { 
        break;
       x++;
      }
      if ( x != 1 )
       return false;
      }
      //si le chiffre a passé tous les tests, alors on peut renvoyer vrai => il est probablement premier.
      return true;  
    }

  2. #22
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Citation Envoyé par j.p.mignot
    Dans mon code j'initialise
    j=0;
    k=1;ce qui est juste.
    j=0 car le 1er nombre premier déclaré est 2
    (premier[0]=2) est les nombres paires sont évincés de la recherche
    ( raison de k += 2)
    on donne premier[1]=3 pour que la boucle commence correctement. <si non la 1er itération invoque un rang non encore calculé> Cela doit être innutile si on limite non pas a k2= sqrt(k) +1 comme je l'ai fait par pridence mais à la vraie limite k2=Trunc( sqrt(k)).
    Pour le reste le code tourne correctement. Vérifiez vous-même!
    à chaque valeur de i on teste au plus le nommbre de nombre premiers < sqrt(i) ce qui n'est pas énorme. Bien sur je ne dis pas que cela soit parfait!
    Sur mon PC trouver tous les nombres 1er <= 10'000 prends entre 0.5 et 1 sec.
    Justement, je viens de vérifier pour être certain de ce que je dis et la sortie est comme je le pensais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    2
    5
    7
    9
    11
    13
    17
    19
    21
    Le problème est que l'on commence les comparaisons avec premier[1] (normal, tester la parité est inutile) et que la boucle est exécutée au moins une fois. La première itération divise donc 3 par 3, c'est pas premier on continue... sans incrémenter j. On trouve ensuite 5 premier, j passe à 1 et premier[1] devient 5. A partir de là les multiple de 3 ne sont plus éliminés.

    On a au moins besoin de commencer avec j=1, ou alors il faut un while standard pour la boucle interne. Et autant partir avec k=3, comme ça on teste de suite 5 mais je chipotte.

  3. #23
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 949
    Points : 730
    Points
    730
    Par défaut dsl...
    arf, encore un pb :
    http://fr.wikipedia.org/wiki/Rivest_Shamir_Adleman

    que signifie ce genre de notation :
    1 (mod (x) )
    le mod(x) ici signifie quoi? pas modulo quand meme?

  4. #24
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    SI 1 mod x, c'est bien modulo X. En particulier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    a = 1 mod x signifie Il existe n entier tel que a = n*x + 1 
    autre notation : a = 1[x]
    ( vivement la balise latex ).

    Pour l'implémentation de tes algos quelques petits trucs me chiffonent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while ( d % 2 == 0 ) {
      d = x/2; 
      s++;
     }
    D'ou vient ce x ? je suppose qu'il s'agit de d

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    aleatoire = rand() % ( n - 1 );
    cela génére un nombre entre 0 et n-2. Il faut rajouter 1 si tu veux assurer l'intervalle [1,n-1]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ( pow(aleatoire, d) % n != 1 )
    C'est correct en tant qu'algorithme naif, mais je crians que ca ne marche aps bien en realité ( précision des doubles, enorme calcul à faire ). Implémente plutot une exponentiation modulaire ( http://fr.wikipedia.org/wiki/Exponentiation_modulaire ).
    Cela te sera de toute facon utile pour tous les calculs sur les entiers modulo quelquechose.

  5. #25
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Effectivement un bug dans le sof. désolé...
    la correction donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       premier[0]=2;
       premier[1]=3;
       j=1;
       k=3;
    je corrige le post d'origine.
    merci d'avoir signlé cette erreur d'initialisation
    sivrit note
    mais je chipotte
    ce n'est pas vrai! il y avait un bug ruinant le résultat!

  6. #26
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 949
    Points : 730
    Points
    730
    Par défaut
    merci zul, je prend note

    ps : le x, ca doit etre ca, j'ai renommé mes variables pour etre en coprrespondance avec celles données dans wikipedia

  7. #27
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 949
    Points : 730
    Points
    730
    Par défaut
    je rajoute un lien vers un site decrivant la norme ANSI X9

    http://www.rsasecurity.com/rsalabs/node.asp?id=2306

    j'ai pas tout lut, mais, y'a des choses interressantes comme ca par exemple

    edit : correction du lien :'(

  8. #28
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 950
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 950
    Points : 5 667
    Points
    5 667
    Par défaut
    Gia,
    Citation Envoyé par hansaplast Voir le message
    lol, c'est pour une action de BTS, les profs n'y verrons que du feu, et, surtout, je rpesenterait mon soft sur un celeron... qui rame sous win 98 (et qui a deja ete reformaté 4 fois depuis le debut de l'année scholaire...)
    Arrête de prendre tes profs pour des billes, et tu feras du travail un peu plus sérieux, ce qui te conduira à mieux comprendre ce que tu fais, et pourquoi.

    Au passage, un effort sur l'orthographe ne ferait de mal à personne.

  9. #29
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Pour Droggo...
    Est ce que tu as vu que la discussion date de 2006 ? Presque vieille de deux ans
    Mais sinon tu as raison dans ta réponse...

  10. #30
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 950
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 950
    Points : 5 667
    Points
    5 667
    Par défaut
    Gio,
    Citation Envoyé par ToTo13 Voir le message
    Pour Droggo...
    Est ce que tu as vu que la discussion date de 2006 ? Presque vieille de deux ans
    Mais sinon tu as raison dans ta réponse...
    Non, je n'avais pas remarqué, car les propos que j'ai cités sont de ceux qui m'énervent fortement.

    Et puis, après tout, le sujet a été remonté !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. generateur de nombre premier
    Par hansaplast dans le forum C++
    Réponses: 3
    Dernier message: 24/04/2006, 12h29
  2. [défi n°8]: premiers nombres premiers
    Par javatwister dans le forum Général JavaScript
    Réponses: 41
    Dernier message: 14/06/2005, 10h22
  3. [LG]Calcul des 15 premiers nombres premiers
    Par yffick dans le forum Langage
    Réponses: 12
    Dernier message: 18/09/2004, 14h57
  4. Cripter avec des nombres premiers
    Par clovis dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 14/04/2004, 19h10
  5. premier nombre premier superieur à m=10^100+1
    Par azman0101 dans le forum Mathématiques
    Réponses: 4
    Dernier message: 17/04/2003, 03h23

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