Diferencia entre revisiones de «Algoritmo de Euclides»

(Página creada con '==== {{Referencia}}{{Construcción}}Algoritmo de Euclides <br> ==== El algoritmo de Euclides es un método antiguo y eficaz para calcular el máximo común divisor (MCD). Fue o…')
 
(Referencias)
 
(No se muestran 20 ediciones intermedias de 6 usuarios)
Línea 1: Línea 1:
==== {{Referencia}}{{Construcción}}Algoritmo de Euclides <br> ====
+
{{Definición|Nombre=Algoritmo de Euclides|imagen=401px-Algoritmo_de_Euclides_geométrico.svg.png|concepto=Método antiguo y eficaz para calcular el máximo común divisor (MCD)}}'''Algoritmo de Euclides''':Es un método antiguo y eficaz para calcular el máximo común divisor (MCD). Fue originalmente descrito por [[Euclides]] en su obra Elementos. El algoritmo de Euclides extendido es una ligera modificación que permite además expresar al máximo común divisor como una combinación lineal. Este algoritmo tiene aplicaciones en diversas áreas como álgebra, teoría de números y ciencias de la computación entre otras. Con unas ligeras modificaciones suele ser utilizado en computadoras electrónicas debido a su gran eficiencia.  
 
 
El algoritmo de Euclides es un método antiguo y eficaz para calcular el máximo común divisor (MCD). Fue originalmente descrito por Euclides en su obra Elementos. El algoritmo de Euclides extendido es una ligera modificación que permite además expresar al máximo común divisor como una combinación lineal. Este algoritmo tiene aplicaciones en diversas áreas como álgebra, teoría de números y ciencias de la computación entre otras. Con unas ligeras modificaciones suele ser utilizado en computadoras electrónicas debido a su gran eficiencia.  
 
  
 
== Algoritmo original de Euclides  ==
 
== Algoritmo original de Euclides  ==
Línea 10: Línea 8:
  
 
Euclides describe en la proposición VII.2 de sus [[Elementos de Euclides|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.  
 
Euclides describe en la proposición VII.2 de sus [[Elementos de Euclides|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.  
<div style="width: 75%;">{{cita|1='''Para encontrar la máxima medida común de dos números que no sean primos entre sí.'''
 
[[Archivo:Euclides VII-2.svg|center|200px]]
 
Sean ''AB'' y ''CD'' los dos números que no son primos uno al otro. Se necesita entonces encontrar la máxima medida común de ''AB'' y ''CD''.
 
  
Si ''CD'' mide ''AB'' entonces es una medida común puesto que ''CD'' se mide a sí mismo. Y es manifiesto que también es la mayor medida pues nada mayor a ''CD'' puede medir a ''CD''. Pero si ''CD'' no mide a ''AB'' entonces algún número quedará de ''AB'' y ''CD'', el menor siendo continuamente restado del mayor y que medirá al número que le precede. Porque una unidad no quedará pues si no es así, ''AB'' y ''CD'' serán primos uno del otro [Prop. VII.1], lo cual es lo contrario de lo que se supuso.
+
Para encontrar la máxima medida común de dos números que no sean primos entre sí. Euclides VII-2.svg
 +
 
 +
Sean AB y CD los dos números que no son primos uno al otro. Se necesita entonces encontrar la máxima medida común de AB y CD.
 +
 
 +
Si CD mide AB entonces es una medida común puesto que CD se mide a sí mismo. Y es manifiesto que también es la mayor medida pues nada mayor a CD puede medir a CD. Pero si CD no mide a AB entonces algún número quedará de AB y CD, el menor siendo continuamente restado del mayor y que medirá al número que le precede. Porque una unidad no quedará pues si no es así, AB y CD serán primos uno del otro [Prop. VII.1], lo cual es lo contrario de lo que se supuso.  
  
Por tanto, algún número queda que medirá el número que le precede. Y sea ''CD'' midiendo ''BE'' dejando ''EA'' menor que sí mismo y sea ''EA'' midiendo '' DF'' dejando ''FC'' menor que sí mismo y sea ''FC'' medida de ''AE''. Entonces, como ''FC'' mide ''AE'' y ''AE'' mide ''DF'', ''FC'' será entonces medida de ''DF''. Y también se mide a sí mismo. Por tanto también medirá todo ''CD''. Y ''CD'' mide a ''BE''. Entonces ''CF'' mide a ''BE'' y también mide a ''EA''. Así mide a todo ''BA'' y también mide a ''CD''. Esto es, ''CF'' mide tanto a ''AB'' y ''CD'' por lo que es una medida común de ''AB'' y ''CD''.
+
Por tanto, algún número queda que medirá el número que le precede. Y sea CD midiendo BE dejando EA menor que sí mismo y sea EA midiendo DF dejando FC menor que sí mismo y sea FC medida de AE. Entonces, como FC mide AE y AE mide DF, FC será entonces medida de DF. Y también se mide a sí mismo.  
  
Afirmo que también es la mayor medida común posible porque si no lo fuera, entonces un número mayor que ''CF'' mide a los números ''AB'' y ''CD'', sea éste ''G''. Dado que ''G'' mide a ''CD'' y ''CD'' mide a ''BE'', ''G'' también mide a ''BE''. Además, mide a todo ''BA'' por lo que mide también al residuo ''AE''. Y ''AE'' mide a ''DF'' por lo que ''G'' también mide a ''DF''. Mide también a todo ''DC'' por lo que mide también al residuo ''CF'', es decir el mayor mide al menor, lo cual es imposible.
+
Por tanto también medirá todo CD. Y CD mide a BE. Entonces CF mide a BE y también mide a EA. Así mide a todo BA y también mide a CD. Esto es, CF mide tanto a AB y CD por lo que es una medida común de AB y CD.  
  
Por tanto, ningún número mayor a ''CF'' puede medir a los números ''AB'' y ''CD''. Entonces ''CF'' es la mayor medida común de ''AB'' y ''CD'', lo cual se quería demostrar.
+
Afirmo que también es la mayor medida común posible porque si no lo fuera, entonces un número mayor que CF mide a los números AB y CD, sea éste G. Dado que G mide a CD y CD mide a BE, G también mide a BE. Además, mide a todo BA por lo que mide también al residuo AE. Y AE mide a DF por lo que G también mide a DF. Mide también a todo DC por lo que mide también al residuo CF, es decir el mayor mide al menor, lo cual es imposible. Por tanto, ningún número mayor a CF puede medir a los números AB y CD. Entonces CF es la mayor medida común de AB y CD, lo cual se quería demostrar. Euclides. Elementos VII.2''&lt;/pre&gt; '' En lenguaje moderno, el algoritmo se describe como sigue:  
|2=[[Euclides]]. ''[[Elementos de Euclides|Elementos]] VII.2''}}</div>
 
<br> En lenguaje moderno, el algoritmo se describe como sigue:  
 
  
 
#Dados dos segmentos ''AB'' y ''CD'' (con ''AB&gt;CD''), restamos ''CD'' de ''AB'' tantas veces como sea posible. Si no hay residuo, entonces ''CD'' es la máxima medida común.  
 
#Dados dos segmentos ''AB'' y ''CD'' (con ''AB&gt;CD''), restamos ''CD'' de ''AB'' tantas veces como sea posible. Si no hay residuo, entonces ''CD'' es la máxima medida común.  
Línea 32: Línea 29:
 
== Algoritmo de Euclides tradicional  ==
 
== Algoritmo de Euclides tradicional  ==
  
Al [[Algoritmo de la división|dividir]] ''a ''entre ''b'' (números enteros), se obtiene un [[Cociente (aritmética)|cociente]] ''q'' y un [[Resto|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''. Éste 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''.  
+
Al [[Algoritmo de la división|dividir]] ''a'' entre ''b'' (números enteros), se obtiene un [[Cociente (aritmética)|cociente]] ''q'' y un [[Resto|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''. Éste 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:  
 
Según lo antes mencionado, para calcular el máximo común divisor de 2366 y 273 se puede proseguir de la siguiente manera:  
Línea 38: Línea 35:
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Paso
+
! Paso  
! Operación
+
! Operación  
 
! Significado
 
! Significado
 
|-
 
|-
| 1
+
| 1  
| 2366 dividido entre 273 es 8 y sobran 182
+
| 2366 dividido entre 273 es 8 y sobran 182  
| mcd(2366,273) = mcd(273,182)
+
| <math>\mathrm{mcd}(2366,273)=\mathrm{mcd}(273,182)</math>
 
|-
 
|-
| 2
+
| 2  
| 273 dividido entre 182 es 1 y sobran 91
+
| 273 dividido entre 182 es 1 y sobran 91  
| mcd(273,182) = mcd(182,91)
+
| <math>\mathrm{mcd}(273,182)=\mathrm{mcd}(182,91)</math>
 
|-
 
|-
| 3
+
| 3  
| 182 dividido entre 91 es 2 y sobra 0
+
| 182 dividido entre 91 es 2 y sobra 0  
| mcd(182,91) = mcd(91,0)
+
| <math>\mathrm{mcd}(182,91)=\mathrm{mcd}(91,0)</math>
 
|}
 
|}
  
 
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:  
 
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:  
  
#Si ''b'' = 0 entonces mcd(a,b) = a y el algoritmo termina  
+
#Si ''b=0 ''entonces mcd(a,b) = a y el algoritmo termina  
#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
+
#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 = r<sub>0</sub> y b = r''<sub>''1''</sub>. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones:  
+
Asuma que llamamos a = r<sub>0</sub> y b = r<sub>1</sub>. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones:  
  
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Paso
+
! Paso  
! Operación
+
! Operación  
 
! Significado
 
! Significado
 
|-
 
|-
| 1
+
| 1  
| r<sub>0 </sub>dividido entre r<sub>1 </sub>es q<sub>1</sub> y sobran r<sub>2</sub><br>
+
| <math>r_0</math> dividido entre <math>r_1</math> es <math>q_1</math> y sobran <math>r_2</math>  
| mcd(r<sub>0</sub>,r<sub>1</sub>) = mcd(r<sub>1</sub>,r<sub>2</sub>)
+
| <math>\mathrm{mcd}(r_0,r_1)=\mathrm{mcd}(r_1,r_2)</math>
 
|-
 
|-
| 2
+
| 2  
| r<sub>1</sub> dividido entre r<sub>2</sub> es q<sub>2</sub> y sobran r<sub>3 </sub><br>
+
| <math>r_1</math> dividido entre <math>r_2</math> es <math>q_2</math> y sobran <math>r_3</math>  
| mcd(r<sub>1</sub>,r<sub>2</sub>) = mcd(r<sub>2</sub>,r<sub>3</sub>)
+
| <math>\mathrm{mcd}(r_1,r_2)=\mathrm{mcd}(r_2,r_3)</math>
 
|-
 
|-
| 3
+
| 3  
| r<sub>2</sub> dividido entre r<sub>3 </sub>es q<sub>3</sub> y sobran r<sub>4</sub><br>
+
| <math>r_2</math> dividido entre <math>r_3</math> es <math>q_3</math> y sobran <math>r_4</math>  
| mcd(r<sub>2</sub>,r<sub>3</sub>) = mcd(r<sub>3</sub>,r<sub>4</sub>)
+
| <math>\mathrm{mcd}(r_2,r_3)=\mathrm{mcd}(r_3,r_4)</math>
 
|-
 
|-
| ''n''
+
| <math>\vdots</math>  
| r<sub>n − 1</sub> dividido entre r<sub>n </sub>es qn y sobran r<sub>n + 1</sub>
+
| <math>\vdots</math>  
| <br>
+
| <math>\vdots</math>
 
|-
 
|-
| ''n + 1''<br>
+
| <math>n</math>  
| r<sub>n </sub>dividido entre r<sub>n + 1</sub> es q<sub>n + 1</sub> y sobra 0<br>
+
| <math>r_{n-1}</math> dividido entre <math>r_n</math> es <math>q_n</math> y sobran <math>r_{n+1}</math>  
| mcd(r<sub>n 1</sub>,r<sub>n</sub>) = mcd(r<sub>n</sub>,r<sub>n + 1</sub>)<br>
+
| <math>\mathrm{mcd}(r_{n-1},r_n)=\mathrm{mcd}(r_n,r_{n+1})</math>
 
|-
 
|-
| <math>n+1</math>
+
| <math>n+1</math>  
| <math>r_n</math> dividido entre <math>r_{n+1}</math> es <math>q_{n+1}</math> y sobra <math>0</math>
+
| <math>r_n</math> dividido entre <math>r_{n+1}</math> es <math>q_{n+1}</math> y sobra <math>0</math>  
 
| <math>\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)</math>
 
| <math>\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)</math>
 
|}
 
|}
  
Como la sucesión de residuos va disminuyendo, eventualmente un residuo tiene que ser cero y es en ese momento cuando el algoritmo termina. El máximo común divisor es precisamente <math>r_{n+1}</math> (el último residuo que no es cero).  
+
Como la sucesión de residuos va disminuyendo, eventualmente un residuo tiene que ser cero y es en ese momento cuando el algoritmo termina. El máximo común divisor es precisamente r<sub>n + 1</sub> (el último residuo que no es cero).  
  
 
=== Generalización  ===
 
=== Generalización  ===
Línea 99: Línea 96:
 
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una "división con residuo". A este tipo de divisiones se les llama [[División euclidiana|divisiones euclidianas]] y a los conjuntos donde se puede definir dicha división se les llama [[Dominio euclídeo|dominios euclídeos]]. Por ejemplo, el conjunto de los [[Número entero|números enteros]] y el de los [[Polinomio]]s 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.  
 
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una "división con residuo". A este tipo de divisiones se les llama [[División euclidiana|divisiones euclidianas]] y a los conjuntos donde se puede definir dicha división se les llama [[Dominio euclídeo|dominios euclídeos]]. Por ejemplo, el conjunto de los [[Número entero|números enteros]] y el de los [[Polinomio]]s 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 <math>P(x)=x^5+2x^3+x</math> y <math>Q(x)=x^4-1</math> el algoritmo de Euclides sugiere la siguiente secuencia de operaciones:  
+
Por ejemplo, para calcular el máximo común divisor de los polinomios P(x) = x<sup>5</sup> + 2x<sup>3</sup> + x y Q(x) = x<sup>4</sup> − 1 el algoritmo de Euclides sugiere la siguiente secuencia de operaciones:  
  
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Paso
+
! Paso  
! Operación
+
! Operación  
 
! Significado
 
! Significado
 
|-
 
|-
| 1
+
| 1  
| <math>x^5+2x^3+x</math> dividido entre <math>x^4-1</math> es <math>x</math> y sobra <math>2x^3+2x</math>
+
| <math>x^5+2x^3+x</math> dividido entre <math>x^4-1</math> es <math>x</math> y sobra <math>2x^3+2x</math>  
 
| <math>\mathrm{mcd}(x^5+2x^3+x,x^4-1)=\mathrm{mcd}(x^4-1,2x^3+2x)</math>
 
| <math>\mathrm{mcd}(x^5+2x^3+x,x^4-1)=\mathrm{mcd}(x^4-1,2x^3+2x)</math>
 
|-
 
|-
| 2
+
| 2  
| <math>x^4-1</math> dividido entre <math>2x^3+2x</math> es <math>\textstyle{\frac12x}</math> y sobra <math>-x^2-1</math>
+
| <math>x^4-1</math> dividido entre <math>2x^3+2x</math> es <math>\textstyle{\frac12x}</math> y sobra <math>-x^2-1</math>  
 
| <math>\mathrm{mcd}(x^4-1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,-x^2-1)</math>
 
| <math>\mathrm{mcd}(x^4-1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,-x^2-1)</math>
 
|-
 
|-
| 3
+
| 3  
| <math>2x^3+2x</math> dividido entre <math>-x^2-1</math> es <math>-2x</math> y sobra 0
+
| <math>2x^3+2x</math> dividido entre <math>-x^2-1</math> es <math>-2x</math> y sobra 0  
 
| <math>\mathrm{mcd}(2x^3+2x,-x^2-1)=\mathrm{mcd}(-x^2-1,0)</math>
 
| <math>\mathrm{mcd}(2x^3+2x,-x^2-1)=\mathrm{mcd}(-x^2-1,0)</math>
 
|}
 
|}
  
