PGCD & PPCM (Plus Grand Commun Diviseur et Plus Petit Commun Multiple)



Téléchargez le programme exemple (3.31 Ko)

L'ensemble des diviseurs communs à deux nombres entiers A et B (voir La décomposition en Facteurs Premiers) possède un plus grand élément, appelé le Plus Grand Commun Diviseur, ou PGCD de A et de B.

Prenons par exemple la décomposition des nombre 12 et 4, on a les égalités suivantes:

12 = 1 * 2 * 2 * 3
4 = 1 * 2 * 2



On en déduit que:

12 est divisible par {1, 2, 3, 4, 6 et 12} 
4 est divisible par {1, 2, et 4} 

4 est donc le Plus Grand Commun Diviseur à 12 et à 4. On note : 
4 = PGCD(12, 4)





La recherche du Plus Petit Commun multiple de deux nombres entiers A et B passe aussi par la La décomposition en Facteurs Premiers de ces 2 nombres. C'est en analysant la liste des facteurs que l'on peut calculer le plus petit commun multiple multiple ou PPCM de A et de B.

Prenons par exemple la décomposition des nombre 12 et 42, on a les égalités suivantes:

12 = 2 * 2 * 3
42 = 2 * 3 * 7



Le PPCM est égal au produit du produit des facteurs communs et des facteurs restants:

PPCM(12, 42) = 2 * 3 * 2 * 7



Le PPCM et le PGCD possèdent aussi une étonnante liaison, qui permet de les calculer plus rapidement une fois qu'on en connait un:

PPCM(A, B) * PGCD(A, B) = A * B



Calcul

Il y a plusieurs manières de calculer le PGCD et le PPCM:

La méthode qui nécessite le plus de calculs, mais la plus rapide pour l'ordinateur car elle n'utilise que des soustractions (présentée ici dans une version lisible) :

Méthode rapide

var
  a, x, y: integer;
begin
  Memo.Lines.Clear;
  x := abs(StrToInt(Edit1.Text));
  y := abs(StrToInt(Edit2.Text));
  while x <> y do
    begin
      if (x > y) then x := x - y;
      if (x < y) then y := y - x;
    end;
  Memo.Lines.Add('PGCD(' + Edit1.Text + ', ' + Edit2.Text + ') = ' + IntToStr(x));
  a := x;
  x := abs(StrToInt(Edit1.Text));
  y := abs(StrToInt(Edit2.Text));
  Memo.Lines.Add('PPCM(' + Edit1.Text + ', ' + Edit2.Text + ') = ' + IntToStr((x * y) div a));
end;



Ou l'algorithme d'Euclide, qui utilise la division (présenté ici dans une version lisible) :

Algorithme d'Euclide

var
  a, b, r: integer;
begin
  Memo.Lines.Clear;
  a := abs(StrToInt(Edit1.Text));
  b := abs(StrToInt(Edit2.Text));
  r := a mod b;
  while (r <> 0) do
    begin
      a := b;
      b := r;
      r := a mod b;
    end;
  Memo.Lines.Add('PGCD(' + Edit1.Text + ', ' + Edit2.Text + ') = ' + IntToStr(b));
  r := b;
  a := abs(StrToInt(Edit1.Text));
  b := abs(StrToInt(Edit2.Text));
  Memo.Lines.Add('PPCM(' + Edit1.Text + ', ' + Edit2.Text + ') = ' + IntToStr((a * b) div r));
end;




3 requête(s) SQL executée(s) en 0.001 Secs - Temps total de génération de la page : 0.007 Secs