Algoritmo de Euclides

De testwiki
Ir a la navegación Ir a la búsqueda

En matemáticas, el algoritmo de Euclides, o algoritmo euclidiano, es un método eficiente para calcular el máximo común divisor (MCD) de dos números enteros, el número más grande que los divide a ambos sin dejar resto. Lleva el nombre del antiguo matemático griego Euclides, quien lo describió por primera vez en Elementos (Plantilla:Esd). Es un ejemplo de un algoritmo, un procedimiento paso a paso para realizar un cálculo de acuerdo con reglas bien definidas, y es uno de los algoritmos más antiguos que se siguen utilizando. Se puede usar para reducir fracciones a su forma más simple y es parte de muchos otros cálculos teórico-numéricos y criptográficos.

El algoritmo euclidiano se basa en el principio de que el máximo común divisor de dos números no cambia si el número más grande se reemplaza por su diferencia con el número más pequeño. Por ejemplo, 21 es el MCD de 252 y 105 (ya que 252 = 21 × 12 y 105 = 21 × 5), y el mismo número 21 también es el MCD de 105 y 252 − 105 = 147. Dado que este reemplazo reduce el más grande de los dos números, al repetir este proceso se obtienen pares de números sucesivamente más pequeños hasta que los dos números se vuelven iguales. Cuando eso ocurre, son el MCD de los dos números originales. Al invertir los pasos o usar el algoritmo de Euclides extendido, el MCD se puede expresar como una combinación lineal de los dos números originales, es decir, la suma de los dos números, cada uno multiplicado por un número entero (por ejemplo, 21 = 5 × 105 + (−2) × 252). El hecho de que el MCD siempre se pueda expresar de esta manera se conoce como la identidad de Bézout.

La versión del algoritmo euclidiano descrita anteriormente (y por Euclides) puede requerir muchos pasos de resta para encontrar el MCD cuando uno de los números dados es mucho más grande que el otro. Una versión más eficiente del algoritmo acorta estos pasos, en su lugar se reemplaza el más grande de los números por su resto al dividirlo por el más pequeño de los dos (con esta versión, el algoritmo se detiene al alcanzar un resto cero). Con esta mejora, el algoritmo nunca requiere más pasos que cinco veces el número de dígitos (base 10) del número entero más pequeño. Esto fue demostrado por Gabriel Lamé en 1844 (teorema de Lamé),[1][2] y marca el comienzo de la teoría de la complejidad informática. Se desarrollaron métodos adicionales para mejorar la eficiencia del algoritmo en el Plantilla:Siglo.

El algoritmo euclidiano tiene muchas aplicaciones teóricas y prácticas. Se utiliza para reducir fracciones a su forma más simple y para realizar divisiones en aritmética modular. Los cálculos que utilizan este algoritmo forman parte de los protocolos criptográficos que se usan para proteger las comunicaciones de Internet, y en los métodos para romper estos sistemas criptográficos mediante la factorización de grandes números compuestos. El algoritmo euclidiano se puede usar para resolver ecuaciones diofánticas, como encontrar números que satisfagan múltiples congruencias de acuerdo con el teorema chino del resto, para construir fracciones continuas y para encontrar aproximaciones racionales precisas a números reales. Finalmente, se puede utilizar como una herramienta básica para demostrar teoremas en la teoría de números, como el teorema de los cuatro cuadrados de Lagrange y la unicidad de las factorizaciones primas.

Algoritmo original de Euclides

AB y CD los segmentos conmensurables.
Ejemplo del algoritmo original de Euclides.

En la concepción griega de la matemática, los números se entendían como magnitudes geométricas. Un tema recurrente en la geometría griega es el de la conmensurabilidad de dos segmentos: dos segmentos (números) AB y CD son conmensurables cuando existe un tercer segmento PQ que cabe exactamente un número entero de veces en los primeros dos; es decir, PQ «mide» (mensura: medida) a los segmentos AB y CD.