De esta manera se concluye que su máximo común divisor es <math>-x^2-1</math>.  
+
De esta manera se concluye que su máximo común divisor es − x<sup>2</sup> − 1.  
  
 
=== Descripción formal  ===
 
=== Descripción formal  ===
  
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión "<math>x\bmod y</math>" significa "el residuo de dividir <math>x</math> entre <math>y</math>" (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|
+
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión "xmod y" significa "el residuo de dividir ''x'' entre y" (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|
 
'''Entrada:''' Valores <math>a</math> y <math>b</math> pertenecientes a un dominio euclídeo
 
'''Entrada:''' Valores <math>a</math> y <math>b</math> pertenecientes a un dominio euclídeo
  
Línea 134: Línea 131:
 
## <math>i\gets i+1</math>
 
## <math>i\gets i+1</math>
 
# '''El resultado es:''' <math>r_{i-1}</math>
 
# '''El resultado es:''' <math>r_{i-1}</math>
 +
|1}} 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 <math>r_i</math>.
 +
 +
=== Generalización  ===
 +
 +
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una "división con residuo". A este tipo de divisiones se les llama [[División euclidiana|divisiones euclidianas]] y a los conjuntos donde se puede definir dicha división se les llama [[Dominio euclídeo|dominios euclídeos]]. Por ejemplo, el conjunto de los [[Número entero|números enteros]] y el de los [[Polinomio]]s 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 <math>P(x)=x^5+2x^3+x</math> y <math>Q(x)=x^4–1</math> el algoritmo de Euclides sugiere la siguiente secuencia de operaciones:
 +
 +
{|
 +
|-
 +
| –
 +
! Paso
 +
! Operación
 +
! Significado
 +
| –
 +
| 1
 +
| <math>x^5+2x^3+x</math> dividido entre <math>x^4–1</math> es <math>x</math> y sobra <math>2x^3+2x</math>
 +
| <math>\mathrm{mcd}(x^5+2x^3+x,x^4–1)=\mathrm{mcd}(x^4–1,2x^3+2x)</math>
 +
| –
 +
| 2
 +
| <math>x^4–1</math> dividido entre <math>2x^3+2x</math> es <math>\textstyle{\frac12x}</math> y sobra <math>–x^2–1</math>
 +
| <math>\mathrm{mcd}(x^4–1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,–x^2–1)</math>
 +
| –
 +
| 3
 +
| <math>2x^3+2x</math> dividido entre <math>–x^2–1</math> es <math>–2x</math> y sobra 0
 +
| <math>\mathrm{mcd}(2x^3+2x,–x^2–1)=\mathrm{mcd}(–x^2–1,0)</math>
 +
|}
 +
 +
De esta manera se concluye que su máximo común divisor es <math>–x^2–1</math>.
 +
 +
