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

Probabilités Discussion :

Test de primalité Miller-Rabin


Sujet :

Probabilités

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 30
    Points : 36
    Points
    36
    Par défaut Test de primalité Miller-Rabin
    Bonjour,

    Dans le cadre d'une recherche de nombres premiers je me suis inspiré de cette page :

    http://rosettacode.org/wiki/Miller-Rabin_primality_test

    en utilisant le code C#.

    Hors j'ai la surprise de ne trouver que quelques nombres :

    5 - 7 - 11 - 13 - 17 - 97 - 193 - 257 - 641 - 5581
    5953 - 7937 - 8681 - 8929 - 27905

    Et en plus le dernier n'est même pas premier !

    Est-ce que l'implémentation est incorrecte ? Je n'arrive pas à trouver la faille...

    Merci...

  2. #2
    Membre actif
    Inscrit en
    Mars 2008
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 209
    Points : 227
    Points
    227
    Par défaut
    il suffisait de lire c'est un teste probabiliste !!!

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 30
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par benDelphic Voir le message
    il suffisait de lire c'est un teste probabiliste !!!
    Ca je l'avais lu mais étant donné le nombre de tests internes la probabilité d'avoir un faux premier est infime et je devrais par contre obtenir tous les premiers, ce qui est très très loin d'être le cas

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par bestmomo Voir le message
    Hors j'ai la surprise de ne trouver que quelques nombres :

    5 - 7 - 11 - 13 - 17 - 97 - 193 - 257 - 641 - 5581
    5953 - 7937 - 8681 - 8929 - 27905

    Et en plus le dernier n'est même pas premier !

    Est-ce que l'implémentation est incorrecte ? Je n'arrive pas à trouver la faille...
    Que certains nombres ne soient pas premier, c'est normal (c'est un test probabiliste). Par contre, il ne devrait pas en manquer.

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Salut,

    le code en python semble fonctionner (pas tous vérifié mais la liste est beaucoup plus longue que celle que tu trouves et 27905 ne fait pas parti des résultats trouvés).

    Vérifie le code c#, ou refait le code à partir de l'algorithme, il n'est pas très compliqué.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 30
    Points : 36
    Points
    36
    Par défaut
    Merci pour les réponses, j'ai effectivement réécrit le code en partant de l'algo proposé :

    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
     
            bool isPrime(int n, int k)
            {
                if (n == 2) return true; 
                else if (n < 2 || n % 2 == 0) return false;
                int d = n - 1;
                int s = 0;
                while (d % 2 == 0)
                {
                    d /= 2;
                    s++;
                }
                while (k-- > 0)
                {
                    int a = new Random().Next(n - 3) + 2;
                    int x = (int)((Math.Pow((double)a, (double)d))) % n;
                    if (x != 1 && x != n - 1)
                    {
                        for (int r = 1; r < s; r++)
                        {
                            x = (x * x) % n;
                            if (x == 1) return false;
                            if (x == n - 1) break;
                        }
                        if(x != n - 1)return false;
                    }
                }
                return true;
            }
    Mais je continue à ne pas avoir tous les premiers listés. Je fais un test des nombres jusqu'à 10000 et j'obtiens ça (avec k = 40) :

    3
    5
    7
    11
    13
    17
    19
    29
    41
    49
    97
    193
    257
    641
    769
    5581
    5953
    7937
    8681
    8929

    Mais j'ai peut-être un bug dans mon code

  7. #7
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Cette ligne là :

    int x = (int)((Math.Pow((double)a, (double)d))) % n;
    provoque un dépassement de capacité et de précision. Il vaut mieux effectuer le calcul par exponentiation binaire.

    int x = modpow(a,d,n)
    (exemple de code en java)

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int modpow(int base, int exp, int m) {
    	int result = 1;
    	while (exp > 0) {
    		if ((exp & 1) > 0)
    			result = (result * base) % m;
    		exp >>= 1;
    		base = (base * base) % m;
    	}
    	return result;
    }

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 30
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Cette ligne là :



    provoque un dépassement de capacité et de précision. Il vaut mieux effectuer le calcul par exponentiation binaire.



    (exemple de code en java)

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int modpow(int base, int exp, int m) {
    	int result = 1;
    	while (exp > 0) {
    		if ((exp & 1) > 0)
    			result = (result * base) % m;
    		exp >>= 1;
    		base = (base * base) % m;
    	}
    	return result;
    }
    Merci !

    Cette ligne ne me plaisait pas vraiment mais je ne pensais pas qu'elle créait le problème

  9. #9
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par bestmomo Voir le message
    Merci !

    Cette ligne ne me plaisait pas vraiment mais je ne pensais pas qu'elle créait le problème
    Faire des calculs en virgule flottante au milieu de calculs sur les entiers, ca se termine généralement par ce genre de problème. :/

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 30
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Faire des calculs en virgule flottante au milieu de calculs sur les entiers, ca se termine généralement par ce genre de problème. :/
    Oui effectivement, je serai plus attentif à l'avenir. Il est quand même malheureux de retrouver du code aussi détestable sur une page wiki.

  11. #11
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par bestmomo Voir le message
    Oui effectivement, je serai plus attentif à l'avenir. Il est quand même malheureux de retrouver du code aussi détestable sur une page wiki.
    c'est une page "rosettacode". Pas une page "wikipedia".

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

Discussions similaires

  1. Test de primalité.
    Par kaari kosaku dans le forum Mathématiques
    Réponses: 1
    Dernier message: 27/04/2009, 11h14
  2. Test de primalité
    Par le marocain dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 23/10/2007, 10h26
  3. [débutant] test de primalité
    Par grand_prophete dans le forum C
    Réponses: 14
    Dernier message: 08/10/2006, 12h32
  4. tests de primalité
    Par 123quatre dans le forum C
    Réponses: 2
    Dernier message: 20/12/2005, 09h55
  5. [Algo] Test de primalité
    Par Khorne dans le forum Mathématiques
    Réponses: 10
    Dernier message: 04/04/2004, 10h30

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