Trouver les diviseurs d'un nombre entier

Soyez le premier à donner votre avis sur cette source.

Vue 36 310 fois - Téléchargée 1 151 fois


Description

suite a ce topic :

http://www.delphifr.com/infomsg_COMMENT-TROUVER-DIVISEUR-NOMBRE-ENTIER_1063338.aspx#3

Voici un petit programme pour trouver TOUT les diviseurs d'un nombre entier (1 et le nombre lui même inclus).

Ce programme mets en pratique une fonctions totalement optimisé (aprés on attaque l'assembleur)
qui permet de trouver les diviseurs trés rapidement ... trop ?

indications sur la fenetre du prog :

Cycles : nombres de cycles CPU ecoulés entre le debut et la fin de la fonction
Temps : temps en millisecondes ecoulés entre le debut et la fun de la fonction
Diviseurs : nombre de diviseurs trouvés (ou signalement d'un nombre premier pour la fonction optimisée)

utilisation :

choisissez un nombre entre 1 et 2 147 483 648
puis cliquez sur le bouton "give me all!" pour lancer le calcul, partez pas! c'est deja finit :)

Conclusion :


Inutile donc indispensable.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

f0xi
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26 -
J'ai oublier de preciser qu'on peu renomer le fichier fmd.ex_ en fmd.exe pour ceux qui desire avoir la version compilée (non delphiistes).
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
Tiens, une source de notre renard préferé, ok elle est pourrie ...

En tout cas ça fait logntemps que l' on a pas de tes nouvelles!

Alors oui, la 2eme fonction est légèrement plus rapide, mais léger ... lol
Je mets 10/10 pour t' encourager à améliorer encore cela :)

A+
Debiars
Messages postés
285
Date d'inscription
lundi 16 juin 2003
Statut
Membre
Dernière intervention
11 février 2018
-
J'aurais aimé avoir quelques commentaires m'expliquant le pourquoi et le comment de la vitesse d'exécution de la fonction optimisée.
Après force recherches, je vous livre le résultat de mes investigations.
Pour faciliter, appelons A la fonction "simpliste" telle que j'aurais pû l'écrire moi-même et B la fonction sophistiquée et optimisée à la Foxi.
Au premier rabord, on pourrait penser que B met deux fois moins de temps que A, vu que l'on divise le nombre testé par deux, en stockant à la fois le diviseur et le quotient,ce qui nous donnerait 26168 ms pour A et 13410 ms pour B. Que nenni, B met 0 ms. Diantre, me dis-je.
En faisant tourner à vide les deux boucles while, j'arrive effectivement à ce résultat. J'en déduis donc que ça se passe à l'intérieur de la boucle. C'est alors que je découvre le petit "break" exécuté quand le diviseur est plus grand que le quotient.
En examinant le résultat de l'opération (1152 chiffres), on constate que le nombre de boucles entre deux chiffres pour trouver la première moitié des diviseurs, varie entre 1 et 318, contre 318 et 432432000 pour la deuxième moitié.
Conclusion : la fonction B effectue 29568 boucles contre 86486400 pour la fonction A. Génial.
Néanmoins, mon cher Foxi, tu aurais pû supprimer ceci :

if (NPrime and $1) = 1 then
PassMax := (NPrime+1) div 2
else
PassMax := NPrime div 2;

et remplacer
while DivisorA <= PassMax do
par while DivisorA <= NPrime do

ce qui ne change rien au résultat puisque de toute façon tu breakes avant d'arriver à PassMax, et cela aurait évité de m'embrouiller la comprenette.
cruchacode
Messages postés
11
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
22 février 2012
-
Gestion de la mémoire : tu peux agrandir les tableaux par incrément de 10... et redimensionner en sortie
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
Je suis tout à fait d' accord avec Debiars: ça manque cruellement d' explications!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.