FONCTION ITÉRATIVE(TRÈS RAPIDE) POUR TROUVER LE PGCD ET LE PPCM [TOUT COMPILATE

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 2 mars 2003 à 22:29
cs_nEUrOne Messages postés 41 Date d'inscription dimanche 17 novembre 2002 Statut Membre Dernière intervention 14 avril 2004 - 3 mars 2003 à 13:14
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/10495-fonction-iterative-tres-rapide-pour-trouver-le-pgcd-et-le-ppcm-tout-compilateur

cs_nEUrOne Messages postés 41 Date d'inscription dimanche 17 novembre 2002 Statut Membre Dernière intervention 14 avril 2004
3 mars 2003 à 13:14
BruNews: y'a pas un moyen d'enlever le modulo ?
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 mars 2003 à 23:36
Et une derniere forme en 64 bits pour varier.
typedef unsigned _int64 _ui64_;

_ui64_ Pgcd(_ui64_ nbr1, _ui64_ nbr2) // plus grand commun diviseur
{
_ui64_ tmp;
if(!nbr1 || !nbr2) return 0xFFFFFFFFFFFFFFFF; // si erreur
if(nbr1 < nbr2) {tmp nbr1; nbr1 nbr2; nbr2 = tmp;}
for(;;) {
if((tmp nbr1 % nbr2) 0) return nbr2;
nbr1 nbr2; nbr2 tmp;
}
}
ciao...
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 mars 2003 à 23:26
DWORD __stdcall euclid(DWORD x, DWORD y)
{
DWORD t;
if(!x || !y) return 0xFFFFFFFF;
do {
if(x < y) {
t x; x y; y = t;
}
x -= y;
} while(x);
return y;
}

ou en + meticuleux

__declspec (naked) DWORD __stdcall euclid(DWORD x, DWORD y)
{
__asm {
mov ecx, [esp+4] ; x
mov eax, [esp+8] ; y
or ecx, ecx
jz short euclERR
or eax, eax
jz short euclERR
euclNEXT:
cmp ecx, eax
mov edx, eax
jae short noswap
mov eax, ecx
mov ecx, edx
noswap:
sub ecx, eax
jnz short euclNEXT
ret 8
euclERR:
or eax, -1
ret 8
}
}
et d'autres versions a la pelle. Recursion n'est pas a bannir, mais faut toujours regarder si pas moyen de l'enlever.
ciao...
TheBabyCool Messages postés 34 Date d'inscription dimanche 2 septembre 2001 Statut Membre Dernière intervention 4 mars 2003
2 mars 2003 à 23:00
???
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 mars 2003 à 22:29
Supprime recursivite et vitesse *= 2 au moins.
ciao...
Rejoignez-nous