CALCUL DU PGCD DE 2 NBRES PAR SOUSTRACTION (AVEC LES CALCULES INTERMÉDIAIRES)

sibi12 Messages postés 337 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 avril 2006 - 2 janv. 2004 à 00:26
sibi12 Messages postés 337 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 avril 2006 - 2 janv. 2004 à 00:29
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/19093-calcul-du-pgcd-de-2-nbres-par-soustraction-avec-les-calcules-intermediaires

sibi12 Messages postés 337 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 avril 2006
2 janv. 2004 à 00:29
ah oui...je voulais rajouter pour ceux qui s'interesse a l'algo AKS pour les premiers que bout de code est tres interressant vu kil permet de trouver le PGCD d'un tres grand nombre et d'un petit très rapidemment

@+
sibi12 Messages postés 337 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 avril 2006
2 janv. 2004 à 00:26
Salut,


je ne connaissais pas cette algo pour les pgcd il a l'air de tendre vite vers le nombre chercher...

Seulement niveau performance ton code est pas top...

si j'ai bien compris tu dois chercher remplacer le plus grand par le reste de la division et jusqu'à ce que ce reste soit nul...l'opérateur modulo est "%"

Je trouvais cette algo tres interressant et je me suis permis de l'accélérrer de facon assez significative... le voici, il y a 3 méthode, celle presente plus haut, la mienne en c++ et la meme en ASM...les mesure sont avec :

#include <windows.h>
#include // pour utiliser les entrées et sorties cout et cin
using namespace std;

int PGCDXbY(int pp, int pg)
{
int res=1;
while (res)
{
res = pg % pp;
pg = pp;
pp = res;
};
return pg;
}
int PGCDXbYasm(int pp, int pg)
{
__asm{
mov eax, pg;
mov ebx, pp;
boucle:
xor edx,edx;
div ebx;
mov eax, ebx;
mov ebx, edx;
test edx, edx;
jne boucle;
mov pg, eax;
mov pp, ebx;
}
return pg;
}
int PGCD(int pp, int pg)
{
int res=1;
while(true) // boncle infinie (j'aurais pu faire avec un for
// ou un while "fini" )
{
res = pg-pp; // On calcule (plus grand nbr) - (le plus petit)
if (res) // si pp est différent de pg, on indique
{ // le résultat du clacul
if(res>pp) pg=res; // on change les variables celon
else if(res> a; // Entrée du 1er nombre
cout << "Entrez b : " << endl;
cin >> b; //Entrée du seconde nombre
cout << " " << endl;

if (a<b) pp=a, pg=b; // On regarde quel est le plus gd
else if (b<a) pp=b, pg=a; //nombre des 2 et on les places ds
else //deux variable pp et pg
{ pg=a, pp=b; //(pp= plus petit et pg= plus grand

cout << "\nCes deux nombres sont egaux donc " // Si les 2 nbres
<< "leurs PGCD est ce meme nombre ." << endl; // sont déjà egaux,
} // on indique que leur PGCD est ce même nombre
/*On indique le résultat*/
itération = 100
for (int j=0;j<5;j++)
{
tps=0;
for(int i=0;i<itération;i++)
{
__asm
{
rdtsc;
mov cycle,eax;
}
res=PGCD(pp, pg);
__asm
{
rdtsc;
sub eax,cycle;
add tps,eax;
}
};
tps /= itération;

cout << "Le PGCD de " << a << " et " << b << " est " << res << " en " << tps << "cycle" << endl;

tps=0;
for(int i=0;i<itération;i++)
{
__asm
{
rdtsc;
mov cycle,eax;
}
res=PGCDXbYasm(pp, pg);
__asm
{
rdtsc;
sub eax,cycle;
add tps,eax;
}
};
tps /= itération;

cout << "Le PGCD(XbY ASM) de " << a << " et " << b << " est " << res << " en " << tps << "cycle" << endl;

tps=0;
for(int i=0;i<itération;i++)
{
__asm
{
rdtsc;
mov cycle,eax;
}
res=PGCDXbY(pp, pg);
__asm
{
rdtsc;
sub eax,cycle;
add tps,eax;
}
};
tps /= itération;

cout << "Le PGCD(XbY) de " << a << " et " << b << " est " << res << " en " << tps << "cycle" << endl << endl;

};
system("pause");
return 0;
}

Voila J'espere que g pas code de connerie... il fait 5 fois chaque code pour avoir une meilleur idée des perormance à cause de la gestion d threads windows.

@+
Rejoignez-nous