No cualquier par de segmentos es conmensurable, como encontraron los pitagóricos cuando establecen que el lado y la diagonal de un cuadrado no son conmensurables, pero en el caso de dos segmentos conmensurables se desea hallar la mayor medida común posible.

Euclides describe en la proposición I.2 en su Libro VII de sus Elementos un método que permite hallar la mayor medida común posible de dos números (segmentos) que no sean primos entre sí, aunque de acuerdo a la época tal método se explica en términos geométricos, lo que se ilustra en la siguiente transcripción.

Plantilla:Cita

En lenguaje moderno, el algoritmo se describe como sigue:

  1. Dados dos segmentos AB y CD (con AB>CD), restamos CD de AB tantas veces como sea posible. Si no hay residuo, entonces CD es la máxima medida común.
  2. Si se obtiene un residuo EA, este es menor que CD y podemos repetir el proceso: restamos EA tantas veces como sea posible de CD. Si al final no queda un residuo, EA es la medida común. En caso contrario obtenemos un nuevo residuo FC menor a EA.
  3. El proceso se repite hasta que en algún momento no se obtiene residuo. Entonces el último residuo obtenido es la mayor medida común.

El hecho de que los segmentos son conmesurables es clave para asegurar que el proceso termina tarde o temprano.

Algoritmo de Euclides tradicional

Al dividir a entre b (números enteros), se obtiene un cociente q y un resto r. Es posible demostrar que el máximo común divisor de a y b es el mismo que el de b y r. Sea c el máximo común divisor de a y b, como a=bq+r y c divide a a y a b, divide también a r. Si existiera otro número mayor que c que divide a b y a r, también dividiría a a , por lo que c no sería el mcd de a y b, lo que contradice la hipótesis). Este es el fundamento principal del algoritmo. También es importante tener en cuenta que el máximo común divisor de cualquier número a y 0 es precisamente a. Para fines prácticos, la notación mcd(a,b) significa máximo común divisor de a y b.

Según lo antes mencionado, para calcular el máximo común divisor de 2366 y 273 se puede proseguir de la siguiente manera:

Paso Operación Significado
1 2366 dividido entre 273 es 8 y sobran 182 mcd(2366,273)=mcd(273,182)
2 273 dividido entre 182 es 1 y sobran 91 mcd(273,182)=mcd(182,91)
3 182 dividido entre 91 es 2 y sobra 0 mcd(182,91)=mcd(91,0)

La secuencia de igualdades mcd(2366,273)=mcd(273,182)=mcd(182,91)=mcd(91,0) implican que mcd(2366,273)=mcd(91,0). Dado que mcd(91,0)=91, entonces se concluye que mcd(2366,273)=91. Este mismo procedimiento se puede aplicar a cualesquiera dos números naturales. En general, si se desea encontrar el máximo común divisor de dos números naturales a y b, se siguen las siguientes reglas:

  1. Si b=0 entonces mcd(a,b)=a y el algoritmo termina
  2. En otro caso, mcd(a,b)=mcd(b,r) donde r es el resto de dividir a entre b. Para calcular mcd(b,r) se utilizan estas mismas reglas

Asuma que llamamos a=r0 y b=r1. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones:

Paso Operación Significado
1 r0 dividido entre r1 es q1 y sobran r2 mcd(r0,r1)=mcd(r1,r2)
2 r1 dividido entre r2 es q2 y sobran r3 mcd(r1,r2)=mcd(r2,r3)
3 r2 dividido entre r3 es q3 y sobran r4 mcd(r2,r3)=mcd(r3,r4)
n rn1 dividido entre rn es qn y sobran rn+1 mcd(rn1,rn)=mcd(rn,rn+1)
n+1 rn dividido entre rn+1 es qn+1 y sobra 0 mcd(rn,rn+1)=mcd(rn+1,0)

Como la sucesión de residuos va disminuyendo, al final un residuo tiene que ser cero y es en ese momento cuando el algoritmo termina. El máximo común divisor es precisamente rn+1 (el último residuo que no es cero).

Generalización

