Algoritmo de Euclides

Algoritmo de Euclides
De Wikipedia, la enciclopedia libre
|
Es posible que, a causa de ello, haya lagunas de contenido o deficiencias de formato. Por favor, antes de realizar correcciones mayores o reescrituras, contacta con ellos en su página de usuario o en la página de discusión del artículo para poder coordinar la redacción. |
El algoritmo de Euclides es un método antiguo y eficaz para calcular el máximo común divisor (MCD) entre dos números enteros. Fue originalmente descrito por Euclides en la proposición 2 del libro VII de su libro Elementos. Tiene numerosas aplicaciones en teoría de números y ciencias de la computación.
Tabla de contenidos |
[editar] Fundamentos del algoritmo
Al dividir a entre b (números enteros), se obtiene un cociente q y un residuo r. Es posible demostrar que el máximo común divisor de a y b es el mismo que el de b y r. Este es el fundamento principal del algoritmo.
De acuerdo con este fundamento, para calcular el máximo común divisor de a y b tan sólo es necesario calcular el máximo común divisor de b y r. Como b y r son números más pequeños, el número de operaciones se reduce. Además, para calcular el máximo común divisor de b y r se puede aplicar la misma regla recurrentemente. Por ejemplo, para calcular el máximo común divisor de 2366 y 273 se podría utilizar la siguiente secuencia de operaciones:
- 2366 entre 273 es 8 y sobran 182
- 273 entre 182 es 1 y sobran 91
- 182 entre 91 es 2 y sobra 0
Esta secuencia de operaciones se puede interpretar con el siguiente significado:
- mcd(2366,273) = mcd(273,182)
- mcd(273,182) = mcd(182,91)
- mcd(182,91) = mcd(91,0)
De esta manera se concluye que el máximo común divisor de 2366 y 273 es 91 (porque mcd(91,0) = 91).
[editar] Descripción general
La expresión "a entre b es q y sobra r" se puede expresar matemáticamente como la siguiete ecuación:
![]() |
Ambas expresiones son completamente equivalentes (véase Algoritmo de la división). Con base en esto, el algoritmo funciona para cualesquiera números enteros a y b mediante la sucesión de divisiones:
![]() |
El máximo común divisor de a y b es rn, es decir, el último residuo distinto de 0. Esto siempre es cierto dado que en realidad sólo se está haciendo la siguiente secuencia de afirmaciones:
![]() |
De esta manera, el algoritmo puede enunciarse como sigue: "Para calcular el máximo común divisor de dos números naturales a y b, verifique si b es cero; si es así, entonces a es el máximo común divisor de a y b. En otro caso, repita el proceso usando (respectivamente) b, y el resto de dividir a entre b."
Este algoritmo puede ser usado en cualquier contexto donde la división con residuo sea posible. Esto incluye a los polinomios, los enteros de Gauss, y en general, en cualquier dominio euclídeo.
[editar] Ejemplos
Como primer ejemplo se muestra cómo calcular el máximo común divisor de 114569 y 180037:
Entonces mcd(114569,180037) = 16367. Como segundo ejemplo se muestra cómo calcular el máximo común divisor de x5 + 2x3 + x y x4 − 1 (los paréntesis se han añadido para facilidad de lectura):
De esta manera se concluye que
.
[editar] Descripción formal
El algoritmo de Euclides puede ser expresado en pseudocódigo de varias maneras. La notación aquí empleada hace uso del operador módulo, de manera que amod b representa el residuo de dividir a entre b. La manera más natural de expresar el algoritmo es utilizando recursión:
| Algoritmo de Eulides recurrente |
|
Función
|
Sin embargo, para implementarlo en una computadora, es mejor considerar una versión iterativa:
| Algoritmo de Eulides iterativo |
|
Función
|
El algoritmo original descrito por Euclides trataba el problema de manera geométrica; usaba la sustracción repetida en lugar del residuo de la división. Esta versión es significativamente menos eficiente:
| Algoritmo de Eulides original |
|
Función
|
[editar] Aplicaciones
[editar] Simplificar fracciones
Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción
es equivalente con
(véase Número racional). De manera más general,
siempre que
. Para reducir una fracción cualquiera
, sólo se necesita dividir a y b entre su máximo común divisor.
Por ejemplo, si se desea reducir
, primero se usa el algoritmo de Euclides para encontrar mcd(166,249) = 83. Se hacen las divisiones
y
. Luego entonces se concluye que
.
[editar] Fracciones continuas
La sucesión de divisiones que se efectúan al seguir algoritmo de Euclides puede ser utilizada para expresar una fracción cualquiera
como fracción continua. Esto se debe a que si a = bq + r y
, entonces
![]() |
Por ejemplo, para encontrar el máximo común divisor de 93164 y 5826 el algoritmo genera la siguiente secuencia de divisiones:
Utilizando la fórmula anterior se convierte
Si se substituye la segunda ecuación en la primera, se obtiene
![]() |
Si se repite este proceso de substitución entonces se obtiene la expresión deseada:
![]() |
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma
![]() |
[editar] Inversos modulares
[editar] Complejidad del algoritmo
Si se considera que las operaciones aritméticas son operaciones elementales, sin pérdida de generalidad se supone que
, entonces la complejidad del algoritmo está en el orden de
donde
. Para ver esto, primero se considera que para cualesquiera dos enteros a,b tales que
, siempre se cumple
Esto es porque:
- Si
, entonces
, por lo tanto
, lo cual implica que 
- Si
entonces 
Como se considera que las operaciones aritméticas son operaciones elementales, entonces la complejidad del algoritmo es del orden exacto del número de veces que se usa el ciclo mientras de la versión iterativa. Considérese a a y b después de pasar dos veces por el ciclo suponiendo que el algoritmo no se detiene antes. Sean a0 y b0 los valores de entrada al algoritmo. Después de la primera iteración
y seguidamente, en la segunda iteración b toma ese valor.
De lo anterior, b se ha vuelto más pequeño que
. Es decir que b se dividido al menos por dos después de dos pasadas por el ciclo. Además sigue siendo cierto que
y por lo tanto se puede aplicar el mismo razonamiento. La conclusión es que a lo mucho, se pasará por el ciclo aproximadamente
veces.
Por lo tanto, la complejidad de
con
está en orden de
.
Sin embargo, si se considera que las operaciones aritméticas no son operaciones elementales, entonces el número de operaciones está acotado por O(n2) - inferior a An2 con A una constante - donde n es el número de cifras del más pequeño entre a y b.
[editar] Implementación
En lenguaje C (versión recursiva):
unsigned int mcd(unsigned int a, unsigned int b){ return (b == 0)? a : mcd(b, a % b); }
En lenguaje Logo (versión recursiva):
para mcd :a :b si :b = 0 [ devuelve :a ] sino [ devuelve mcd :b resto :a :b ] fin
En lenguaje C (versión iterativa):
unsigned int mcd(unsigned int a, unsigned int b){ unsigned int aux; while (a > 0){ aux = a; a = b % a; b = aux; } return b; }
En lenguaje Logo (versión iterativa):
para mcd :a :b
mientras [:a > 0] [
haz "t :a
haz "a resto :b :a
haz "b :t
]
devuelve :b
fin
En lenguaje Visual Basic 8 (versión iterativa):
Public Function mcd(a As UInteger, b As UInteger) As UInteger Dim t As UInteger While a > 0 t = a a = b Mod a b = t End While Return b End Function
En lenguaje Haskell (versión recursiva):
mcd::Int->Int->Int mcd a 0 = a mcd a b = mcd b (mod a b)
En lenguaje Pascal (versión iterativa):
function MCD(a , b:integer):integer; var t,result:integer; begin if b = 0 then result := a else while a > 0 do begin t := a; a := b mod a; b := t; result := b end; MCD:=result; end;
En lenguaje Java (versión iterativa): //Instalar drjava (http://www.drjava.org/download.shtml) // Uso (interactions pane): java mcd a b public class mcd {public static void main(String[] args) {if (args.length != 2) {System.out.println("Usage: java gcd arg1 arg2"); return;} int a = Integer.parseInt(args[0]); int b = Integer.parseInt(args[1]); System.out.println("gcd is " + gcd(a, b } public static int mcd(int a, int b) { while (a>0) {int t; t=a; a=b%a; b=t; } return +b; } } En lenguaje Python (versión recursiva):
def mcd(a, b): if b == 0: return a return mcd(b, a % b)
En lenguaje PHP (versión recursiva) :
function mcd($a, $b){ return ($b == 0)? $a : mcd($b, $a % $b); }
[editar] Referencias
- Brassard, Gilles; Bratley, Paul: «Análisis de algoritmos», en Fundamentos de Algoritmia. Madrid: PRENTICE HALL, 1997. ISBN 84-89660-00-X
- El contenido de este artículo incorpora material de una entrada de la Enciclopedia Libre Universal, publicada en castellano bajo la licencia GFDL.












:
entonces:


haga lo siguiente:
Nota: Esto significa asignar a
entonces:















