Précédent   Forum des professionnels en informatique > Autres langages > Algorithmes > Mathématiques
Mathématiques Forum d'entraide sur les mathématiques et l'algorithmique numérique. Avant de poster : Cours d'algorithmique numérique
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/01/2012, 14h26   #1
Membre du Club
 
Homme
Doctorant en Astrophysique
Inscription : mars 2009
Messages : 234
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : mars 2009
Messages : 234
Points : 49
Points : 49
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
Kaluza est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 18h54   #2
Expert Confirmé
 
Inscription : août 2006
Messages : 3 195
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 195
Points : 3 342
Points : 3 342
Pye,

Ce sont des nombres de Mersennes, une petite recherche s'impose.
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/01/2012, 00h24   #3
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 419
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 39
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : décembre 2006
Messages : 9 419
Points : 14 125
Points : 14 125
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.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2012, 04h16   #4
Expert Confirmé
 
Inscription : août 2006
Messages : 3 195
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 195
Points : 3 342
Points : 3 342
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.
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2012, 11h45   #5
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 419
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 39
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : décembre 2006
Messages : 9 419
Points : 14 125
Points : 14 125
Citation:
Envoyé par droggo Voir le message
Ça, c'est le nombre de ceux qui sont premiers.
Ah oui, mince. Lu trop vite.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2012, 12h53   #6
Modérateur
 
Avatar de Franck Dernoncourt
 
Homme Franck Dernoncourt
Chercheur en informatique
Inscription : avril 2010
Messages : 807
Détails du profil
Informations personnelles :
Nom : Homme Franck Dernoncourt
Âge : 24
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : avril 2010
Messages : 807
Points : 2 407
Points : 2 407
Envoyer un message via ICQ à Franck Dernoncourt Envoyer un message via AIM à Franck Dernoncourt Envoyer un message via MSN à Franck Dernoncourt Envoyer un message via Yahoo à Franck Dernoncourt Envoyer un message via Skype™ à Franck Dernoncourt
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
Franck Dernoncourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 00h57   #7
Membre du Club
 
Homme
Doctorant en Astrophysique
Inscription : mars 2009
Messages : 234
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : mars 2009
Messages : 234
Points : 49
Points : 49
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...
Kaluza est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 11h31   #8
Expert Confirmé Sénior
 
Inscription : janvier 2007
Messages : 8 740
Détails du profil
Informations personnelles :
Âge : 54

Informations forums :
Inscription : janvier 2007
Messages : 8 740
Points : 9 974
Points : 9 974
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..
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java

Je ne réponds pas aux MP techniques
souviron34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 14h13   #9
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 419
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 39
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : décembre 2006
Messages : 9 419
Points : 14 125
Points : 14 125
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.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2012, 12h56   #10
Rédacteur/Modérateur
 
Avatar de pseudocode
 
Homme Xavier Philippeau
Architecte système
Inscription : décembre 2006
Messages : 9 419
Détails du profil
Informations personnelles :
Nom : Homme Xavier Philippeau
Âge : 39
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : décembre 2006
Messages : 9 419
Points : 14 125
Points : 14 125
Oublié de poster le code.

Code java :
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.
__________________
ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.
pseudocode est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h15.


 
 
 
 
Partenaires

Hébergement Web