=== Descripción formal  ===
 +
 +
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión "<math>x\bmod y</math>" significa "el residuo de dividir <math>x</math> entre <math>y</math>" (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|
 +
'''Entrada:''' Valores <math>a</math> y <math>b</math> pertenecientes a un dominio euclídeo
 +
 +
'''Salida:''' Un máximo común divisor de <math>a</math> y <math>b</math>
 +
# <math>r_0\gets a</math>, <math>r_1\gets b</math>
 +
# <math>i\gets1</math>
 +
# '''Mientras''' <math>r_i\neq 0</math> '''haga lo siguiente:'''
 +
## <math>r_{i+1}\gets r_{i–1}\bmod r_i</math>
 +
## <math>i\gets i+1</math>
 +
# '''El resultado es:''' <math>r_{i–1}</math>
 
|1}} 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 <math>r_i</math>.  
 
|1}} 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 <math>r_i</math>.  
  
Línea 148: Línea 187:
 
#Se substituye el residuo 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 cada paso expresar cada residuo como combinación lineal.
 
#Se substituye el residuo 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 cada paso expresar cada residuo 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 <math>2\times 2</math> se usa la siguiente fórmula (vése [[Producto de matrices]]): {{Ecuación | <math>\begin{bmatrix}e&f\\g&h\end{bmatrix}\times\begin{bmatrix}a&b\\c&d\end{bmatrix}=\begin{bmatrix}e a+f c&e b+f d\\g a+h c&g b+h d\end{bmatrix}</math>|1}} Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores <math>q_i</math> y <math>r_i</math> que ahí se describen. Por cada valor <math>q_i</math> calculado se puede formar la matriz <math>\textstyle Q_i=\begin{bmatrix}0&1\\1&-q_i\end{bmatrix}</math>. Usando la ecuación {{Eqnref|1}} de manera repetida se puede calcular el producto las primeras <math>i</math> matrices de este tipo: {{Ecuación | <math>\begin{bmatrix}s_i&t_i\\s_{i+1}&t_{i+1}\end{bmatrix}=\begin{bmatrix}0&1\\1&-q_i\end{bmatrix}\times \begin{bmatrix}0&1\\1&-q_{i-1}\end{bmatrix}\times\cdots\times \begin{bmatrix}0&1\\1&-q_1\end{bmatrix}</math>}}  
+
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 <math>2\times 2</math> se usa la siguiente fórmula (vése [[Producto de matrices]]): {{Ecuación | <math>\begin{bmatrix}e&f\\g&h\end{bmatrix}\times\begin{bmatrix}a&b\\c&d\end{bmatrix}=\begin{bmatrix}e a+f c&e b+f d\\g a+h c&g b+h d\end{bmatrix}</math>|1}} Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores <math>q_i</math> y <math>r_i</math> que ahí se describen. Por cada valor <math>q_i</math> calculado se puede formar la matriz <math>\textstyle Q_i=\begin{bmatrix}0&1\\1&–q_i\end{bmatrix}</math>. Usando la ecuación {{Eqnref|1}} de manera repetida se puede calcular el producto las primeras <math>i</math> matrices de este tipo: {{Ecuación | <math>\begin{bmatrix}s_i&t_i\\s_{i+1}&t_{i+1}\end{bmatrix}=\begin{bmatrix}0&1\\1&–q_i\end{bmatrix}\times \begin{bmatrix}0&1\\1&–q_{i–1}\end{bmatrix}\times\cdots\times \begin{bmatrix}0&1\\1&–q_1\end{bmatrix}</math>}}  
  
Resulta ser que los valores <math>s_i</math> y <math>t_i</math> tienen la propiedad de que <math>r_i=a s_i+b t_i</math>, es decir, expresan a <math>r_i</math> como una combinación lineal de <math>a</math> y <math>b</math>. Particularmente, como <math>\mathrm{mcd}(a,b)=r_{n+1}</math> entonces se tiene <math>\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}</math>, 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.<!--Pero no colocaré la demostración en una enciclopedia--> Es importante calcular <math>Q_i\times\cdots\times Q_3\times Q_2\times Q_1</math> en ese mismo orden. La matriz <math>Q_1</math> aparece en el extremo derecho y la matriz <math>Q_i</math> en el izquierdo.  
+
Resulta ser que los valores <math>s_i</math> y <math>t_i</math> tienen la propiedad de que <math>r_i=a s_i+b t_i</math>, es decir, expresan a <math>r_i</math> como una combinación lineal de <math>a</math> y <math>b</math>. Particularmente, como <math>\mathrm{mcd}(a,b)=r_{n+1}</math> entonces se tiene <math>\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}</math>, 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.&lt;!––Pero no colocaré la demostración en una enciclopedia––&gt; Es importante calcular <math>Q_i\times\cdots\times Q_3\times Q_2\times Q_1</math> en ese mismo orden. La matriz <math>Q_1</math> aparece en el extremo derecho y la matriz <math>Q_i</math> en el izquierdo.  
  
Regresando al primer ejemplo, la sucesión de cocientes es <math>q_1=8</math>, <math>q_2=1</math> y <math>q_3=2</math>. Entonces se puede calcular {{Ecuación | <math>\begin{bmatrix}-1&9\\3&-26\end{bmatrix}=\begin{bmatrix}0&1\\1&-2\end{bmatrix}\times \begin{bmatrix}0&1\\1&-1\end{bmatrix}\times \begin{bmatrix}0&1\\1&-8\end{bmatrix}</math>}} Utilizando el primer renglón de esta matriz se puede leer que <math>91=2366(-1)+273(9)</math>, es decir, se ha encontrado la manera de expresar al máximo común divisor de 2366 y 273 como una combinación lineal.  
+
Regresando al primer ejemplo, la sucesión de cocientes es <math>q_1=8</math>, <math>q_2=1</math> y <math>q_3=2</math>. Entonces se puede calcular {{Ecuación | <math>\begin{bmatrix}–1&9\\3&–26\end{bmatrix}=\begin{bmatrix}0&1\\1&–2\end{bmatrix}\times \begin{bmatrix}0&1\\1&–1\end{bmatrix}\times \begin{bmatrix}0&1\\1&–8\end{bmatrix}</math>}} Utilizando el primer renglón de esta matriz se puede leer que <math>91=2366(–1)+273(9)</math>, 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  ===
 
=== Descripción formal  ===
  
 
Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores <math>s_i</math> y <math>t_i</math> con la multiplicación de matrices: {{Ecuación | <math>\begin{bmatrix}s_i&t_i\\s_{i+1}&t_{i+1}\end{bmatrix} =
 
Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores <math>s_i</math> y <math>t_i</math> con la multiplicación de matrices: {{Ecuación | <math>\begin{bmatrix}s_i&t_i\\s_{i+1}&t_{i+1}\end{bmatrix} =
\begin{bmatrix}s_i&t_i\\s_{i-1}-q_is_i&t_{i-1}-q_it_i\end{bmatrix} = \begin{bmatrix}0&1\\1&-q_i\end{bmatrix}\times\begin{bmatrix}s_{i-1}&t_{i-1}\\s_i&t_i\end{bmatrix}</math>}} De esta manera <math>s_{i+1} = s_{i-1}-q_is_i</math> y además <math>t_{i+1} = t_{i-1}-q_it_i</math>. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: {{Algoritmo|de Euclides extendido|
+
\begin{bmatrix}s_i&t_i\\s_{i–1}–q_is_i&t_{i–1}–q_it_i\end{bmatrix} = \begin{bmatrix}0&1\\1&–q_i\end{bmatrix}\times\begin{bmatrix}s_{i–1}&t_{i–1}\\s_i&t_i\end{bmatrix}</math>}} De esta manera <math>s_{i+1} = s_{i–1}–q_is_i</math> y además <math>t_{i+1} = t_{i–1}–q_it_i</math>. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: {{Algoritmo|de Euclides extendido|
 
'''Entrada:''' Valores <math>a</math> y <math>b</math> pertenecientes a un dominio euclídeo
 
'''Entrada:''' Valores <math>a</math> y <math>b</math> pertenecientes a un dominio euclídeo
  
Línea 164: Línea 203:
 
# <math>i\gets 1</math>
 
# <math>i\gets 1</math>
 
# '''Mientras''' <math>r_i\neq0</math> '''haga lo siguiente:'''
 
# '''Mientras''' <math>r_i\neq0</math> '''haga lo siguiente:'''
## Divida <math>r_{i-1} </math> entre <math>r_i </math> para obtener el cociente <math>q_i </math> y el residuo <math>r_{i+1} </math>
+
## Divida <math>r_{i–1} </math> entre <math>r_i </math> para obtener el cociente <math>q_i </math> y el residuo <math>r_{i+1} </math>
## <math>s_{i+1}\gets s_{i-1}-q_is_i</math>
+
## <math>s_{i+1}\gets s_{i–1}–q_is_i</math>
## <math>t_{i+1}\gets t_{i-1}-q_it_i</math>
+
## <math>t_{i+1}\gets t_{i–1}–q_it_i</math>
 
## <math>i\gets i+1</math>
 
## <math>i\gets i+1</math>
# '''El resultado es:''' <math>r_{i-1} </math> es un máximo común divisor de <math>a </math> y <math>b </math> y se expresa <math>r_{i-1}=as_{i-1}+bt_{i-1} </math>
+
# '''El resultado es:''' <math>r_{i–1} </math> es un máximo común divisor de <math>a </math> y <math>b </math> y se expresa <math>r_{i–1}=as_{i–1}+bt_{i–1} </math>
 
|2}}  
 
|2}}  
  