En realidad, el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualquier elemento en el que exista una "división con residuo". A este tipo de divisiones se les llama divisiones euclidianas y a los conjuntos donde se puede definir dicha división se les llama dominios euclídeos. Por ejemplo, el conjunto de los números enteros y el de los polinomios con coeficientes racionales son dominios euclídeos porque podemos definir una división con residuo (véase División polinomial). De esta manera, se puede calcular el máximo común divisor de dos números enteros o de dos polinomios.

Por ejemplo, para calcular el máximo común divisor de los polinomios P(x)=x5+2x3+x y Q(x)=x41 el algoritmo de Euclides sugiere la siguiente secuencia de operaciones:

Paso Operación Significado
1 x5+2x3+x dividido entre x41 es x y sobra 2x3+2x mcd(x5+2x3+x,x41)=mcd(x41,2x3+2x)
2 x41 dividido entre 2x3+2x es 12x y sobra x21 mcd(x41,2x3+2x)=mcd(2x3+2x,x21)
3 2x3+2x dividido entre x21 es 2x y sobra 0 mcd(2x3+2x,x21)=mcd(x21,0)

De esta manera se concluye que su máximo común divisor es x21.

Descripción formal

Se puede expresar este algoritmo de manera más formal usando pseudocódigo. En este caso la expresión "xmody" significa "el residuo de dividir x entre y" (véase Aritmética modular). Plantilla:Algoritmo Vale la pena notar que este algoritmo no es eficiente ser implementado directamente en una computadora, ya que requeriría memorizar todos los valores de ri.

Algoritmo de Euclides extendido

El algoritmo de Euclides extendido permite, además de encontrar un máximo común divisor de dos números enteros a y b, expresarlo como la mínima combinación lineal de esos números, es decir, encontrar números enteros s y t tales que mcd(a,b)=as+bt. Esto se generaliza también hacia cualquier dominio euclidiano.

Fundamentos

Existen varias maneras de explicar el algoritmo de Euclides extendido, una de las más comunes consiste en la siguiente:

  1. Usar el algoritmo tradicional de Euclides. En cada paso, en lugar de "a dividido entre b es q y de resto r" se escribe la ecuación a=bq+r (véase algoritmo de la división).
  2. Se despeja el resto de cada ecuación.
  3. Se sustituye el resto de la última ecuación en la penúltima, y la penúltima en la antepenúltima y así sucesivamente hasta llegar a la primera ecuación, y en todo paso se expresa cada resto como combinación lineal.

Sin embargo, en aras de la comprensión y memorización de este algoritmo, es conveniente conocer la siguiente caracterización. Para multiplicar dos matrices de tamaño 2×2 se usa la siguiente fórmula (véase Producto de matrices): Plantilla:Ecuación Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores qi y ri que ahí se describen. Por cada valor qi calculado se puede formar la matriz Qi=[011qi]. Usando la ecuación Plantilla:Eqnref de manera repetida se puede calcular el producto de las primeras i matrices de este tipo: Plantilla:Ecuación

Resulta ser que los valores si y ti tienen la propiedad de que ri=asi+bti, es decir, expresan a ri como una combinación lineal de a y b. Particularmente, como mcd(a,b)=rn+1 entonces se tiene mcd(a,b)=asn+1+btn+1, lo cual es la solución del problema. Esta propiedad no debería ser sorprendente, pues esta multiplicación de matrices equivale al método antes descrito donde se substituye cada ecuación en la anterior. Es importante calcular Qi××Q3×Q2×Q1 en ese mismo orden. La matriz Q1 aparece en el extremo derecho y la matriz Qi en el izquierdo.

Regresando al primer ejemplo, la sucesión de cocientes es q1=8, q2=1 y q3=2. Entonces se puede calcular Plantilla:Ecuación Utilizando el primer renglón de esta matriz se puede leer que 91=2366(1)+273(9), es decir, se ha encontrado la manera de expresar al máximo común divisor de 2366 y 273 como una combinación lineal.

Descripción formal

Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores si y ti con la multiplicación de matrices: Plantilla:Ecuación De esta manera si+1=si1qisi y además ti+1=ti1qiti. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: Plantilla:Algoritmo

