Artigo original: Euclidian Algorithm: GCD (Greatest Common Divisor) Explained with C++ and Java Examples

Para tratarmos deste assunto, primeiramente, é preciso conhecer a respeito do máximo divisor comum (MDC ou GCD – no inglês, Greatest Common Divisor) e da operação MOD (de módulo).

Máximo divisor comum (MDC ou GCD)

O MDC de dois ou mais números inteiros é o maior número inteiro que divide es números anteriormente mencionados de tal modo que o resto da divisão é zero.

Exemplo:
O MDC de 20 e 30 é 10  (10 é o maior número que divide 20 e 30 com o resto 0)
O MDC de 42, 120, 285 = 3  (3 é o maior número que divide 42, 120 e 285 com o resto 0)

Operação "mod"

O operador de módulo (mod) mostra o resto da divisão quando dividimos dois números inteiros. Escrevemos isso assim:
A mod B = R

Isso significa que, ao dividir A e B, temos o resto R. Essa operação difere da operação regular de divisão, que nos dá o quociente.

Exemplo:
7 mod 2 = 1  (Ao dividir 7 por 2 temos o resto 1)
42 mod 7 = 0  (Ao dividir 42 por 7 temos o resto 0)

Tendo entendido os dois conceitos acima, será fácil de entender o algoritmo de Euclides.

Algoritmo de Euclides para o máximo divisor comum (MDC ou GCD)

O algoritmo de Euclides encontra o máximo divisor comum (que chamaremos nos algoritmos de 'GCD') de 2 números.

Você entenderá melhor esse algoritmo ao vê-lo em funcionamento. Supondo que você deseja calcular o GCD de 1220 e de 516, vamos aplicar o algoritmo de Euclides:

Pseudocódigo do algoritmo
Passo 1:  suponha que a, b  sejam os dois números
Passo 2:  a mod b = R
Passo 3:  considere que  a = b  e que  b = R
Passo 4:  repita os passos 2 e 3 até que a mod b  seja maior do que 0
Passo 5:  GCD = b
Passo 6: fim

Código em JavaScript para encontrar o GCD:

function gcd(a, b) {
  var R;
  while ((a % b) > 0)  {
    R = a % b;
    a = b;
    b = R;
  }
  return b;
}

Código em JavaScript para encontrar o GCD usando a recursividade:

function gcd(a, b) {
  if (b == 0)
    return a;
  else
    return gcd(b, (a % b));
}

Código em C para encontrar o GCD usando a recursividade:

int gcd(int a, int b) 
{ 
    // Tudo pode ser dividido por 0  
    if (a == 0) 
       return b; 
    if (b == 0) 
       return a; 
  
    // Caso de base 
    if (a == b) 
        return a; 
  
    // a é maior 
    if (a > b) 
        return gcd(a-b, b); 
    return gcd(a, b-a); 
}

Código em C++ para encontrar o GCD:

int gcd(int a,int b) {
  int R;
  while ((a % b) > 0)  {
    R = a % b;
    a = b;
    b = R;
  }
  return b;
}

Código em Python para encontrar o GCD usando recursividade:

def gcd(a, b):
  if b == 0:
    return a:
  else:
    return gcd(b, (a % b))

Código em Java para encontrar o GCD usando recursividade:

static int gcd(int a, int b)
{
  if(b == 0)
  {
    return a;
  }
  return gcd(b, a % b);
}

Você também pode usar o algoritmo de Euclides para encontrar o máximo divisor comum de mais de dois números. Como o GCD é associativo, a operação a seguir também seria válida:  GCD(a,b,c) == GCD(GCD(a,b), c)

Calcule o GCD dos dois primeiros número, depois encontre o GCD do resultado e do número seguinte. Exemplo:  GCD(203,91,77) == GCD(GCD(203,91),77) == GCD(7, 77) == 7

Você pode encontra o GCD de  n  números da mesma maneira.

O que é o algoritmo de Euclides estendido?

Esta é uma extensão do algoritmo de Euclides. Ela também calcula os coeficientes x, y, de tal modo que:

ax+by = gcd(a,b)

x e y também são conhecidos como os coeficientes da identidade de Bézout.

Código em C para o algoritmo de Euclides estendido

struct Triplet{
	int gcd;
	int x;
	int y;
};
Triplet gcdExtendedEuclid(int a,int b){
	// Case de base
	if(b==0){
		Triplet myAns;
		myAns.gcd = a;
		myAns.x = 1;
		myAns.y = 0;
		return myAns;

	}
	Triplet smallAns = gcdExtendedEuclid(b,a%b);
	// Algoritmo de Euclides estendido

	Triplet myAns;
	myAns.gcd = smallAns.gcd;
	myAns.x  = smallAns.y;
	myAns.y = (smallAns.x - ((a/b)*(smallAns.y)));
	return myAns;	
}