Línea 175: Línea 214:
 
=== Simplificar fracciones  ===
 
=== Simplificar fracciones  ===
  
Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción <math>\textstyle\frac{65}{91}</math> es equivalente con <math>\textstyle\frac 5 7</math> (véase [[Número racional]]). De manera más general, <math>\textstyle\frac ab=\frac {ca}{cb}</math> siempre que <math>c\ne0</math>. Para reducir una fracción cualquiera <math>\textstyle\frac a b</math>, sólo se necesita dividir <math>a</math> y <math>b</math> entre su máximo común divisor.  
+
Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción frac{65}{91} es equivalente con frac 5 7 (véase [[Número racional]]). De manera más general, frac ab=\frac {ca}{cb} siempre que c\ne0. Para reducir una fracción cualquiera frac a b, sólo se necesita dividir ''a ''y ''b'' entre su máximo común divisor.  
  
Por ejemplo, si se desea reducir <math>\textstyle\frac{166}{249}</math>, primero se usa el algoritmo de Euclides para encontrar <math>\mathrm{mcd}(166,249)=83</math>. Se hacen las divisiones <math>\textstyle 166\div 83 = 2</math> y <math>\textstyle 249\div 83 = 3</math>. Luego entonces se concluye que <math>\textstyle\frac{166}{249}=\frac 2 3</math>.  
+
Por ejemplo, si se desea reducir frac{166}{249}, primero se usa el algoritmo de Euclides para encontrar mcd(166,249)=83. Se hacen las divisiones 166\div 83 = 2 y 249\div 83 = 3. Luego entonces se concluye que frac{166}{249}=\frac 2 3.  
  
 
=== Fracciones continuas  ===
 
=== 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 <math>\textstyle\frac a b</math> como [[Fracción continua]]. Esto se debe a que si <math>a = bq + r</math> y <math>r\neq 0</math>, entonces {{ecuación|<math>\frac a b = q + \frac 1 {\frac b r}</math>|3}}
+
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]]. <br>  
  
Por ejemplo, para encontrar el máximo común divisor de <math>93164</math> y <math>5826</math> el algoritmo genera la siguiente secuencia de divisiones:
+
Esto se debe a que si ''a = bq + r ''y r neq 0, entonces&nbsp;
  
{| class="wikitable"
+
Por ejemplo, para encontrar el máximo común divisor de93164 y 5826 el algoritmo genera la siguiente secuencia de divisiones:
 +
 
 +
{| cellspacing="1" cellpadding="1" border="1" style="width: 397px; height: 123px;"
 
|-
 
|-
! Paso
+
! scope="col" | Paso<br>
! Operación
+
! scope="col" | Operación <br>
! Significado
+
! scope="col" | Significado<br>
 
|-
 
|-
| 1
+
! scope="row" | 1<br>
| 93164 dividido entre 5826 es 15 y sobran 5774
+
| 93164 dividido entre 5826 es 15 y sobran 5774<br>
| <math>93164=5826\times 15+5774</math>
+
| <br>
 
|-
 
|-
| 2
+
! scope="row" | 2<br>
| 5826 dividido entre 5774 es 1 y sobran 52
+
| 5826 dividido entre 5774 es 1 y sobran 52<br>
| <math>5826=5774\times 1+52</math>
+
| <br>
 
|-
 
|-
| 3
+
! scope="row" | 3<br>
| 5774 dividido entre 52 es 111 y sobran 2
+
| 5774 dividido entre 52 es 111 y sobran 2<br>
| <math>5774=52\times 111+2</math>
+
| <br>
 
|-
 
|-
| 4
+
! scope="row" | 4<br>
| 52 dividido entre 2 es 26 y sobra 0
+
| 52 dividido entre 2 es 26 y sobra 0<br>
| <math>52=2\times 26+0</math>
+
| <br>
 
|}
 
|}
  
Todas estas ecuaciones las podemos hacer parecidas a la ecuación {{eqnref | 3}}:  
+
<br>
 +
 
 +
Todas estas ecuaciones las podemos hacer parecidas a la ecuación&nbsp;:  
  
#<math>\textstyle\frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}}</math>
+
#frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}}  
#<math>\textstyle\frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}}</math>
+
#frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}}  
#<math>\textstyle\frac{5774}{52}=111+ \frac 1 {\frac{52}{2}}</math>
+
#frac{5774}{52}=111+ \frac 1 {\frac{52}{2}}  
#<math>\textstyle\frac{52}{2}=26</math>
+
#frac{52}{2}=26
  
Si se substituye la segunda ecuación en la primera, se obtiene {{Ecuación|<math>\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {\frac{5774}{52}}}</math>}}
+
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: {{Ecuación|<math>\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {111+ \frac 1 {26}}}</math>}}
+
Si se repite este proceso de substitución entonces se obtiene la expresión deseada:&nbsp;
  
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma {{Ecuación|<math>\frac{a}{b}=q_1+ \frac 1 {q_2+ \frac 1 {q_3+ \frac 1 {\ddots q_{n-1}+ \frac 1 {q_n}}}}</math>}} <!-- Esto va en la sección siguiente: Volviendo al caso <math>a</math> y <math>b</math> enteros, el algoritmo de Euclides permite encontrar los coeficientes enteros <math>u</math> y <math>v</math> de la [[identidad de Bézout]] <math>au+bv=\mathrm{mcd}(a, b)</math> de fundamental importancia en la [[aritmética]]. -->
+
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma &lt;!–– Esto va en la sección siguiente: Volviendo al caso ''a ''y ''b'' enteros, el algoritmo de Euclides permite encontrar los coeficientes enteros ''u'' y ''v'' de la [[Identidad de Bézout]] au+bv={mcd}(a, b) de fundamental importancia en la [[Aritmética]]. ––&gt;
  
 
=== Inversos modulares  ===
 
=== Inversos modulares  ===
  
Decimos que dos números enteros son ''congruentes módulo <math>m</math>'' (aunque también se puede generalizar para cualquier otro dominio euclídeo) si al dividirlos entre <math>m</math> 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 <math>a</math> es congruente con <math>b</math> módulo <math>m</math> se escribe <math>a\equiv b\pmod m</math>, en el ejemplo anterior se tiene <math>7\equiv 12\pmod 5</math>. Supóngase que se conocen los valores de <math>a</math>, <math>b</math> y <math>m</math>, pero que se desconoce el valor <math>x</math> de la siguiente ecuación: {{Ecuacion |<math>a x\equiv b\pmod m</math>|2}} Basta con encontrar un valor <math>a^{-1}</math> que tenga la característica de que <math>a^{-1} a\equiv 1\pmod m</math>, pues de esta manera al multiplicar la ecuación {{eqnref|2}} por <math>a^{-1}</math> se tendría la solución deseada: {{Ecuacion | <math>x\equiv a^{-1} b\pmod m</math>}} Al valor <math>a^{-1}</math> se le llama ''inverso modular'' de <math>a</math> módulo <math>m</math>. Desafortunadamente este valor no siempre existe. Por ejemplo, con <math>a=4</math> y <math>m=6</math> no existe ningún número entero entero <math>a^{-1}</math> tal que <math>a^{-1} 4\equiv 1\pmod 6</math>. De hecho este valor existe si y sólo si <math>\mathrm{mcd}(a,m)=1</math>. Más aún, si al usar el algoritmo de Euclides extendido (ahora con <math>b=m</math>) se obtiene <math>1=as+mt</math>, entonces el valor <math>s</math> es el inverso modular de <math>a</math> módulo <math>m</math>. <!--LA DEMOSTRACIÓN NO ES BUENO COLOCARLA EN LA ENCICLOPEDIA--> Por ejemplo, se desea resolver la ecuación {{Ecuacion |<math>5 x\equiv 2\pmod 9</math>}} Entonces con el algoritmo de Euclides extendido se calcula que <math>\mathrm{mcd}(5,9)=1=5(2)+9(-1)</math>. Como <math>\mathrm{mcd}(5,9)=1</math> entonces 5 tiene un inverso modular. Más aún, como <math>1=5(2)+9(-1)</math>, entonces ese inverso es 2. Entonces {{Ecuacion |<math>x\equiv 2(2)\pmod 9</math>}} Es decir que el valor de <math>x</math> es <math>4</math>.  
+
Decimos 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, en el ejemplo anterior se tiene 7 equiv 12 p mod 5. Supóngase que se conocen los valores de ''a'', ''b'' y ''m'', pero que se desconoce el valor ''x'' de la siguiente ecuación:<br>  
 +
 
 +
Basta con encontrar un valor ''a''<sup>-1</sup> que tenga la característica de que, pues de esta manera al multiplicar la ecuación por ''a''<sup>-1</sup> se tendría la solución deseada: <br>  
 +
 
 +
Al valor ''a''<sup>-1</sup> se le llama ''inverso modular'' de ''a'' módulo ''m''. Desafortunadamente este valor no siempre existe. Por ejemplo, con ''a''=4 y''m''=6 no existe ningún número entero entero ''a''<sup>-1</sup> tal que. De hecho este valor existe si y sólo si 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 modular de ''a'' módulo ''m''. Por ejemplo, se desea resolver la ecuación <br>  
 +
 
 +
Entonces con el algoritmo de Euclides extendido se calcula que mcd(5,9) = 1 = 5(2) + 9( 1). Como mcd(5,9) = 1 entonces 5 tiene un inverso modular. Más aún, como 1 = 5(2) + 9( 1), entonces ese inverso es 2. Entonces <br>  
 +
 
 +
