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

Mathématiques Discussion :

Tester divisibilité d'un nombre de la forme 2^n-1


Sujet :

Mathématiques

  1. #1
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut Tester divisibilité d'un nombre de la forme 2^n-1
    Bonjour.

    J'aimerai savoir si il y a un moyen sioux très rapide de tester la divisibilité d'un nombre N = 2^n-1 (donc une suite de n "1" en binaire) par un autre nombre D avec n pouvant être très grand (possibilité d'utiliser une libraire pour de la précision arbitraire) et D un entier 64 bits. (ou dit autrement, tester si (2^n-1)%D == 0) .

    Merci

  2. #2
    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
    Pye,

    Ce sont des nombres de Mersennes, une petite recherche s'impose.

  3. #3
    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 droggo Voir le message
    Ce sont des nombres de Mersennes, une petite recherche s'impose.
    D'autant plus qu'on n'en connait pour l'instant qu'une 50aine. Un simple switch/case devrait suffire pour ton test.

  4. #4
    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
    Fue,
    Citation Envoyé par pseudocode Voir le message
    D'autant plus qu'on n'en connait pour l'instant qu'une 50aine. Un simple switch/case devrait suffire pour ton test.
    Ça, c'est le nombre de ceux qui sont premiers.

    De mémoire le plus grand trouvé dans ce cas correspond à n > 43 000 000, je ne sais plus précisément.

  5. #5
    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 droggo Voir le message
    Ça, c'est le nombre de ceux qui sont premiers.
    Ah oui, mince. Lu trop vite.

  6. #6
    Membre émérite
    Avatar de Franck Dernoncourt
    Homme Profil pro
    PhD student in AI @ MIT
    Inscrit en
    Avril 2010
    Messages
    894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PhD student in AI @ MIT
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 894
    Points : 2 464
    Points
    2 464
    Par défaut
    Citation Envoyé par droggo Voir le message
    De mémoire le plus grand trouvé dans ce cas correspond à n > 43 000 000, je ne sais plus précisément.
    n = 43,112,609
    http://en.wikipedia.org/wiki/Mersenn...ersenne_primes
    Bourrinés à coups de GIMPS

  7. #7
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut
    Je m'étais renseigné sur les nombres de Mersenne avant, et ce n'est pas ce que je recherche. Un nombre de Mersenne est un nombre, effectivement de la forme 2^n-1 mais où, dans la plupart des définitions que l'on trouve, n est premier.

    Mais ce qui m'intéresse est la chose suivante : à n donné (genre 1 milliard (donc 2^(10^9) ne passe bien entendu pas en mémoire), j'ai une liste de nombres D (genre 1 million de D différents) et je veux savoir le plus rapidement possible lesquels parmi ceux là divisent 2^n-1. Ma problématique n'est donc pas la même que celle des nombres de Mersenne premiers...

    Si vous avez des idées...

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Kaluza Voir le message
    à n donné (genre 1 milliard (donc 2^(10^9)
    Déjà tu as un petit problème, là

    Maintenant, qu'entends-tu par :

    Citation Envoyé par Kaluza Voir le message
    ne passe bien entendu pas en mémoire),
    J'avoue ne pas comprendre ..

    Pose correctement ton problème, stp, parce que là c'est un peu flou..

  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 Kaluza Voir le message
    Je m'étais renseigné sur les nombres de Mersenne avant, et ce n'est pas ce que je recherche. Un nombre de Mersenne est un nombre, effectivement de la forme 2^n-1 mais où, dans la plupart des définitions que l'on trouve, n est premier.

    Mais ce qui m'intéresse est la chose suivante : à n donné (genre 1 milliard (donc 2^(10^9) ne passe bien entendu pas en mémoire), j'ai une liste de nombres D (genre 1 million de D différents) et je veux savoir le plus rapidement possible lesquels parmi ceux là divisent 2^n-1. Ma problématique n'est donc pas la même que celle des nombres de Mersenne premiers...

    Si vous avez des idées...
    Tu peux construire dynamiquement un critère de divisibilité pour chacun de tes nombres D, et l'appliquer sur ton nombre Mn. Il vaut mieux travailler sur un critère en binaire vu que Mn est constitué uniquement de 1 en binaire : ca évite de devoir le représenter en mémoire.

    Cela dit, avec un "n" proche de 1 milliard, ca risque quand même de prendre plusieurs secondes pour chaque D, donc plusieurs mois de calculs au total.


    NB: et pour le fun, (2^(10^9)-1) est divisible par 5 d'après mon programme.

  10. #10
    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
    Oublié de poster le code.

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    long n=1199;       // n such as Mn = (2^n)-1 
    long d=745988807;  // divisor to test
     
    long r=1;   // r = remainder of {(BASE^i)/d}, modulo d
    long sum=0; // sum of {digit(i)*remainder(i)}, modulo d
    for(int i=0; i<n; i++, r=(r*2)%d) {
    	// all digits are "1" for Mn in base 2
    	sum = (sum + 1*r) % d;
    }
     
    System.out.printf("(2^%d)-1 = %d (mod %d)",n,sum,d);

    (2^1199)-1 = 0 (mod 745988807)

    NB : ce code peut être optimisé pour la vitesse, en particulier sur les calculs de modulo car les valeur de 'r' et 'sum' n'augmentent pas de beaucoup à chaque tour de boucle.

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/02/2007, 22h25
  2. [VBA-E] Probleme avec Nombre stocké sous forme de texte
    Par AliochaBada dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/07/2006, 01h46
  3. Facilité de tester les types de champs dans un FORM ?
    Par shadeoner dans le forum Langage
    Réponses: 5
    Dernier message: 30/03/2006, 20h49
  4. problème avec nombre au niveau forms
    Par momo9237 dans le forum Oracle
    Réponses: 2
    Dernier message: 08/11/2005, 18h22
  5. [LG]Nombres complexes et forme polaire
    Par chavernac dans le forum Langage
    Réponses: 3
    Dernier message: 28/03/2005, 18h36

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