Aplicaciones

Simplificar fracciones

Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción 6591 es equivalente con 57 (véase Número racional). De manera más general, ab=cacb siempre que c0. Para reducir una fracción cualquiera ab, sólo se necesita dividir a y b entre su máximo común divisor.

Por ejemplo, si se desea reducir 166249, primero se usa el algoritmo de Euclides para encontrar mcd(166,249)=83. Se hacen las divisiones 166÷83=2 y 249÷83=3. Luego entonces se concluye que 166249=23.

Fracciones continuas

La sucesión de divisiones que se efectúan al seguir el algoritmo de Euclides puede ser utilizada para expresar una fracción cualquiera ab como fracción continua. Esto se debe a que si a=bq+r y r0, entonces Plantilla:Ecuación

Por ejemplo, para encontrar el máximo común divisor de 93164 y 5826 el algoritmo genera la siguiente secuencia de divisiones:

Paso Operación Significado
1 93164 dividido entre 5826 es 15 y sobran 5774 93164=5826×15+5774
2 5826 dividido entre 5774 es 1 y sobran 52 5826=5774×1+52
3 5774 dividido entre 52 es 111 y sobran 2 5774=52×111+2
4 52 dividido entre 2 es 26 y sobra 0 52=2×26+0

Todas estas ecuaciones las podemos hacer parecidas a la ecuación Plantilla:Eqnref:

  1. 931645826=15+158265774
  2. 58265774=1+1577452
  3. 577452=111+1522
  4. 522=26

Si se sustituye la segunda ecuación en la primera, se obtiene Plantilla:Ecuación

Si se repite este proceso de substitución entonces se obtiene la expresión deseada: Plantilla:Ecuación

De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma Plantilla:Ecuación


Inversos módulo m

Plantilla:AP Se dice que dos números enteros son congruentes módulo m (aunque también se puede generalizar para cualquier otro dominio euclídeo) si al dividirlos entre m obtenemos el mismo residuo (véase Congruencia). Por ejemplo, 7 es congruente con 12 módulo 5 porque al dividir 7 entre 5 y 12 entre 5, en ambos casos obtenemos el mismo residuo (que es 2). Cuando a es congruente con b módulo m se escribe ab(modm), en el ejemplo anterior se tiene 712(mod5). Supóngase que se conocen los valores de a, b y m, pero que se desconoce el valor x en la siguiente congruencia: Plantilla:Ecuacion Basta encontrar un valor a1 que satisfaga: a1a1(modm), pues de esta manera al multiplicar la ecuación Plantilla:Eqnref por a1 se tendrá la solución deseada: Plantilla:Ecuacion Al elemento a1 se le llama "inverso módulo m" de a. Desafortunadamente este valor no siempre existe. Por ejemplo, con a=4 y m=6 no existe ningún número entero a1 tal que a141(mod6). De hecho este valor existe si y sólo si mcd(a,m)=1 (la existencia de soluciones depende de la condición mcd(a,m)|b, mientras que la unicidad depende de que el mcd(a,m)=1). Más aún, si al usar el algoritmo de Euclides extendido (ahora con b=m) se obtiene 1=as+mt, entonces el valor s es el inverso módulo m de a. Por ejemplo, se desea resolver la ecuación Plantilla:Ecuacion Entonces con el algoritmo de Euclides extendido se obtiene que mcd(5,9)=1=5(2)+9(1). Como mcd(5,9)=1 entonces 5 tiene un inverso módulo 9. Más aún, como 1=5(2)+9(1), entonces ese inverso es 2. Entonces Plantilla:Ecuacion Es decir que el valor de x es 4.

Complejidad del algoritmo

Gráfica del número de divisiones efectuadas en el algoritmo de Euclides. El rojo indica pocas operaciones, mientras que los colores más azules representan mayor número de operaciones.