Es decir que el valor de ''x'' es 4.  
  
 
Véase [[Multiplicador modular inverso]]  
 
Véase [[Multiplicador modular inverso]]  
Línea 229: Línea 280:
 
== Complejidad del algoritmo  ==
 
== Complejidad del algoritmo  ==
  
[[Image:Euclidean algorithm running time X Y.png|thumb|Gráfica del número de divisiones efectuadas en el algoritmo de Euclides. El rojo indica pocas operaciones, mientras que los colores eventualmente 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 f_{10}=55 y f_{11}=89 se obtiene la siguiente secuencia de operaciones:<br>
  
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 <math>f_{10}=55</math> y <math>f_{11}=89</math> se obtiene la siguiente secuencia de operaciones:
+
{| cellspacing="1" cellpadding="1" border="1" style="width: 418px; height: 225px;"
 
 
{| class="wikitable"
 
 
|-
 
|-
! Paso
+
! scope="col" | Paso<br>
! Operación
+
! scope="col" | Operación<br>
! Significado
+
! scope="col" | Significado<br>
 
|-
 
|-
| 1
+
! scope="row" | 1<br>
| 89 dividido entre 55 es 1 y sobran 34
+
| 89 dividido entre 55 es 1 y sobran 34<br>
| <math>\mathrm{mcd}(89,55)=\mathrm{mcd}(55,34)</math>
+
| mcd(89,55) = mcd(55,34)<br>
 
|-
 
|-
| 2
+
! scope="row" | 2<br>
| 55 dividido entre 34 es 1 y sobran 21
+
| 55 dividido entre 34 es 1 y sobran 21<br>
| <math>\mathrm{mcd}(55,34)=\mathrm{mcd}(34,21)</math>
+
| mcd(55,34) = mcd(34,21)<br>
 
|-
 
|-
| 3
+
! scope="row" | 3<br>
| 34 dividido entre 21 es 1 y sobran 13
+
| 34 dividido entre 21 es 1 y sobran 13<br>
| <math>\mathrm{mcd}(34,21)=\mathrm{mcd}(21,13)</math>
+
| mcd(34,21) = mcd(21,13)<br>
 
|-
 
|-
| 4
+
! scope="row" | 4<br>
| 21 dividido entre 13 es 1 y sobran 8
+
| 21 dividido entre 13 es 1 y sobran 8<br>
| <math>\mathrm{mcd}(21,13)=\mathrm{mcd}(13,8)</math>
+
| mcd(21,13) = mcd(13,8)
 
|-
 
|-
| 5
+
! scope="row" | 5<br>
| 13 dividido entre 8 es 1 y sobran 5
+
| 13 dividido entre 8 es 1 y sobran 5<br>
| <math>\mathrm{mcd}(13,8)=\mathrm{mcd}(8,5)</math>
+
| mcd(13,8) = mcd(8,5)
 
|-
 
|-
| 6
+
! scope="row" | 6  
| 8 dividido entre 5 es 1 y sobran 3
+
| 8 dividido entre 5 es 1 y sobran 3<br>
| <math>\mathrm{mcd}(8,5)=\mathrm{mcd}(5,3)</math>
+
| mcd(8,5) = mcd(5,3)
 
|-
 
|-
| 7
+
! scope="row" | 7  
| 5 dividido entre 3 es 1 y sobran 2
+
| 5 dividido entre 3 es 1 y sobran 2<br>
| <math>\mathrm{mcd}(5,3)=\mathrm{mcd}(3,2)</math>
+
| mcd(5,3) = mcd(3,2)<br>
 
|-
 
|-
| 8
+
! scope="row" | 8  
| 3 dividido entre 2 es 1 y sobran 1
+
| 3 dividido entre 2 es 1 y sobran 1  
| <math>\mathrm{mcd}(3,2)=\mathrm{mcd}(2,1)</math>
+
| mcd(3,2) = mcd(2,1)
 
|-
 
|-
| 9
+
! scope="row" | 9  
| 2 dividido entre 1 es 2 y sobra 0
+
| 2 dividido entre 1 es 2 y sobra 0  
| <math>\mathrm{mcd}(2,1)=\mathrm{mcd}(1,0)</math>
+
| 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 <math>\mathcal O(\log n)</math> divisiones para calcular el máximo común divisor de <math>n</math> y <math>m</math> donde <math>n>m</math>.  
+
<br> 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(log n) divisiones para calcular el máximo común divisor de ''n'' y ''m'' donde ''n&gt;m''.  
  
El número promedio de divisiones efectuadas por el algoritmo se estuvo investigando desde 1968, pero sólo hasta apenas el año 2002, Brigitte Vallée demostró que si los dos números se pueden representar con <math>n</math> bits, entonces el número promedio de divisiones necesarias es <math>\textstyle{\frac{\pi^2}{6}n}</math>.  
+
El número promedio de divisiones efectuadas por el algoritmo se estuvo investigando desde 1968, pero sólo 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 .  
  
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 <math>\mathcal O(\log n)</math> donde <math>n</math> es el grado de los polinomios.  
+
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(log n) donde ''n ''es el grado de los polinomios.  
  
 
== Implementación en pseudocódigo  ==
 
== Implementación en pseudocódigo  ==
  
En general, los algoritmos {{Algref|1}} y {{Algref|2}} 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:  
+
En general, los algoritmos 1 y 2 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:  
  
{{Algoritmo|de Euclides tradicional implementado de manera recurrente|
+
{| cellspacing="1" cellpadding="1" border="1" style="width: 426px; height: 182px;"
'''Función''' <math>\mathrm{mcd}(a,b)</math>''':'''
+
|-
:'''Si''' <math>b=0 </math> '''entonces:'''
+
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente<br>
::'''El resultado es''' <math>a </math>
+
|-
:'''En otro caso:'''
+
| '''Función''' mcd(a,b):  
::'''El resultado es''' <math>\mathrm{mcd}(b,a\bmod b)</math>
+
'''Si''' b = 0 '''entonces''':  
}} {{Algoritmo|de Euclides tradicional implementado de manera iterativa|
 
'''Función''' <math>\mathrm{mcd}(a,b)</math>''':'''
 
:'''Mientras''' <math>b\ne0</math> '''haga lo siguiente:'''
 
::<math>(a,b)\gets(b,a\bmod b)</math>
 
:'''El resultado es''' <math>a </math>
 
}} {{Algoritmo|de Euclides extendido implementado de manera recurrente|
 
'''Función''' <math>{\it Euclides}(a,b)</math>''':'''
 
:'''Si''' <math>b=0 </math> '''entonces:'''
 
::'''El resultado es''' <math>(a,1,0)</math>
 
:'''En otro caso:'''
 
::<math>(d,s,t)\gets{\it Euclides}(b,a\bmod b)</math>
 
::'''El resultado es''' <math>(d,t,s-(a\div b) t)</math>
 
}} {{Algoritmo|de Euclides extendido implementado de manera iterativa|
 
'''Función''' <math>{\it Euclides}(a,b)</math>''':'''
 
:<math>(s,t,s^\prime,t^\prime)\gets(1,0,0,1)</math>
 
:'''Mientras''' <math>b\ne0</math> '''haga lo siguiente:'''
 
::Divida <math>a </math> entre <math>b </math> para obtener un cociente <math>q </math> y un residuo <math>r </math>
 
::<math>(a,s,t,b,s^\prime,t^\prime)\gets(b,s^\prime,t^\prime,r,s-s^\prime q,t-t^\prime q)</math>
 
:'''El resultado es''' <math>(a,s,t)</math>
 
}} {{Algoritmo|de Euclides extendido implementado de manera iterativa con matrices|
 
'''Función''' <math>{\it Euclides}(a,b)</math>''':'''
 
:<math>Q\gets\begin{pmatrix}1&0\\0&1\end{pmatrix}</math>
 
:'''Mientras''' <math>b\ne0</math> '''haga lo siguiente:'''
 
::Divida <math>a </math> entre <math>b </math> para obtener un cociente <math>q </math> y un residuo <math>r </math>
 
::<math>Q\gets\begin{pmatrix}0&1\\1&-q\end{pmatrix}\times Q</math>
 
::<math>(a,b)\gets(b,r)</math>
 
:'''El resultado es''' <math>(a,Q_{1 1},Q_{1 2})</math>
 
}} Acerca de la notación empleada:  
 
  
*<math>x\gets y</math> significa "asigne a la variable <math>x</math> el valor actual de <math>y</math>". En lenguajes como [[Lenguaje C|C]], [[Lenguaje de programación Java|Java]], [[C]], [[Python]] y [[Visual Basic]] esto significa simplemente <code>x = y</code>. En otros lenguajes como [[Lenguaje de programación Pascal|Pascal]] se traduce en <code>a&nbsp;:= b</code>, en [[Maxima]] es <code>a&nbsp;: b</code>, en [[R-project|R]], S y [[Ocaml]] es <code>x &lt;- y</code>, e inclusive se utiliza la flecha <code>x ← y</code> como el caso de [[APL]].  
+
'''El resultado es''' a
*<math>(x,y,z)\gets(a,b,c)</math> significa que primero se evalúan los valores <math>a,b,c</math> y luego se asigna <math>x\gets a,y\gets b,z\gets c</math>, etc. En lenguajes como Python, [[Ruby]] o Maxima esta instrucción tiene una estructura muy similar, como por ejemplo en Python: <code>(x,y,z) = (a,b,c)</code>. En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: <code>aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;</code>.  
+
 
*<math>a\div b</math> significa "el cociente de dividir <math>a</math> entre <math>b</math>". 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 <code>a/b</code>. Otras maneras son <code>a\b</code> (Visual Basic) , <code>a div b</code> (Pascal) o bien <code>a//b</code> (Python 3).  
+
'''En otro caso''':
*<math>a\bmod b</math> significa "el residuo de dividir <math>a</math> entre <math>b</math>". A esta operación se le conoce simplemente como ''módulo''. En muchos lenguajes de programación se implementa como <code>a&nbsp;% b</code>, mientras que en otros es <code>a mod b</code> (Visual Basic o Pascal) o bien <code>a rem b</code> (Ada).
+
 
 +
'''El resultado es''' mcd(b,amod b)
 +
 
 +
|}
 +
 
 +
<br>
 +
 
 +
{| cellspacing="1" cellpadding="1" border="1" style="width: 432px; height: 89px;"
 +
|-
 +
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente<br>
 +
|-
 +
| '''Función''' mcd(a,b):
 +
'''&nbsp;&nbsp;&nbsp; Mientras haga lo siguiente''':
 +
 
 +
'''&nbsp;&nbsp;&nbsp; El resultado es''' a
 +
 
 +
|}
 +
 
 +
<br>
 +
 
 +
{| cellspacing="1" cellpadding="1" border="1" style="width: 434px; height: 133px;"
 +
|-
 +
| '''Algoritmo '''de Euclides tradicional implementado de manera recurrente<br>
 +
|-
 +
| '''Función''' Euclides(a,b):
 +
'''Si''' b = 0 '''entonces''':
 +
 
 +
'''El resultado es '''(a,1,0)
 +
 
 +
'''En otro caso''': '''El resultado es'''
 +
 
 +
|}
 +
 
 +
<br>
 +
 
 +
{| cellspacing="1" cellpadding="1" border="1" style="width: 430px; height: 48px;"
 +
|-
 +
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente<br>
 +
|-
 +
| '''Función''' Euclides(a,b):
 +
'''Mientras haga lo siguiente''':
 +
 
 +
Divida ''a ''entre ''b'' para obtener un cociente ''q'' y un residuo''r''
 +
 
 +
'''El resultado es '''(a,s,t)
 +
 
 +
|}
 +
 
 +
<br>  
 +
 
 +
{| cellspacing="1" cellpadding="1" border="1" style="width: 428px; height: 51px;"
 +
|-
 +
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente<br>
 +
|-
 +
| '''Función '''Euclides(a,b):
 +
'''Mientras haga lo siguiente''': Divida ''a'' entre ''b'' para obtener un cociente ''q'' y un residuo ''r''
 +
 
 +
'''El resultado es''' (a,Q<sub>11</sub>,Q<sub>12</sub>)
 +
 
 +
|}
 +
 
 +
<br> Acerca de la notación empleada:
 +
 
 +
*''x'' gest ''y'' significa "asigne a la variable ''a ''el valor actual de ''b''". En lenguajes como [[Lenguaje C|C]], [[Lenguaje de programación Java|Java]], [[C]], [[Python]] y [[Visual Basic]] esto significa simplemente <code>x = y</code>. En otros lenguajes como [[Lenguaje de programación Pascal|Pascal]] se traduce en <code>a&nbsp;:= b</code>, en [[Maxima]] es <code>a&nbsp;: b</code>, en [[R–project|R]], S y [[Ocaml]] es <code>x &lt;y</code>, e inclusive se utiliza la flecha <code>x ← y</code> como el caso de [[APL]].  
 +
*(''x,y,z'') gets (''a,b,c'') significa que primero se evalúan los valores ''a, b, c'' y luego se asigna ''x'' gets ''a, y'' gets ''b, z'' gets ''c'', etc. En lenguajes como Python, [[Ruby]] o Maxima esta instrucción tiene una estructura muy similar, como por ejemplo en Python: <code>(x,y,z) = (a,b,c)</code>. En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: <code>aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;</code>.  
 +
*''a'' div ''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 <code>a/b</code>. Otras maneras son <code>a\b</code> (Visual Basic) , <code>a div b</code> (Pascal) o bien <code>a//b</code> (Python 3).  
 +
*''a'' mod ''b'' 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 <code>a&nbsp;% b</code>, mientras que en otros es <code>a mod b</code> (Visual Basic o Pascal) o bien <code>a rem b</code> (Ada).
 +
 
 +
==Ver además==
 +
*[[Algoritmo de  ordenamiento]]
 +
*[[Algoritmo de búsqueda]]
 +
*[[Algoritmo de Kruskal]]
 +
*[[Algoritmo]]
 +
*[[Algoritmo de Prim]]
 +
*[[Algoritmo de Boruvka]]
 +
*[[Algoritmo  de Gutmann]]
 +
*[[Algoritmo criptográfico]]
 +
*[[Algoritmo de Ordenamiento  Burbuja]]
 +
*[[Algoritmo de Ordenamiento Shell]]
 +
*[[Algoritmo  genético]]
 +
*[[Algoritmo de  ordenamiento por  selección]]
 +
*[[Algoritmo de  árboles de decisión de  Microsoft]]
 +
*[[Algoritmo de Búsqueda  Heurística  A*]]
 +
*[[Algoritmo asimétrico]]
  
 
== Referencias  ==
 
== Referencias  ==
  
{{listaref}} <!-- Recomiendo revisarlos en este orden (así influyeron en la redacción del artículo)-->
+
*Von Zur Gathen, Joachim; Gerhard, Jürgen (2003). «The Euclidean Algorithm», Modern Computer Algebra. Cambridge
  
*{{cita libro
+
*University Press. ISBN 0-521-82646-2.
| autor = von zur Gathen, Joachim; Gerhard, Jürgen
+
*Shoup, Victor (2008). «Euclid´s algorithm», A Computational Introduction to Numbrer Theory and Algebra. Cambridge
| capítulo = The Euclidean Algorithm
+
*University Press. ISBN 978-0-521-85154-1.
| título = [http://math-www.uni-paderborn.de/mca/ Modern Computer Algebra]
+
*Johnsonbaugh, Richard (2005). «Introdución a la teoría de números», Matemáticas Discretas. México: PEARSON EDUCACIÓN. ISBN 970-26-0637-3.
| año = 2003
+
*Ralph P. Grimaldi (1998). «Propiedades de los números enteros: Inducción matemática», Matemáticas Discreta y Combinatoria. México: Addison Wesley Longman de México. ISBN 968-444-324-2.
| editorial = Cambridge University Press
+
*&nbsp; Lipschutz, Seymour; Lipson, Marc (2009). «Propiedades de los enteros», Matemáticas Discretas. McGraw-Hill. ISBN 978-970-10-7236-3.
| id = ISBN 0-521-82646-2
+
*&nbsp; Brassard, Gilles; Bratley, Paul (1997). «Análisis de algoritmos», Fundamentos de Algoritmia. Madrid: PRENTICE HALL. ISBN 84-89660-00-X.
}}
+
*Vallée, Brigitte (2002). «Dynamical Analysis of α-Euclidean Algorithmos». Journal of Algorithms 44 (1). ISBN 0196-6774, pp. 246-285. http://users.info.unicaen.fr/~brigitte/Publications/bourdon-daireaux-vallee.ps.
*{{cita libro
+
*Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford (2009). «Number-Theoretic Algorithms», Introduction to Algorithms. The MIT Press. ISBN 978-0-262-53305-8.
| autor = Shoup, Victor
+
*Barrera Mora, Fernando (2005). «Definiciones y resultados generales», Introducción a la Teoría de Grupos. Publicaciones Electrónicas de la Sociedad Matemática Mexicana. ISBN&nbsp;968-9161-02-4.
| capítulo = Euclid’s algorithm
+
*Cárdenas, Humberto; Lluis, Emilio; Raggi, Francisco; Tomás, Francisco (2004).&nbsp;«Divisibilidad», Álgebra Superior. México: Trillas. ISBN 968-24-3783-0.
| título = [http://www.shoup.net/ntb/ A Computational Introduction to Number Theory and Algebra]
+
*&nbsp;Pérez Segui, María Luisa (2006). «Divisibilidad», Teoría de Números. Instituto de Matemáticas, UNAM. ISBN 970-32-1170-0.
| año = 2008
+
*&nbsp;Sánchez Velázquez, Jesús (1998). «Algoritmos para números grandes», Introducción al análisis de algoritmos. México: Trillas. ISBN 968-24-4341-5.
| editorial = Cambridge University Press
 
| id = ISBN 978-0-521-85154-1
 
}}
 
*{{cita libro
 
| autor = Johnsonbaugh, Richard
 
| capítulo = Introducción a la teoría de números
 
| título = Matemáticas Discretas
 
| año = 2005
 
| editorial = México: PEARSON EDUCACIÓN
 
| id = ISBN 970-26-0637-3
 
}}
 
*{{cita libro
 
| autor = Ralph P. Grimaldi
 
| capítulo = Propiedades de los números enteros: Inducción matemática
 
| título = Matemáticas Discreta y Combinatoria
 
| año = 1998
 
| editorial = México: Addison Wesley Longman de México
 
| id = ISBN 968-444-324-2
 
}}
 
*{{cita libro
 
| autor = Lipschutz, Seymour; Lipson, Marc
 
| capítulo = Propiedades de los enteros
 
| título = Matemáticas Discretas
 
| año = 2009
 
| editorial = McGraw-Hill
 
| id = ISBN 978-970-10-7236-3
 
}}
 
*{{cita libro
 
| autor = Brassard, Gilles; Bratley, Paul
 
| capítulo = Análisis de algoritmos
 
| título = Fundamentos de Algoritmia
 
| año = 1997
 
| editorial = Madrid: PRENTICE HALL
 
| id = ISBN 84-89660-00-X
 
}}
 
*{{cita publicación
 
| autor = Vallée, Brigitte
 
| título = Dynamical Analysis of <math>\alpha</math>-Euclidean Algorithms
 
| año = 2002
 
| publicación = Journal of Algorithms
 
| volumen = 44
 
| número = 1
 
| id = ISSN 0196-6774 , pp. 246-285 <!-- No estoy seguro del ISSN, favor de verificar-->
 
| url = http://users.info.unicaen.fr/~brigitte/Publications/bourdon-daireaux-vallee.ps
 
}}
 
*{{cita libro
 
| autor = Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford
 
| capítulo = Number-Theoretic Algorithms
 
| título = Introduction to Algorithms
 
| año = 2009
 
| editorial = The MIT Press
 
| id = ISBN 978-0-262-53305-8
 
}}
 
*{{cita libro
 
| autor = Barrera Mora, Fernando
 
| capítulo = Definiciones y resultados generales
 
| título = [http://smm.org.mx/publicaciones/pe/textos/2004/v4/pdf/smm-pe-textos-2004-v4.pdf Introducción a la Teoría de Grupos]
 
| año = 2005
 
| editorial = Publicaciones Electrónicas de la Sociedad Matemática Mexicana
 
| id = ISBN 968-9161-02-4
 
}}
 
*{{cita libro
 
| autor = Cárdenas, Humberto; Lluis, Emilio; Raggi, Francisco; Tomás, Francisco
 
| capítulo = Divisibilidad
 
| título = Álgebra Superior
 
| año = 2004
 
| editorial = México: Trillas
 
| id = ISBN 968-24-3783-0
 
}}
 
*{{cita libro
 
| autor = Pérez Seguí, María Luisa
 
| capítulo = Divisibilidad
 
| título = Teoría de Números
 
| año = 2006
 
| editorial = Instituto de Matemáticas, UNAM
 
| id = ISBN 970-32-1170-0
 
}}
 
*{{cita libro
 
| autor = Sánchez Velázquez, Jesús
 
| capítulo = Algoritmos para números grandes
 
| título = Introducción al análisis de algoritmos
 
| año = 1998
 
| editorial = México: Trillas
 
| id = ISBN 968-24-4341-5
 
}}
 
*{{cita libro
 
| autor = Baldor, Aurelio
 
| capítulo = Máximo común divisor
 
| título = Álgebra
 
| año = 2008
 
| editorial = México: Grupo Editorial Patria
 
| id = ISBN 978-970-817-000-0
 
}}
 
  
<br>
+
*Baldor, Aurelio (2008). «Máximo común divisor», Álgebra. México
 +
*Grupo Editorial Patria. ISBN 978-970-817-000-0.
  
 
[[Category:Algoritmos]]
 
[[Category:Algoritmos]]
 
<br>
 

última versión al 15:12 19 ene 2012

Algoritmo de Euclides
Información sobre la plantilla
401px-Algoritmo de Euclides geométrico.svg.png
Concepto:Método antiguo y eficaz para calcular el máximo común divisor (MCD)

Algoritmo de Euclides:Es un método antiguo y eficaz para calcular el máximo común divisor (MCD). Fue originalmente descrito por Euclides en su obra Elementos. El algoritmo de Euclides extendido es una ligera modificación que permite además expresar al máximo común divisor como una combinación lineal. Este algoritmo tiene aplicaciones en diversas áreas como álgebra, teoría de números y ciencias de la computación entre otras. Con unas ligeras modificaciones suele ser utilizado en computadoras electrónicas debido a su gran eficiencia.

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 el cual 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  no es un número racional, pero en el caso de dos segmentos conmensurables se desea hallar la mayor medida común posible.

Euclides describe en la proposición VII.2 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.

Para encontrar la máxima medida común de dos números que no sean primos entre sí. Euclides VII-2.svg

Sean AB y CD los dos números que no son primos uno al otro. Se necesita entonces encontrar la máxima medida común de AB y CD.

Si CD mide AB entonces es una medida común puesto que CD se mide a sí mismo. Y es manifiesto que también es la mayor medida pues nada mayor a CD puede medir a CD. Pero si CD no mide a AB entonces algún número quedará de AB y CD, el menor siendo continuamente restado del mayor y que medirá al número que le precede. Porque una unidad no quedará pues si no es así, AB y CD serán primos uno del otro [Prop. VII.1], lo cual es lo contrario de lo que se supuso.

Por tanto, algún número queda que medirá el número que le precede. Y sea CD midiendo BE dejando EA menor que sí mismo y sea EA midiendo DF dejando FC menor que sí mismo y sea FC medida de AE. Entonces, como FC mide AE y AE mide DF, FC será entonces medida de DF. Y también se mide a sí mismo.

Por tanto también medirá todo CD. Y CD mide a BE. Entonces CF mide a BE y también mide a EA. Así mide a todo BA y también mide a CD. Esto es, CF mide tanto a AB y CD por lo que es una medida común de AB y CD.

Afirmo que también es la mayor medida común posible porque si no lo fuera, entonces un número mayor que CF mide a los números AB y CD, sea éste G. Dado que G mide a CD y CD mide a BE, G también mide a BE. Además, mide a todo BA por lo que mide también al residuo AE. Y AE mide a DF por lo que G también mide a DF. Mide también a todo DC por lo que mide también al residuo CF, es decir el mayor mide al menor, lo cual es imposible. Por tanto, ningún número mayor a CF puede medir a los números AB y CD. Entonces CF es la mayor medida común de AB y CD, lo cual se quería demostrar. Euclides. Elementos VII.2</pre> 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 EF, éste es menor que CD y podemos repetir el proceso: restamos EF tantas veces como sea posible de CD. Si al final no queda un residuo, EF es la medida común. En caso contrario obtenemos un nuevo residuo GH menor a EF.
  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 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. Éste 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 <math>\mathrm{mcd}(2366,273)=\mathrm{mcd}(273,182)</math>
2 273 dividido entre 182 es 1 y sobran 91 <math>\mathrm{mcd}(273,182)=\mathrm{mcd}(182,91)</math>
3 182 dividido entre 91 es 2 y sobra 0 <math>\mathrm{mcd}(182,91)=\mathrm{mcd}(91,0)</math>

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 <math>r_0</math> dividido entre <math>r_1</math> es <math>q_1</math> y sobran <math>r_2</math> <math>\mathrm{mcd}(r_0,r_1)=\mathrm{mcd}(r_1,r_2)</math>
2 <math>r_1</math> dividido entre <math>r_2</math> es <math>q_2</math> y sobran <math>r_3</math> <math>\mathrm{mcd}(r_1,r_2)=\mathrm{mcd}(r_2,r_3)</math>
3 <math>r_2</math> dividido entre <math>r_3</math> es <math>q_3</math> y sobran <math>r_4</math> <math>\mathrm{mcd}(r_2,r_3)=\mathrm{mcd}(r_3,r_4)</math>
<math>\vdots</math> <math>\vdots</math> <math>\vdots</math>
<math>n</math> <math>r_{n-1}</math> dividido entre <math>r_n</math> es <math>q_n</math> y sobran <math>r_{n+1}</math> <math>\mathrm{mcd}(r_{n-1},r_n)=\mathrm{mcd}(r_n,r_{n+1})</math>
<math>n+1</math> <math>r_n</math> dividido entre <math>r_{n+1}</math> es <math>q_{n+1}</math> y sobra <math>0</math> <math>\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)</math>

Como la sucesión de residuos va disminuyendo, eventualmente 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 cualesquiera elementos donde 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) = x4 − 1 el algoritmo de Euclides sugiere la siguiente secuencia de operaciones:

Paso Operación Significado
1 <math>x^5+2x^3+x</math> dividido entre <math>x^4-1</math> es <math>x</math> y sobra <math>2x^3+2x</math> <math>\mathrm{mcd}(x^5+2x^3+x,x^4-1)=\mathrm{mcd}(x^4-1,2x^3+2x)</math>
2 <math>x^4-1</math> dividido entre <math>2x^3+2x</math> es <math>\textstyle{\frac12x}</math> y sobra <math>-x^2-1</math> <math>\mathrm{mcd}(x^4-1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,-x^2-1)</math>
3 <math>2x^3+2x</math> dividido entre <math>-x^2-1</math> es <math>-2x</math> y sobra 0 <math>\mathrm{mcd}(2x^3+2x,-x^2-1)=\mathrm{mcd}(-x^2-1,0)</math>

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

Descripción formal

Se puede expresar este algoritmo de manera más formal usando Pseudocódigo. En este caso la expresión "xmod y" significa "el residuo de dividir x entre y" (véase Aritmética modular). Se ha detectado un bucle de plantilla: 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 <math>r_i</math>.

Generalización

En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde 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 <math>P(x)=x^5+2x^3+x</math> y <math>Q(x)=x^4–1</math> el algoritmo de Euclides sugiere la siguiente secuencia de operaciones:

Paso Operación Significado 1 <math>x^5+2x^3+x</math> dividido entre <math>x^4–1</math> es <math>x</math> y sobra <math>2x^3+2x</math> <math>\mathrm{mcd}(x^5+2x^3+x,x^4–1)=\mathrm{mcd}(x^4–1,2x^3+2x)</math> 2 <math>x^4–1</math> dividido entre <math>2x^3+2x</math> es <math>\textstyle{\frac12x}</math> y sobra <math>–x^2–1</math> <math>\mathrm{mcd}(x^4–1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,–x^2–1)</math> 3 <math>2x^3+2x</math> dividido entre <math>–x^2–1</math> es <math>–2x</math> y sobra 0 <math>\mathrm{mcd}(2x^3+2x,–x^2–1)=\mathrm{mcd}(–x^2–1,0)</math>

De esta manera se concluye que su máximo común divisor es <math>–x^2–1</math>.

Descripción formal

Se puede expresar este algoritmo de manera más formal usando Pseudocódigo. En este caso la expresión "<math>x\bmod y</math>" significa "el residuo de dividir <math>x</math> entre <math>y</math>" (véase Aritmética modular). Se ha detectado un bucle de plantilla: 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 <math>r_i</math>.

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 <math>a</math> y <math>b</math>, expresarlo como la mínima combinación lineal de esos números, es decir, encontrar números enteros <math>s</math> y <math>t</math> tales que <math>\mathrm{mcd}(a,b)=a s+b t</math>. Esto se generaliza también hacia cualquier dominio euclideano.

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 "<math>a</math> dividido entre <math>b</math> es <math>q</math> y sobra <math>r</math>" se escribe la ecuación <math>a=b q+r</math> (véase Algoritmo de la división).
  2. Se despejan los residuos de cada ecuación.
  3. Se substituye el residuo 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 cada paso expresar cada residuo 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 <math>2\times 2</math> se usa la siguiente fórmula (vése Producto de matrices): Plantilla:Ecuación Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores <math>q_i</math> y <math>r_i</math> que ahí se describen. Por cada valor <math>q_i</math> calculado se puede formar la matriz <math>\textstyle Q_i=\begin{bmatrix}0&1\\1&–q_i\end{bmatrix}</math>. Usando la ecuación Plantilla:Eqnref de manera repetida se puede calcular el producto las primeras <math>i</math> matrices de este tipo: Plantilla:Ecuación

Resulta ser que los valores <math>s_i</math> y <math>t_i</math> tienen la propiedad de que <math>r_i=a s_i+b t_i</math>, es decir, expresan a <math>r_i</math> como una combinación lineal de <math>a</math> y <math>b</math>. Particularmente, como <math>\mathrm{mcd}(a,b)=r_{n+1}</math> entonces se tiene <math>\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}</math>, 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.<!––Pero no colocaré la demostración en una enciclopedia––> Es importante calcular <math>Q_i\times\cdots\times Q_3\times Q_2\times Q_1</math> en ese mismo orden. La matriz <math>Q_1</math> aparece en el extremo derecho y la matriz <math>Q_i</math> en el izquierdo.

Regresando al primer ejemplo, la sucesión de cocientes es <math>q_1=8</math>, <math>q_2=1</math> y <math>q_3=2</math>. Entonces se puede calcular Plantilla:Ecuación Utilizando el primer renglón de esta matriz se puede leer que <math>91=2366(–1)+273(9)</math>, 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 <math>s_i</math> y <math>t_i</math> con la multiplicación de matrices: Plantilla:Ecuación De esta manera <math>s_{i+1} = s_{i–1}–q_is_i</math> y además <math>t_{i+1} = t_{i–1}–q_it_i</math>. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: Se ha detectado un bucle de plantilla: 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 frac{65}{91} es equivalente con frac 5 7 (véase Número racional). De manera más general, frac ab=\frac {ca}{cb} siempre que c\ne0. Para reducir una fracción cualquiera frac a b, sólo se necesita dividir a y b entre su máximo común divisor.

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

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 r neq 0, entonces 

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

Paso
Operación
Significado
1
93164 dividido entre 5826 es 15 y sobran 5774

2
5826 dividido entre 5774 es 1 y sobran 52

3
5774 dividido entre 52 es 111 y sobran 2

4
52 dividido entre 2 es 26 y sobra 0


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

  1. frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}}
  2. frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}}
  3. frac{5774}{52}=111+ \frac 1 {\frac{52}{2}}
  4. frac{52}{2}=26

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 <!–– Esto va en la sección siguiente: Volviendo al caso a y b enteros, el algoritmo de Euclides permite encontrar los coeficientes enteros u y v de la Identidad de Bézout au+bv={mcd}(a, b) de fundamental importancia en la Aritmética. ––>

