Tabla de contenido
Mientras que el algoritmo euclidiano calcula solo el máximo común divisor (MCD) de dos enteros
Es importante tener en cuenta que siempre podemos encontrar dicha representación, por ejemplo
Una forma más general de ese problema se analiza en el artículo sobre Ecuaciones diofánticas lineales. Se basará en este algoritmo.
En esta sección, denotaremos el MCD de
Los cambios al algoritmo original son muy simples.
Si recordamos el algoritmo, podemos ver que el algoritmo termina con
A partir de estos coeficientes
Supongamos que encontramos los coeficientes
y queremos encontrar el par
Podemos representar
Sustituyendo esta expresión en la ecuación del coeficiente de
y después de reorganizar los términos:
Encontramos los valores de
int mcd(int a, int b, int& x, int& y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int x1, y1;
int d = mcd(b, a % b, x1, y1);
x = y1;
y = x1 - y1 * (a / b);
return d;
}
La función recursiva anterior devuelve el MCD y asigna los valores de los coeficientes a x
e y
(que se pasan por referencia a la función).
Esta implementación del algoritmo euclidiano extendido también produce resultados correctos para enteros negativos.
También es posible escribir el algoritmo euclidiano extendido de forma iterativa. Debido a que evita la recursividad, el código se ejecutará un poco más rápido que el recursivo.
int mcd(int a, int b, int& x, int& y) {
x = 1, y = 0;
int x1 = 0, y1 = 1, a1 = a, b1 = b;
while (b1) {
int q = a1 / b1;
tie(x, x1) = make_tuple(x1, x - q * x1);
tie(y, y1) = make_tuple(y1, y - q * y1);
tie(a1, b1) = make_tuple(b1, a1 - q * b1);
}
return a1;
}
Si observas de cerca las variables a1
y b1
, podrás notar que toman exactamente los mismos valores que en la versión iterativa del algoritmo euclidiano normal. Entonces al menos el algoritmo calculará el MCD correcto.
Para ver por qué el algoritmo también calcula los coeficientes correctos, puedes verificar que las siguientes invariantes se mantendrán en cualquier momento (antes del ciclo while y al final de cada iteración):
Al final, sabemos que
Incluso puedes optimizar más el código y eliminar la variable