Programme pour nombre parfait
Fermé
mounirovic
Messages postés
21
Date d'inscription
dimanche 23 octobre 2005
Statut
Membre
Dernière intervention
17 mars 2009
-
13 janv. 2008 à 19:12
med - 10 déc. 2012 à 12:52
med - 10 déc. 2012 à 12:52
A voir également:
- Nombre parfait en python
- Python est introuvable. exúcutez sans argument pour procúder ó l - Forum Python
- Citizen code python avis - Accueil - Outils
- En raison d'un nombre important d'échec de connexion snapchat - Forum Snapchat
- \R python ✓ - Forum Python
- Nombre facile - Télécharger - Outils professionnels
12 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
20 sept. 2011 à 12:14
20 sept. 2011 à 12:14
Comme tout le monde y va régulièrement de son petit code, je vais y mettre mon grain de sel parce qu'au final tout le monde fait plus ou moins pareil : une boucle de 1 à n/2 (voire de 1 à n) et on calcule à la fin la somme des diviseurs pour comparer avec n.
Pourtant il y a au moins deux méthodes pour faire mieux :
1) si au cours du calcul la somme des diviseurs dépasse déjà n, ce n'est pas la peine de continuer ! Du coup il est intéressant de calculer les plus grand diviseurs en premier.
Exemple avec n=12 dont les diviseurs sont 1, 2, 3, 4 et 6. En commençant par la fin on fait la somme 6+4+3=13, on est déjà supérieur à 12 donc ce n'est pas nécessaire de calculer les diviseurs 2 et 1 pour savoir que 12 n'est pas parfait !
2) si k est un diviseur de n, alors n/k en est également un autre (2 divise 12 donc 6 aussi) donc au lieu d'aller chercher des diviseurs jusqu'à n/2 on peut s'arrêter à sqrt(n).
On parcourt donc uniquement les diviseurs inférieurs à sqrt(n), ce qui fait des calculs avec de "petits" diviseurs, et lorsqu'on a trouvé un diviseur k, on ajoute k ET n/k, ce qui fait qu'on ajoute bien les plus grands diviseurs en premier (k petit --> n/k grand)
Exemple avec n=12, on part de la somme à 1 puisque c'est toujours un diviseur, on fait le calcul avec 2 qui est un diviseur on ajoute donc à la somme 2 ET 6(=12/2), et après on fait le test sur 3 et on rajoute 3 ET 4(=12/3) et on s'arrête d'une part parce que la somme est déjà supérieure à 12 et d'autre part parce que la racine de 12 est 3,46 et qu'on ne va pas au delà (sinon on compterait une deuxième fois le 4 !)
Attention : si k==sqrt(n)==n/k il ne faut bien sûr compter le diviseur qu'une seule fois !
À quoi ça sert d'autant s'embêter ? Par exemple pour savoir si 137438691328 est un nombre parfait, en s'arrêtant à n/2 vous allez faire 69 milliards de calculs n%k alors qu'en vous arrêtant à sqrt(n) vous n'allez en faire "que" 371 millions (ce qui se fait en 1 seconde)
Ces allègements des calculs se feront surtout ressentir si vous cherchez TOUS les nombres parfaits sur un intervalle donné. Par exemple pour chercher les nombres parfaits entre 1 et 100 000, en s'arrêtant à n/2 vous ferez 2.5 milliards de calculs contre 21 millions en s'arrêtant à sqrt(n)...
Pourtant il y a au moins deux méthodes pour faire mieux :
1) si au cours du calcul la somme des diviseurs dépasse déjà n, ce n'est pas la peine de continuer ! Du coup il est intéressant de calculer les plus grand diviseurs en premier.
Exemple avec n=12 dont les diviseurs sont 1, 2, 3, 4 et 6. En commençant par la fin on fait la somme 6+4+3=13, on est déjà supérieur à 12 donc ce n'est pas nécessaire de calculer les diviseurs 2 et 1 pour savoir que 12 n'est pas parfait !
2) si k est un diviseur de n, alors n/k en est également un autre (2 divise 12 donc 6 aussi) donc au lieu d'aller chercher des diviseurs jusqu'à n/2 on peut s'arrêter à sqrt(n).
On parcourt donc uniquement les diviseurs inférieurs à sqrt(n), ce qui fait des calculs avec de "petits" diviseurs, et lorsqu'on a trouvé un diviseur k, on ajoute k ET n/k, ce qui fait qu'on ajoute bien les plus grands diviseurs en premier (k petit --> n/k grand)
Exemple avec n=12, on part de la somme à 1 puisque c'est toujours un diviseur, on fait le calcul avec 2 qui est un diviseur on ajoute donc à la somme 2 ET 6(=12/2), et après on fait le test sur 3 et on rajoute 3 ET 4(=12/3) et on s'arrête d'une part parce que la somme est déjà supérieure à 12 et d'autre part parce que la racine de 12 est 3,46 et qu'on ne va pas au delà (sinon on compterait une deuxième fois le 4 !)
Attention : si k==sqrt(n)==n/k il ne faut bien sûr compter le diviseur qu'une seule fois !
À quoi ça sert d'autant s'embêter ? Par exemple pour savoir si 137438691328 est un nombre parfait, en s'arrêtant à n/2 vous allez faire 69 milliards de calculs n%k alors qu'en vous arrêtant à sqrt(n) vous n'allez en faire "que" 371 millions (ce qui se fait en 1 seconde)
Ces allègements des calculs se feront surtout ressentir si vous cherchez TOUS les nombres parfaits sur un intervalle donné. Par exemple pour chercher les nombres parfaits entre 1 et 100 000, en s'arrêtant à n/2 vous ferez 2.5 milliards de calculs contre 21 millions en s'arrêtant à sqrt(n)...
30 déc. 2011 à 14:13
30 déc. 2011 à 18:50