Inversos modulares

Decimos 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). Cuandoa es congruente con b módulo m se escribe, en el ejemplo anterior se tiene 7 equiv 12 p mod 5. Supóngase que se conocen los valores de a, b y m, pero que se desconoce el valor x de la siguiente ecuación:

Basta con encontrar un valor a-1 que tenga la característica de que, pues de esta manera al multiplicar la ecuación por a-1 se tendría la solución deseada:

Al valor a-1 se le llama inverso modular de a módulo m. Desafortunadamente este valor no siempre existe. Por ejemplo, con a=4 ym=6 no existe ningún número entero entero a-1 tal que. De hecho este valor existe si y sólo si mcd(a,m)=1. Más aún, si al usar el algoritmo de Euclides extendido (ahora conb=m) se obtiene 1 =as + mt, entonces el valor s es el inverso modular de a módulo m. Por ejemplo, se desea resolver la ecuación

Entonces con el algoritmo de Euclides extendido se calcula que mcd(5,9) = 1 = 5(2) + 9( − 1). Como mcd(5,9) = 1 entonces 5 tiene un inverso modular. Más aún, como 1 = 5(2) + 9( − 1), entonces ese inverso es 2. Entonces

Es decir que el valor de x es 4.

Véase Multiplicador modular inverso

Complejidad del algoritmo

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 f_{10}=55 y f_{11}=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(log n) 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 sólo 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 .

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(log n) donde n es el grado de los polinomios.