El teorema de Lamé afirma que el caso peor para este algoritmo es cuando se le pide calcular el máximo común divisor de dos números consecutivos de la sucesión de Fibonacci. Por ejemplo, si se desea calcular el máximo común divisor de f10=55 y f11=89 se obtiene la siguiente secuencia de operaciones:

Paso Operación Significado
1 89 dividido entre 55 es 1 y sobran 34 mcd(89,55)=mcd(55,34)
2 55 dividido entre 34 es 1 y sobran 21 mcd(55,34)=mcd(34,21)
3 34 dividido entre 21 es 1 y sobran 13 mcd(34,21)=mcd(21,13)
4 21 dividido entre 13 es 1 y sobran 8 mcd(21,13)=mcd(13,8)
5 13 dividido entre 8 es 1 y sobran 5 mcd(13,8)=mcd(8,5)
6 8 dividido entre 5 es 1 y sobran 3 mcd(8,5)=mcd(5,3)
7 5 dividido entre 3 es 1 y sobran 2 mcd(5,3)=mcd(3,2)
8 3 dividido entre 2 es 1 y sobran 1 mcd(3,2)=mcd(2,1)
9 2 dividido entre 1 es 2 y sobra 0 mcd(2,1)=mcd(1,0)

En este ejemplo se observa que con estos dos números de dos dígitos decimales, se necesita hacer 9 divisiones. En general, el número de divisiones efectuadas por el algoritmo nunca supera 5 veces el número de dígitos que tienen estos números. En términos de complejidad computacional, esto significa que se requieren O(logn) divisiones para calcular el máximo común divisor de n y m donde n>m.

El número promedio de divisiones efectuadas por el algoritmo se estuvo investigando desde 1968, pero solo hasta apenas el año 2002, Brigitte Vallée demostró que si los dos números se pueden representar con n bits, entonces el número promedio de divisiones necesarias es π26n.

Sin embargo, no basta con saber el número de divisiones. Hay que recordar que el algoritmo de Euclides funciona tanto para polinomios como para números enteros, y en general, cualquier dominio Euclídeo. En cada caso, la complejidad del algoritmo depende del número de divisiones efectuadas y del costo de cada división. En el caso de los polinomios, el número de divisiones es O(logn) donde n es el grado de los polinomios.

Implementación en pseudocódigo

En general, los algoritmos Plantilla:Algref y Plantilla:Algref no son muy apropiados para implementarse directamente en un lenguaje de programación, especialmente porque consumen mucha memoria. Si no se necesitan los valores intermedios, y sólo se desea calcular el máximo común divisor de dos números enteros, conviene usar estas variantes:

Plantilla:Algoritmo Plantilla:Algoritmo Plantilla:Algoritmo Plantilla:Algoritmo Plantilla:Algoritmo Acerca de la notación empleada:

  • xy significa "asigne a la variable x el valor actual de y". En lenguajes como C, Java, C#, Python y Visual Basic esto significa simplemente x = y. En otros lenguajes como Pascal se traduce en a := b, en Maxima es a : b, en R, S y Ocaml es x <- y, e inclusive se utiliza la flecha x ← y como el caso de APL.
  • (x,y,z)(a,b,c) significa que primero se evalúan los valores a,b,c y luego se asigna xa,yb,zc, etc. En lenguajes como Python, Ruby o Maxima esta instrucción tiene una estructura muy similar, como por ejemplo en Python: (x,y,z) = (a,b,c). En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;.
  • a÷b significa "el cociente de dividir a entre b". A esta operación se le conoce también como la división truncada porque trunca la parte fraccionaria del número. En muchos lenguajes de programación esto se implementa simplemente como a/b. Otras maneras son a\b (Visual Basic) , a div b (Pascal) o bien a//b (Python 3).
  • amodb significa "el residuo de dividir a entre b". A esta operación se le conoce simplemente como módulo. En muchos lenguajes de programación se implementa como a % b, mientras que en otros es a mod b (Visual Basic o Pascal) o bien a rem b (Ada).

Véase también

Referencias

Plantilla:Listaref

Bibliografía

Enlaces externos

Plantilla:Wikilibros

Plantilla:Control de autoridades