Décomposition en facteurs premiers

Soyez le premier à donner votre avis sur cette source.

Vue 13 551 fois - Téléchargée 532 fois

Description

Encore des maths... Il permet de savoir si un nombre entier positif peut se décomposer en facteurs premier et les facteurs sont affichés (rien de très innovants)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13 -
Les maths, c'est assurément indispensable, codé correctement c'est encore mieux.
Ta boucle fait i instructions de trop.
i = 0;
do {
puissance[i] = 0;
i++;
} while(i <= 255);

traduite par compilo, elle donne:
mov edx, _puissance ;// adresse tableau
xor eax, eax ;// i = 0
doI:
mov dword ptr[edx+eax*4], 0
add eax, 1
cmp eax, 255 ;// INUTILE ET DONC NUISIBLE AUX PERFS
jbe short doI

Toujours tendre vers 0 quand on peut:
i = 255;
do {
puissance[i] = 0;
i++;
} while(--i >= 0);

donnera cette fois:
mov edx, _puissance ;// adresse tableau
mov eax, 255 ;// i = 0
doI:
mov dword ptr[edx+eax*4], 0
sub eax, 1
jns short doI

ON gagne tout net 1 comparaison par tour de boucle, pas négligeable du tout.
cs_Patrice99
Messages postés
1222
Date d'inscription
jeudi 23 août 2001
Statut
Membre
Dernière intervention
9 septembre 2018
-
Oui mais quand on fait trop d'optimisation, on devient distrait, et on oublis d'enlever i++, tout ça pour économiser 0.5 pouillème de seconde. Mieux vaux se concentrer sur la clarté du code source, et garder l'optimisation que pour les cas où on y gagne vraiment.
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13 -
Simplement du au copier/coller qu'il ne faudrait jamais faire avec du code mais ça ne retire rien à ce que j'ai dit plus haut.
"trop" d'optimisation, je ne vois même pas ce que ça veut dire.
acx01b
Messages postés
281
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
8 juillet 2014
3 -
salut

on divise n par 2 tant que l'on peut
ensuite on divise n par 2i+1 pour i variant de 1 à racine carré de n (au maximum) divisée par 2 tant que c'est possible, et surtout quand n diminue on recalcule sa racine carré

ta boucle serait alors

i = 1;
racinecarre = racinecarrede(n);
while ((i+=2) <= racinecarre) {
if (n % i == 0) {
...
n /= (i-=2);
racinecarre = racinecarrede(n);
// racinecarrede: fonction à optimiser car la version qui
// renvoie un double ne nous sert à rien
}
}
acx01b
Messages postés
281
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
8 juillet 2014
3 -
pour ce qui st de l'optimisation encore je ne sais pas si
ce n'est pas mieux:

while ((i+=2) <= racinecarre) {
if (n % i == 0) {
n /= i;
while (n % i == 0) {
compte++;
n /= i;
}
... // tu enregistres ici dans un tableau les diviseurs
compte=0;
racinecarre = racinecarrede(n);
// racinecarrede: fonction à optimiser car la version qui
// renvoie un double ne nous sert à rien
}

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.