Implementación en pseudocódigo

En general, los algoritmos 1 y 2 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:

Algoritmo de Euclides tradicional implementado de manera recurrente
Función mcd(a,b):

Si b = 0 entonces:

El resultado es a

En otro caso:

El resultado es mcd(b,amod b)


Algoritmo de Euclides tradicional implementado de manera recurrente
Función mcd(a,b):

    Mientras haga lo siguiente:

    El resultado es a


Algoritmo de Euclides tradicional implementado de manera recurrente
Función Euclides(a,b):

Si b = 0 entonces:

El resultado es (a,1,0)

En otro caso: El resultado es


Algoritmo de Euclides tradicional implementado de manera recurrente
Función Euclides(a,b):

Mientras haga lo siguiente:

Divida a entre b para obtener un cociente q y un residuor

El resultado es (a,s,t)


Algoritmo de Euclides tradicional implementado de manera recurrente
Función Euclides(a,b):

Mientras haga lo siguiente: Divida a entre b para obtener un cociente q y un residuo r

El resultado es (a,Q11,Q12)


Acerca de la notación empleada:

  • x gest y significa "asigne a la variable a el valor actual de b". 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) gets (a,b,c) significa que primero se evalúan los valores a, b, c y luego se asigna x gets a, y gets b, z gets c, 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 div 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).
  • a mod b 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).

Ver además

Referencias

  • Von Zur Gathen, Joachim; Gerhard, Jürgen (2003). «The Euclidean Algorithm», Modern Computer Algebra. Cambridge
  • University Press. ISBN 0-521-82646-2.
  • Shoup, Victor (2008). «Euclid´s algorithm», A Computational Introduction to Numbrer Theory and Algebra. Cambridge
  • University Press. ISBN 978-0-521-85154-1.
  • Johnsonbaugh, Richard (2005). «Introdución a la teoría de números», Matemáticas Discretas. México: PEARSON EDUCACIÓN. ISBN 970-26-0637-3.
  • Ralph P. Grimaldi (1998). «Propiedades de los números enteros: Inducción matemática», Matemáticas Discreta y Combinatoria. México: Addison Wesley Longman de México. ISBN 968-444-324-2.
  •   Lipschutz, Seymour; Lipson, Marc (2009). «Propiedades de los enteros», Matemáticas Discretas. McGraw-Hill. ISBN 978-970-10-7236-3.
  •   Brassard, Gilles; Bratley, Paul (1997). «Análisis de algoritmos», Fundamentos de Algoritmia. Madrid: PRENTICE HALL. ISBN 84-89660-00-X.
  • Vallée, Brigitte (2002). «Dynamical Analysis of α-Euclidean Algorithmos». Journal of Algorithms 44 (1). ISBN 0196-6774, pp. 246-285. http://users.info.unicaen.fr/~brigitte/Publications/bourdon-daireaux-vallee.ps.
  • Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford (2009). «Number-Theoretic Algorithms», Introduction to Algorithms. The MIT Press. ISBN 978-0-262-53305-8.
  • Barrera Mora, Fernando (2005). «Definiciones y resultados generales», Introducción a la Teoría de Grupos. Publicaciones Electrónicas de la Sociedad Matemática Mexicana. ISBN 968-9161-02-4.
  • Cárdenas, Humberto; Lluis, Emilio; Raggi, Francisco; Tomás, Francisco (2004). «Divisibilidad», Álgebra Superior. México: Trillas. ISBN 968-24-3783-0.
  •  Pérez Segui, María Luisa (2006). «Divisibilidad», Teoría de Números. Instituto de Matemáticas, UNAM. ISBN 970-32-1170-0.
  •  Sánchez Velázquez, Jesús (1998). «Algoritmos para números grandes», Introducción al análisis de algoritmos. México: Trillas. ISBN 968-24-4341-5.
  • Baldor, Aurelio (2008). «Máximo común divisor», Álgebra. México
  • Grupo Editorial Patria. ISBN 978-970-817-000-0.