<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.ecured.cu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Asanto+uci</id>
	<title>EcuRed - Contribuciones del colaborador [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.ecured.cu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Asanto+uci"/>
	<link rel="alternate" type="text/html" href="https://www.ecured.cu/Especial:Contribuciones/Asanto_uci"/>
	<updated>2026-04-22T15:10:32Z</updated>
	<subtitle>Contribuciones del colaborador</subtitle>
	<generator>MediaWiki 1.31.16</generator>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Variable_en_programaci%C3%B3n&amp;diff=172347</id>
		<title>Variable en programación</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Variable_en_programaci%C3%B3n&amp;diff=172347"/>
		<updated>2010-10-01T18:47:03Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '{{Referencia}} Variable (Programación)   &amp;lt;br&amp;gt;En programación, las variables son estructuras de datos que, como su nombre indica, pueden cambiar de contenido a lo largo de la e...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}} Variable (Programación) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;En programación, las variables son estructuras de datos que, como su nombre indica, pueden cambiar de contenido a lo largo de la ejecución de un programa. Una variable corresponde a un área reservada en la memoria principal del ordenador pudiendo ser de longitud:&amp;lt;br&amp;gt;Fija.- Cuando el tamaño de la misma no variará a lo largo de la ejecución del programa. Todas las variables, sean del tipo que sean tienen longitud fija, salvo algunas excepciones — como las colecciones de otras variables (arrays) o las cadenas. &lt;br /&gt;
&lt;br /&gt;
Variable.- Cuando el tamaño de la misma puede variar a lo largo de la ejecución. Típicamente colecciones de datos. &lt;br /&gt;
&lt;br /&gt;
== &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Tipos de datos  ==&lt;br /&gt;
&lt;br /&gt;
Debido a que las variables contienen o apuntan a valores de tipos determinados, las operaciones sobre las mismas y el dominio de sus propios valores están determinadas por el tipo de datos en cuestión. &lt;br /&gt;
&lt;br /&gt;
Algunos tipos de datos usados: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*[[Tipo de dato lógico]]. &lt;br /&gt;
*[[Tipo de dato entero]]. &lt;br /&gt;
*[[Tipo de dato de coma flotante (real, con decimales)]]. &lt;br /&gt;
*[[Tipo de dato carácter]]. &lt;br /&gt;
*[[Cadena (informática)|Tipo de dato ''cadena'']]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;br&amp;gt;Variables y paso de parámetros a subalgoritmos  ==&lt;br /&gt;
&lt;br /&gt;
Las variables pueden ser intercambiadas entre [[Subrutina|rutinas]], por valor y por referencia: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Por valor.- Se copia el valor (el dato) de la variable en la zona de la pila de llamadas —de ámbito local— que corresponde a la nueva subrutina llamada. Por tanto, esta subrutina obtiene dicho valor pero no puede modificar la variable original. Esto significa que si la variable sufre alteraciones dentro de esta rutina, para poder acceder a dichas modificaciones al finalizar, deberá devolver el nuevo valor de la misma. Si no se realiza esta operación, el valor de la variable será exactamente el mismo que tenía antes de pasar por la función. &lt;br /&gt;
*Por referencia- No se pasa el valor directamente de la variable, si no una referencia o Puntero (programación)puntero a la misma —que contiene la dirección de la zona de memoria donde se aloja el contenido—, de tal modo que se opera directamente sobre la zona de memoria que la contiene, lo cual implica que las modificaciones que sufra serán accesibles a posteriori.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== &amp;lt;br&amp;gt;Almacenamiento de variables en memoria  ==&lt;br /&gt;
&lt;br /&gt;
Las variables se representan con identificadores que hacen referencia a un lugar de la memoria del programa en donde se almacena un dato. Una variable está asociada a un [[Tipo de dato]]s, el cual y en función del tamaño del mismo determina la cantidad de [[Byte]]s que serán necesarios para almacenar la variable. En el caso de colecciones y al contrario que con el resto de tipo de datos, ya sean primitivos u objetos complejos, la memoria asignada a almacenar tales variables no se conoce de antemano, lo cual lleva a establecer políticas de reserva de Memoria de ordenador|memoria: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Reserva fija de memoria- Implica predeterminar la cantidad de memoria que se asignará a la colección. Es una política extremadamente rígida, ya que llegados al final de la zona de memoria no se podrían almacenar nuevos elementos. &lt;br /&gt;
*Reserva variable de memoria- Se dedica una zona de memoria, pudiendo ser de un tamaño predeterminado o no, y en caso de sobrepasarse dicha zona de memoria se vuelve a asignar otra zona, contigua o no, para impedir la restricción mencionada arriba.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Ámbito  ==&lt;br /&gt;
&lt;br /&gt;
Respecto al ámbito de una variable, éste puede ser: &lt;br /&gt;
&lt;br /&gt;
*Local: Cuando la misma sólo es accesible desde un único procedimiento hijo, no pudiendo ser leída o modificada desde otro procedimiento hermano o desde el propio procedimiento padre. Es posible declarar variables en bloques de condición, bucles, etc de tal modo que sólo pueda accederse a ellas en el propio bloque. &lt;br /&gt;
*Global: Cuando la misma es accesible tanto desde rutinas o macros de la aplicación, como en todos los procedimientos y funciones de la misma.&lt;br /&gt;
&lt;br /&gt;
Si bien es cierto, que de una forma básica, se puede definir el ámbito de las variables de la forma expuesta más arriba, existen grados de ''globalidad'' de las mismas, pudiendo ser accesibles desde unos puntos u otros, o incluso pudiendo ser accesibles entre aplicaciones distintas, llegando al caso de la ''superglobalidad''. Ejemplo del ámbito de una variable en el lenguaje de programación Lenguaje de programación Java|Java. &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;source lang=&amp;quot;java&amp;quot;&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
public class A {&lt;br /&gt;
&lt;br /&gt;
public Integer numeroEntero = new Integer(); /* Variable Global a todos los Métodos */&lt;br /&gt;
&lt;br /&gt;
public Integer metodo() {&lt;br /&gt;
&lt;br /&gt;
int num = 1; // Variable Local a metodo. Puede accederse dentro de este método en cualquier parte, pero no fuera del mismo.&lt;br /&gt;
&lt;br /&gt;
for (int i = 0;i&amp;amp;lt;numeroEntero.intValue();i++) { // i es local al bucle for, sólo puede ser accedida dentro del mismo.&lt;br /&gt;
&lt;br /&gt;
num *= i;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// i = 2; Esta línea provocaría error al no haber declarado la variable i. i fue definida localmente al bucle for.&lt;br /&gt;
&lt;br /&gt;
return Integer.valueOf(num);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void otroMetodo() {&lt;br /&gt;
&lt;br /&gt;
int num = 1; // Variable local a otroMetodo. num aquí es una variable distinta a la variable num de metodo&lt;br /&gt;
&lt;br /&gt;
System.out.println(&amp;quot;Variable local num: &amp;quot; + num);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Fuente  ==&lt;br /&gt;
&lt;br /&gt;
*Introducción a la programación: Java; Fernando Berzal&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
[[Category:Matemáticas]] [[Category:Programación]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Variables&amp;diff=172125</id>
		<title>Variables</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Variables&amp;diff=172125"/>
		<updated>2010-10-01T17:13:57Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '&amp;amp;nbsp;&amp;lt;img _fck_mw_template=&amp;quot;true&amp;quot; _fckrealelement=&amp;quot;0&amp;quot; _fckfakelement=&amp;quot;true&amp;quot; src=&amp;quot;http://www.ecured.cu/extensions/FCKeditor/fckeditor/editor/images/spacer.gif&amp;quot; class=&amp;quot;FCK__MWTem...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;nbsp;&amp;lt;img _fck_mw_template=&amp;quot;true&amp;quot; _fckrealelement=&amp;quot;0&amp;quot; _fckfakelement=&amp;quot;true&amp;quot; src=&amp;quot;http://www.ecured.cu/extensions/FCKeditor/fckeditor/editor/images/spacer.gif&amp;quot; class=&amp;quot;FCK__MWTemplate&amp;quot;&amp;gt;Variable&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Una variable es en principio un concepto que determina una cualidad de un objeto, es un atributo que puede variar de una o&amp;lt;br&amp;gt;más maneras y que sintetiza conceptualmente lo que se quiere conocer acerca del objeto de investigación.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Es un símbolo que representa un elemento no especificado de un conjunto dado. Dicho conjunto es llamado conjunto universal de la variable, universo o dominio de la variable, y cada elemento del conjunto es un valor de la variable. Sea x una variable cuyo universo es el conjunto {1,3,5,7,9,11,13}; entonces x puede tener cualquiera de esos valores: 1,3,5,7,9,11,13. En otras palabras x puede reemplazarse por cualquier entero positivo impar menor que 14. Por esta razón, a menudo se dice que una variable es un reemplazo de cualquier elemento de su universo y sistema solar. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Una variable es un elemento de una fórmula, proposición o algoritmo que puede adquirir o ser sustituido por un valor cualquiera (siempre dentro de su universo). Los valores que una variable es capaz de recibir, pueden estar definidos dentro de un rango, y/o estar limitados por criterios o condiciones de pertenencia, al universo que les corresponde (en estos casos, el universo de la variable pasa a ser un subconjunto de un universo mayor, el que tendría sin las restricciones). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tipos de variable  ==&lt;br /&gt;
&lt;br /&gt;
*&amp;amp;nbsp; [[Variable aleatoria]] &lt;br /&gt;
*&amp;amp;nbsp; [[Variable de control]] &lt;br /&gt;
*&amp;amp;nbsp; [[Variable dependiente]] &lt;br /&gt;
*&amp;amp;nbsp; [[Variable discreta y variable continua]] &lt;br /&gt;
*&amp;amp;nbsp; [[Variable estadística]] &lt;br /&gt;
*&amp;amp;nbsp; [[Variable independiente]] &lt;br /&gt;
*&amp;amp;nbsp; [[Variable en programación]] &lt;br /&gt;
*&amp;amp;nbsp; [[Variable ambiental]]&lt;br /&gt;
&lt;br /&gt;
En muchos usos, lo contrario de una variable es una constante. También puede considerarse a las constantes como caso particular de variables, con un universo unitario (con un solo elemento), ya que sólo pueden tener un valor, y no pueden modificarlo.&amp;amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
== Característica&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
1. Rasgos que pueden ser observados, y que, por tanto, van a permitir alguna confrontación con la realidad empírica, y&amp;lt;br&amp;gt;2. La propiedad de poder variar, es decir, de asumir valores o lo que es igual: los conceptos para que sean considerados como variables, deben tener la propiedad de ser mensurables de alguna forma desde la mera clasificación hasta el nivel de medición superior que sea posible alcanzar.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Defeniciónes de las variables ==&lt;br /&gt;
&lt;br /&gt;
*De forma conceptual o constitutiva, es decir, definiendo en que consiste la naturaleza de la variable mediante conceptos.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*De forma operativa, consiste en definir las variables describiendo las operaciones o actividades que han de realizarse para medirla o manipularla. Se convierte en una serie de instrucciones que el investigador debe tener resente para medirla o manipularla. El investigador ha de traducir las variables a definiciones observables, cuantificables y medibles. La definición&amp;lt;br&amp;gt;operacional implica la desmembración de los aspectos diferenciables del concepto atendiendo fundamentalmente a dos niveles de generalidad diferentes. Es decir, en la definición operacional debemos distinguir, básicamente, entre dimensiones e indicadores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fuentes&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
*Las variables y su operacionalizacion. Material de apoyo sobre metodología de la investigación; Lic. Leticia Montes de Oca Viciedo, Lic. Pablo Morales Salabarria, Lic. Marglenis Herrería Iznaga&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Matemáticas]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Boruvka&amp;diff=95333</id>
		<title>Algoritmo de Boruvka</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Boruvka&amp;diff=95333"/>
		<updated>2010-07-02T18:26:33Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '{{Referencia}}   == Historia  ==  El '''Algoritmo de Borůvka''' es un Algoritmo para encontrar el Mínimo árbol de expansión en un grafo ponderado en el que todos sus…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}} &lt;br /&gt;
&lt;br /&gt;
== Historia  ==&lt;br /&gt;
&lt;br /&gt;
El '''Algoritmo de Borůvka''' es un [[Algoritmo]] para encontrar el [[Mínimo árbol de expansión]] en un grafo ponderado en el que todos sus arcos tienen distinto peso. &lt;br /&gt;
&lt;br /&gt;
Fue publicado por primera vez en [[1926]] por [[Otakar Borůvka]] como un método eficiente para construir la [[Red eléctrica]] de [[Moravia]]. El algoritmo fue redescubierto por [[Gustave Choquet|Choquet]] en [[1938]];&amp;lt;ref&amp;gt;{{cita publicación | apellido = Choquet | nombre = Gustave | enlaceautor = Gustave Choquet | año = 1938 | título = Étude de certains réseaux de routes | publicación = Comptes-rendus de l’Académie des Sciences | volumen = 206 | páginas = 310–313 | idioma = French }}&amp;lt;/ref&amp;gt; de nuevo por [[Kazimierz Florek|Florek]], [[Jan Łukasiewicz|Łukasiewicz]], [[Julian Perkal|Perkal]], [[Hugo Steinhaus|Steinhaus]] y [[Stefan Zubrzycki|Zubrzycki]] en [[Hugo Steinhaus#graphs1951|1951]]; y de nuevo por [[Sollin]] a principio de la década de 1960. Debido a que [[Sollin]] fue el único de ellos que era científico en computación, este algoritmo es frecuentemente llamado [[Algoritmo de Sollin]], especialmente en la literatura sobre [[Computación paralela]]. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo comienza examinando cada vértice y añadiendo el arco de menor peso desde ese vértice a otro en el grafo, sin tener en cuenta los arcos ya agregados, y continua uniendo estos grupos de la misma manera hasta que se completa un árbol que cubra todos los vértices. Si denominamos a cada vértice o conjunto de vértices conectados como &amp;quot;componente&amp;quot;, el pseudocódigo del Algoritmo de Boruvka es: &lt;br /&gt;
&lt;br /&gt;
*Comenzar con un grafo conexo ''G'' en el que todos sus arcos tengan distinto peso, y un conjunto vacío de arcos ''T''. &lt;br /&gt;
*Mientras los vértices de ''G'' conectados por ''T'' sean disjuntos: &lt;br /&gt;
**Crear un conjunto vacío de arcos ''S'' &lt;br /&gt;
**Para cada componente: &lt;br /&gt;
***Crear un conjunto vacío de arcos ''S'' &lt;br /&gt;
***Para cada vértice v en el componente: &lt;br /&gt;
****Agregar el arco de menor peso desde el vértice v a otro vertice en un componente disjunto a ''S'' &lt;br /&gt;
***Añadir el arco de menor peso en ''S'' a ''E'' &lt;br /&gt;
**Añadir el conjunto resultante ''E'' a ''T''. &lt;br /&gt;
*El conjunto de aristas resultante ''T'' es el arbol de expansión mínimo de ''G''.&lt;br /&gt;
&lt;br /&gt;
== Complejidad  ==&lt;br /&gt;
&lt;br /&gt;
Con el Algoritmo de Boruvka se puede obtener una [[Complejidad]] de O(log V) iteraciones en el bucle externo antes de terminar, y por lo tanto su [[Complejidad temporal]] es O(ElogV), donde E es el número de arcos, y V es el número de vértices de G. En [[Grafos planos]] puede implementarse para ejecutarse en tiempo lineal, eliminando los arcos de menor peso entre cada par de nodos después de cada etapa del algoritmo. &lt;br /&gt;
&lt;br /&gt;
== Otros algoritmos  ==&lt;br /&gt;
&lt;br /&gt;
Entre otros [[Algoritmos]] para este problema se incluyen el [[Algoritmo de Prim]] (realmente descubierto por [[Vojtech Jarnik]]) y el [[Algoritmo de Kruskal]]. Algoritmos más rápidos pueden ser obtenidos combinando el [[Algoritmo de Prim]] con el Algoritmo de Boruvka. &lt;br /&gt;
&lt;br /&gt;
El algoritmo más rápido para hallar el árbol de recubrimiento mínimo aleatorio está basado en parte en el algoritmo de Boruvka gracias a [[Karger]], [[Klein]] y [[Tarjan]] y se obtiene una complejidad O(E). &lt;br /&gt;
&lt;br /&gt;
El mejor [[Algoritmo]] (determinista) conocido para encontrar el [[Árbol mínimo de recubrimiento]] de [[Bernard Chazelle]] está también basado en parte en el Algoritmo de Boruvka y tiene complejidad temporal O(Ealfa(V)), donde alfa es la inversa de la [[Función de Ackermann]]. Estos algoritmos aleatorios y deterministas combinan pasos del Algoritmo de Boruvka reduciendo el numero de nodos que quedan por conectar, con pasos de diferente tipo que reduzcan el numero de arcos entre cada par de nodos. &lt;br /&gt;
&lt;br /&gt;
== Referencia  ==&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp; 1. ↑ Borůvka, Otakar (1926). «O jistém problému minimálním (About a certain minimal problem)» (en Czech, German summary). Práce mor. přírodověd. spol. v Brně III 3:&amp;amp;nbsp; pp. 37–58. &amp;lt;br&amp;gt;&amp;amp;nbsp; 2. ↑ Borůvka, Otakar (1926). «Příspěvek k řešení otázky ekonomické stavby elektrovodních sítí (Contribution to the solution of a problem of economical construction of electrical networks)» (en Czech). Elektronický Obzor 15:&amp;amp;nbsp; pp. 153–154. &amp;lt;br&amp;gt;&amp;amp;nbsp; 3. ↑ Choquet, Gustave (1938). «Étude de certains réseaux de routes» (en French). Comptes-rendus de l’Académie des Sciences 206:&amp;amp;nbsp; pp. 310–313. &amp;lt;br&amp;gt;&amp;amp;nbsp; 4. ↑ Eppstein, David (1999), «Spanning trees and spanners», en Sack, J.-R.; Urrutia, J., Handbook of Computational Geometry, Elsevier, pp. 425–461&amp;amp;nbsp;; Mareš, Martin (2004), «Two linear time algorithms for MST on minor closed graph classes», Archivum mathematicum 40 (3): 315–320, http://www.emis.de/journals/AM/04-3/am1139.pdf .&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Prim&amp;diff=95321</id>
		<title>Algoritmo de Prim</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Prim&amp;diff=95321"/>
		<updated>2010-07-02T18:19:02Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '{{Referencia}}&amp;lt;br&amp;gt;   El algoritmo de Prim es un algoritmo perteneciente a la teoría de los grafos para encontrar un árbol recubridor mínimo en un grafo conexo, no dirigido y …'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}}&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
El algoritmo de Prim es un algoritmo perteneciente a la teoría de los grafos para encontrar un árbol recubridor mínimo en un grafo conexo, no dirigido y cuyas aristas están etiquetadas. &lt;br /&gt;
&lt;br /&gt;
En otras palabras, el algoritmo encuentra un subconjunto de aristas que forman un árbol con todos los vértices, donde el peso total de todas las aristas en el árbol es el mínimo posible. Si el grafo no es conexo, entonces el algoritmo encontrará el árbol recubridor mínimo para uno de los componentes conexos que forman dicho grafo no conexo. &lt;br /&gt;
&lt;br /&gt;
El algoritmo fue diseñado en 1930 por el matemático Vojtech Jarnik y luego de manera independiente por el científico computacional Robert C. Prim en 1957 y redescubierto por Dijkstra en 1959. Por esta razón, el algoritmo es también conocido como algoritmo DJP o algoritmo de Jarnik. &lt;br /&gt;
&lt;br /&gt;
== Descripción conceptual  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo incrementa continuamente el tamaño de un árbol, comenzando por un vértice inicial al que se le van agregando sucesivamente vértices cuya distancia a los anteriores es mínima. Esto significa que en cada paso, las aristas a considerar son aquellas que inciden en vértices que ya pertenecen al árbol. &lt;br /&gt;
&lt;br /&gt;
El árbol recubridor mínimo está completamente construido cuando no quedan más vértices por agregar. &lt;br /&gt;
&lt;br /&gt;
== Pseudocódigo del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
*Estructura de datos auxiliar: Q = [[Estructura de datos]] '''[[Cola de prioridad]]''' (se puede implementar con un [[Montículo (programación)|heap]])&lt;br /&gt;
&lt;br /&gt;
    '''JARNIK''' (Grafo ''G'', nodo_fuente ''s'')&lt;br /&gt;
&lt;br /&gt;
        ''// Inicializamos todos los nodos del grafo. La distancia la ponemos a infinito y el padre de cada nodo a NULL''&lt;br /&gt;
      ''// Encolamos, en una cola de prioridad donde la prioridad es la distancia, todas las parejas &amp;amp;lt;nodo,distancia&amp;amp;gt; del grafo''&lt;br /&gt;
      '''por cada''' ''u'' en ''V[G]'' '''hacer'''&lt;br /&gt;
          distancia[''u''] = INFINITO&lt;br /&gt;
            padre[''u''] = NULL&lt;br /&gt;
            Añadir(cola,&amp;amp;lt;''u'',distancia[''u'']&amp;amp;gt;)&lt;br /&gt;
        distancia[''s'']=0&lt;br /&gt;
        '''mientras''' cola&amp;amp;nbsp;!= 0 '''do'''&lt;br /&gt;
          ''// OJO: Se entiende por mayor prioridad aquel nodo cuya distancia[u] es menor.''&lt;br /&gt;
          ''u'' = extraer_minimo(cola) //devuelve el minimo y lo elimina de la cola.&lt;br /&gt;
            '''por cada''' '''v''' adyacente a ''''u'''' '''hacer'''&lt;br /&gt;
              '''si''' ((''v'' ∈ cola) '''&amp;amp;amp;&amp;amp;amp;''' (distancia[''v''] &amp;amp;gt; peso(u, v)) '''entonces'''&lt;br /&gt;
                  padre[''v''] = ''u''&lt;br /&gt;
                  distancia[''v''] = peso(u, v)&lt;br /&gt;
                    Actualizar(cola,&amp;amp;lt;''v'',distancia[''v'']&amp;amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Código en JAVA  ==&lt;br /&gt;
&amp;lt;pre&amp;gt;public class Algorithms&lt;br /&gt;
{&lt;br /&gt;
public static Graph PrimsAlgorithm (Graph g, int s)&lt;br /&gt;
{&lt;br /&gt;
int n = g.getNumberOfVertices ();&lt;br /&gt;
Entry[] table = new Entry [n];&lt;br /&gt;
for (int v = 0; v &amp;amp;lt; n; ++v)&lt;br /&gt;
table [v] = new Entry ();&lt;br /&gt;
table [s].distance = 0;&lt;br /&gt;
PriorityQueue queue =&lt;br /&gt;
new BinaryHeap (g.getNumberOfEdges());&lt;br /&gt;
queue.enqueue (&lt;br /&gt;
new Association (new Int (0), g.getVertex (s)));&lt;br /&gt;
while (!queue.isEmpty ())&lt;br /&gt;
{&lt;br /&gt;
Association assoc = (Association) queue.dequeueMin();&lt;br /&gt;
Vertex v0 = (Vertex) assoc.getValue ();&lt;br /&gt;
int n0 = v0.getNumber ();&lt;br /&gt;
if (!table [n0].known)&lt;br /&gt;
{&lt;br /&gt;
table [n0].known = true;&lt;br /&gt;
Enumeration p = v0.getEmanatingEdges ();&lt;br /&gt;
while (p.hasMoreElements ())&lt;br /&gt;
{&lt;br /&gt;
Edge edge = (Edge) p.nextElement ();&lt;br /&gt;
Vertex v1 = edge.getMate (v0);&lt;br /&gt;
int n1 = v1.getNumber ();&lt;br /&gt;
Int wt = (Int) edge.getWeight ();&lt;br /&gt;
int d = wt.intValue ();&lt;br /&gt;
if (!table[n1].known &amp;amp;amp;&amp;amp;amp; table[n1].distance&amp;amp;gt;d)&lt;br /&gt;
{ table [n1].distance = d;&lt;br /&gt;
table [n1].predecessor = n0;&lt;br /&gt;
queue.enqueue (&lt;br /&gt;
new Association (new Int (d), v1));&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
Graph result = new GraphAsLists (n);&lt;br /&gt;
for (int v = 0; v &amp;amp;lt; n; ++v)&lt;br /&gt;
result.addVertex (v);&lt;br /&gt;
for (int v = 0; v &amp;amp;lt; n; ++v)&lt;br /&gt;
if (v&amp;amp;nbsp;!= s)&lt;br /&gt;
result.addEdge (v, table [v].predecessor);&lt;br /&gt;
return result;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
== Demostración  ==&lt;br /&gt;
&lt;br /&gt;
Sea G un grafo [[Teoría de los grafos#Grafos_Conexos|conexo]] y [[Teoría de los grafos#Grafos_ponderados|ponderado]]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Ya que G es conexo, siempre habrá un camino para todo nodo. &lt;br /&gt;
&lt;br /&gt;
La salida Y del algoritmo de Prim es un árbol porque las aristas y los nodos agregados a Y están conectados. &lt;br /&gt;
&lt;br /&gt;
Sea Y el árbol recubridor mínimo de G. &lt;br /&gt;
&lt;br /&gt;
Si Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=Y es el árbol recubridor mínimo. &lt;br /&gt;
&lt;br /&gt;
Si no, sea la primera arista agregada durante la construcción de Y, que no está en Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; y sea V el conjunto de nodos conectados por las aristas agregadas antes que ''e''. Entonces un extremo de V está en V y el otro no. Ya que Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; es el árbol recubridor mínimo de G hay un camino en Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; que une los dos extremos. Mientras que uno se mueve por el camino, se debe encontrar una arista ''f'' uniendo un nodo en V a uno que no está en V. En la iteración que ''e'' se agrega a Y, ''f'' también se podría haber agregado y se hubiese agregado en vez de ''e'' si su peso fuera menor que el de ''e''. Ya que ''f'' no se agregó se concluye: &lt;br /&gt;
&lt;br /&gt;
:Sea Y2 el grafo obtenido al remover f y agregando e \in Y_1. Es fácil mostrar que Y2 conexo tiene la misma cantidad de aristas que Y1, y el peso total de sus aristas no es mayor que el de Y1, entonces también es un árbol recubridor mínimo de G y contiene a e y todas las aristas agregadas anteriormente durante la construcción de V. Si se repiten los pasos mencionados anteriormente, eventualmente se obtendrá el árbol recubridor mínimo de G que es igual a Y.&lt;br /&gt;
&lt;br /&gt;
Esto demuestra que Y es el árbol recubridor mínimo de G. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*R. C. Prim: ''Shortest connection networks and some generalisations''. In: ''Bell System Technical Journal'', 36 (1957), pp. 1389–1401 &lt;br /&gt;
*D. Cherition and R. E. Tarjan: ''Finding minimum spanning trees''. In: ''SIAM Journal of Computing'', 5 (Dec. 1976), pp. 724–741 &lt;br /&gt;
*[[Thomas H. Cormen]], [[Charles E. Leiserson]], [[Ronald L. Rivest]], and [[Clifford Stein]]. ''[[Introduction to Algorithms]]'', Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Section 23.2: The algorithms of Kruskal and Prim, pp.567–574.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Sudoku_backtracking&amp;diff=79797</id>
		<title>Sudoku backtracking</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Sudoku_backtracking&amp;diff=79797"/>
		<updated>2010-06-09T16:59:36Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '{{Referencia}}Sudoku (en japonés: 数独, sūdoku) es un pasatiempo que se popularizó en Japón en 1986, y se dio a conocer en el ámbito internacional en 2005. El objetivo de…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}}Sudoku (en japonés: 数独, sūdoku) es un pasatiempo que se popularizó en Japón en 1986, y se dio a conocer en el ámbito internacional en 2005. El objetivo del sudoku es rellenar una cuadrícula de 9 × 9 celdas (81 casillas) dividida en subcuadrículas de 3 × 3 (también llamadas &amp;quot;cajas&amp;quot; o &amp;quot;regiones&amp;quot;) con las cifras del 1 al 9 partiendo de algunos números ya dispuestos en algunas de las celdas. Aunque se podrían usar colores, letras, figuras, se conviene en usar números para mayor claridad. Lo que importa, en todo caso, es que sean nueve elementos diferenciados. No se debe repetir ninguna cifra en una misma fila, columna o subcuadrícula. Un sudoku está bien planteado si la solución es única. La resolución del problema requiere paciencia y ciertas dotes lógicas. &lt;br /&gt;
&lt;br /&gt;
La solución de un sudoku siempre es un cuadrado latino, aunque el recíproco en general no es cierto ya que el sudoku establece la restricción añadida de que no se puede repetir un mismo número en una región. &lt;br /&gt;
&lt;br /&gt;
Numerosos periódicos han empezado a publicar el sudoku desde el 2005 en su sección de pasatiempos. &lt;br /&gt;
&lt;br /&gt;
== Reglas y terminología  ==&lt;br /&gt;
&lt;br /&gt;
El sudoku se presenta normalmente como una tabla de 9&amp;amp;nbsp;×&amp;amp;nbsp;9, compuesta por subtablas de 3&amp;amp;nbsp;×&amp;amp;nbsp;3 denominadas &amp;quot;regiones&amp;quot; (también se le llaman &amp;quot;cajas&amp;quot; o &amp;quot;bloques&amp;quot;). Algunas celdas ya contienen números, conocidos como &amp;quot;números dados&amp;quot; (o a veces &amp;quot;pistas&amp;quot;): El objetivo es rellenar las celdas vacías, con un número en cada una de ellas, de tal forma que cada columna, fila y región contenga los números 1–9 sólo una vez. Además, cada número de la solución aparece sólo una vez en cada una de las tres &amp;quot;direcciones&amp;quot;, de ahí el &amp;quot;los números deben estar solos&amp;quot; que evoca el nombre del juego. &lt;br /&gt;
&lt;br /&gt;
== Métodos de resolución  ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Soduku ejemplo de trazado.png]]La región 3&amp;amp;nbsp;×&amp;amp;nbsp;3 de la esquina superior izquierda debe contener un 7. &lt;br /&gt;
&lt;br /&gt;
La estrategia para resolver este rompecabezas se puede considerar como la combinación de tres procesos: escaneo, marcado y análisis. &lt;br /&gt;
&lt;br /&gt;
=== Escaneo  ===&lt;br /&gt;
&lt;br /&gt;
Rastreando a lo largo y ancho los sietes localizados en cualquier lugar de la rejilla, el jugador puede eliminar todas las celdas vacías de la esquina superior izquierda que no pueden contener un 7. Esto deja sólo una celda posible (remarcada en verde).]] &lt;br /&gt;
&lt;br /&gt;
=== Marcado  ===&lt;br /&gt;
&lt;br /&gt;
El escaneo viene a interrumpirse cuando no pueden descubrirse nuevos números. En este punto es necesario centrarse en algún análisis lógico. La mayoría encuentra útil guiar este análisis mediante el marcado de números candidatos en las celdas vacías. Hay dos notaciones populares: subíndices y puntos &lt;br /&gt;
&lt;br /&gt;
En la notación de subíndice, los números candidatos se escriben en pequeño en las celdas. La desventaja es que los puzles originales se publican en periódicos que habitualmente no dejan demasiado espacio para acomodar más que unos pocos dígitos. Si se usa esta notación, los resolutores crean, a menudo, una copia más grande del puzzle y emplean un lápiz afilado. &lt;br /&gt;
&lt;br /&gt;
La segunda notación es un patrón de puntos con un punto en la esquina superior izquierda representando un 1 y un punto en la esquina inferior derecha representando un 9. Esta notación tiene como ventaja que puede usarse en el puzle original. Se requiere destreza para el emplazamiento de los puntos, porque la existencia de puntos desplazados o marcas inadvertidas lleva, inevitablemente, a confusión y no son fáciles de borrar sin añadir más confusión. &lt;br /&gt;
&lt;br /&gt;
=== Análisis  ===&lt;br /&gt;
&lt;br /&gt;
Hay dos aproximaciones principales: &lt;br /&gt;
&lt;br /&gt;
*En '''eliminación''', el progreso se realiza mediante la sucesiva eliminación de números candidatos para una o más celdas, hasta dejar sólo una elección. Después de lograr cada respuesta, debe realizarse un nuevo escaneo (habitualmente comprobando el efecto del último número). Hay una serie de tácticas de eliminación. Una de las más comunes es el &amp;quot;borrado del candidato no coincidente&amp;quot;. Las celdas con idéntica configuración de números candidatos se dice que coinciden si la cantidad de números candidatos en cada una es igual al número de celdas que los contienen. Por ejemplo lápiz y una goma. Esta aproximación puede ser desaprobada por puristas lógicos por demasiado [[Ensayo y error]] pero puede llegar a soluciones claras y rápidamente.&lt;br /&gt;
&lt;br /&gt;
Idealmente, se necesita encontrar una combinación de técnicas que eviten alguno de los inconvenientes de los elementos de arriba. El recuento de regiones, filas y columnas puede resultar aburrido. Escribir números candidatos en celdas vacías puede consumir demasiado tiempo. La aproximación &amp;quot;y-si&amp;quot; puede ser confusa a menos que se sea bien organizado. El quid de la cuestión es encontrar una técnica que minimice el recuento, el marcado y e &lt;br /&gt;
&lt;br /&gt;
== Resolución por ordenador  ==&lt;br /&gt;
&lt;br /&gt;
Algunos programas que emulan la resolución humana, permiten estimar la dificultad que tendrá un humano para encontrar la solución. &lt;br /&gt;
&lt;br /&gt;
Para la implementación del resolvedor de sudokus utilizaremos la clase vector (fácilmente transformable en un array clásico) y tres funciones: &lt;br /&gt;
&lt;br /&gt;
*Una llamada inicial: simplemente se encarga de llamar a la función recursiva. Para darle más utilidad retornará un booleano que indicará si se ha encontrado alguna solución al sudoku. &lt;br /&gt;
*Una función recursiva: se encarga del proceso de ir probando números. Incluye un parámetro de entrada/salida que indica si se ha encontrado alguna solución. &lt;br /&gt;
*El comprobador de validez: simplemente es una función que retorna un booleano indicando si un valor puede estar en un sitio indicado.&lt;br /&gt;
&lt;br /&gt;
El vector contendrá enteros codificando como &amp;quot;0&amp;quot; los lugares a rellenar (los &amp;quot;-&amp;quot;) y como su propio valor numérico los valores preestablecidos. Al final de la implementación del resolvedor se propone una acción que lee un sudoku como el propuesto arriba y lo transforma en la matriz numérica. &lt;br /&gt;
&lt;br /&gt;
Además, utilizaremos las siguientes definiciones y constantes:&amp;amp;nbsp; &lt;br /&gt;
&amp;lt;pre&amp;gt;const int FILS = 9; // Filas de un sudoku&lt;br /&gt;
const int COLS = 9; // Columnas de un sudoku&lt;br /&gt;
&lt;br /&gt;
typedef vector&amp;amp;lt; vector&amp;amp;lt;int&amp;amp;gt; &amp;amp;gt; Matriz; // Definición de Matriz&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt;Llamada inicial:&amp;amp;nbsp; &lt;br /&gt;
&amp;lt;pre&amp;gt;bool rellenar(Matriz&amp;amp;amp; v) {&lt;br /&gt;
bool tr = false;&lt;br /&gt;
rellenar(v, 0, 0, tr); // V y TR són parámetros de E/S&lt;br /&gt;
return tr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Función recursiva:nst Matriz&amp;amp;amp; v, int fil, int col) { for (return false; } } return true; }&amp;amp;lt;/source&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
Por si se tiene alguna duda, aquí se propone un método para leer un sudoku como el descrito arriba (caracteres de números y &amp;quot;-&amp;quot;) y lo transforma en una matriz numérica de 0 (valores a introducir) y números (preestablecidos).&amp;amp;nbsp; &lt;br /&gt;
&amp;lt;pre&amp;gt;// Precondición: V es una Matriz de tamaño FILS x COLS&lt;br /&gt;
void leer(Matriz&amp;amp;amp; v) {&lt;br /&gt;
char x;&lt;br /&gt;
for (int i = 0; i &amp;amp;lt; FILS; ++i) {&lt;br /&gt;
for (int c = 0; c &amp;amp;lt; COLS; ++c) {&lt;br /&gt;
cin &amp;amp;gt;&amp;amp;gt; x;&lt;br /&gt;
v[i][c] = x=='-'&amp;amp;nbsp;? 0:x&amp;amp;amp;0xF;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
== Niveles de dificultad  ==&lt;br /&gt;
&lt;br /&gt;
Los programas informáticos que resuelven sudokus pueden estimar la dificultad que tiene un humano para encontrar la solución, basándose en la complejidad de las técnicas de resolución necesarias. Esta estimación permite a los editores adaptar sus sudokus para personas con diferente experiencia resolutoria. Algunas versiones &amp;quot;en línea&amp;quot; (online) también ofrecen varios niveles de dificultad. &lt;br /&gt;
&lt;br /&gt;
== Construcción  ==&lt;br /&gt;
&lt;br /&gt;
Es posible establecer sudokus con más de una solución y también realizar tableros iniciales de sudoku sin solución, pero no se consideran rompecabezas sudoku apropiados; como la mayor parte de los rompecabezas lógicos, se espera una solución única. &lt;br /&gt;
&lt;br /&gt;
La construcción de un rompecabeza sudoku puede ser realizada a mano eficientemente predeterminando las posiciones de los números dados y asignándoles valores para realizar un proceso deductivo. Tal indefinido dada se puede suponer que no tienen ningún valor particular, mientras se le da un valor diferente antes de que se complete la construcción, el encargado de resolver será capaz de hacer las mismas deducciones derivadas de tales supuestos, como en ese momento, el dado es muy mucho más definido como algo más. Esta técnica da al constructor un mayor control sobre el flujo de resolución de puzzles, líder en el alvistas solucionador de sudokus por compuestas íntegramente. &lt;br /&gt;
&lt;br /&gt;
Los sudoku [[Nikoli]] se construyen a mano,y el nombre del autor aparece en los créditos junto a cada rompecabeza; los números dados siempre se encuentran en forma de un patrón simétrico. Los rompecabezas ''Number Place Challenger'' de Dell (véase Variantes más abajo) también citan los créditos del autor. Los rompecabezas sudoku que aparecen en la mayoría de los periódicos del Reino Unido aparentemente son generados por ordenador, pero emplean probables en sudokus generados por ordenador. El desafío para los programadores de sudokus es enseñar a un programa cómo construir rompecabezas inteligentes, de manera que no se puedan distinguir de aquellos realizados por humanos; Wayne Gould necesitó retocar su popular programa durante seis años para creer que había alcanzado ese nivel. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=B%C3%BAsqueda_en_profundidad&amp;diff=79779</id>
		<title>Búsqueda en profundidad</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=B%C3%BAsqueda_en_profundidad&amp;diff=79779"/>
		<updated>2010-06-09T16:44:58Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}}Búsqueda en profundidad &lt;br /&gt;
&lt;br /&gt;
Una Búsqueda en profundidad (en inglés DFS o Depth First Search) es un algoritmo que permite recorrer todos los nodos de un grafo o árbol (teoría de grafos) de manera ordenada, pero no uniforme. Su funcionamiento consiste en ir expandiendo todos y cada uno de los nodos que va localizando, de forma recurrente, en un camino concreto. Cuando ya no quedan más nodos que visitar en dicho camino, regresa (Backtracking), de modo que repite el mismo proceso con cada uno de los hermanos del nodo ya procesado. &lt;br /&gt;
&lt;br /&gt;
Análogamente existe el algoritmo de búsqueda en anchura (BFS o Breadth First Search). &lt;br /&gt;
&lt;br /&gt;
== Pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
*'''Pseudocódigo para grafos'''&lt;br /&gt;
&lt;br /&gt;
   '''DFS'''(grafo G)&lt;br /&gt;
      '''PARA CADA''' vertice ''u'' ∈ V[G] '''HACER'''&lt;br /&gt;
           estado[''u''] ← NO_VISITADO&lt;br /&gt;
              padre[''u''] ← NULO&lt;br /&gt;
      tiempo ← 0&lt;br /&gt;
      '''PARA CADA''' vertice ''u'' ∈ V[G] '''HACER'''&lt;br /&gt;
           '''SI''' estado[u] = NO_VISITADO '''ENTONCES'''&lt;br /&gt;
                   DFS_Visitar(''u'')&lt;br /&gt;
&lt;br /&gt;
   '''DFS-Visitar'''(nodo ''u'')&lt;br /&gt;
      estado[''u''] ← VISITADO&lt;br /&gt;
      tiempo ← tiempo + 1&lt;br /&gt;
      d[u] ← tiempo&lt;br /&gt;
      '''PARA CADA''' ''v'' ∈ Vecinos[''u''] '''HACER'''&lt;br /&gt;
           '''SI''' estado[''v''] = NO_VISITADO '''ENTONCES'''&lt;br /&gt;
                   padre[''v''] ← ''u''&lt;br /&gt;
                   DFS_Visitar(''v'')&lt;br /&gt;
      estado[''u''] ← TERMINADO&lt;br /&gt;
      tiempo ← tiempo + 1&lt;br /&gt;
      ''f[u]'' ← tiempo&lt;br /&gt;
&lt;br /&gt;
== Arcos DF  ==&lt;br /&gt;
&lt;br /&gt;
Si en tiempo de descubrimiento de ''u'' tenemos el arco '''(u,v)''': &lt;br /&gt;
&lt;br /&gt;
i. Si el estado de ''v'' es NO_VISITADO, entonces ''(u,v)'' ∈ DF, &lt;br /&gt;
&lt;br /&gt;
== Véase también  ==&lt;br /&gt;
&lt;br /&gt;
*[[Árbol (estructura de datos)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Lema: Un [[Grafo]] dirigido es cíclico si y sólo si al ejecutar DFS(G) produce al menos un arco hacia atrás.&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*[[Thomas H. Cormen]], [[Charles E. Leiserson]], [[Ronald L. Rivest]], and [[Clifford Stein]]. ''[[Introduction to Algorithms]]'', Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Section 22.3: Depth-first search, pp.540–549.&lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=B%C3%BAsqueda_en_profundidad&amp;diff=79777</id>
		<title>Búsqueda en profundidad</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=B%C3%BAsqueda_en_profundidad&amp;diff=79777"/>
		<updated>2010-06-09T16:44:40Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '==== {{Referencia}}Búsqueda en profundidad  ====  Una Búsqueda en profundidad (en inglés DFS o Depth First Search) es un algoritmo que permite recorrer todos los nodos de un …'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== {{Referencia}}Búsqueda en profundidad  ====&lt;br /&gt;
&lt;br /&gt;
Una Búsqueda en profundidad (en inglés DFS o Depth First Search) es un algoritmo que permite recorrer todos los nodos de un grafo o árbol (teoría de grafos) de manera ordenada, pero no uniforme. Su funcionamiento consiste en ir expandiendo todos y cada uno de los nodos que va localizando, de forma recurrente, en un camino concreto. Cuando ya no quedan más nodos que visitar en dicho camino, regresa (Backtracking), de modo que repite el mismo proceso con cada uno de los hermanos del nodo ya procesado. &lt;br /&gt;
&lt;br /&gt;
Análogamente existe el algoritmo de búsqueda en anchura (BFS o Breadth First Search). &lt;br /&gt;
&lt;br /&gt;
== Pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
*'''Pseudocódigo para grafos'''&lt;br /&gt;
&lt;br /&gt;
   '''DFS'''(grafo G)&lt;br /&gt;
      '''PARA CADA''' vertice ''u'' ∈ V[G] '''HACER'''&lt;br /&gt;
            estado[''u''] ← NO_VISITADO&lt;br /&gt;
              padre[''u''] ← NULO&lt;br /&gt;
      tiempo ← 0&lt;br /&gt;
      '''PARA CADA''' vertice ''u'' ∈ V[G] '''HACER'''&lt;br /&gt;
            '''SI''' estado[u] = NO_VISITADO '''ENTONCES'''&lt;br /&gt;
                    DFS_Visitar(''u'')&lt;br /&gt;
&lt;br /&gt;
   '''DFS-Visitar'''(nodo ''u'')&lt;br /&gt;
      estado[''u''] ← VISITADO&lt;br /&gt;
      tiempo ← tiempo + 1&lt;br /&gt;
      d[u] ← tiempo&lt;br /&gt;
      '''PARA CADA''' ''v'' ∈ Vecinos[''u''] '''HACER'''&lt;br /&gt;
            '''SI''' estado[''v''] = NO_VISITADO '''ENTONCES'''&lt;br /&gt;
                    padre[''v''] ← ''u''&lt;br /&gt;
                    DFS_Visitar(''v'')&lt;br /&gt;
      estado[''u''] ← TERMINADO&lt;br /&gt;
      tiempo ← tiempo + 1&lt;br /&gt;
      ''f[u]'' ← tiempo&lt;br /&gt;
&lt;br /&gt;
== Arcos DF  ==&lt;br /&gt;
&lt;br /&gt;
Si en tiempo de descubrimiento de ''u'' tenemos el arco '''(u,v)''': &lt;br /&gt;
&lt;br /&gt;
i. Si el estado de ''v'' es NO_VISITADO, entonces ''(u,v)'' ∈ DF, &lt;br /&gt;
&lt;br /&gt;
== Véase también  ==&lt;br /&gt;
&lt;br /&gt;
*[[Árbol (estructura de datos)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Lema: Un [[Grafo]] dirigido es cíclico si y sólo si al ejecutar DFS(G) produce al menos un arco hacia atrás.&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*[[Thomas H. Cormen]], [[Charles E. Leiserson]], [[Ronald L. Rivest]], and [[Clifford Stein]]. ''[[Introduction to Algorithms]]'', Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Section 22.3: Depth-first search, pp.540–549.&lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Cola_(Estructura_de_datos)&amp;diff=74756</id>
		<title>Cola (Estructura de datos)</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Cola_(Estructura_de_datos)&amp;diff=74756"/>
		<updated>2010-05-27T18:33:33Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}}Cola (informática) Una cola es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza por un extremo y la operación de extracción pop por el otro. También se le llama estructura FIFO (del inglés First In First Out), debido a que el primer elemento en entrar será también el primero en salir. &lt;br /&gt;
&lt;br /&gt;
Las colas se utilizan en sistemas informáticos, transportes y operaciones de investigación (entre otros), dónde los objetos, personas o eventos son tomados como datos que se almacenan y se guardan mediante colas para su posterior procesamiento. Este tipo de estructura de datos abstracta se implementa en lenguajes orientados a objetos mediante clases, en forma de listas enlazadas. &lt;br /&gt;
&lt;br /&gt;
== Usos concretos de la cola  ==&lt;br /&gt;
&lt;br /&gt;
La particularidad de una estructura de datos de cola es el hecho de que sólo podemos acceder al primer y al último elemento de la estructura. Así mismo, los elementos sólo se pueden eliminar por el principio y sólo se pueden añadir por el final de la cola.[[Image:ColaProg.JPG|border|right|Ejemplo de Cola]] Ejemplos de colas en la vida real serían: personas comprando en un supermercado, esperando para entrar a ver un partido de béisbol, esperando en el cine para ver una película, una pequeña peluquería, etc. La idea esencial es que son todos líneas de espera. &lt;br /&gt;
&lt;br /&gt;
En estos casos, el primer elemento de la lista realiza su función (pagar comida, pagar entrada para el partido o para el cine) y deja la cola. Este movimiento está representado en la cola por la función pop o desencolar. Cada vez que otro elemento se añade a la lista de espera se añaden al final de la cola representando la función ''push'' o encolar. Hay otras funciones auxiliares para ver el tamaño de la cola (''size''), para ver si está vacía en el caso de que no haya nadie esperando (''empty'') o para ver el primer elemento de la cola (''front''). &lt;br /&gt;
&lt;br /&gt;
== Información adicional  ==&lt;br /&gt;
&lt;br /&gt;
Teóricamente, la característica de las colas es que tienen una capacidad específica. Por muchos elementos que contengan siempre se puede añadir un elemento más y en caso de estar vacía borrar un elemento sería imposible hasta que no se añade un nuevo elemento. A la hora de añadir un elemento podríamos darle una mayor importancia a unos elementos que a otros (un cargo VIP) y para ello se crea un tipo de cola especial que es la cola de prioridad. (Ver [[Cola de prioridad (estructura de datos)|cola de prioridad]]). &lt;br /&gt;
&lt;br /&gt;
Esto es una falacia &lt;br /&gt;
&lt;br /&gt;
== Operaciones Básicas  ==&lt;br /&gt;
&lt;br /&gt;
*'''Crear''': se crea la cola vacía. &lt;br /&gt;
*'''Encolar''' (añadir, entrar, push): se añade un elemento a la cola. Se añade al final de esta. &lt;br /&gt;
*'''Desencolar''' (sacar, salir, pop): se elimina el elemento frontal de la cola, es decir, el primer elemento que entró. &lt;br /&gt;
*'''Frente''' (consultar, front): se devuelve el elemento frontal de la cola, es decir, el primero elemento que entró.&lt;br /&gt;
&lt;br /&gt;
== Implementaciones  ==&lt;br /&gt;
&lt;br /&gt;
=== Colas en Maude  ===&lt;br /&gt;
&lt;br /&gt;
La ColaNV es la cola no vacía, que diferenciamos de la cola normal a la hora de tomar en cuenta errores. A su vez, el elemento X representa el tipo de valor que puede contener la cola: entero, carácter, registro.... &lt;br /&gt;
&amp;lt;pre&amp;gt; fmod COLA {X&amp;amp;nbsp;:: TRIV} is&lt;br /&gt;
    sorts ColaNV{X} Cola{X} .&lt;br /&gt;
    subsort ColaNV{X} &amp;amp;lt; Cola{X} .&lt;br /&gt;
    *** generadores&lt;br /&gt;
    op crear  &amp;amp;nbsp;: -&amp;amp;gt; Cola{X} [ctor] .&lt;br /&gt;
    op encolar&amp;amp;nbsp;: X$Elt Cola{X} -&amp;amp;gt; ColaNV {X} [ctor] .&lt;br /&gt;
&lt;br /&gt;
    *** constructores&lt;br /&gt;
    op desencolar&amp;amp;nbsp;: Cola{X} -&amp;amp;gt; Cola{X} .&lt;br /&gt;
&lt;br /&gt;
    *** selectores&lt;br /&gt;
    op frente&amp;amp;nbsp;: ColaNV{X} -&amp;amp;gt; X$Elt .&lt;br /&gt;
&lt;br /&gt;
    *** variables&lt;br /&gt;
    var C&amp;amp;nbsp;: ColaNV{X} .&lt;br /&gt;
    vars E E2&amp;amp;nbsp;: X$Elt .&lt;br /&gt;
&lt;br /&gt;
    *** ecuaciones&lt;br /&gt;
    eq desencolar(crear) = crear .&lt;br /&gt;
    eq desencolar(encolar(E, crear)) = crear .&lt;br /&gt;
    eq desencolar(encolar(E, C)) = encolar(E, desencolar(C)) .&lt;br /&gt;
&lt;br /&gt;
    eq frente(encolar(E, crear)) = E .&lt;br /&gt;
    eq frente(encolar(E, C)) = frente(C) .&lt;br /&gt;
  endfm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Especificación de una cola de colas de enteros en Maude:&lt;br /&gt;
&lt;br /&gt;
  view VInt from TRIV to INT is &lt;br /&gt;
  	sort Elt to Int .&lt;br /&gt;
  endv&lt;br /&gt;
  &lt;br /&gt;
  view VColaInt from TRIV to COLA{VInt} is &lt;br /&gt;
  	sort Elt to Cola{VInt} .&lt;br /&gt;
  endv&lt;br /&gt;
  &lt;br /&gt;
  fmod COLA-COLAS-INT is&lt;br /&gt;
  	protecting INT .&lt;br /&gt;
  	protecting COLA{VColaInt} .&lt;br /&gt;
  		&lt;br /&gt;
  	*** operaciones propias de la cola de colas de enteros&lt;br /&gt;
	op encolarInt   &amp;amp;nbsp;: Int ColaNV{VColaInt} -&amp;amp;gt; ColaNV{VColaInt} .&lt;br /&gt;
	op desencolarInt&amp;amp;nbsp;: Cola{VColaInt}       -&amp;amp;gt; Cola{VColaInt} .&lt;br /&gt;
	op frenteInt    &amp;amp;nbsp;: ColaNV{VColaInt}     -&amp;amp;gt; [Int] .&lt;br /&gt;
	&lt;br /&gt;
	*** variables&lt;br /&gt;
	var CCNV&amp;amp;nbsp;: ColaNV{VColaInt} .&lt;br /&gt;
	var CC  &amp;amp;nbsp;: Cola{VColaInt} .&lt;br /&gt;
	var CE  &amp;amp;nbsp;: Cola{VInt} .&lt;br /&gt;
	var E   &amp;amp;nbsp;: Int .&lt;br /&gt;
	&lt;br /&gt;
	*** ecuaciones	&lt;br /&gt;
	eq encolarInt(E, encolar(CE, CC)) = encolar(encolar(E, CE), CC) .&lt;br /&gt;
&lt;br /&gt;
        eq desencolarInt (encolar(CE, crear)) = encolar(desencolar(CE), crear) . &lt;br /&gt;
        eq desencolarInt (encolar(CE, CCNV)) = encolar(CE, desencolarInt(CCNV)) . &lt;br /&gt;
&lt;br /&gt;
	eq frenteInt(CCNV) = frente(frente(CCNV)) .&lt;br /&gt;
  endfm&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Colas en C++  ===&lt;br /&gt;
&amp;lt;pre&amp;gt;#ifndef COLA&lt;br /&gt;
#define COLA // Define la cola&lt;br /&gt;
template &amp;amp;lt;class T&amp;amp;gt;&lt;br /&gt;
class Cola{&lt;br /&gt;
private:&lt;br /&gt;
struct Nodo{&lt;br /&gt;
T elemento;&lt;br /&gt;
struct Nodo* siguiente; // coloca el nodo en la segunda posición&lt;br /&gt;
}* primero;&lt;br /&gt;
struct Nodo* ultimo;&lt;br /&gt;
unsigned int elementos;&lt;br /&gt;
public:&lt;br /&gt;
Cola(){&lt;br /&gt;
elementos = 0;&lt;br /&gt;
}&lt;br /&gt;
~Cola(){&lt;br /&gt;
while (elementos&amp;amp;nbsp;!= 0) pop();&lt;br /&gt;
}&lt;br /&gt;
void push(const T&amp;amp;amp; elem){&lt;br /&gt;
Nodo* aux = new Nodo;&lt;br /&gt;
aux-&amp;amp;gt;elemento = elem;&lt;br /&gt;
if (elementos == 0) primero = aux;&lt;br /&gt;
else ultimo-&amp;amp;gt;siguiente = aux;&lt;br /&gt;
ultimo = aux;&lt;br /&gt;
++elementos;&lt;br /&gt;
}&lt;br /&gt;
void pop(){&lt;br /&gt;
Nodo* aux = primero;&lt;br /&gt;
primero = primero-&amp;amp;gt;siguiente;&lt;br /&gt;
delete aux;&lt;br /&gt;
--elementos;&lt;br /&gt;
}&lt;br /&gt;
T consultar() const{&lt;br /&gt;
return primero-&amp;amp;gt;elemento;&lt;br /&gt;
}&lt;br /&gt;
bool vacia() const{&lt;br /&gt;
return elementos == 0;&lt;br /&gt;
}&lt;br /&gt;
unsigned int size() const{&lt;br /&gt;
return elementos;&lt;br /&gt;
}&lt;br /&gt;
};&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Colas en JAVA  ===&lt;br /&gt;
&amp;lt;pre&amp;gt;public void inserta(Elemento x) {&lt;br /&gt;
Nodo Nuevo;&lt;br /&gt;
Nuevo = new Nodo(x, null);&lt;br /&gt;
if (NodoCabeza == null) {&lt;br /&gt;
NodoCabeza = Nuevo;&lt;br /&gt;
} else {&lt;br /&gt;
NodoFinal.Siguiente = Nuevo;&lt;br /&gt;
}&lt;br /&gt;
NodoFinal = Nuevo;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Elemento cabeza() throws IllegalArgumentException {&lt;br /&gt;
if (NodoCabeza == null) {&lt;br /&gt;
throw new IllegalArgumentException();&lt;br /&gt;
} else {&lt;br /&gt;
return NodoCabeza.Info;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Cola() {&lt;br /&gt;
// Devuelve una Cola vacía&lt;br /&gt;
NodoCabeza = null;&lt;br /&gt;
NodoFinal = null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Colas en C#  ===&lt;br /&gt;
&amp;lt;pre&amp;gt;public partial class frmPrincipal&lt;br /&gt;
{&lt;br /&gt;
// Variables globales&lt;br /&gt;
public static string[] Cola;&lt;br /&gt;
public static int Frente;&lt;br /&gt;
public static int Final;&lt;br /&gt;
public static int N;&lt;br /&gt;
&lt;br /&gt;
[STAThread]&lt;br /&gt;
public static void Main(string[] args)&lt;br /&gt;
{&lt;br /&gt;
Application.EnableVisualStyles();&lt;br /&gt;
Application.SetCompatibleTextRenderingDefault(false);&lt;br /&gt;
Application.Run(new frmPrincipal());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public frmPrincipal() // Constructor&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
InitializeComponent();&lt;br /&gt;
&lt;br /&gt;
Cola = new string[5]; // Arreglo lineal de 5&lt;br /&gt;
N = 4;&lt;br /&gt;
Frente = -1;&lt;br /&gt;
Final = -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CmdInsercionClick(object sender, System.EventArgs e)&lt;br /&gt;
{&lt;br /&gt;
frmInsercion Insercion = new frmInsercion();&lt;br /&gt;
Insercion.Show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CmdRecorridoClick(object sender, System.EventArgs e)&lt;br /&gt;
{&lt;br /&gt;
frmRecorrido Recorrido = new frmRecorrido();&lt;br /&gt;
Recorrido.Show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CmdBusquedaClick(object sender, EventArgs e)&lt;br /&gt;
{&lt;br /&gt;
frmBusqueda Busqueda = new frmBusqueda();&lt;br /&gt;
Busqueda.Show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CmdEliminacionClick(object sender, EventArgs e)&lt;br /&gt;
{&lt;br /&gt;
frmEliminacion Eliminar = new frmEliminacion();&lt;br /&gt;
Eliminar.Show();&lt;br /&gt;
}&lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
Algoritmo Insertar(Cola, N, Frente, Final, Elemento)&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;void CmdInsertarClick(object sender, System.EventArgs e)&lt;br /&gt;
{&lt;br /&gt;
elemento = txtInsercion.Text;&lt;br /&gt;
// Se verifica que haya espacio en la Cola&lt;br /&gt;
if (frmPrincipal.Frente == 0 &amp;amp;amp;&amp;amp;amp; frmPrincipal.Final == frmPrincipal.N)&lt;br /&gt;
{&lt;br /&gt;
MessageBox.Show(&amp;quot;La Cola esta llena&amp;quot;);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
if (frmPrincipal.Frente == frmPrincipal.Final + 1)&lt;br /&gt;
{&lt;br /&gt;
MessageBox.Show(&amp;quot;La Cola esta llena&amp;quot;);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Si la cola esta vacia se inicializan punteros&lt;br /&gt;
if (frmPrincipal.Frente == -1)&lt;br /&gt;
{&lt;br /&gt;
frmPrincipal.Frente = 0;&lt;br /&gt;
frmPrincipal.Final = 0;&lt;br /&gt;
}&lt;br /&gt;
else if (frmPrincipal.Final == frmPrincipal.N)&lt;br /&gt;
{&lt;br /&gt;
frmPrincipal.Final = 0;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
frmPrincipal.Final = frmPrincipal.Final + 1;&lt;br /&gt;
}&lt;br /&gt;
// Se agrega elemento a la Cola&lt;br /&gt;
frmPrincipal.Cola[frmPrincipal.Final] = elemento;&lt;br /&gt;
txtInsercion.Text = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
Algoritmo Eliminación (Cola, Frente, Final, N)&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;Void CmdEliminarClick(object sender, EventArgs e)&lt;br /&gt;
{&lt;br /&gt;
if (frmPrincipal.Frente == -1)&lt;br /&gt;
{&lt;br /&gt;
MessageBox.Show(&amp;quot;Cola Vacia&amp;quot;);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
string elemento = frmPrincipal.Cola[frmPrincipal.Frente];&lt;br /&gt;
&lt;br /&gt;
// si la cola tiene un solo elemento&lt;br /&gt;
if (frmPrincipal.Frente == frmPrincipal.Final)&lt;br /&gt;
{&lt;br /&gt;
frmPrincipal.Frente = -1;&lt;br /&gt;
frmPrincipal.Final = -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
else if (frmPrincipal.Frente == frmPrincipal.N)&lt;br /&gt;
{&lt;br /&gt;
frmPrincipal.Frente = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
frmPrincipal.Frente = frmPrincipal.Frente + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
lsEliminado.Items.Add(elemento);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
== Tipos de colas  ==&lt;br /&gt;
&lt;br /&gt;
*''Colas circulares (anillos)'': en las que el último elemento y el primero están unidos.&lt;br /&gt;
&lt;br /&gt;
*''Colas de prioridad'': En ellas, los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. Si varios elementos tienen la misma prioridad, se atenderán de modo convencional según la posición que ocupen. Hay 2 formas de implementación:&lt;br /&gt;
&lt;br /&gt;
#Añadir un campo a cada nodo con su prioridad. Resulta conveniente mantener la cola ordenada por orden de prioridad. &lt;br /&gt;
#Crear tantas colas como prioridades haya, y almacenar cada elemento en su cola.&lt;br /&gt;
&lt;br /&gt;
*''Bicolas'': son colas en donde los nodos se pueden añadir y quitar por ambos extremos; se les llama DEQUE (Double Ended QUEue). Para representar las bicolas lo podemos hacer con un array circular con Inicio y Fin que apunten a cada uno de los extremos. Hay variantes:&lt;br /&gt;
&lt;br /&gt;
*''Bicolas de entrada restringida'': Son aquellas donde la inserción sólo se hace por el final, aunque podemos eliminar al ''inicio'' ó al ''final''.&lt;br /&gt;
&lt;br /&gt;
*''Bicolas de salida restringida'': Son aquellas donde sólo se elimina por el final, aunque se puede insertar al ''inicio'' y al ''final''.\&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Estructura_de_datos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Cola_(Estructura_de_datos)&amp;diff=74753</id>
		<title>Cola (Estructura de datos)</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Cola_(Estructura_de_datos)&amp;diff=74753"/>
		<updated>2010-05-27T18:32:30Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '{{Referencia}}Cola (informática) Una cola es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza por…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}}Cola (informática) Una cola es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operación de inserción push se realiza por un extremo y la operación de extracción pop por el otro. También se le llama estructura FIFO (del inglés First In First Out), debido a que el primer elemento en entrar será también el primero en salir. &lt;br /&gt;
&lt;br /&gt;
Las colas se utilizan en sistemas informáticos, transportes y operaciones de investigación (entre otros), dónde los objetos, personas o eventos son tomados como datos que se almacenan y se guardan mediante colas para su posterior procesamiento. Este tipo de estructura de datos abstracta se implementa en lenguajes orientados a objetos mediante clases, en forma de listas enlazadas. &lt;br /&gt;
&lt;br /&gt;
== Usos concretos de la cola  ==&lt;br /&gt;
&lt;br /&gt;
La particularidad de una estructura de datos de cola es el hecho de que sólo podemos acceder al primer y al último elemento de la estructura. Así mismo, los elementos sólo se pueden eliminar por el principio y sólo se pueden añadir por el final de la cola.[[Image:ColaProg.JPG|border|right|Ejemplo de Cola]] Ejemplos de colas en la vida real serían: personas comprando en un supermercado, esperando para entrar a ver un partido de béisbol, esperando en el cine para ver una película, una pequeña peluquería, etc. La idea esencial es que son todos líneas de espera. &lt;br /&gt;
&lt;br /&gt;
En estos casos, el primer elemento de la lista realiza su función (pagar comida, pagar entrada para el partido o para el cine) y deja la cola. Este movimiento está representado en la cola por la función pop o desencolar. Cada vez que otro elemento se añade a la lista de espera se añaden al final de la cola representando la función ''push'' o encolar. Hay otras funciones auxiliares para ver el tamaño de la cola (''size''), para ver si está vacía en el caso de que no haya nadie esperando (''empty'') o para ver el primer elemento de la cola (''front''). &lt;br /&gt;
&lt;br /&gt;
== Información adicional  ==&lt;br /&gt;
&lt;br /&gt;
Teóricamente, la característica de las colas es que tienen una capacidad específica. Por muchos elementos que contengan siempre se puede añadir un elemento más y en caso de estar vacía borrar un elemento sería imposible hasta que no se añade un nuevo elemento. A la hora de añadir un elemento podríamos darle una mayor importancia a unos elementos que a otros (un cargo VIP) y para ello se crea un tipo de cola especial que es la cola de prioridad. (Ver [[Cola de prioridad (estructura de datos)|cola de prioridad]]). &lt;br /&gt;
&lt;br /&gt;
Esto es una falacia &lt;br /&gt;
&lt;br /&gt;
== Operaciones Básicas  ==&lt;br /&gt;
&lt;br /&gt;
*'''Crear''': se crea la cola vacía. &lt;br /&gt;
*'''Encolar''' (añadir, entrar, push): se añade un elemento a la cola. Se añade al final de esta. &lt;br /&gt;
*'''Desencolar''' (sacar, salir, pop): se elimina el elemento frontal de la cola, es decir, el primer elemento que entró. &lt;br /&gt;
*'''Frente''' (consultar, front): se devuelve el elemento frontal de la cola, es decir, el primero elemento que entró.&lt;br /&gt;
&lt;br /&gt;
== Implementaciones  ==&lt;br /&gt;
&lt;br /&gt;
=== Colas en Maude  ===&lt;br /&gt;
&lt;br /&gt;
La ColaNV es la cola no vacía, que diferenciamos de la cola normal a la hora de tomar en cuenta errores. A su vez, el elemento X representa el tipo de valor que puede contener la cola: entero, carácter, registro.... &lt;br /&gt;
&amp;lt;pre&amp;gt; fmod COLA {X&amp;amp;nbsp;:: TRIV} is&lt;br /&gt;
    sorts ColaNV{X} Cola{X} .&lt;br /&gt;
    subsort ColaNV{X} &amp;amp;lt; Cola{X} .&lt;br /&gt;
    *** generadores&lt;br /&gt;
    op crear  &amp;amp;nbsp;: -&amp;amp;gt; Cola{X} [ctor] .&lt;br /&gt;
    op encolar&amp;amp;nbsp;: X$Elt Cola{X} -&amp;amp;gt; ColaNV {X} [ctor] .&lt;br /&gt;
&lt;br /&gt;
    *** constructores&lt;br /&gt;
    op desencolar&amp;amp;nbsp;: Cola{X} -&amp;amp;gt; Cola{X} .&lt;br /&gt;
&lt;br /&gt;
    *** selectores&lt;br /&gt;
    op frente&amp;amp;nbsp;: ColaNV{X} -&amp;amp;gt; X$Elt .&lt;br /&gt;
&lt;br /&gt;
    *** variables&lt;br /&gt;
    var C&amp;amp;nbsp;: ColaNV{X} .&lt;br /&gt;
    vars E E2&amp;amp;nbsp;: X$Elt .&lt;br /&gt;
&lt;br /&gt;
    *** ecuaciones&lt;br /&gt;
    eq desencolar(crear) = crear .&lt;br /&gt;
    eq desencolar(encolar(E, crear)) = crear .&lt;br /&gt;
    eq desencolar(encolar(E, C)) = encolar(E, desencolar(C)) .&lt;br /&gt;
&lt;br /&gt;
    eq frente(encolar(E, crear)) = E .&lt;br /&gt;
    eq frente(encolar(E, C)) = frente(C) .&lt;br /&gt;
  endfm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Especificación de una cola de colas de enteros en Maude:&lt;br /&gt;
&lt;br /&gt;
  view VInt from TRIV to INT is &lt;br /&gt;
  	sort Elt to Int .&lt;br /&gt;
  endv&lt;br /&gt;
  &lt;br /&gt;
  view VColaInt from TRIV to COLA{VInt} is &lt;br /&gt;
  	sort Elt to Cola{VInt} .&lt;br /&gt;
  endv&lt;br /&gt;
  &lt;br /&gt;
  fmod COLA-COLAS-INT is&lt;br /&gt;
  	protecting INT .&lt;br /&gt;
  	protecting COLA{VColaInt} .&lt;br /&gt;
  		&lt;br /&gt;
  	*** operaciones propias de la cola de colas de enteros&lt;br /&gt;
	op encolarInt   &amp;amp;nbsp;: Int ColaNV{VColaInt} -&amp;amp;gt; ColaNV{VColaInt} .&lt;br /&gt;
	op desencolarInt&amp;amp;nbsp;: Cola{VColaInt}       -&amp;amp;gt; Cola{VColaInt} .&lt;br /&gt;
	op frenteInt    &amp;amp;nbsp;: ColaNV{VColaInt}     -&amp;amp;gt; [Int] .&lt;br /&gt;
	&lt;br /&gt;
	*** variables&lt;br /&gt;
	var CCNV&amp;amp;nbsp;: ColaNV{VColaInt} .&lt;br /&gt;
	var CC  &amp;amp;nbsp;: Cola{VColaInt} .&lt;br /&gt;
	var CE  &amp;amp;nbsp;: Cola{VInt} .&lt;br /&gt;
	var E   &amp;amp;nbsp;: Int .&lt;br /&gt;
	&lt;br /&gt;
	*** ecuaciones	&lt;br /&gt;
	eq encolarInt(E, encolar(CE, CC)) = encolar(encolar(E, CE), CC) .&lt;br /&gt;
&lt;br /&gt;
        eq desencolarInt (encolar(CE, crear)) = encolar(desencolar(CE), crear) . &lt;br /&gt;
        eq desencolarInt (encolar(CE, CCNV)) = encolar(CE, desencolarInt(CCNV)) . &lt;br /&gt;
&lt;br /&gt;
	eq frenteInt(CCNV) = frente(frente(CCNV)) .&lt;br /&gt;
  endfm&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Colas en C++  ===&lt;br /&gt;
&amp;lt;pre&amp;gt;#ifndef COLA&lt;br /&gt;
#define COLA // Define la cola&lt;br /&gt;
template &amp;amp;lt;class T&amp;amp;gt;&lt;br /&gt;
class Cola{&lt;br /&gt;
private:&lt;br /&gt;
struct Nodo{&lt;br /&gt;
T elemento;&lt;br /&gt;
struct Nodo* siguiente; // coloca el nodo en la segunda posición&lt;br /&gt;
}* primero;&lt;br /&gt;
struct Nodo* ultimo;&lt;br /&gt;
unsigned int elementos;&lt;br /&gt;
public:&lt;br /&gt;
Cola(){&lt;br /&gt;
elementos = 0;&lt;br /&gt;
}&lt;br /&gt;
~Cola(){&lt;br /&gt;
while (elementos != 0) pop();&lt;br /&gt;
}&lt;br /&gt;
void push(const T&amp;amp;amp; elem){&lt;br /&gt;
Nodo* aux = new Nodo;&lt;br /&gt;
aux-&amp;amp;gt;elemento = elem;&lt;br /&gt;
if (elementos == 0) primero = aux;&lt;br /&gt;
else ultimo-&amp;amp;gt;siguiente = aux;&lt;br /&gt;
ultimo = aux;&lt;br /&gt;
++elementos;&lt;br /&gt;
}&lt;br /&gt;
void pop(){&lt;br /&gt;
Nodo* aux = primero;&lt;br /&gt;
primero = primero-&amp;amp;gt;siguiente;&lt;br /&gt;
delete aux;&lt;br /&gt;
--elementos;&lt;br /&gt;
}&lt;br /&gt;
T consultar() const{&lt;br /&gt;
return primero-&amp;amp;gt;elemento;&lt;br /&gt;
}&lt;br /&gt;
bool vacia() const{&lt;br /&gt;
return elementos == 0;&lt;br /&gt;
}&lt;br /&gt;
unsigned int size() const{&lt;br /&gt;
return elementos;&lt;br /&gt;
}&lt;br /&gt;
};&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Colas en JAVA  ===&lt;br /&gt;
&amp;lt;pre&amp;gt;public void inserta(Elemento x) {&lt;br /&gt;
Nodo Nuevo;&lt;br /&gt;
Nuevo = new Nodo(x, null);&lt;br /&gt;
if (NodoCabeza == null) {&lt;br /&gt;
NodoCabeza = Nuevo;&lt;br /&gt;
} else {&lt;br /&gt;
NodoFinal.Siguiente = Nuevo;&lt;br /&gt;
}&lt;br /&gt;
NodoFinal = Nuevo;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Elemento cabeza() throws IllegalArgumentException {&lt;br /&gt;
if (NodoCabeza == null) {&lt;br /&gt;
throw new IllegalArgumentException();&lt;br /&gt;
} else {&lt;br /&gt;
return NodoCabeza.Info;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Cola() {&lt;br /&gt;
// Devuelve una Cola vacía&lt;br /&gt;
NodoCabeza = null;&lt;br /&gt;
NodoFinal = null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Colas en C#  ===&lt;br /&gt;
&amp;lt;pre&amp;gt;public partial class frmPrincipal&lt;br /&gt;
{&lt;br /&gt;
// Variables globales&lt;br /&gt;
public static string[] Cola;&lt;br /&gt;
public static int Frente;&lt;br /&gt;
public static int Final;&lt;br /&gt;
public static int N;&lt;br /&gt;
&lt;br /&gt;
[STAThread]&lt;br /&gt;
public static void Main(string[] args)&lt;br /&gt;
{&lt;br /&gt;
Application.EnableVisualStyles();&lt;br /&gt;
Application.SetCompatibleTextRenderingDefault(false);&lt;br /&gt;
Application.Run(new frmPrincipal());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public frmPrincipal() // Constructor&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
InitializeComponent();&lt;br /&gt;
&lt;br /&gt;
Cola = new string[5]; // Arreglo lineal de 5&lt;br /&gt;
N = 4;&lt;br /&gt;
Frente = -1;&lt;br /&gt;
Final = -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CmdInsercionClick(object sender, System.EventArgs e)&lt;br /&gt;
{&lt;br /&gt;
frmInsercion Insercion = new frmInsercion();&lt;br /&gt;
Insercion.Show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CmdRecorridoClick(object sender, System.EventArgs e)&lt;br /&gt;
{&lt;br /&gt;
frmRecorrido Recorrido = new frmRecorrido();&lt;br /&gt;
Recorrido.Show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CmdBusquedaClick(object sender, EventArgs e)&lt;br /&gt;
{&lt;br /&gt;
frmBusqueda Busqueda = new frmBusqueda();&lt;br /&gt;
Busqueda.Show();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void CmdEliminacionClick(object sender, EventArgs e)&lt;br /&gt;
{&lt;br /&gt;
frmEliminacion Eliminar = new frmEliminacion();&lt;br /&gt;
Eliminar.Show();&lt;br /&gt;
}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Algoritmo Insertar(Cola, N, Frente, Final, Elemento)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;void CmdInsertarClick(object sender, System.EventArgs e)&lt;br /&gt;
{&lt;br /&gt;
elemento = txtInsercion.Text;&lt;br /&gt;
// Se verifica que haya espacio en la Cola&lt;br /&gt;
if (frmPrincipal.Frente == 0 &amp;amp;amp;&amp;amp;amp; frmPrincipal.Final == frmPrincipal.N)&lt;br /&gt;
{&lt;br /&gt;
MessageBox.Show(&amp;quot;La Cola esta llena&amp;quot;);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
if (frmPrincipal.Frente == frmPrincipal.Final + 1)&lt;br /&gt;
{&lt;br /&gt;
MessageBox.Show(&amp;quot;La Cola esta llena&amp;quot;);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Si la cola esta vacia se inicializan punteros&lt;br /&gt;
if (frmPrincipal.Frente == -1)&lt;br /&gt;
{&lt;br /&gt;
frmPrincipal.Frente = 0;&lt;br /&gt;
frmPrincipal.Final = 0;&lt;br /&gt;
}&lt;br /&gt;
else if (frmPrincipal.Final == frmPrincipal.N)&lt;br /&gt;
{&lt;br /&gt;
frmPrincipal.Final = 0;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
frmPrincipal.Final = frmPrincipal.Final + 1;&lt;br /&gt;
}&lt;br /&gt;
// Se agrega elemento a la Cola&lt;br /&gt;
frmPrincipal.Cola[frmPrincipal.Final] = elemento;&lt;br /&gt;
txtInsercion.Text = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Algoritmo Eliminación (Cola, Frente, Final, N)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;Void CmdEliminarClick(object sender, EventArgs e)&lt;br /&gt;
{&lt;br /&gt;
if (frmPrincipal.Frente == -1)&lt;br /&gt;
{&lt;br /&gt;
MessageBox.Show(&amp;quot;Cola Vacia&amp;quot;);&lt;br /&gt;
return;&lt;br /&gt;
}&lt;br /&gt;
string elemento = frmPrincipal.Cola[frmPrincipal.Frente];&lt;br /&gt;
&lt;br /&gt;
// si la cola tiene un solo elemento&lt;br /&gt;
if (frmPrincipal.Frente == frmPrincipal.Final)&lt;br /&gt;
{&lt;br /&gt;
frmPrincipal.Frente = -1;&lt;br /&gt;
frmPrincipal.Final = -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
else if (frmPrincipal.Frente == frmPrincipal.N)&lt;br /&gt;
{&lt;br /&gt;
frmPrincipal.Frente = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
frmPrincipal.Frente = frmPrincipal.Frente + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
lsEliminado.Items.Add(elemento);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
== Tipos de colas  ==&lt;br /&gt;
&lt;br /&gt;
*''Colas circulares (anillos)'': en las que el último elemento y el primero están unidos.&lt;br /&gt;
&lt;br /&gt;
*''Colas de prioridad'': En ellas, los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. Si varios elementos tienen la misma prioridad, se atenderán de modo convencional según la posición que ocupen. Hay 2 formas de implementación:&lt;br /&gt;
&lt;br /&gt;
#Añadir un campo a cada nodo con su prioridad. Resulta conveniente mantener la cola ordenada por orden de prioridad. &lt;br /&gt;
#Crear tantas colas como prioridades haya, y almacenar cada elemento en su cola.&lt;br /&gt;
&lt;br /&gt;
*''Bicolas'': son colas en donde los nodos se pueden añadir y quitar por ambos extremos; se les llama DEQUE (Double Ended QUEue). Para representar las bicolas lo podemos hacer con un array circular con Inicio y Fin que apunten a cada uno de los extremos. Hay variantes:&lt;br /&gt;
&lt;br /&gt;
*''Bicolas de entrada restringida'': Son aquellas donde la inserción sólo se hace por el final, aunque podemos eliminar al ''inicio'' ó al ''final''.&lt;br /&gt;
&lt;br /&gt;
*''Bicolas de salida restringida'': Son aquellas donde sólo se elimina por el final, aunque se puede insertar al ''inicio'' y al ''final''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Estructura_de_datos]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Pila_(Estructura_de_datos)&amp;diff=74734</id>
		<title>Pila (Estructura de datos)</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Pila_(Estructura_de_datos)&amp;diff=74734"/>
		<updated>2010-05-27T18:14:57Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '{{Referencia}}Pila (informática) Una pila (stack en inglés) es una lista ordinal o estructura de datos en la que el modo de acceso a sus elementos es de tipo LIFO (del inglés…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}}Pila (informática) Una pila (stack en inglés) es una lista ordinal o estructura de datos en la que el modo de acceso a sus elementos es de tipo LIFO (del inglés Last In First Out, último en entrar, primero en salir) que permite almacenar y recuperar datos. Se aplica en multitud de ocasiones en informática debido a su simplicidad y ordenación implícita en la propia estructura. Representación gráfica de una pila &lt;br /&gt;
&lt;br /&gt;
Para el manejo de los datos se cuenta con dos operaciones básicas: apilar (push), que coloca un objeto en la pila, y su operación inversa, retirar (o desapilar, pop), que retira el último elemento apilado. &lt;br /&gt;
&lt;br /&gt;
En cada momento sólo se tiene acceso a la parte superior de la pila, es decir, al último objeto apilado (denominado TOS, Top of Stack en inglés). La operación retirar permite la obtención de este elemento, que es retirado de la pila permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser el nuevo TOS. &lt;br /&gt;
&lt;br /&gt;
Por analogía con objetos cotidianos, una operación apilar equivaldría a colocar un plato sobre una pila de platos, y una operación retirar a retirarlo. &lt;br /&gt;
&lt;br /&gt;
Las pilas suelen emplearse en los siguientes contextos: &lt;br /&gt;
&lt;br /&gt;
    * Evaluación de expresiones en notación postfija (notación polaca inversa).&lt;br /&gt;
    * Reconocedores sintácticos de lenguajes independientes del contexto&lt;br /&gt;
    * Implementación de recursividad.&lt;br /&gt;
&lt;br /&gt;
== Historia  ==&lt;br /&gt;
&lt;br /&gt;
El método de pila para la evaluación de expresiones fue propuesto en 1955 y dos años después patentado por Fiedrich L.Bauer, quién recibió en 1988 el premio &amp;quot;IEEE Computer Society Pioneer Award&amp;quot; por su trabajo en el desarrollo de dicha estructura de datos. &lt;br /&gt;
&lt;br /&gt;
== Pila de llamadas  ==&lt;br /&gt;
&lt;br /&gt;
La '''pila de llamadas''' es un segmento de [[Memoria de ordenador|memoria]] que utiliza esta estructura de datos para almacenar información sobre las llamadas a [[Subrutina|subrutinas]] actualmente en ejecución en un [[Programa informático|programa]] en [[Proceso (informática)|proceso]]. &lt;br /&gt;
&lt;br /&gt;
Cada vez que una nueva subrutina es llamada, se apila una nueva entrada con información sobre ésta tal como sus variables locales. En especial, se almacena aquí el punto de retorno al que regresar cuando esta subrutina termine (para volver a la subrutina anterior y continuar su ejecución después de esta llamada).. &lt;br /&gt;
&lt;br /&gt;
== Pila como tipo abstracto de datos  ==&lt;br /&gt;
&lt;br /&gt;
A modo de resumen tipo de datos, la pila es un contenedor de nodos y tiene dos operaciones básicas: '''push''' (o apilar) y '''pop''' (o desapilar). 'Push' añade un nodo a la parte superior de la pila, dejando por debajo el resto de los nodos. 'Pop' elimina y devuelve el actual nodo superior de la pila. Una metáfora que se utiliza con frecuencia es la idea de una pila de platos en una cafetería con muelle de pila. En esa serie, sólo la primera placa es visible y accesible para el usuario, todas las demás placas permanecen ocultas. Como se añaden las nuevas placas, cada nueva placa se convierte en la parte superior de la pila, escondidos debajo de cada plato, empujando a la pila de placas. A medida que la placa superior se elimina de la pila, la segunda placa se convierte en la parte superior de la pila. Dos principios importantes son ilustrados por esta metáfora: En primer lugar la última salida es un principio, la segunda es que el contenido de la pila está oculto. Sólo la placa de la parte superior es visible, por lo que para ver lo que hay en la tercera placa, el primer y segundo platos tendrán que ser retirados. &lt;br /&gt;
&lt;br /&gt;
=== Operaciones  ===&lt;br /&gt;
&lt;br /&gt;
Una pila cuenta con 2 operacines imprescindibles: apilar y desapilar, a las que en las implementaciones modernas de las pilas se suelen añadir más de uso habitual. &lt;br /&gt;
&lt;br /&gt;
*'''Crear:''' se crea la pila vacía. &lt;br /&gt;
*'''Apilar:''' se añade un elemento a la pila.(push) &lt;br /&gt;
*'''Desapilar:''' se elimina el elemento frontal de la pila.(pop) &lt;br /&gt;
*'''Cima:''' devuelve el elemento que esta en la cima de la pila. (top o peek) &lt;br /&gt;
*'''Vacía:''' devuelve cierto si la pila está vacía o falso en caso contrario.&lt;br /&gt;
&lt;br /&gt;
=== Implementación  ===&lt;br /&gt;
&lt;br /&gt;
Un requisito típico de almacenamiento de una pila de n elementos es O(n). El requisito típico de tiempo de O(1) las operaciones también son fáciles de satisfacer con un array o con listas enlazadas simples. &lt;br /&gt;
&lt;br /&gt;
La biblioteca de plantillas de C++ estándar proporciona una &amp;quot;pila&amp;quot; clase templated que se limita a sólo apilar/desapilar operaciones. Java contiene una biblioteca de la clase Pila que es una especialización de Vector. Esto podría ser considerado como un defecto, porque el diseño heredado get () de Vector método LIFO ignora la limitación de la Pila. &lt;br /&gt;
&lt;br /&gt;
Estos son ejemplos sencillos de una pila con las operaciones descritas anteriormente (pero no hay comprobación de errores). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== EN PYTHON  ====&lt;br /&gt;
&amp;lt;pre&amp;gt;class Stack(object):&lt;br /&gt;
def __init__(self):&lt;br /&gt;
self.stack_pointer = None&lt;br /&gt;
&lt;br /&gt;
def push(self, element):&lt;br /&gt;
self.stack_pointer = Node(element, self.stack_pointer)&lt;br /&gt;
&lt;br /&gt;
def pop(self):&lt;br /&gt;
e = self.stack_pointer.element&lt;br /&gt;
self.stack_pointer = self.stack_pointer.next&lt;br /&gt;
return e&lt;br /&gt;
&lt;br /&gt;
def peek(self):&lt;br /&gt;
return self.stack_pointer.element&lt;br /&gt;
&lt;br /&gt;
def __len__(self):&lt;br /&gt;
i = 0&lt;br /&gt;
sp = self.stack_pointer&lt;br /&gt;
while sp:&lt;br /&gt;
i += 1&lt;br /&gt;
sp = sp.next&lt;br /&gt;
return i&lt;br /&gt;
&lt;br /&gt;
class Node(object):&lt;br /&gt;
def __init__(self, element=None, next=None):&lt;br /&gt;
self.element = element&lt;br /&gt;
self.next = next&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
# small use example&lt;br /&gt;
s = Stack()&lt;br /&gt;
[s.push(i) for i in xrange(10)]&lt;br /&gt;
print [s.pop() for i in xrange(len(s))]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== EN MAUDE  ====&lt;br /&gt;
&lt;br /&gt;
La PilaNV es la pila no vacía, que diferenciamos de la pila normal a la hora de tomar en cuenta errores. El elemento X representa el tipo de valor que puede contener la pila: entero, carácter, registro.... &lt;br /&gt;
&lt;br /&gt;
 fmod PILA-GENERICA {X&amp;amp;nbsp;:: TRIV} is&lt;br /&gt;
   sorts Pila{X} PilaNV{X}.&lt;br /&gt;
   subsorts PilaNV{X} &amp;amp;lt; Pila{X}.&lt;br /&gt;
  &lt;br /&gt;
   ***generadores:&lt;br /&gt;
    op crear: -&amp;amp;gt; Pila {X} [ctor].&lt;br /&gt;
    op apilar&amp;amp;nbsp;: X$Elt Pila{X} -&amp;amp;gt; PilaNV{X} [ctor].&lt;br /&gt;
   &lt;br /&gt;
   ***constructores&lt;br /&gt;
    op desapilar&amp;amp;nbsp;: Pila{X} -&amp;amp;gt; Pila{X}.&lt;br /&gt;
   &lt;br /&gt;
   ***selectores &lt;br /&gt;
    op cima&amp;amp;nbsp;: PilaNV{X} -&amp;amp;gt; X$Elt.&lt;br /&gt;
  &lt;br /&gt;
   ***variables &lt;br /&gt;
     var P&amp;amp;nbsp;: Pila{X}.&lt;br /&gt;
     var E&amp;amp;nbsp;: X$Elt.&lt;br /&gt;
   &lt;br /&gt;
   ***ecuaciones &lt;br /&gt;
    eq desapilar (crear) = crear.&lt;br /&gt;
    eq desapilar(apilar(E, P)) = P.&lt;br /&gt;
    eq cima(apilar(E, P)) = E.&lt;br /&gt;
 endfm&lt;br /&gt;
&lt;br /&gt;
==== EN C++  ====&lt;br /&gt;
&amp;lt;pre&amp;gt;#ifndef PILA&lt;br /&gt;
#define PILA // define la pila&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
template &amp;amp;lt;class T&amp;amp;gt;&lt;br /&gt;
class Pila {&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
struct Nodo {&lt;br /&gt;
T elemento;&lt;br /&gt;
Nodo* siguiente; // coloca el nodo en la segunda posicion&lt;br /&gt;
}* ultimo;&lt;br /&gt;
unsigned int elementos;&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
Pila() {&lt;br /&gt;
elementos = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
~Pila() {&lt;br /&gt;
while (elementos&amp;amp;nbsp;!= 0) pop();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void push(const T&amp;amp;amp; elem) {&lt;br /&gt;
Nodo* aux = new Nodo;&lt;br /&gt;
aux-&amp;amp;gt;elemento = elem;&lt;br /&gt;
aux-&amp;amp;gt;siguiente = ultimo;&lt;br /&gt;
ultimo = aux;&lt;br /&gt;
++elementos;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void pop() {&lt;br /&gt;
Nodo* aux = ultimo;&lt;br /&gt;
ultimo = ultimo-&amp;amp;gt;siguiente;&lt;br /&gt;
delete aux;&lt;br /&gt;
--elementos;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
T cima() const {&lt;br /&gt;
return ultimo-&amp;amp;gt;elemento;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool vacia() const {&lt;br /&gt;
return elementos == 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
unsigned int altura() const {&lt;br /&gt;
return elementos;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Estructuras de datos relacionadas  ===&lt;br /&gt;
&lt;br /&gt;
El tipo base de la estructura FIFO (el primero en entrar es el primero en salir)es la cola, y la combinación de las operaciones de la pila y la cola es proporcionado por el deque. Por ejemplo, el cambio de una pila en una cola en un algoritmo de búsqueda puede cambiar el algoritmo de búsqueda en primera profundidad (en inglés, DFS) por una búsqueda en amplitud (en inglés, BFS). Una pila acotada es una pila limitada a un tamaño máximo impuesto en su especificación. &lt;br /&gt;
&lt;br /&gt;
== Pilas Hardware  ==&lt;br /&gt;
&lt;br /&gt;
Un uso muy común de las pilas a nivel de arquitectura hardware es la asignación de memoria. &lt;br /&gt;
&lt;br /&gt;
== Arquitectura básica de una pila  ==&lt;br /&gt;
&lt;br /&gt;
Una pila típica es un área de la memoria de los computadores con un origen fijo y un tamaño variable. Al principio, el tamaño de la pila es cero. Un puntero de pila, por lo general en forma de un registro de hardware, apunta a la más reciente localización en la pila; cuando la pila tiene un tamaño de cero, el puntero de pila de puntos en el origen de la pila. &lt;br /&gt;
&lt;br /&gt;
Las dos operaciones aplicables a todas las pilas son: &lt;br /&gt;
&lt;br /&gt;
*Una operación apilar, en el que un elemento de datos se coloca en el lugar apuntado por el puntero de pila, y la dirección en el puntero de pila se ajusta por el tamaño de los datos de partida. &lt;br /&gt;
*Una operación desapilar: un elemento de datos en la ubicación actual apuntado por el puntero de pila es eliminado, y el puntero de pila se ajusta por el tamaño de los datos de partida.&lt;br /&gt;
&lt;br /&gt;
Hay muchas variaciones en el principio básico de las operaciones de pila. Cada pila tiene un lugar fijo en la memoria en la que comienza. Como los datos se añadirán a la pila, el puntero de pila es desplazado para indicar el estado actual de la pila, que se expande lejos del origen (ya sea hacia arriba o hacia abajo, dependiendo de la aplicación concreta). &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, una pila puede comenzar en una posición de la memoria de mil, y ampliar por debajo de las direcciones, en cuyo caso, los nuevos datos se almacenan en lugares que van por debajo de 1000, y el puntero de pila se decrementa cada vez que un nuevo elemento se agrega. Cuando un tema es eliminado de la pila, el puntero de pila se incrementa. &lt;br /&gt;
&lt;br /&gt;
Los punteros de pila pueden apuntar al origen de una pila o de un número limitado de direcciones, ya sea por encima o por debajo del origen (dependiendo de la dirección en que crece la pila), sin embargo el puntero de pila no puede cruzar el origen de la pila. En otras palabras, si el origen de la pila está en la dirección 1000 y la pila crece hacia abajo (hacia las direcciones 999, 998, y así sucesivamente), el puntero de pila nunca debe ser incrementado más allá de 1000 (para 1001, 1002, etc.) Si un desapilar operación en la pila hace que el puntero de pila se deje atrás el origen de la pila, una pila se produce desbordamiento. Si una operación de apilar hace que el puntero de pila incremente o decremente más allá del máximo de la pila, en una pila se produce desbordamiento. &lt;br /&gt;
&lt;br /&gt;
La pila es visualizada ya sea creciente de abajo hacia arriba (como pilas del mundo real), o, con el máximo elemento de la pila en una posición fija, o creciente, de izquierda a derecha, por lo que el máximo elemento se convierte en el máximo a &amp;quot;la derecha&amp;quot;. Esta visualización puede ser independiente de la estructura real de la pila en la memoria. Esto significa que rotar a la derecha es mover el primer elemento a la tercera posición, la segunda a la primera y la tercera a la segunda. Aquí hay dos equivalentes visualizaciones de este proceso: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
  Manzana                                            Plátano&lt;br /&gt;
  &lt;br /&gt;
  Plátano       ==rotar a la derecha==&amp;amp;gt;              Fresa&lt;br /&gt;
  &lt;br /&gt;
  Fresa                                              Manzana&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
  Fresa                                             Manzana&lt;br /&gt;
  &lt;br /&gt;
  Plátano       ==rotar a la izquierda==&amp;amp;gt;           Fresa&lt;br /&gt;
  &lt;br /&gt;
  Manzana                                           Plátano&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; Una pila es normalmente representada en los ordenadores por un bloque de celdas de memoria, con los &amp;quot;de abajo&amp;quot; en una ubicación fija, y el puntero de pila de la dirección actual de la &amp;quot;cima&amp;quot; de células de la pila. En la parte superior e inferior se utiliza la terminología con independencia de que la pila crece realmente a la baja de direcciones de memoria o direcciones de memoria hacia mayores. &lt;br /&gt;
&lt;br /&gt;
Apilando un elemento en la pila,se ajusta el puntero de pila por el tamaño de elementos (ya sea decrementar o incrementar, en función de la dirección en que crece la pila en la memoria), que apunta a la próxima celda, y copia el nuevo elemento de la cima en área de la pila. Dependiendo de nuevo sobre la aplicación exacta, al final de una operación de apilar, el puntero de pila puede señalar a la siguiente ubicación no utilizado en la pila, o tal vez apunte al máximo elemento de la pila. Si la pila apunta al máximo elemento de la pila, el puntero de pila se actualizará antes de que un nuevo elemento se apile, si el puntero que apunta a la próxima ubicación disponible en la pila, que se actualizará después de que el máximo elemento se apile en la pila. &lt;br /&gt;
&lt;br /&gt;
Desapilando es simplemente la inversa de apilar. El primer elemento de la pila es eliminado y el puntero de pila se actualiza, en el orden opuesto de la utilizada en la operación de apilar. &lt;br /&gt;
&lt;br /&gt;
== Soporte de Hardware  ==&lt;br /&gt;
&lt;br /&gt;
Muchas [[CPU]]s tienen registros que se pueden utilizar como punteros de pila. Algunos, como el Intel x86, tienen instrucciones especiales que implícitamente el uso de un registro dedicado a la tarea de ser un puntero de pila. Otros, como el DEC PDP-11 y de la familia 68000 de [[Motorola]] tienen que hacer frente a los modos de hacer posible la utilización de toda una serie de registros como un puntero de pila. La serie Intel 80x87 numérico de coprocessors tiene un conjunto de registros que se puede acceder ya sea como una pila o como una serie de registros numerados. Algunos microcontroladores, por ejemplo algunos PICs, tienen un fondo fijo de pila que no es directamente accesible. También hay una serie de microprocesadores que aplicar una pila directamente en el hardware: &lt;br /&gt;
&lt;br /&gt;
*Computer vaqueros MuP21 &lt;br /&gt;
*Harris RTX línea &lt;br /&gt;
*Novix NC4016&lt;br /&gt;
&lt;br /&gt;
Muchas pilas basadas en los microprocesadores se utilizan para aplicar el lenguaje de programación Forth en el nivel de microcódigo. Pila también se utilizaron como base de una serie de mainframes y miniordenadores. Esas máquinas fueron llamados pila de máquinas, el más famoso es el Burroughs B5000 &lt;br /&gt;
&lt;br /&gt;
== Soporte de Software  ==&lt;br /&gt;
&lt;br /&gt;
En programas de aplicación escrito en un lenguaje de alto nivel, una pila puede ser implementada de manera eficiente, ya sea usando vectores o listas enlazadas. En LISP no hay necesidad de aplicar la pila, ya que las funciones apilar y desapilar están disponibles para cualquier lista. Adobe PostScript también está diseñada en torno a una pila que se encuentra directamente visible y manipuladas por el programador. El uso de las pilas está muy presente en el desarrollo de software por ello la importancia de las pilas como tipo abstracto de datos. &lt;br /&gt;
&lt;br /&gt;
== Expresión de evaluación y análisis sintáctico  ==&lt;br /&gt;
&lt;br /&gt;
Se calcula empleando la notación polaca inversa utilizando una estructura de pila para los posibles valores. Las expresiones pueden ser representadas en prefijo, infijo, postfijo. La conversión de una forma de la expresión a otra forma necesita de una pila. Muchos compiladores utilizan una pila para analizar la sintaxis de las expresiones, bloques de programa, etc. Antes de traducir el código de bajo nivel. La mayoría de los lenguajes de programación son de contexto libre de los idiomas que les permite ser analizados con máquinas basadas en la pila. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, el cálculo: ((1 + 2) * 4) + 3, puede ser anotado como en notación postfija con la ventaja de no prevalecer las normas y los paréntesis necesario: &lt;br /&gt;
&lt;br /&gt;
1 2 + 4 * 3 + &lt;br /&gt;
&lt;br /&gt;
La expresión es evaluada de izquierda a derecha utilizando una pila: &lt;br /&gt;
&lt;br /&gt;
*Apilar cuando se enfrentan a un operando y &lt;br /&gt;
*Desafilar dos operandos y evaluar el valor cuando se enfrentan a una operación. &lt;br /&gt;
*Apilar el resultado.&lt;br /&gt;
&lt;br /&gt;
De la siguiente manera (la Pila se muestra después de que la operación se haya llevado a cabo): &lt;br /&gt;
&lt;br /&gt;
  ENTRADA         OPERACION                 PILA&lt;br /&gt;
  &lt;br /&gt;
  1             Apilar operando             1&lt;br /&gt;
  2             Apilar operando             1, 2&lt;br /&gt;
  +             Añadir                      3&lt;br /&gt;
  4             Apilar operando             3, 4&lt;br /&gt;
  *             Multiplicar                 12&lt;br /&gt;
  3             Apilar operando             12, 3&lt;br /&gt;
  +             Añadir                      15 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; El resultado final, 15, se encuentra en la parte superior de la pila al final del cálculo. &lt;br /&gt;
&lt;br /&gt;
=== Tiempo de ejecución de la gestión de memoria  ===&lt;br /&gt;
&lt;br /&gt;
Artículo principal: Pila basada en la asignación de memoria y Pila máquina. Una serie de lenguajes de programación están orientadas a la pila, lo que significa que la mayoría definen operaciones básicas (añadir dos números, la impresión de un carácter) cogiendo sus argumentos de la pila, y realizando de nuevo los valores de retorno en la pila. Por ejemplo, PostScript tiene una pila de retorno y un operando de pila, y también tiene un montón de gráficos estado y un diccionario de pila. &lt;br /&gt;
&lt;br /&gt;
Forth utiliza dos pilas, una para pasar argumentos y una subrutina de direcciones de retorno. El uso de una pila de retorno es muy común, pero el uso poco habitual de un argumento para una pila legible para humanos es el lenguaje de programación Forth razón que se denomina una pila basada en el idioma. &lt;br /&gt;
&lt;br /&gt;
Muchas máquinas virtuales también están orientadas hacia la pila, incluida la p-código máquina y la máquina virtual Java. &lt;br /&gt;
&lt;br /&gt;
Casi todos los entornos de computación de tiempo de ejecución de memoria utilizan una pila especial PILA para tener información sobre la llamada de un procedimiento o función y de la anidación con el fin de cambiar al contexto de la llamada a restaurar cuando la llamada termina. Ellos siguen un protocolo de tiempo de ejecución entre el que llama y el llamado para guardar los argumentos y el valor de retorno en la pila. Pila es una forma importante de apoyar llamadas anidadas o a funciones recursivas. Este tipo de pila se utiliza implícitamente por el compilador para apoyar CALL y RETURN estados (o sus equivalentes), y no es manipulada directamente por el programador. &lt;br /&gt;
&lt;br /&gt;
Algunos lenguajes de programación utilizar la pila para almacenar datos que son locales a un procedimiento. El espacio para los datos locales se asigna a los temas de la pila cuando el procedimiento se introduce, y son borradas cuando el procedimiento termina. El lenguaje de programación C es generalmente aplicado de esta manera. Utilizando la misma pila de los datos y llamadas de procedimiento tiene importantes consecuencias para la seguridad (ver más abajo), de los que un programador debe ser consciente, a fin de evitar la introducción de graves errores de seguridad en un programa. &lt;br /&gt;
&lt;br /&gt;
=== Solucionar problemas de búsqueda  ===&lt;br /&gt;
&lt;br /&gt;
La búsqueda de la solución de un problema, es independientemente de si el enfoque es exhaustivo u óptimo, necesita espacio en la pila. Ejemplos de búsqueda exhaustiva métodos son fuerza bruta y backtraking. Ejemplos de búsqueda óptima a explorar métodos,son branch and bound y soluciones heurísticas. Todos estos algoritmos utilizan pilas para recordar la búsqueda de nodos que se han observado, pero no explorados aún. La única alternativa al uso de una pila es utilizar la recursividad y dejar que el compilador sea recursivo (pero en este caso el compilador todavía está utilizando una pila interna). El uso de pilas es frecuente en muchos problemas, que van desde almacenar la profundidad de los árboles hasta resolver crucigramas o jugar al ajedrez por ordenador. Algunos de estos problemas pueden ser resueltos por otras estructuras de datos como una cola. &lt;br /&gt;
&lt;br /&gt;
== Seguridad  ==&lt;br /&gt;
&lt;br /&gt;
La seguridad a la hora de desarrollar software usando estructuras de datos de tipo pila es un factor a tener en cuenta debido a ciertas vulnerabilidad que un uso incorrecto de éstas puede originar en la seguridad de nuestro software o en la seguridad del propio sistema que lo ejecuta. Por ejemplo, algunos lenguajes de programación usan una misma pila para almacenar los datos para un procedimientos y el link que permite retornar a su invocador. Ésto significa que el programa introduce y extrae los datos de la misma pila en la que se encuentra información crítica con las direcciones de retorno de las llamadas a procedimiento, supongamos que al introducir datos en la pila lo hacemos en una posición errónea de manera que introducimos una datos de mayor tamaño al soportado por la pila corrompiendo así las llamadas a procedimientos provocariamos un fallo en nuestro programa. [http://www.cs.ucla.edu/~palsberg/paper/sas03.pdf Ésta técnica] usada de forma maliciosa (es similar pero en otro ámbito al buffer overflow) permitiría a un atacante modificar el funcionamiento normal de nuestro programa y nuestro sistema, y es al menos una técnica útil si no lo evitamos en lenguajes muy populares como el ejemplo C. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Estructura_de_datos]] [[Category:Programación]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Ordenamiento_Radix&amp;diff=70739</id>
		<title>Ordenamiento Radix</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Ordenamiento_Radix&amp;diff=70739"/>
		<updated>2010-05-19T19:54:31Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '{{Referencia}}Ordenamiento Radix En informática, el ordenamiento Radix (radix sort en inglés) es un algoritmo de ordenamiento que ordena enteros procesando sus dígitos de for…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}}Ordenamiento Radix En informática, el ordenamiento Radix (radix sort en inglés) es un algoritmo de ordenamiento que ordena enteros procesando sus dígitos de forma individual. Como los enteros pueden representar cadenas de caracteres (por ejemplo, nombres o fechas) y, especialmente, números en punto flotante especialmente formateados, radix sort no está limitado sólo a los enteros. &lt;br /&gt;
&lt;br /&gt;
== Descripción  ==&lt;br /&gt;
&lt;br /&gt;
La mayor parte de los ordenadores digitales representan internamente todos sus datos como representaciones electrónicas de números binarios, por lo que procesar los dígitos de las representaciones de enteros por representaciones de grupos de dígitos binarios es lo más conveniente. Existen dos clasificaciones de radix sort: el de dígito menos significativo ('''LSD''') y el de dígito más significativo ('''MSD'''). ''Radix sort LSD'' procesa las representaciones de enteros empezando por el dígito menos significativo y moviéndose hacia el dígito más significativo. ''Radix sort MSD'' trabaja en sentido contrario. &lt;br /&gt;
&lt;br /&gt;
Las representaciones de enteros que son procesadas por los algoritmos de ordenamiento se les llama a menudo &amp;quot;claves&amp;quot;, que pueden existir por sí mismas o asociadas a otros datos. ''Radix sort LSD'' usa típicamente el siguiente orden: claves cortas aparecen antes que las claves largas, y claves de la misma longitud son ordenadas de forma léxica. Esto coincide con el orden normal de las representaciones de enteros, como la secuencia &amp;quot;1, 2, 3, 4, 5, 6, 7, 8, 9, 10&amp;quot;. ''Radix sorts MSD'' usa orden léxico, que es ideal para la ordenación de cadenas de caracteres, como las palabras o representaciones de enteros de longitud fija. Una secuencia como &amp;quot;b, c, d, e, f, g, h, i, j, ba&amp;quot; será ordenada léxicamente como &amp;quot;b, ba, c, d, e, f, g, h, i, j&amp;quot;. Si se usa orden léxico para ordenar representaciones de enteros de longitud variable, entonces la ordenación de las representaciones de los números del 1 al 10 será &amp;quot;1, 10, 2, 3, 4, 5, 6, 7, 8, 9&amp;quot;, como si las claves más cortas estuvieran justificadas a la izquierda y rellenadas a la derecha con espacios en blanco, para hacerlas tan largas como la clave más larga, para el propósito de este ordenamiento. &lt;br /&gt;
&lt;br /&gt;
== Ejemplo  ==&lt;br /&gt;
&lt;br /&gt;
Vector original: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;25 57 48 37 12 92 86 33&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Asignamos los elementos en colas basadas en el dígito menos significativo de cada uno de ellos. &lt;br /&gt;
&lt;br /&gt;
:0:&amp;lt;br&amp;gt; &lt;br /&gt;
:1:&amp;lt;br&amp;gt; &lt;br /&gt;
:2:1&amp;lt;u&amp;gt;2&amp;lt;/u&amp;gt; 9&amp;lt;u&amp;gt;2&amp;lt;/u&amp;gt;&amp;amp;lt;/br&amp;amp;gt; &lt;br /&gt;
:3:3&amp;lt;u&amp;gt;3&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
:4:&amp;lt;br&amp;gt; &lt;br /&gt;
:5:2&amp;lt;u&amp;gt;5&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
:6:8&amp;lt;u&amp;gt;6&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
:7:5&amp;lt;u&amp;gt;7&amp;lt;/u&amp;gt; 3&amp;lt;u&amp;gt;7&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
:8:4&amp;lt;u&amp;gt;8&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
:9:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después de la primera pasada, la ordenación queda: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;12 92 33 25 86 57 37 48&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Colas basadas en el dígito más significativo. &lt;br /&gt;
&lt;br /&gt;
:0:&amp;lt;br&amp;gt; &lt;br /&gt;
:1:&amp;lt;u&amp;gt;1&amp;lt;/u&amp;gt;2&amp;lt;br&amp;gt; &lt;br /&gt;
:2:&amp;lt;u&amp;gt;2&amp;lt;/u&amp;gt;5&amp;amp;lt;/br&amp;amp;gt; &lt;br /&gt;
:3:&amp;lt;u&amp;gt;3&amp;lt;/u&amp;gt;3 &amp;lt;u&amp;gt;3&amp;lt;/u&amp;gt;7&amp;lt;br&amp;gt; &lt;br /&gt;
:4:&amp;lt;u&amp;gt;4&amp;lt;/u&amp;gt;8&amp;lt;br&amp;gt; &lt;br /&gt;
:5:&amp;lt;u&amp;gt;5&amp;lt;/u&amp;gt;7&amp;lt;br&amp;gt; &lt;br /&gt;
:6:&amp;lt;br&amp;gt; &lt;br /&gt;
:7:&amp;lt;br&amp;gt; &lt;br /&gt;
:8:&amp;lt;u&amp;gt;8&amp;lt;/u&amp;gt;6&amp;lt;br&amp;gt; &lt;br /&gt;
:9:&amp;lt;u&amp;gt;9&amp;lt;/u&amp;gt;2&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lista ordenada: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;12 25 33 37 48 57 86 92&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Implementaciones  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo Radix Sort en [[C]]&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;void radixsort(int x[], int n)&lt;br /&gt;
{&lt;br /&gt;
int front[10], rear[10];&lt;br /&gt;
struct {&lt;br /&gt;
int info;&lt;br /&gt;
int next;&lt;br /&gt;
} node[NUMELTS];&lt;br /&gt;
int exp, first, i, j, k, p, q, y;&lt;br /&gt;
&lt;br /&gt;
/* Inicializar una lista vinculada */&lt;br /&gt;
for (i = 0; i &amp;amp;lt; n-1; i++) {&lt;br /&gt;
node[i].info = x[i];&lt;br /&gt;
node[i].next = i+1;&lt;br /&gt;
} /* fin del for */&lt;br /&gt;
node[n-1].info = x[n-1];&lt;br /&gt;
node[n-1].next = -1;&lt;br /&gt;
first = 0; /* first es la cabeza de la lista vinculada */&lt;br /&gt;
for (k = 1; k &amp;amp;lt; 5; k++) {&lt;br /&gt;
/* Suponer que tenemos números de cuatro dígitos */&lt;br /&gt;
for (i = 0; i &amp;amp;lt; 10; i++) {&lt;br /&gt;
/*Inicializar colas */&lt;br /&gt;
rear[i] = -1;&lt;br /&gt;
front[i] = -1;&lt;br /&gt;
} /*fin del for */&lt;br /&gt;
/* Procesar cada elemento en la lista */&lt;br /&gt;
while (first&amp;amp;nbsp;!= -1) {&lt;br /&gt;
p = first;&lt;br /&gt;
first = node[first].next;&lt;br /&gt;
y = node[p].info;&lt;br /&gt;
/* Extraer el kâsimo dÁgito */&lt;br /&gt;
exp = pow(10, k-1); /* elevar 10 a la (k-1)ésima potencia */&lt;br /&gt;
j = (y/exp)&amp;amp;nbsp;% 10;&lt;br /&gt;
/* Insertar y en queue[j] */&lt;br /&gt;
q = rear[j];&lt;br /&gt;
if (q == -1)&lt;br /&gt;
front[j] = p;&lt;br /&gt;
else&lt;br /&gt;
node[q].next = p;&lt;br /&gt;
rear[j] = p;&lt;br /&gt;
} /*fin del while */&lt;br /&gt;
&lt;br /&gt;
/* En este punto, cada registro está en su cola basándose en el dígito k&lt;br /&gt;
Ahora formar una lista única de todos los elementos de la cola.&lt;br /&gt;
Encontrar el primer elemento. */&lt;br /&gt;
for (j = 0; j &amp;amp;lt; 10 &amp;amp;amp;&amp;amp;amp; front[j] == -1; j++);&lt;br /&gt;
;&lt;br /&gt;
first = front[j];&lt;br /&gt;
&lt;br /&gt;
/* Vincular las colas restantes */&lt;br /&gt;
while (j &amp;amp;lt;= 9) { /* Verificar si se ha terminado */&lt;br /&gt;
/*Encontrar el elemento siguiente */&lt;br /&gt;
for (i = j+1; i &amp;amp;lt; 10 &amp;amp;amp;&amp;amp;amp; front[i] == -1; i++);&lt;br /&gt;
;&lt;br /&gt;
if (i &amp;amp;lt;= 9) {&lt;br /&gt;
p = i;&lt;br /&gt;
node[rear[j]].next = front[i];&lt;br /&gt;
} /* fin del if */&lt;br /&gt;
j = i;&lt;br /&gt;
} /* fin del while */&lt;br /&gt;
node[rear[p]].next = -1;&lt;br /&gt;
} /* fin del for */&lt;br /&gt;
&lt;br /&gt;
/* Copiar de regreso al archivo original */&lt;br /&gt;
for (i = 0; i &amp;amp;lt; n; i++) {&lt;br /&gt;
x[i] = node[first].info;&lt;br /&gt;
first = node[first].next;&lt;br /&gt;
} /*fin del for */&lt;br /&gt;
} /* fin de radixsort*/&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
int x[50] = {NULL}, i;&lt;br /&gt;
static int n;&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;\nCadena de números enteros: \n&amp;quot;);&lt;br /&gt;
for (n = 0;; n++)&lt;br /&gt;
if (!scanf(&amp;quot;%d&amp;quot;, &amp;amp;amp;x[n])) break;&lt;br /&gt;
if (n)&lt;br /&gt;
radixsort (x, n);&lt;br /&gt;
for (i = 0; i &amp;amp;lt; n; i++)&lt;br /&gt;
printf(&amp;quot;%d &amp;quot;, x[i]);&lt;br /&gt;
return 0;&lt;br /&gt;
}&amp;lt;/pre&amp;gt; &lt;br /&gt;
El algoritmo Radix Sort en [[Perl]], para claves de igual longitud&amp;amp;nbsp; &amp;lt;!--&lt;br /&gt;
A ESTE EJEMPLO LE FALTA SER FORMATEADO: CADENA DE ENTRADA, COLAS FORMADAS, SALIDA, VARIABLES INTERMEDIAS, ETC.&lt;br /&gt;
USAR TABLAS Y LISTAS.&lt;br /&gt;
&lt;br /&gt;
Estado de la lista&lt;br /&gt;
&lt;br /&gt;
i&lt;br /&gt;
 Node[i].info&lt;br /&gt;
 Node[i].next&lt;br /&gt;
&lt;br /&gt;
Inicialización K = 1 K = 2 K = 3&lt;br /&gt;
 &lt;br /&gt;
0&lt;br /&gt;
 65&lt;br /&gt;
 1&lt;br /&gt;
 3&lt;br /&gt;
 1&lt;br /&gt;
 2&lt;br /&gt;
 &lt;br /&gt;
1&lt;br /&gt;
 789&lt;br /&gt;
 2&lt;br /&gt;
 -1&lt;br /&gt;
 -1&lt;br /&gt;
 -1&lt;br /&gt;
 &lt;br /&gt;
2&lt;br /&gt;
 123&lt;br /&gt;
 3&lt;br /&gt;
 0&lt;br /&gt;
 3&lt;br /&gt;
 3&lt;br /&gt;
 &lt;br /&gt;
3&lt;br /&gt;
 457&lt;br /&gt;
 -1&lt;br /&gt;
 1&lt;br /&gt;
 0&lt;br /&gt;
 1&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
rear = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}&lt;br /&gt;
&lt;br /&gt;
2 0 3 1&lt;br /&gt;
&lt;br /&gt;
front = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}&lt;br /&gt;
&lt;br /&gt;
2 0 3 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
k = 1&lt;br /&gt;
&lt;br /&gt;
p = 0 p = 1 p = 2 p = 3&lt;br /&gt;
&lt;br /&gt;
first = 1 first = 2 first = 3 first = -1&lt;br /&gt;
&lt;br /&gt;
y = 65 y = 789 y = 123 y = 457&lt;br /&gt;
&lt;br /&gt;
exp = 1 exp = 1 exp = 1 exp = 1&lt;br /&gt;
&lt;br /&gt;
j = 5 j = 9 j = 3 j = 7&lt;br /&gt;
&lt;br /&gt;
q = -1 q = -1 q = -1 q = -1&lt;br /&gt;
&lt;br /&gt;
si q == -1 si q == -1 si q == -1 si q == -1&lt;br /&gt;
&lt;br /&gt;
front[5] = 0 front[9] = 1 front[3] = 2 front[7] = 3&lt;br /&gt;
&lt;br /&gt;
rear[5] = 0 rear[9] = 1 rear[3] = 2 rear[7] = 3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	j = 3&lt;br /&gt;
	first = 2&lt;br /&gt;
	while ( j &amp;lt;= 9)&lt;br /&gt;
		i = 5&lt;br /&gt;
		si i &amp;lt;= 9&lt;br /&gt;
                   		p = 5&lt;br /&gt;
                  		 node[2].next = 0&lt;br /&gt;
                   		j = 5&lt;br /&gt;
              	i = 7&lt;br /&gt;
                	si i &amp;lt;= 9&lt;br /&gt;
                   		p = 7&lt;br /&gt;
                   		node[0].next = 3&lt;br /&gt;
                   		j = 5&lt;br /&gt;
              	i = 9&lt;br /&gt;
                	si i &amp;lt;= 9&lt;br /&gt;
                   		p = 9&lt;br /&gt;
                  		 node[2].next = 1&lt;br /&gt;
                   		j = 9&lt;br /&gt;
	fin del while&lt;br /&gt;
	p = 9&lt;br /&gt;
	node[1].next = -1&lt;br /&gt;
&lt;br /&gt;
===Características===&lt;br /&gt;
Debido a que el ciclo for (k = 1; k &amp;lt;= m; k++) externo se recorre m veces (una para cada dígito) y el ciclo interior n veces (una para cada elemento en el archivo) el ordenamiento es de aproximadamente (m*n).&lt;br /&gt;
Si las llaves son complejas (es decir, si casi cada número que puede ser una llave lo es en realidad) m se aproxima a log n, por lo que (m*n) se aproxima a (n log n).&lt;br /&gt;
Si la cantidad de dígitos es grande, en ocasiones es más eficiente ordenar el archivo aplicando primero el ordenamiento de raíz a los dígitos más significativos y después utilizando inserción directa sobre el archivo ordenado.&lt;br /&gt;
--&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;sub radix_sort {&lt;br /&gt;
my $array = shift;          # Recibimos una referencia a un array&lt;br /&gt;
my $from = $array;&lt;br /&gt;
my $to;&lt;br /&gt;
&lt;br /&gt;
# Esperamos que todas las claves tengan la misma longitud,&lt;br /&gt;
# por lo que hacemos un bucle por todos los dígitos, desde&lt;br /&gt;
# el que está más a la derecha, hacia la izquierda&lt;br /&gt;
for ( my $i = length $array-&amp;amp;gt;[ 0 ] - 1; $i &amp;amp;gt;= 0; $i-- ) {&lt;br /&gt;
&lt;br /&gt;
# Una nueva lista de ordenación&lt;br /&gt;
$to = [ ];&lt;br /&gt;
&lt;br /&gt;
# Para todas las claves a ordenar&lt;br /&gt;
foreach my $clave ( @$from ) {&lt;br /&gt;
&lt;br /&gt;
# Estabilidad es esencial, por lo que usamos push().&lt;br /&gt;
# $to es un array de referencias a arrays de claves ordenadas&lt;br /&gt;
# según el valor numérico (ord()) del dígito de la clave&lt;br /&gt;
push @{ $to-&amp;amp;gt;[ ord( substr $clave, $i ) ] }, $clave;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Concatenamos todos los valores ordenados en un solo array.&lt;br /&gt;
# Desplegamos los arrays dentro del array $to&lt;br /&gt;
$from = [ map { @{ $_ || [ ] } } @$to ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Ahora copiamos los elementos al array original, como valor de retorno&lt;br /&gt;
@$array = @$from;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Andr%C3%A9i_Kolmog%C3%B3rov&amp;diff=70517</id>
		<title>Andréi Kolmogórov</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Andr%C3%A9i_Kolmog%C3%B3rov&amp;diff=70517"/>
		<updated>2010-05-19T18:05:55Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Personaje_científico|nombre=Andréi Nikoláyevich Kolmogórov  |imagen=|descripcion=|especialidades=matemático|fecha_de_nacimiento=25 de abril de 1903|lugar_de_nacimiento=|fecha_de_fallecimiento=20 de octubre de 1987|lugar_de_fallecimiento=}}Andréi Nikoláyevich Kolmogórov (Андре́й Никола́евич Колмого́ров) (25 de abril de 1903 - 20 de octubre de 1987) fue un matemático ruso que hizo progresos importantes en los campos del escenario y de la topología. En particular, desarrolló una base axiomática que supone el pilar básico de la teoría de las probabilidades a partir de la teoría de conjuntos. Trabajó al principio de su carrera en lógica constructivista y en la serie de Fourier. También trabajó en turbulencias y mecánica clásica. Asimismo, fue el fundador de la teoría de la complejidad algorítmica. Obtuvo su doctorado en la Universidad Estatal de Moscú bajo la dirección de Nikolái Luzin en 1929. &lt;br /&gt;
&lt;br /&gt;
== Biografía ==&lt;br /&gt;
&lt;br /&gt;
=== Primeros años ===&lt;br /&gt;
&lt;br /&gt;
Kolmogorov nació en Tambov, en 1903. Su madre soltera murió en el parto y fue criado por sus tías a Tunoshna cerca de Yaroslavl a la hacienda de su abuelo, un noble rico. Su padre, un agrónomo de profesión, fue deportado de San Petersburgo para participar en el movimiento revolucionario. Que desapareció y se presume que han muerto en la Guerra Civil Rusa. &lt;br /&gt;
&lt;br /&gt;
Kolmogorov fue educado en la escuela del pueblo de su tía, y sus primeros esfuerzos literarios y trabajos matemáticos fueron impresas en el periódico escolar. Como un adolescente que diseñó máquinas de movimiento perpetuo, ocultando su (necesaria) de defectos de forma tan inteligente que sus profesores de enseñanza secundaria no pudieron descubrirlos. En 1910, su tía lo adoptó y luego se trasladó a Moscú, donde fue a un gimnasio, donde se graduó de ella en 1920. &lt;br /&gt;
&lt;br /&gt;
En 1920, Kolmogorov comenzó a estudiar en la Universidad Estatal de Moscú y el Instituto Tecnológico de Química. Kolmogorov ganado una reputación por su erudición de amplio alcance. Como estudiante, participó en los seminarios del historiador ruso SV Bachrushin, y publicó su primer documento de investigación sobre las prácticas de tenencia de la tierra en la República de Nóvgorod en los siglos XV y XVI. [1] Al mismo tiempo (1921-1922), Kolmogorov derivados y demostrado varios resultados en la teoría de conjuntos y en la teoría de series de Fourier (series trigonométricas). &lt;br /&gt;
&lt;br /&gt;
=== Madurez ===&lt;br /&gt;
&lt;br /&gt;
En 1922 Kolmogorov construyó una serie de Fourier que diverge en casi todas partes, obteniendo el reconocimiento internacional. Alrededor de este tiempo, decidió dedicar su vida a la matemática. En 1925 Kolmogorov se graduó de la Universidad Estatal de Moscú, y comenzó a estudiar bajo la supervisión de Nikolai Luzin. Se hizo amigo de toda la vida con Pavel Alexandrov, que participan de Kolmogorov en 1936 en una persecución política feo de su maestro mutuo, el llamado caso Luzin o asunto Luzin. Kolmogorov (junto con A. Khinchin) se interesó en la teoría de la probabilidad. También en 1925, publicó su famosa obra en la lógica intuicionista - Al principio del tercero excluido. De Kolmogorov en 1929 obtuvo su título de Doctor en Filosofía, Ph.D., de la Universidad Estatal de Moscú. &lt;br /&gt;
&lt;br /&gt;
En 1930, Kolmogorov fue en su primer viaje largo al extranjero, de viaje en Göttingen y Munich, Alemania, y después en París, Francia. Su trabajo pionero sobre los métodos de análisis de la Teoría de la Probabilidad se publicó (en alemán) en 1931. También en 1931, se convirtió en profesor en la Universidad de Moscú. En 1933, Kolmogorov publicó el libro Los fundamentos de la Teoría de la Probabilidad, estableciendo las bases modernas de la teoría axiomática de la probabilidad y establecer su reputación como experto en la vida más importantes del mundo en este campo. En 1935, Kolmogorov se convirtió en el primer presidente de la teoría de probabilidades en la Universidad Estatal de Moscú. En 1939, fue elegido miembro de pleno derecho (académico) de la Academia Rusa de Ciencias. En un documento del 1938, Kolmogorov &amp;quot;establecido los teoremas básicos de alisado y de la predicción de procesos estocásticos estacionarios&amp;quot; - un documento que tendría importantes aplicaciones militares durante la Guerra Fría por venir. [2] &lt;br /&gt;
&lt;br /&gt;
En su estudio de los procesos estocásticos (procesos al azar), especialmente en procesos de Markov, Kolmogorov y el matemático británico Sydney Chapman desarrollada de forma independiente el conjunto de ecuaciones fundamentales en el campo, las ecuaciones de Chapman-Kolmogorov. Kolmogorov (izquierda) trabaja en su charla (Tallin, RSS de Estonia, 1973) Kolmogorov trabaja en su charla (Tallin, RSS de Estonia, 1973) &lt;br /&gt;
&lt;br /&gt;
Más tarde, cambió de Kolmogorov intereses de investigación en la zona de turbulencia, donde sus publicaciones a partir de 1941 tuvo una influencia significativa en el campo. En la mecánica clásica, él es más conocido por el test de Kolmogorov-Arnold-Moser teorema (presentado por primera vez en 1954 en el Congreso Internacional de Matemáticos). En 1957 se resolvió el problema de decimotercera Hilbert (un trabajo conjunto con su estudiante VI Arnold). Fue fundador de la teoría de la complejidad algorítmica, a menudo llamada teoría de la complejidad de Kolmogorov, que comenzó a desarrollar alrededor de este tiempo. &lt;br /&gt;
&lt;br /&gt;
Kolmogorov se casó con Anna Dmitrievna Egorov en 1942. Se aplicó una fuerte rutina de la enseñanza durante toda su vida, no sólo en el nivel universitario, sino también con niños más pequeños, ya que participó activamente en el desarrollo de una pedagogía para los niños superdotados, en la literatura y la música, así como en las matemáticas. En la Universidad Estatal de Moscú, Kolmogorov ocupado diferentes posiciones, incluyendo los jefes de diversos departamentos: probabilidad, estadística, y los procesos de azar, la lógica matemática, y también se desempeñó como decano de la Facultad de la Universidad Estatal de Moscú de Mecánica y Matemáticas. &lt;br /&gt;
&lt;br /&gt;
En 1971, Kolmogorov se unió a una expedición oceanográfica a bordo del buque de investigación Dmitri Mendeleyev. Escribió una serie de artículos para la Gran Enciclopedia Soviética. En sus últimos años dedicó gran parte de su esfuerzo a la relación matemática y filosófica entre la teoría de probabilidades en las zonas abstracta y aplicada. [3] &lt;br /&gt;
&lt;br /&gt;
Kolmogorov murió en Moscú en 1987. Una cita: &amp;quot;Todo matemático cree que está por delante sobre todas las demás. La razón por la que no lo digo en público, es porque son gente inteligente&amp;quot; es que se le atribuyen. &lt;br /&gt;
&lt;br /&gt;
== Bibliografia ==&lt;br /&gt;
&lt;br /&gt;
Una bibliografía de sus obras aparecó en &amp;quot;Publications of A. N. Kolmogorov&amp;quot;. Annals of Probability, 17 (3): 945-964. Juliol de 1989. doi: 10.1214/aop/1176991252. &lt;br /&gt;
&lt;br /&gt;
*Kolmogorov, Andrey (1933) (en alemá). Grundbegriffe der Wahrscheinlichkeitsrechnung. Berlín: Julius Springer.o Traducció: Kolmogorov, Andrey (1956). Els fonaments de la Teoria de la Probabilitat (2 ª ed.). Nova York: Chelsea. ISBN 0828400237. http://www.mathematik.com/Kolmogorov/index.html. &lt;br /&gt;
*1991-93. Obres escollides de A.N. Kolmogorov, 3 vols. Tikhomirov, V. M., ed., Volosov, V. M., trad. Dordrecht: Kluwer Academic Publishers. ISBN 9027727961 &lt;br /&gt;
*1925. &amp;quot;Al principi del tercer exclòs&amp;quot; de Jean van Heijenoort, 1967. A Source Book in Mathematical Logic, 1879-1931. Harvard Univ Press. Prensa: 414-37.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Matemático]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Andr%C3%A9i_Kolmog%C3%B3rov&amp;diff=70515</id>
		<title>Andréi Kolmogórov</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Andr%C3%A9i_Kolmog%C3%B3rov&amp;diff=70515"/>
		<updated>2010-05-19T18:03:21Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '{{Personaje_científico}}Andréi Nikoláyevich Kolmogórov (Андре́й Никола́евич Колмого́ров) (25 de abril de 1903 - 20 de octubre de 1987) fue un ma…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Personaje_científico}}Andréi Nikoláyevich Kolmogórov (Андре́й Никола́евич Колмого́ров) (25 de abril de 1903 - 20 de octubre de 1987) fue un matemático ruso que hizo progresos importantes en los campos del escenario y de la topología. En particular, desarrolló una base axiomática que supone el pilar básico de la teoría de las probabilidades a partir de la teoría de conjuntos. Trabajó al principio de su carrera en lógica constructivista y en la serie de Fourier. También trabajó en turbulencias y mecánica clásica. Asimismo, fue el fundador de la teoría de la complejidad algorítmica. Obtuvo su doctorado en la Universidad Estatal de Moscú bajo la dirección de Nikolái Luzin en 1929. &lt;br /&gt;
&lt;br /&gt;
== Biografía ==&lt;br /&gt;
&lt;br /&gt;
=== Primeros años ===&lt;br /&gt;
&lt;br /&gt;
Kolmogorov nació en Tambov, en 1903. Su madre soltera murió en el parto y fue criado por sus tías a Tunoshna cerca de Yaroslavl a la hacienda de su abuelo, un noble rico. Su padre, un agrónomo de profesión, fue deportado de San Petersburgo para participar en el movimiento revolucionario. Que desapareció y se presume que han muerto en la Guerra Civil Rusa. &lt;br /&gt;
&lt;br /&gt;
Kolmogorov fue educado en la escuela del pueblo de su tía, y sus primeros esfuerzos literarios y trabajos matemáticos fueron impresas en el periódico escolar. Como un adolescente que diseñó máquinas de movimiento perpetuo, ocultando su (necesaria) de defectos de forma tan inteligente que sus profesores de enseñanza secundaria no pudieron descubrirlos. En 1910, su tía lo adoptó y luego se trasladó a Moscú, donde fue a un gimnasio, donde se graduó de ella en 1920. &lt;br /&gt;
&lt;br /&gt;
En 1920, Kolmogorov comenzó a estudiar en la Universidad Estatal de Moscú y el Instituto Tecnológico de Química. Kolmogorov ganado una reputación por su erudición de amplio alcance. Como estudiante, participó en los seminarios del historiador ruso SV Bachrushin, y publicó su primer documento de investigación sobre las prácticas de tenencia de la tierra en la República de Nóvgorod en los siglos XV y XVI. [1] Al mismo tiempo (1921-1922), Kolmogorov derivados y demostrado varios resultados en la teoría de conjuntos y en la teoría de series de Fourier (series trigonométricas). &lt;br /&gt;
&lt;br /&gt;
=== Madurez ===&lt;br /&gt;
&lt;br /&gt;
En 1922 Kolmogorov construyó una serie de Fourier que diverge en casi todas partes, obteniendo el reconocimiento internacional. Alrededor de este tiempo, decidió dedicar su vida a la matemática. En 1925 Kolmogorov se graduó de la Universidad Estatal de Moscú, y comenzó a estudiar bajo la supervisión de Nikolai Luzin. Se hizo amigo de toda la vida con Pavel Alexandrov, que participan de Kolmogorov en 1936 en una persecución política feo de su maestro mutuo, el llamado caso Luzin o asunto Luzin. Kolmogorov (junto con A. Khinchin) se interesó en la teoría de la probabilidad. También en 1925, publicó su famosa obra en la lógica intuicionista - Al principio del tercero excluido. De Kolmogorov en 1929 obtuvo su título de Doctor en Filosofía, Ph.D., de la Universidad Estatal de Moscú. &lt;br /&gt;
&lt;br /&gt;
En 1930, Kolmogorov fue en su primer viaje largo al extranjero, de viaje en Göttingen y Munich, Alemania, y después en París, Francia. Su trabajo pionero sobre los métodos de análisis de la Teoría de la Probabilidad se publicó (en alemán) en 1931. También en 1931, se convirtió en profesor en la Universidad de Moscú. En 1933, Kolmogorov publicó el libro Los fundamentos de la Teoría de la Probabilidad, estableciendo las bases modernas de la teoría axiomática de la probabilidad y establecer su reputación como experto en la vida más importantes del mundo en este campo. En 1935, Kolmogorov se convirtió en el primer presidente de la teoría de probabilidades en la Universidad Estatal de Moscú. En 1939, fue elegido miembro de pleno derecho (académico) de la Academia Rusa de Ciencias. En un documento del 1938, Kolmogorov &amp;quot;establecido los teoremas básicos de alisado y de la predicción de procesos estocásticos estacionarios&amp;quot; - un documento que tendría importantes aplicaciones militares durante la Guerra Fría por venir. [2] &lt;br /&gt;
&lt;br /&gt;
En su estudio de los procesos estocásticos (procesos al azar), especialmente en procesos de Markov, Kolmogorov y el matemático británico Sydney Chapman desarrollada de forma independiente el conjunto de ecuaciones fundamentales en el campo, las ecuaciones de Chapman-Kolmogorov. Kolmogorov (izquierda) trabaja en su charla (Tallin, RSS de Estonia, 1973) Kolmogorov trabaja en su charla (Tallin, RSS de Estonia, 1973) &lt;br /&gt;
&lt;br /&gt;
Más tarde, cambió de Kolmogorov intereses de investigación en la zona de turbulencia, donde sus publicaciones a partir de 1941 tuvo una influencia significativa en el campo. En la mecánica clásica, él es más conocido por el test de Kolmogorov-Arnold-Moser teorema (presentado por primera vez en 1954 en el Congreso Internacional de Matemáticos). En 1957 se resolvió el problema de decimotercera Hilbert (un trabajo conjunto con su estudiante VI Arnold). Fue fundador de la teoría de la complejidad algorítmica, a menudo llamada teoría de la complejidad de Kolmogorov, que comenzó a desarrollar alrededor de este tiempo. &lt;br /&gt;
&lt;br /&gt;
Kolmogorov se casó con Anna Dmitrievna Egorov en 1942. Se aplicó una fuerte rutina de la enseñanza durante toda su vida, no sólo en el nivel universitario, sino también con niños más pequeños, ya que participó activamente en el desarrollo de una pedagogía para los niños superdotados, en la literatura y la música, así como en las matemáticas. En la Universidad Estatal de Moscú, Kolmogorov ocupado diferentes posiciones, incluyendo los jefes de diversos departamentos: probabilidad, estadística, y los procesos de azar, la lógica matemática, y también se desempeñó como decano de la Facultad de la Universidad Estatal de Moscú de Mecánica y Matemáticas. &lt;br /&gt;
&lt;br /&gt;
En 1971, Kolmogorov se unió a una expedición oceanográfica a bordo del buque de investigación Dmitri Mendeleyev. Escribió una serie de artículos para la Gran Enciclopedia Soviética. En sus últimos años dedicó gran parte de su esfuerzo a la relación matemática y filosófica entre la teoría de probabilidades en las zonas abstracta y aplicada. [3] &lt;br /&gt;
&lt;br /&gt;
Kolmogorov murió en Moscú en 1987. Una cita: &amp;quot;Todo matemático cree que está por delante sobre todas las demás. La razón por la que no lo digo en público, es porque son gente inteligente&amp;quot; es que se le atribuyen. &lt;br /&gt;
&lt;br /&gt;
== Bibliografia ==&lt;br /&gt;
&lt;br /&gt;
Una bibliografía de sus obras aparecó en &amp;quot;Publications of A. N. Kolmogorov&amp;quot;. Annals of Probability, 17 (3): 945-964. Juliol de 1989. doi: 10.1214/aop/1176991252. &lt;br /&gt;
&lt;br /&gt;
*Kolmogorov, Andrey (1933) (en alemá). Grundbegriffe der Wahrscheinlichkeitsrechnung. Berlín: Julius Springer.o Traducció: Kolmogorov, Andrey (1956). Els fonaments de la Teoria de la Probabilitat (2 ª ed.). Nova York: Chelsea. ISBN 0828400237. http://www.mathematik.com/Kolmogorov/index.html. &lt;br /&gt;
*1991-93. Obres escollides de A.N. Kolmogorov, 3 vols. Tikhomirov, V. M., ed., Volosov, V. M., trad. Dordrecht: Kluwer Academic Publishers. ISBN 9027727961 &lt;br /&gt;
*1925. &amp;quot;Al principi del tercer exclòs&amp;quot; de Jean van Heijenoort, 1967. A Source Book in Mathematical Logic, 1879-1931. Harvard Univ Press. Prensa: 414-37.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Matemático]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67270</id>
		<title>Algoritmo de Euclides</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67270"/>
		<updated>2010-05-14T21:36:32Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mejorar|faltan las fuentes}} '''Algoritmo de Euclides:''' &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo original de Euclides  ==&lt;br /&gt;
&lt;br /&gt;
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 [[Conmensurable|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''. &lt;br /&gt;
&lt;br /&gt;
No cualquier par de segmentos es conmensurable, como encontraron los pitagóricos cuando establecen que&amp;amp;nbsp; no es un número racional, pero en el caso de dos segmentos conmensurables se desea hallar la mayor medida común posible. &lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;    '''''Para encontrar la máxima medida común de dos números que no sean primos entre sí.&lt;br /&gt;
Euclides VII-2.svg'''''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.&lt;br /&gt;
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.&lt;br /&gt;
Euclides. Elementos VII.2''&amp;lt;/pre&amp;gt; &lt;br /&gt;
En lenguaje moderno, el algoritmo se describe como sigue: &lt;br /&gt;
&lt;br /&gt;
#Dados dos segmentos ''AB'' y ''CD'' (con ''AB&amp;amp;gt;CD''), restamos ''CD'' de ''AB'' tantas veces como sea posible. Si no hay residuo, entonces ''CD'' es la máxima medida común. &lt;br /&gt;
#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. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
El hecho de que los segmentos son conmesurables es clave para asegurar que el proceso termina tarde o temprano &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides tradicional  ==&lt;br /&gt;
&lt;br /&gt;
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''. &lt;br /&gt;
&lt;br /&gt;
Según lo antes mencionado, para calcular el máximo común divisor de 2366 y 273 se puede proseguir de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| 2366 dividido entre 273 es 8 y sobran 182 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2366,273)=\mathrm{mcd}(273,182)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| 273 dividido entre 182 es 1 y sobran 91 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(273,182)=\mathrm{mcd}(182,91)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| 182 dividido entre 91 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(182,91)=\mathrm{mcd}(91,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
#Si ''b=0 ''entonces mcd(a,b) = a y el algoritmo termina &lt;br /&gt;
#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&lt;br /&gt;
&lt;br /&gt;
Asuma que llamamos a = r&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; y b = r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_0&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_1&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_0,r_1)=\mathrm{mcd}(r_1,r_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_2&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_1,r_2)=\mathrm{mcd}(r_2,r_3)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_4&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_2,r_3)=\mathrm{mcd}(r_3,r_4)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_{n-1}&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_n&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_{n-1},r_n)=\mathrm{mcd}(r_n,r_{n+1})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_{n+1}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; (el último residuo que no es cero). &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios P(x) = x&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; + 2x&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; + x y Q(x) = x&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; − 1 el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4-1)=\mathrm{mcd}(x^4-1,2x^3+2x)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4-1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,-x^2-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;-2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,-x^2-1)=\mathrm{mcd}(-x^2-1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es − x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; − 1. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;xmod y&amp;quot; significa &amp;quot;el residuo de dividir ''x'' entre y&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i-1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios &amp;lt;math&amp;gt;P(x)=x^5+2x^3+x&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;Q(x)=x^4–1&amp;lt;/math&amp;gt; el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4–1)=\mathrm{mcd}(x^4–1,2x^3+2x)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4–1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,–x^2–1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;–2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,–x^2–1)=\mathrm{mcd}(–x^2–1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;&amp;lt;math&amp;gt;x\bmod y&amp;lt;/math&amp;gt;&amp;quot; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i–1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides extendido  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo de Euclides extendido permite, además de encontrar un máximo común divisor de dos números enteros &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, expresarlo como la mínima combinación lineal de esos números, es decir, encontrar números enteros &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s+b t&amp;lt;/math&amp;gt;. Esto se generaliza también hacia cualquier dominio euclideano. &lt;br /&gt;
&lt;br /&gt;
=== Fundamentos  ===&lt;br /&gt;
&lt;br /&gt;
Existen varias maneras de explicar el algoritmo de Euclides extendido, una de las más comunes consiste en la siguiente: &lt;br /&gt;
&lt;br /&gt;
#Usar el algoritmo tradicional de Euclides. En cada paso, en lugar de &amp;quot;&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&amp;quot; se escribe la ecuación &amp;lt;math&amp;gt;a=b q+r&amp;lt;/math&amp;gt; (véase [[Algoritmo de la división]]). &lt;br /&gt;
#Se despejan los residuos de cada ecuación. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;2\times 2&amp;lt;/math&amp;gt; se usa la siguiente fórmula (vése [[Producto de matrices]]): {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}e&amp;amp;f\\g&amp;amp;h\end{bmatrix}\times\begin{bmatrix}a&amp;amp;b\\c&amp;amp;d\end{bmatrix}=\begin{bmatrix}e a+f c&amp;amp;e b+f d\\g a+h c&amp;amp;g b+h d\end{bmatrix}&amp;lt;/math&amp;gt;|1}} Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; que ahí se describen. Por cada valor &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; calculado se puede formar la matriz &amp;lt;math&amp;gt;\textstyle Q_i=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}&amp;lt;/math&amp;gt;. Usando la ecuación {{Eqnref|1}} de manera repetida se puede calcular el producto las primeras &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; matrices de este tipo: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_{i–1}\end{bmatrix}\times\cdots\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_1\end{bmatrix}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Resulta ser que los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; tienen la propiedad de que &amp;lt;math&amp;gt;r_i=a s_i+b t_i&amp;lt;/math&amp;gt;, es decir, expresan a &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; como una combinación lineal de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Particularmente, como &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=r_{n+1}&amp;lt;/math&amp;gt; entonces se tiene &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}&amp;lt;/math&amp;gt;, 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.&amp;amp;lt;!––Pero no colocaré la demostración en una enciclopedia––&amp;amp;gt; Es importante calcular &amp;lt;math&amp;gt;Q_i\times\cdots\times Q_3\times Q_2\times Q_1&amp;lt;/math&amp;gt; en ese mismo orden. La matriz &amp;lt;math&amp;gt;Q_1&amp;lt;/math&amp;gt; aparece en el extremo derecho y la matriz &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; en el izquierdo. &lt;br /&gt;
&lt;br /&gt;
Regresando al primer ejemplo, la sucesión de cocientes es &amp;lt;math&amp;gt;q_1=8&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_2=1&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;q_3=2&amp;lt;/math&amp;gt;. Entonces se puede calcular {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}–1&amp;amp;9\\3&amp;amp;–26\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–2\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–1\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–8\end{bmatrix}&amp;lt;/math&amp;gt;}} Utilizando el primer renglón de esta matriz se puede leer que &amp;lt;math&amp;gt;91=2366(–1)+273(9)&amp;lt;/math&amp;gt;, es decir, se ha encontrado la manera de expresar al máximo común divisor de 2366 y 273 como una combinación lineal. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; con la multiplicación de matrices: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix} =&lt;br /&gt;
\begin{bmatrix}s_i&amp;amp;t_i\\s_{i–1}–q_is_i&amp;amp;t_{i–1}–q_it_i\end{bmatrix} = \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times\begin{bmatrix}s_{i–1}&amp;amp;t_{i–1}\\s_i&amp;amp;t_i\end{bmatrix}&amp;lt;/math&amp;gt;}} De esta manera &amp;lt;math&amp;gt;s_{i+1} = s_{i–1}–q_is_i&amp;lt;/math&amp;gt; y además &amp;lt;math&amp;gt;t_{i+1} = t_{i–1}–q_it_i&amp;lt;/math&amp;gt;. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: {{Algoritmo|de Euclides extendido|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, y valores &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=as+bt&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a, r_1\gets b, s_0\gets 1, t_0\gets 0, s_1\gets 0, t_1\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## Divida &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;r_i &amp;lt;/math&amp;gt; para obtener el cociente &amp;lt;math&amp;gt;q_i &amp;lt;/math&amp;gt; y el residuo &amp;lt;math&amp;gt;r_{i+1} &amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;s_{i+1}\gets s_{i–1}–q_is_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;t_{i+1}\gets t_{i–1}–q_it_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; es un máximo común divisor de &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; y se expresa &amp;lt;math&amp;gt;r_{i–1}=as_{i–1}+bt_{i–1} &amp;lt;/math&amp;gt;&lt;br /&gt;
|2}} &lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
=== Simplificar fracciones  ===&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
=== Fracciones continuas  ===&lt;br /&gt;
&lt;br /&gt;
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]]. &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Esto se debe a que si ''a = bq + r ''y r neq 0, entonces&amp;amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para encontrar el máximo común divisor de93164 y 5826 el algoritmo genera la siguiente secuencia de divisiones: &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 397px; height: 123px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Paso&amp;lt;br&amp;gt; &lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Operación &amp;lt;br&amp;gt; &lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Significado&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 1&amp;lt;br&amp;gt; &lt;br /&gt;
| 93164 dividido entre 5826 es 15 y sobran 5774&amp;lt;br&amp;gt; &lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 2&amp;lt;br&amp;gt; &lt;br /&gt;
| 5826 dividido entre 5774 es 1 y sobran 52&amp;lt;br&amp;gt; &lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 3&amp;lt;br&amp;gt; &lt;br /&gt;
| 5774 dividido entre 52 es 111 y sobran 2&amp;lt;br&amp;gt; &lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 4&amp;lt;br&amp;gt; &lt;br /&gt;
| 52 dividido entre 2 es 26 y sobra 0&amp;lt;br&amp;gt; &lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Todas estas ecuaciones las podemos hacer parecidas a la ecuación&amp;amp;nbsp;: &lt;br /&gt;
&lt;br /&gt;
#frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}} &lt;br /&gt;
#frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}} &lt;br /&gt;
#frac{5774}{52}=111+ \frac 1 {\frac{52}{2}} &lt;br /&gt;
#frac{52}{2}=26&lt;br /&gt;
&lt;br /&gt;
Si se substituye la segunda ecuación en la primera, se obtiene &lt;br /&gt;
&lt;br /&gt;
Si se repite este proceso de substitución entonces se obtiene la expresión deseada:&amp;amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma &amp;amp;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]]. ––&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Inversos modulares  ===&lt;br /&gt;
&lt;br /&gt;
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:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Basta con encontrar un valor ''a''&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt; que tenga la característica de que, pues de esta manera al multiplicar la ecuación por ''a''&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt; se tendría la solución deseada: &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Al valor ''a''&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt; 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''&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt; 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 &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Es decir que el valor de ''x'' es 4. &lt;br /&gt;
&lt;br /&gt;
Véase [[Multiplicador modular inverso]] &lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
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:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 418px; height: 225px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Paso&amp;lt;br&amp;gt; &lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Operación&amp;lt;br&amp;gt; &lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Significado&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 1&amp;lt;br&amp;gt; &lt;br /&gt;
| 89 dividido entre 55 es 1 y sobran 34&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(89,55) = mcd(55,34)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 2&amp;lt;br&amp;gt; &lt;br /&gt;
| 55 dividido entre 34 es 1 y sobran 21&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(55,34) = mcd(34,21)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 3&amp;lt;br&amp;gt; &lt;br /&gt;
| 34 dividido entre 21 es 1 y sobran 13&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(34,21) = mcd(21,13)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 4&amp;lt;br&amp;gt; &lt;br /&gt;
| 21 dividido entre 13 es 1 y sobran 8&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(21,13) = mcd(13,8)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 5&amp;lt;br&amp;gt; &lt;br /&gt;
| 13 dividido entre 8 es 1 y sobran 5&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(13,8) = mcd(8,5)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 6&amp;lt;br&amp;gt; &lt;br /&gt;
| 8 dividido entre 5 es 1 y sobran 3&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(8,5) = mcd(5,3)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 7&amp;lt;br&amp;gt; &lt;br /&gt;
| 5 dividido entre 3 es 1 y sobran 2&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(5,3) = mcd(3,2)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 8&amp;lt;br&amp;gt; &lt;br /&gt;
| 3 dividido entre 2 es 1 y sobran 1&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(3,2) = mcd(2,1)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 9&amp;lt;br&amp;gt; &lt;br /&gt;
| 2 dividido entre 1 es 2 y sobra 0&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(2,1) = mcd(1,0)&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
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&amp;amp;gt;m''. &lt;br /&gt;
&lt;br /&gt;
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 . &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Implementación en pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 426px; height: 182px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''Si''' b = 0 '''entonces''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''El resultado es''' a &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''En otro caso''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es''' mcd(b,amod b)&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 432px; height: 89px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b): &lt;br /&gt;
'''&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
'''&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; El resultado es''' a &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 434px; height: 133px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo '''de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp; '''Si''' b = 0 '''entonces''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es '''(a,1,0) &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp; '''En otro caso''':&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es'''&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 430px; height: 48px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Divida ''a ''entre ''b'' para obtener un cociente ''q'' y un residuo''r'' &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es '''(a,s,t) &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 428px; height: 51px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función '''Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Divida ''a'' entre ''b'' para obtener un cociente ''q'' y un residuo ''r'' &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es''' (a,Q&amp;lt;sub&amp;gt;11&amp;lt;/sub&amp;gt;,Q&amp;lt;sub&amp;gt;12&amp;lt;/sub&amp;gt;) &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Acerca de la notación empleada: &lt;br /&gt;
&lt;br /&gt;
*''x'' gest ''y'' significa &amp;quot;asigne a la variable ''a ''el valor actual de ''b''&amp;quot;. En lenguajes como [[Lenguaje C|C]], [[Lenguaje de programación Java|Java]], [[C]], [[Python]] y [[Visual Basic]] esto significa simplemente &amp;lt;code&amp;gt;x = y&amp;lt;/code&amp;gt;. En otros lenguajes como [[Lenguaje de programación Pascal|Pascal]] se traduce en &amp;lt;code&amp;gt;a&amp;amp;nbsp;:= b&amp;lt;/code&amp;gt;, en [[Maxima]] es &amp;lt;code&amp;gt;a&amp;amp;nbsp;: b&amp;lt;/code&amp;gt;, en [[R–project|R]], S y [[Ocaml]] es &amp;lt;code&amp;gt;x &amp;amp;lt;– y&amp;lt;/code&amp;gt;, e inclusive se utiliza la flecha &amp;lt;code&amp;gt;x ← y&amp;lt;/code&amp;gt; como el caso de [[APL]]. &lt;br /&gt;
*(''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: &amp;lt;code&amp;gt;(x,y,z) = (a,b,c)&amp;lt;/code&amp;gt;. En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: &amp;lt;code&amp;gt;aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;&amp;lt;/code&amp;gt;. &lt;br /&gt;
*''a'' div ''b'' significa &amp;quot;el cociente de dividir ''a'' entre ''b''&amp;quot;. 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 &amp;lt;code&amp;gt;a/b&amp;lt;/code&amp;gt;. Otras maneras son &amp;lt;code&amp;gt;a\b&amp;lt;/code&amp;gt; (Visual Basic) , &amp;lt;code&amp;gt;a div b&amp;lt;/code&amp;gt; (Pascal) o bien &amp;lt;code&amp;gt;a//b&amp;lt;/code&amp;gt; (Python 3). &lt;br /&gt;
*''a'' mod ''b'' significa &amp;quot;el residuo de dividir ''a ''entre ''b''&amp;quot;. A esta operación se le conoce simplemente como ''módulo''. En muchos lenguajes de programación se implementa como &amp;lt;code&amp;gt;a&amp;amp;nbsp;% b&amp;lt;/code&amp;gt;, mientras que en otros es &amp;lt;code&amp;gt;a mod b&amp;lt;/code&amp;gt; (Visual Basic o Pascal) o bien &amp;lt;code&amp;gt;a rem b&amp;lt;/code&amp;gt; (Ada).&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*Von Zur Gathen, Joachim; Gerhard, Jürgen (2003). «The Euclidean Algorithm», Modern Computer Algebra. Cambridge&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 0-521-82646-2.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Shoup, Victor (2008). «Euclid´s algorithm», A Computational Introduction to Numbrer Theory and Algebra. Cambridge &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 978-0-521-85154-1.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Lipschutz, Seymour; Lipson, Marc (2009). «Propiedades de los enteros», Matemáticas Discretas. McGraw-Hill. ISBN 978-970-10-7236-3.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Brassard, Gilles; Bratley, Paul (1997). «Análisis de algoritmos», Fundamentos de Algoritmia. Madrid: PRENTICE HALL. ISBN &amp;lt;br&amp;gt;&amp;amp;nbsp;84-89660-00-X.&amp;lt;br&amp;gt; &lt;br /&gt;
*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. &amp;lt;br&amp;gt; &lt;br /&gt;
*Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford (2009). «Number-Theoretic Algorithms», Introduction to Algorithms. The MIT Press. ISBN 978-0-262-53305-8.&amp;lt;br&amp;gt; &lt;br /&gt;
*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&amp;amp;nbsp;968-9161-02-4.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Cárdenas, Humberto; Lluis, Emilio; Raggi, Francisco; Tomás, Francisco (2004).&amp;amp;nbsp;«Divisibilidad», Álgebra Superior. México: Trillas. ISBN 968-24-3783-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Pérez Segui, María Luisa (2006). «Divisibilidad», Teoría de Números. Instituto de Matemáticas, UNAM. ISBN 970-32-1170-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Baldor, Aurelio (2008). «Máximo común divisor», Álgebra. México: Grupo Editorial Patria. ISBN 978-970-817-000-0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67266</id>
		<title>Algoritmo de Euclides</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67266"/>
		<updated>2010-05-14T21:31:07Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mejorar|faltan las fuentes}} '''Algoritmo de Euclides:''' &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo original de Euclides  ==&lt;br /&gt;
&lt;br /&gt;
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 [[Conmensurable|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''. &lt;br /&gt;
&lt;br /&gt;
No cualquier par de segmentos es conmensurable, como encontraron los pitagóricos cuando establecen que&amp;amp;nbsp; no es un número racional, pero en el caso de dos segmentos conmensurables se desea hallar la mayor medida común posible. &lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;    '''''Para encontrar la máxima medida común de dos números que no sean primos entre sí.&lt;br /&gt;
Euclides VII-2.svg'''''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.&lt;br /&gt;
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.&lt;br /&gt;
Euclides. Elementos VII.2''&amp;lt;/pre&amp;gt; &lt;br /&gt;
En lenguaje moderno, el algoritmo se describe como sigue: &lt;br /&gt;
&lt;br /&gt;
#Dados dos segmentos ''AB'' y ''CD'' (con ''AB&amp;amp;gt;CD''), restamos ''CD'' de ''AB'' tantas veces como sea posible. Si no hay residuo, entonces ''CD'' es la máxima medida común. &lt;br /&gt;
#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. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
El hecho de que los segmentos son conmesurables es clave para asegurar que el proceso termina tarde o temprano &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides tradicional  ==&lt;br /&gt;
&lt;br /&gt;
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''. &lt;br /&gt;
&lt;br /&gt;
Según lo antes mencionado, para calcular el máximo común divisor de 2366 y 273 se puede proseguir de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| 2366 dividido entre 273 es 8 y sobran 182 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2366,273)=\mathrm{mcd}(273,182)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| 273 dividido entre 182 es 1 y sobran 91 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(273,182)=\mathrm{mcd}(182,91)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| 182 dividido entre 91 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(182,91)=\mathrm{mcd}(91,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
#Si ''b=0 ''entonces mcd(a,b) = a y el algoritmo termina &lt;br /&gt;
#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&lt;br /&gt;
&lt;br /&gt;
Asuma que llamamos a = r&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; y b = r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_0&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_1&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_0,r_1)=\mathrm{mcd}(r_1,r_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_2&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_1,r_2)=\mathrm{mcd}(r_2,r_3)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_4&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_2,r_3)=\mathrm{mcd}(r_3,r_4)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_{n-1}&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_n&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_{n-1},r_n)=\mathrm{mcd}(r_n,r_{n+1})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_{n+1}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; (el último residuo que no es cero). &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios P(x) = x&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; + 2x&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; + x y Q(x) = x&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; − 1 el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4-1)=\mathrm{mcd}(x^4-1,2x^3+2x)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4-1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,-x^2-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;-2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,-x^2-1)=\mathrm{mcd}(-x^2-1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es − x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; − 1. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;xmod y&amp;quot; significa &amp;quot;el residuo de dividir ''x'' entre y&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i-1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios &amp;lt;math&amp;gt;P(x)=x^5+2x^3+x&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;Q(x)=x^4–1&amp;lt;/math&amp;gt; el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4–1)=\mathrm{mcd}(x^4–1,2x^3+2x)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4–1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,–x^2–1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;–2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,–x^2–1)=\mathrm{mcd}(–x^2–1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;&amp;lt;math&amp;gt;x\bmod y&amp;lt;/math&amp;gt;&amp;quot; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i–1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides extendido  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo de Euclides extendido permite, además de encontrar un máximo común divisor de dos números enteros &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, expresarlo como la mínima combinación lineal de esos números, es decir, encontrar números enteros &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s+b t&amp;lt;/math&amp;gt;. Esto se generaliza también hacia cualquier dominio euclideano. &lt;br /&gt;
&lt;br /&gt;
=== Fundamentos  ===&lt;br /&gt;
&lt;br /&gt;
Existen varias maneras de explicar el algoritmo de Euclides extendido, una de las más comunes consiste en la siguiente: &lt;br /&gt;
&lt;br /&gt;
#Usar el algoritmo tradicional de Euclides. En cada paso, en lugar de &amp;quot;&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&amp;quot; se escribe la ecuación &amp;lt;math&amp;gt;a=b q+r&amp;lt;/math&amp;gt; (véase [[Algoritmo de la división]]). &lt;br /&gt;
#Se despejan los residuos de cada ecuación. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;2\times 2&amp;lt;/math&amp;gt; se usa la siguiente fórmula (vése [[Producto de matrices]]): {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}e&amp;amp;f\\g&amp;amp;h\end{bmatrix}\times\begin{bmatrix}a&amp;amp;b\\c&amp;amp;d\end{bmatrix}=\begin{bmatrix}e a+f c&amp;amp;e b+f d\\g a+h c&amp;amp;g b+h d\end{bmatrix}&amp;lt;/math&amp;gt;|1}} Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; que ahí se describen. Por cada valor &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; calculado se puede formar la matriz &amp;lt;math&amp;gt;\textstyle Q_i=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}&amp;lt;/math&amp;gt;. Usando la ecuación {{Eqnref|1}} de manera repetida se puede calcular el producto las primeras &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; matrices de este tipo: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_{i–1}\end{bmatrix}\times\cdots\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_1\end{bmatrix}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Resulta ser que los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; tienen la propiedad de que &amp;lt;math&amp;gt;r_i=a s_i+b t_i&amp;lt;/math&amp;gt;, es decir, expresan a &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; como una combinación lineal de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Particularmente, como &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=r_{n+1}&amp;lt;/math&amp;gt; entonces se tiene &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}&amp;lt;/math&amp;gt;, 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.&amp;amp;lt;!––Pero no colocaré la demostración en una enciclopedia––&amp;amp;gt; Es importante calcular &amp;lt;math&amp;gt;Q_i\times\cdots\times Q_3\times Q_2\times Q_1&amp;lt;/math&amp;gt; en ese mismo orden. La matriz &amp;lt;math&amp;gt;Q_1&amp;lt;/math&amp;gt; aparece en el extremo derecho y la matriz &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; en el izquierdo. &lt;br /&gt;
&lt;br /&gt;
Regresando al primer ejemplo, la sucesión de cocientes es &amp;lt;math&amp;gt;q_1=8&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_2=1&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;q_3=2&amp;lt;/math&amp;gt;. Entonces se puede calcular {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}–1&amp;amp;9\\3&amp;amp;–26\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–2\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–1\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–8\end{bmatrix}&amp;lt;/math&amp;gt;}} Utilizando el primer renglón de esta matriz se puede leer que &amp;lt;math&amp;gt;91=2366(–1)+273(9)&amp;lt;/math&amp;gt;, es decir, se ha encontrado la manera de expresar al máximo común divisor de 2366 y 273 como una combinación lineal. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; con la multiplicación de matrices: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix} =&lt;br /&gt;
\begin{bmatrix}s_i&amp;amp;t_i\\s_{i–1}–q_is_i&amp;amp;t_{i–1}–q_it_i\end{bmatrix} = \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times\begin{bmatrix}s_{i–1}&amp;amp;t_{i–1}\\s_i&amp;amp;t_i\end{bmatrix}&amp;lt;/math&amp;gt;}} De esta manera &amp;lt;math&amp;gt;s_{i+1} = s_{i–1}–q_is_i&amp;lt;/math&amp;gt; y además &amp;lt;math&amp;gt;t_{i+1} = t_{i–1}–q_it_i&amp;lt;/math&amp;gt;. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: {{Algoritmo|de Euclides extendido|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, y valores &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=as+bt&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a, r_1\gets b, s_0\gets 1, t_0\gets 0, s_1\gets 0, t_1\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## Divida &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;r_i &amp;lt;/math&amp;gt; para obtener el cociente &amp;lt;math&amp;gt;q_i &amp;lt;/math&amp;gt; y el residuo &amp;lt;math&amp;gt;r_{i+1} &amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;s_{i+1}\gets s_{i–1}–q_is_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;t_{i+1}\gets t_{i–1}–q_it_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; es un máximo común divisor de &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; y se expresa &amp;lt;math&amp;gt;r_{i–1}=as_{i–1}+bt_{i–1} &amp;lt;/math&amp;gt;&lt;br /&gt;
|2}} &lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
=== Simplificar fracciones  ===&lt;br /&gt;
&lt;br /&gt;
Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción &amp;lt;math&amp;gt;\textstyle\frac{65}{91}&amp;lt;/math&amp;gt; es equivalente con &amp;lt;math&amp;gt;\textstyle\frac 5 7&amp;lt;/math&amp;gt; (véase [[Número racional]]). De manera más general, &amp;lt;math&amp;gt;\textstyle\frac ab=\frac {ca}{cb}&amp;lt;/math&amp;gt; siempre que &amp;lt;math&amp;gt;c\ne0&amp;lt;/math&amp;gt;. Para reducir una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt;, sólo se necesita dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; entre su máximo común divisor. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si se desea reducir &amp;lt;math&amp;gt;\textstyle\frac{166}{249}&amp;lt;/math&amp;gt;, primero se usa el algoritmo de Euclides para encontrar &amp;lt;math&amp;gt;\mathrm{mcd}(166,249)=83&amp;lt;/math&amp;gt;. Se hacen las divisiones &amp;lt;math&amp;gt;\textstyle 166\div 83 = 2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\textstyle 249\div 83 = 3&amp;lt;/math&amp;gt;. Luego entonces se concluye que &amp;lt;math&amp;gt;\textstyle\frac{166}{249}=\frac 2 3&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Fracciones continuas  ===&lt;br /&gt;
&lt;br /&gt;
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]]. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto se debe a que si ''a = bq + r ''y r neq 0, entonces&amp;amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para encontrar el máximo común divisor de93164 y 5826 el algoritmo genera la siguiente secuencia de divisiones: &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 397px; height: 123px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Paso&amp;lt;br&amp;gt;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Operación &amp;lt;br&amp;gt;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Significado&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 1&amp;lt;br&amp;gt;&lt;br /&gt;
| 93164 dividido entre 5826 es 15 y sobran 5774&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 2&amp;lt;br&amp;gt;&lt;br /&gt;
| 5826 dividido entre 5774 es 1 y sobran 52&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 3&amp;lt;br&amp;gt;&lt;br /&gt;
| 5774 dividido entre 52 es 111 y sobran 2&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 4&amp;lt;br&amp;gt;&lt;br /&gt;
| 52 dividido entre 2 es 26 y sobra 0&amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Todas estas ecuaciones las podemos hacer parecidas a la ecuación : &lt;br /&gt;
&lt;br /&gt;
#frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}} &lt;br /&gt;
#frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}} &lt;br /&gt;
#frac{5774}{52}=111+ \frac 1 {\frac{52}{2}} &lt;br /&gt;
#frac{52}{2}=26&lt;br /&gt;
&lt;br /&gt;
Si se substituye la segunda ecuación en la primera, se obtiene &lt;br /&gt;
&lt;br /&gt;
Si se repite este proceso de substitución entonces se obtiene la expresión deseada:&amp;amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma &amp;amp;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]]. ––&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Inversos modulares  ===&lt;br /&gt;
&lt;br /&gt;
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:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Basta con encontrar un valor ''a''&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt; que tenga la característica de que, pues de esta manera al multiplicar la ecuación por ''a''&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt; se tendría la solución deseada: &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Al valor ''a''&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt; 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''&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt; 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 &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Es decir que el valor de ''x'' es 4. &lt;br /&gt;
&lt;br /&gt;
Véase [[Multiplicador modular inverso]] &lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
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:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 418px; height: 225px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Paso&amp;lt;br&amp;gt; &lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Operación&amp;lt;br&amp;gt; &lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Significado&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 1&amp;lt;br&amp;gt; &lt;br /&gt;
| 89 dividido entre 55 es 1 y sobran 34&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(89,55) = mcd(55,34)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 2&amp;lt;br&amp;gt; &lt;br /&gt;
| 55 dividido entre 34 es 1 y sobran 21&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(55,34) = mcd(34,21)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 3&amp;lt;br&amp;gt; &lt;br /&gt;
| 34 dividido entre 21 es 1 y sobran 13&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(34,21) = mcd(21,13)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 4&amp;lt;br&amp;gt; &lt;br /&gt;
| 21 dividido entre 13 es 1 y sobran 8&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(21,13) = mcd(13,8)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 5&amp;lt;br&amp;gt; &lt;br /&gt;
| 13 dividido entre 8 es 1 y sobran 5&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(13,8) = mcd(8,5)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 6&amp;lt;br&amp;gt; &lt;br /&gt;
| 8 dividido entre 5 es 1 y sobran 3&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(8,5) = mcd(5,3)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 7&amp;lt;br&amp;gt; &lt;br /&gt;
| 5 dividido entre 3 es 1 y sobran 2&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(5,3) = mcd(3,2)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 8&amp;lt;br&amp;gt; &lt;br /&gt;
| 3 dividido entre 2 es 1 y sobran 1&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(3,2) = mcd(2,1)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 9&amp;lt;br&amp;gt; &lt;br /&gt;
| 2 dividido entre 1 es 2 y sobra 0&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(2,1) = mcd(1,0)&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
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&amp;amp;gt;m''. &lt;br /&gt;
&lt;br /&gt;
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 . &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Implementación en pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 426px; height: 182px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''Si''' b = 0 '''entonces''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''El resultado es''' a &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''En otro caso''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es''' mcd(b,amod b)&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 432px; height: 89px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b): &lt;br /&gt;
'''&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
'''&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; El resultado es''' a &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 434px; height: 133px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo '''de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp; '''Si''' b = 0 '''entonces''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es '''(a,1,0) &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp; '''En otro caso''':&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es'''&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 430px; height: 48px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Divida ''a ''entre ''b'' para obtener un cociente ''q'' y un residuo''r'' &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es '''(a,s,t) &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 428px; height: 51px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función '''Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Divida ''a'' entre ''b'' para obtener un cociente ''q'' y un residuo ''r'' &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es''' (a,Q&amp;lt;sub&amp;gt;11&amp;lt;/sub&amp;gt;,Q&amp;lt;sub&amp;gt;12&amp;lt;/sub&amp;gt;) &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Acerca de la notación empleada: &lt;br /&gt;
&lt;br /&gt;
*''x'' gest ''y'' significa &amp;quot;asigne a la variable ''a ''el valor actual de ''b''&amp;quot;. En lenguajes como [[Lenguaje C|C]], [[Lenguaje de programación Java|Java]], [[C]], [[Python]] y [[Visual Basic]] esto significa simplemente &amp;lt;code&amp;gt;x = y&amp;lt;/code&amp;gt;. En otros lenguajes como [[Lenguaje de programación Pascal|Pascal]] se traduce en &amp;lt;code&amp;gt;a&amp;amp;nbsp;:= b&amp;lt;/code&amp;gt;, en [[Maxima]] es &amp;lt;code&amp;gt;a&amp;amp;nbsp;: b&amp;lt;/code&amp;gt;, en [[R–project|R]], S y [[Ocaml]] es &amp;lt;code&amp;gt;x &amp;amp;lt;– y&amp;lt;/code&amp;gt;, e inclusive se utiliza la flecha &amp;lt;code&amp;gt;x ← y&amp;lt;/code&amp;gt; como el caso de [[APL]]. &lt;br /&gt;
*(''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: &amp;lt;code&amp;gt;(x,y,z) = (a,b,c)&amp;lt;/code&amp;gt;. En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: &amp;lt;code&amp;gt;aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;&amp;lt;/code&amp;gt;. &lt;br /&gt;
*''a'' div ''b'' significa &amp;quot;el cociente de dividir ''a'' entre ''b''&amp;quot;. 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 &amp;lt;code&amp;gt;a/b&amp;lt;/code&amp;gt;. Otras maneras son &amp;lt;code&amp;gt;a\b&amp;lt;/code&amp;gt; (Visual Basic) , &amp;lt;code&amp;gt;a div b&amp;lt;/code&amp;gt; (Pascal) o bien &amp;lt;code&amp;gt;a//b&amp;lt;/code&amp;gt; (Python 3). &lt;br /&gt;
*''a'' mod ''b'' significa &amp;quot;el residuo de dividir ''a ''entre ''b''&amp;quot;. A esta operación se le conoce simplemente como ''módulo''. En muchos lenguajes de programación se implementa como &amp;lt;code&amp;gt;a&amp;amp;nbsp;% b&amp;lt;/code&amp;gt;, mientras que en otros es &amp;lt;code&amp;gt;a mod b&amp;lt;/code&amp;gt; (Visual Basic o Pascal) o bien &amp;lt;code&amp;gt;a rem b&amp;lt;/code&amp;gt; (Ada).&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*Von Zur Gathen, Joachim; Gerhard, Jürgen (2003). «The Euclidean Algorithm», Modern Computer Algebra. Cambridge&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 0-521-82646-2.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Shoup, Victor (2008). «Euclid´s algorithm», A Computational Introduction to Numbrer Theory and Algebra. Cambridge &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 978-0-521-85154-1.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Lipschutz, Seymour; Lipson, Marc (2009). «Propiedades de los enteros», Matemáticas Discretas. McGraw-Hill. ISBN 978-970-10-7236-3.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Brassard, Gilles; Bratley, Paul (1997). «Análisis de algoritmos», Fundamentos de Algoritmia. Madrid: PRENTICE HALL. ISBN &amp;lt;br&amp;gt;&amp;amp;nbsp;84-89660-00-X.&amp;lt;br&amp;gt; &lt;br /&gt;
*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. &amp;lt;br&amp;gt; &lt;br /&gt;
*Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford (2009). «Number-Theoretic Algorithms», Introduction to Algorithms. The MIT Press. ISBN 978-0-262-53305-8.&amp;lt;br&amp;gt; &lt;br /&gt;
*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&amp;amp;nbsp;968-9161-02-4.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Cárdenas, Humberto; Lluis, Emilio; Raggi, Francisco; Tomás, Francisco (2004).&amp;amp;nbsp;«Divisibilidad», Álgebra Superior. México: Trillas. ISBN 968-24-3783-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Pérez Segui, María Luisa (2006). «Divisibilidad», Teoría de Números. Instituto de Matemáticas, UNAM. ISBN 970-32-1170-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Baldor, Aurelio (2008). «Máximo común divisor», Álgebra. México: Grupo Editorial Patria. ISBN 978-970-817-000-0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67248</id>
		<title>Algoritmo de Euclides</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67248"/>
		<updated>2010-05-14T21:21:12Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mejorar|faltan las fuentes}} '''Algoritmo de Euclides:''' &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo original de Euclides  ==&lt;br /&gt;
&lt;br /&gt;
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 [[Conmensurable|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''. &lt;br /&gt;
&lt;br /&gt;
No cualquier par de segmentos es conmensurable, como encontraron los pitagóricos cuando establecen que&amp;amp;nbsp; no es un número racional, pero en el caso de dos segmentos conmensurables se desea hallar la mayor medida común posible. &lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;    '''''Para encontrar la máxima medida común de dos números que no sean primos entre sí.&lt;br /&gt;
Euclides VII-2.svg'''''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.&lt;br /&gt;
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.&lt;br /&gt;
Euclides. Elementos VII.2''&amp;lt;/pre&amp;gt; &lt;br /&gt;
En lenguaje moderno, el algoritmo se describe como sigue: &lt;br /&gt;
&lt;br /&gt;
#Dados dos segmentos ''AB'' y ''CD'' (con ''AB&amp;amp;gt;CD''), restamos ''CD'' de ''AB'' tantas veces como sea posible. Si no hay residuo, entonces ''CD'' es la máxima medida común. &lt;br /&gt;
#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. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
El hecho de que los segmentos son conmesurables es clave para asegurar que el proceso termina tarde o temprano &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides tradicional  ==&lt;br /&gt;
&lt;br /&gt;
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''. &lt;br /&gt;
&lt;br /&gt;
Según lo antes mencionado, para calcular el máximo común divisor de 2366 y 273 se puede proseguir de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| 2366 dividido entre 273 es 8 y sobran 182 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2366,273)=\mathrm{mcd}(273,182)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| 273 dividido entre 182 es 1 y sobran 91 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(273,182)=\mathrm{mcd}(182,91)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| 182 dividido entre 91 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(182,91)=\mathrm{mcd}(91,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
#Si ''b=0 ''entonces mcd(a,b) = a y el algoritmo termina &lt;br /&gt;
#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&lt;br /&gt;
&lt;br /&gt;
Asuma que llamamos a = r&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; y b = r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_0&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_1&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_0,r_1)=\mathrm{mcd}(r_1,r_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_2&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_1,r_2)=\mathrm{mcd}(r_2,r_3)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_4&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_2,r_3)=\mathrm{mcd}(r_3,r_4)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_{n-1}&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_n&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_{n-1},r_n)=\mathrm{mcd}(r_n,r_{n+1})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_{n+1}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; (el último residuo que no es cero). &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios P(x) = x&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; + 2x&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; + x y Q(x) = x&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; − 1 el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4-1)=\mathrm{mcd}(x^4-1,2x^3+2x)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4-1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,-x^2-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;-2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,-x^2-1)=\mathrm{mcd}(-x^2-1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es − x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; − 1. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;xmod y&amp;quot; significa &amp;quot;el residuo de dividir ''x'' entre y&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i-1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios &amp;lt;math&amp;gt;P(x)=x^5+2x^3+x&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;Q(x)=x^4–1&amp;lt;/math&amp;gt; el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4–1)=\mathrm{mcd}(x^4–1,2x^3+2x)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4–1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,–x^2–1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;–2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,–x^2–1)=\mathrm{mcd}(–x^2–1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;&amp;lt;math&amp;gt;x\bmod y&amp;lt;/math&amp;gt;&amp;quot; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i–1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides extendido  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo de Euclides extendido permite, además de encontrar un máximo común divisor de dos números enteros &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, expresarlo como la mínima combinación lineal de esos números, es decir, encontrar números enteros &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s+b t&amp;lt;/math&amp;gt;. Esto se generaliza también hacia cualquier dominio euclideano. &lt;br /&gt;
&lt;br /&gt;
=== Fundamentos  ===&lt;br /&gt;
&lt;br /&gt;
Existen varias maneras de explicar el algoritmo de Euclides extendido, una de las más comunes consiste en la siguiente: &lt;br /&gt;
&lt;br /&gt;
#Usar el algoritmo tradicional de Euclides. En cada paso, en lugar de &amp;quot;&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&amp;quot; se escribe la ecuación &amp;lt;math&amp;gt;a=b q+r&amp;lt;/math&amp;gt; (véase [[Algoritmo de la división]]). &lt;br /&gt;
#Se despejan los residuos de cada ecuación. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;2\times 2&amp;lt;/math&amp;gt; se usa la siguiente fórmula (vése [[Producto de matrices]]): {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}e&amp;amp;f\\g&amp;amp;h\end{bmatrix}\times\begin{bmatrix}a&amp;amp;b\\c&amp;amp;d\end{bmatrix}=\begin{bmatrix}e a+f c&amp;amp;e b+f d\\g a+h c&amp;amp;g b+h d\end{bmatrix}&amp;lt;/math&amp;gt;|1}} Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; que ahí se describen. Por cada valor &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; calculado se puede formar la matriz &amp;lt;math&amp;gt;\textstyle Q_i=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}&amp;lt;/math&amp;gt;. Usando la ecuación {{Eqnref|1}} de manera repetida se puede calcular el producto las primeras &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; matrices de este tipo: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_{i–1}\end{bmatrix}\times\cdots\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_1\end{bmatrix}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Resulta ser que los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; tienen la propiedad de que &amp;lt;math&amp;gt;r_i=a s_i+b t_i&amp;lt;/math&amp;gt;, es decir, expresan a &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; como una combinación lineal de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Particularmente, como &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=r_{n+1}&amp;lt;/math&amp;gt; entonces se tiene &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}&amp;lt;/math&amp;gt;, 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.&amp;amp;lt;!––Pero no colocaré la demostración en una enciclopedia––&amp;amp;gt; Es importante calcular &amp;lt;math&amp;gt;Q_i\times\cdots\times Q_3\times Q_2\times Q_1&amp;lt;/math&amp;gt; en ese mismo orden. La matriz &amp;lt;math&amp;gt;Q_1&amp;lt;/math&amp;gt; aparece en el extremo derecho y la matriz &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; en el izquierdo. &lt;br /&gt;
&lt;br /&gt;
Regresando al primer ejemplo, la sucesión de cocientes es &amp;lt;math&amp;gt;q_1=8&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_2=1&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;q_3=2&amp;lt;/math&amp;gt;. Entonces se puede calcular {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}–1&amp;amp;9\\3&amp;amp;–26\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–2\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–1\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–8\end{bmatrix}&amp;lt;/math&amp;gt;}} Utilizando el primer renglón de esta matriz se puede leer que &amp;lt;math&amp;gt;91=2366(–1)+273(9)&amp;lt;/math&amp;gt;, es decir, se ha encontrado la manera de expresar al máximo común divisor de 2366 y 273 como una combinación lineal. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; con la multiplicación de matrices: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix} =&lt;br /&gt;
\begin{bmatrix}s_i&amp;amp;t_i\\s_{i–1}–q_is_i&amp;amp;t_{i–1}–q_it_i\end{bmatrix} = \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times\begin{bmatrix}s_{i–1}&amp;amp;t_{i–1}\\s_i&amp;amp;t_i\end{bmatrix}&amp;lt;/math&amp;gt;}} De esta manera &amp;lt;math&amp;gt;s_{i+1} = s_{i–1}–q_is_i&amp;lt;/math&amp;gt; y además &amp;lt;math&amp;gt;t_{i+1} = t_{i–1}–q_it_i&amp;lt;/math&amp;gt;. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: {{Algoritmo|de Euclides extendido|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, y valores &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=as+bt&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a, r_1\gets b, s_0\gets 1, t_0\gets 0, s_1\gets 0, t_1\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## Divida &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;r_i &amp;lt;/math&amp;gt; para obtener el cociente &amp;lt;math&amp;gt;q_i &amp;lt;/math&amp;gt; y el residuo &amp;lt;math&amp;gt;r_{i+1} &amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;s_{i+1}\gets s_{i–1}–q_is_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;t_{i+1}\gets t_{i–1}–q_it_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; es un máximo común divisor de &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; y se expresa &amp;lt;math&amp;gt;r_{i–1}=as_{i–1}+bt_{i–1} &amp;lt;/math&amp;gt;&lt;br /&gt;
|2}} &lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
=== Simplificar fracciones  ===&lt;br /&gt;
&lt;br /&gt;
Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción &amp;lt;math&amp;gt;\textstyle\frac{65}{91}&amp;lt;/math&amp;gt; es equivalente con &amp;lt;math&amp;gt;\textstyle\frac 5 7&amp;lt;/math&amp;gt; (véase [[Número racional]]). De manera más general, &amp;lt;math&amp;gt;\textstyle\frac ab=\frac {ca}{cb}&amp;lt;/math&amp;gt; siempre que &amp;lt;math&amp;gt;c\ne0&amp;lt;/math&amp;gt;. Para reducir una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt;, sólo se necesita dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; entre su máximo común divisor. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si se desea reducir &amp;lt;math&amp;gt;\textstyle\frac{166}{249}&amp;lt;/math&amp;gt;, primero se usa el algoritmo de Euclides para encontrar &amp;lt;math&amp;gt;\mathrm{mcd}(166,249)=83&amp;lt;/math&amp;gt;. Se hacen las divisiones &amp;lt;math&amp;gt;\textstyle 166\div 83 = 2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\textstyle 249\div 83 = 3&amp;lt;/math&amp;gt;. Luego entonces se concluye que &amp;lt;math&amp;gt;\textstyle\frac{166}{249}=\frac 2 3&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Fracciones continuas  ===&lt;br /&gt;
&lt;br /&gt;
La sucesión de divisiones que se efectúan al seguir algoritmo de Euclides puede ser utilizada para expresar una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt; como [[Fracción continua]]. Esto se debe a que si &amp;lt;math&amp;gt;a = bq + r&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r\neq 0&amp;lt;/math&amp;gt;, entonces {{ecuación|&amp;lt;math&amp;gt;\frac a b = q + \frac 1 {\frac b r}&amp;lt;/math&amp;gt;|3}} &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para encontrar el máximo común divisor de &amp;lt;math&amp;gt;93164&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;5826&amp;lt;/math&amp;gt; el algoritmo genera la siguiente secuencia de divisiones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 93164 dividido entre 5826 es 15 y sobran 5774 &lt;br /&gt;
| &amp;lt;math&amp;gt;93164=5826\times 15+5774&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 5826 dividido entre 5774 es 1 y sobran 52 &lt;br /&gt;
| &amp;lt;math&amp;gt;5826=5774\times 1+52&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 5774 dividido entre 52 es 111 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;5774=52\times 111+2&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 52 dividido entre 2 es 26 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;52=2\times 26+0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Todas estas ecuaciones las podemos hacer parecidas a la ecuación {{eqnref | 3}}: &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5774}{52}=111+ \frac 1 {\frac{52}{2}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{52}{2}=26&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se substituye la segunda ecuación en la primera, se obtiene {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {\frac{5774}{52}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Si se repite este proceso de substitución entonces se obtiene la expresión deseada: {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {111+ \frac 1 {26}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma {{Ecuación|&amp;lt;math&amp;gt;\frac{a}{b}=q_1+ \frac 1 {q_2+ \frac 1 {q_3+ \frac 1 {\ddots q_{n–1}+ \frac 1 {q_n}}}}&amp;lt;/math&amp;gt;}} &amp;amp;lt;!–– Esto va en la sección siguiente: Volviendo al caso &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; enteros, el algoritmo de Euclides permite encontrar los coeficientes enteros &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; de la [[Identidad de Bézout]] &amp;lt;math&amp;gt;au+bv=\mathrm{mcd}(a, b)&amp;lt;/math&amp;gt; de fundamental importancia en la [[Aritmética]]. ––&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Inversos modulares  ===&lt;br /&gt;
&lt;br /&gt;
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:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Basta con encontrar un valor ''a''&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt; que tenga la característica de que, pues de esta manera al multiplicar la ecuación por ''a''&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt; se tendría la solución deseada: &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al valor ''a''&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt; 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''&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt; 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 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es decir que el valor de ''x'' es 4. &lt;br /&gt;
&lt;br /&gt;
Véase [[Multiplicador modular inverso]] &lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
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:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 418px; height: 225px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Paso&amp;lt;br&amp;gt; &lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Operación&amp;lt;br&amp;gt; &lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Significado&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 1&amp;lt;br&amp;gt; &lt;br /&gt;
| 89 dividido entre 55 es 1 y sobran 34&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(89,55) = mcd(55,34)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 2&amp;lt;br&amp;gt; &lt;br /&gt;
| 55 dividido entre 34 es 1 y sobran 21&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(55,34) = mcd(34,21)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 3&amp;lt;br&amp;gt; &lt;br /&gt;
| 34 dividido entre 21 es 1 y sobran 13&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(34,21) = mcd(21,13)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 4&amp;lt;br&amp;gt; &lt;br /&gt;
| 21 dividido entre 13 es 1 y sobran 8&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(21,13) = mcd(13,8)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 5&amp;lt;br&amp;gt; &lt;br /&gt;
| 13 dividido entre 8 es 1 y sobran 5&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(13,8) = mcd(8,5)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 6&amp;lt;br&amp;gt; &lt;br /&gt;
| 8 dividido entre 5 es 1 y sobran 3&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(8,5) = mcd(5,3)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 7&amp;lt;br&amp;gt; &lt;br /&gt;
| 5 dividido entre 3 es 1 y sobran 2&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(5,3) = mcd(3,2)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 8&amp;lt;br&amp;gt; &lt;br /&gt;
| 3 dividido entre 2 es 1 y sobran 1&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(3,2) = mcd(2,1)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 9&amp;lt;br&amp;gt; &lt;br /&gt;
| 2 dividido entre 1 es 2 y sobra 0&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(2,1) = mcd(1,0)&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
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&amp;amp;gt;m''. &lt;br /&gt;
&lt;br /&gt;
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 . &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Implementación en pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 426px; height: 182px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''Si''' b = 0 '''entonces''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''El resultado es''' a &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''En otro caso''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es''' mcd(b,amod b)&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 432px; height: 89px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b): &lt;br /&gt;
'''&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
'''&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; El resultado es''' a &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 434px; height: 133px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo '''de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp; '''Si''' b = 0 '''entonces''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es '''(a,1,0) &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp; '''En otro caso''':&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es'''&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 430px; height: 48px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Divida ''a ''entre ''b'' para obtener un cociente ''q'' y un residuo''r'' &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es '''(a,s,t) &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 428px; height: 51px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función '''Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Divida ''a'' entre ''b'' para obtener un cociente ''q'' y un residuo ''r'' &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es''' (a,Q&amp;lt;sub&amp;gt;11&amp;lt;/sub&amp;gt;,Q&amp;lt;sub&amp;gt;12&amp;lt;/sub&amp;gt;) &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Acerca de la notación empleada: &lt;br /&gt;
&lt;br /&gt;
*''x'' gest ''y'' significa &amp;quot;asigne a la variable ''a ''el valor actual de ''b''&amp;quot;. En lenguajes como [[Lenguaje C|C]], [[Lenguaje de programación Java|Java]], [[C]], [[Python]] y [[Visual Basic]] esto significa simplemente &amp;lt;code&amp;gt;x = y&amp;lt;/code&amp;gt;. En otros lenguajes como [[Lenguaje de programación Pascal|Pascal]] se traduce en &amp;lt;code&amp;gt;a&amp;amp;nbsp;:= b&amp;lt;/code&amp;gt;, en [[Maxima]] es &amp;lt;code&amp;gt;a&amp;amp;nbsp;: b&amp;lt;/code&amp;gt;, en [[R–project|R]], S y [[Ocaml]] es &amp;lt;code&amp;gt;x &amp;amp;lt;– y&amp;lt;/code&amp;gt;, e inclusive se utiliza la flecha &amp;lt;code&amp;gt;x ← y&amp;lt;/code&amp;gt; como el caso de [[APL]]. &lt;br /&gt;
*(''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: &amp;lt;code&amp;gt;(x,y,z) = (a,b,c)&amp;lt;/code&amp;gt;. En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: &amp;lt;code&amp;gt;aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;&amp;lt;/code&amp;gt;. &lt;br /&gt;
*''a'' div ''b'' significa &amp;quot;el cociente de dividir ''a'' entre ''b''&amp;quot;. 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 &amp;lt;code&amp;gt;a/b&amp;lt;/code&amp;gt;. Otras maneras son &amp;lt;code&amp;gt;a\b&amp;lt;/code&amp;gt; (Visual Basic) , &amp;lt;code&amp;gt;a div b&amp;lt;/code&amp;gt; (Pascal) o bien &amp;lt;code&amp;gt;a//b&amp;lt;/code&amp;gt; (Python 3). &lt;br /&gt;
*''a'' mod ''b'' significa &amp;quot;el residuo de dividir ''a ''entre ''b''&amp;quot;. A esta operación se le conoce simplemente como ''módulo''. En muchos lenguajes de programación se implementa como &amp;lt;code&amp;gt;a&amp;amp;nbsp;% b&amp;lt;/code&amp;gt;, mientras que en otros es &amp;lt;code&amp;gt;a mod b&amp;lt;/code&amp;gt; (Visual Basic o Pascal) o bien &amp;lt;code&amp;gt;a rem b&amp;lt;/code&amp;gt; (Ada).&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*Von Zur Gathen, Joachim; Gerhard, Jürgen (2003). «The Euclidean Algorithm», Modern Computer Algebra. Cambridge&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 0-521-82646-2.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Shoup, Victor (2008). «Euclid´s algorithm», A Computational Introduction to Numbrer Theory and Algebra. Cambridge &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 978-0-521-85154-1.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Lipschutz, Seymour; Lipson, Marc (2009). «Propiedades de los enteros», Matemáticas Discretas. McGraw-Hill. ISBN 978-970-10-7236-3.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Brassard, Gilles; Bratley, Paul (1997). «Análisis de algoritmos», Fundamentos de Algoritmia. Madrid: PRENTICE HALL. ISBN &amp;lt;br&amp;gt;&amp;amp;nbsp;84-89660-00-X.&amp;lt;br&amp;gt; &lt;br /&gt;
*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. &amp;lt;br&amp;gt; &lt;br /&gt;
*Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford (2009). «Number-Theoretic Algorithms», Introduction to Algorithms. The MIT Press. ISBN 978-0-262-53305-8.&amp;lt;br&amp;gt; &lt;br /&gt;
*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&amp;amp;nbsp;968-9161-02-4.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Cárdenas, Humberto; Lluis, Emilio; Raggi, Francisco; Tomás, Francisco (2004).&amp;amp;nbsp;«Divisibilidad», Álgebra Superior. México: Trillas. ISBN 968-24-3783-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Pérez Segui, María Luisa (2006). «Divisibilidad», Teoría de Números. Instituto de Matemáticas, UNAM. ISBN 970-32-1170-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Baldor, Aurelio (2008). «Máximo común divisor», Álgebra. México: Grupo Editorial Patria. ISBN 978-970-817-000-0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67221</id>
		<title>Algoritmo de Euclides</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67221"/>
		<updated>2010-05-14T21:08:05Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mejorar|faltan las fuentes}} '''Algoritmo de Euclides:''' &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo original de Euclides  ==&lt;br /&gt;
&lt;br /&gt;
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 [[Conmensurable|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''. &lt;br /&gt;
&lt;br /&gt;
No cualquier par de segmentos es conmensurable, como encontraron los pitagóricos cuando establecen que&amp;amp;nbsp; no es un número racional, pero en el caso de dos segmentos conmensurables se desea hallar la mayor medida común posible. &lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;    '''''Para encontrar la máxima medida común de dos números que no sean primos entre sí.&lt;br /&gt;
Euclides VII-2.svg'''''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.&lt;br /&gt;
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.&lt;br /&gt;
Euclides. Elementos VII.2''&amp;lt;/pre&amp;gt; &lt;br /&gt;
En lenguaje moderno, el algoritmo se describe como sigue: &lt;br /&gt;
&lt;br /&gt;
#Dados dos segmentos ''AB'' y ''CD'' (con ''AB&amp;amp;gt;CD''), restamos ''CD'' de ''AB'' tantas veces como sea posible. Si no hay residuo, entonces ''CD'' es la máxima medida común. &lt;br /&gt;
#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. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
El hecho de que los segmentos son conmesurables es clave para asegurar que el proceso termina tarde o temprano &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides tradicional  ==&lt;br /&gt;
&lt;br /&gt;
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''. &lt;br /&gt;
&lt;br /&gt;
Según lo antes mencionado, para calcular el máximo común divisor de 2366 y 273 se puede proseguir de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| 2366 dividido entre 273 es 8 y sobran 182 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2366,273)=\mathrm{mcd}(273,182)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| 273 dividido entre 182 es 1 y sobran 91 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(273,182)=\mathrm{mcd}(182,91)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| 182 dividido entre 91 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(182,91)=\mathrm{mcd}(91,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
#Si ''b=0 ''entonces mcd(a,b) = a y el algoritmo termina &lt;br /&gt;
#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&lt;br /&gt;
&lt;br /&gt;
Asuma que llamamos a = r&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; y b = r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_0&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_1&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_0,r_1)=\mathrm{mcd}(r_1,r_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_2&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_1,r_2)=\mathrm{mcd}(r_2,r_3)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_4&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_2,r_3)=\mathrm{mcd}(r_3,r_4)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_{n-1}&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_n&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_{n-1},r_n)=\mathrm{mcd}(r_n,r_{n+1})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_{n+1}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; (el último residuo que no es cero). &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios P(x) = x&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; + 2x&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; + x y Q(x) = x&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; − 1 el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4-1)=\mathrm{mcd}(x^4-1,2x^3+2x)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4-1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,-x^2-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;-2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,-x^2-1)=\mathrm{mcd}(-x^2-1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es − x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; − 1. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;xmod y&amp;quot; significa &amp;quot;el residuo de dividir ''x'' entre y&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i-1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios &amp;lt;math&amp;gt;P(x)=x^5+2x^3+x&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;Q(x)=x^4–1&amp;lt;/math&amp;gt; el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4–1)=\mathrm{mcd}(x^4–1,2x^3+2x)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4–1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,–x^2–1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;–2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,–x^2–1)=\mathrm{mcd}(–x^2–1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;&amp;lt;math&amp;gt;x\bmod y&amp;lt;/math&amp;gt;&amp;quot; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i–1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides extendido  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo de Euclides extendido permite, además de encontrar un máximo común divisor de dos números enteros &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, expresarlo como la mínima combinación lineal de esos números, es decir, encontrar números enteros &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s+b t&amp;lt;/math&amp;gt;. Esto se generaliza también hacia cualquier dominio euclideano. &lt;br /&gt;
&lt;br /&gt;
=== Fundamentos  ===&lt;br /&gt;
&lt;br /&gt;
Existen varias maneras de explicar el algoritmo de Euclides extendido, una de las más comunes consiste en la siguiente: &lt;br /&gt;
&lt;br /&gt;
#Usar el algoritmo tradicional de Euclides. En cada paso, en lugar de &amp;quot;&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&amp;quot; se escribe la ecuación &amp;lt;math&amp;gt;a=b q+r&amp;lt;/math&amp;gt; (véase [[Algoritmo de la división]]). &lt;br /&gt;
#Se despejan los residuos de cada ecuación. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;2\times 2&amp;lt;/math&amp;gt; se usa la siguiente fórmula (vése [[Producto de matrices]]): {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}e&amp;amp;f\\g&amp;amp;h\end{bmatrix}\times\begin{bmatrix}a&amp;amp;b\\c&amp;amp;d\end{bmatrix}=\begin{bmatrix}e a+f c&amp;amp;e b+f d\\g a+h c&amp;amp;g b+h d\end{bmatrix}&amp;lt;/math&amp;gt;|1}} Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; que ahí se describen. Por cada valor &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; calculado se puede formar la matriz &amp;lt;math&amp;gt;\textstyle Q_i=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}&amp;lt;/math&amp;gt;. Usando la ecuación {{Eqnref|1}} de manera repetida se puede calcular el producto las primeras &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; matrices de este tipo: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_{i–1}\end{bmatrix}\times\cdots\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_1\end{bmatrix}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Resulta ser que los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; tienen la propiedad de que &amp;lt;math&amp;gt;r_i=a s_i+b t_i&amp;lt;/math&amp;gt;, es decir, expresan a &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; como una combinación lineal de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Particularmente, como &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=r_{n+1}&amp;lt;/math&amp;gt; entonces se tiene &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}&amp;lt;/math&amp;gt;, 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.&amp;amp;lt;!––Pero no colocaré la demostración en una enciclopedia––&amp;amp;gt; Es importante calcular &amp;lt;math&amp;gt;Q_i\times\cdots\times Q_3\times Q_2\times Q_1&amp;lt;/math&amp;gt; en ese mismo orden. La matriz &amp;lt;math&amp;gt;Q_1&amp;lt;/math&amp;gt; aparece en el extremo derecho y la matriz &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; en el izquierdo. &lt;br /&gt;
&lt;br /&gt;
Regresando al primer ejemplo, la sucesión de cocientes es &amp;lt;math&amp;gt;q_1=8&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_2=1&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;q_3=2&amp;lt;/math&amp;gt;. Entonces se puede calcular {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}–1&amp;amp;9\\3&amp;amp;–26\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–2\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–1\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–8\end{bmatrix}&amp;lt;/math&amp;gt;}} Utilizando el primer renglón de esta matriz se puede leer que &amp;lt;math&amp;gt;91=2366(–1)+273(9)&amp;lt;/math&amp;gt;, es decir, se ha encontrado la manera de expresar al máximo común divisor de 2366 y 273 como una combinación lineal. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; con la multiplicación de matrices: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix} =&lt;br /&gt;
\begin{bmatrix}s_i&amp;amp;t_i\\s_{i–1}–q_is_i&amp;amp;t_{i–1}–q_it_i\end{bmatrix} = \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times\begin{bmatrix}s_{i–1}&amp;amp;t_{i–1}\\s_i&amp;amp;t_i\end{bmatrix}&amp;lt;/math&amp;gt;}} De esta manera &amp;lt;math&amp;gt;s_{i+1} = s_{i–1}–q_is_i&amp;lt;/math&amp;gt; y además &amp;lt;math&amp;gt;t_{i+1} = t_{i–1}–q_it_i&amp;lt;/math&amp;gt;. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: {{Algoritmo|de Euclides extendido|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, y valores &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=as+bt&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a, r_1\gets b, s_0\gets 1, t_0\gets 0, s_1\gets 0, t_1\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## Divida &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;r_i &amp;lt;/math&amp;gt; para obtener el cociente &amp;lt;math&amp;gt;q_i &amp;lt;/math&amp;gt; y el residuo &amp;lt;math&amp;gt;r_{i+1} &amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;s_{i+1}\gets s_{i–1}–q_is_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;t_{i+1}\gets t_{i–1}–q_it_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; es un máximo común divisor de &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; y se expresa &amp;lt;math&amp;gt;r_{i–1}=as_{i–1}+bt_{i–1} &amp;lt;/math&amp;gt;&lt;br /&gt;
|2}} &lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
=== Simplificar fracciones  ===&lt;br /&gt;
&lt;br /&gt;
Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción &amp;lt;math&amp;gt;\textstyle\frac{65}{91}&amp;lt;/math&amp;gt; es equivalente con &amp;lt;math&amp;gt;\textstyle\frac 5 7&amp;lt;/math&amp;gt; (véase [[Número racional]]). De manera más general, &amp;lt;math&amp;gt;\textstyle\frac ab=\frac {ca}{cb}&amp;lt;/math&amp;gt; siempre que &amp;lt;math&amp;gt;c\ne0&amp;lt;/math&amp;gt;. Para reducir una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt;, sólo se necesita dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; entre su máximo común divisor. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si se desea reducir &amp;lt;math&amp;gt;\textstyle\frac{166}{249}&amp;lt;/math&amp;gt;, primero se usa el algoritmo de Euclides para encontrar &amp;lt;math&amp;gt;\mathrm{mcd}(166,249)=83&amp;lt;/math&amp;gt;. Se hacen las divisiones &amp;lt;math&amp;gt;\textstyle 166\div 83 = 2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\textstyle 249\div 83 = 3&amp;lt;/math&amp;gt;. Luego entonces se concluye que &amp;lt;math&amp;gt;\textstyle\frac{166}{249}=\frac 2 3&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Fracciones continuas  ===&lt;br /&gt;
&lt;br /&gt;
La sucesión de divisiones que se efectúan al seguir algoritmo de Euclides puede ser utilizada para expresar una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt; como [[Fracción continua]]. Esto se debe a que si &amp;lt;math&amp;gt;a = bq + r&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r\neq 0&amp;lt;/math&amp;gt;, entonces {{ecuación|&amp;lt;math&amp;gt;\frac a b = q + \frac 1 {\frac b r}&amp;lt;/math&amp;gt;|3}} &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para encontrar el máximo común divisor de &amp;lt;math&amp;gt;93164&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;5826&amp;lt;/math&amp;gt; el algoritmo genera la siguiente secuencia de divisiones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 93164 dividido entre 5826 es 15 y sobran 5774 &lt;br /&gt;
| &amp;lt;math&amp;gt;93164=5826\times 15+5774&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 5826 dividido entre 5774 es 1 y sobran 52 &lt;br /&gt;
| &amp;lt;math&amp;gt;5826=5774\times 1+52&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 5774 dividido entre 52 es 111 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;5774=52\times 111+2&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 52 dividido entre 2 es 26 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;52=2\times 26+0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Todas estas ecuaciones las podemos hacer parecidas a la ecuación {{eqnref | 3}}: &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5774}{52}=111+ \frac 1 {\frac{52}{2}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{52}{2}=26&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se substituye la segunda ecuación en la primera, se obtiene {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {\frac{5774}{52}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Si se repite este proceso de substitución entonces se obtiene la expresión deseada: {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {111+ \frac 1 {26}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma {{Ecuación|&amp;lt;math&amp;gt;\frac{a}{b}=q_1+ \frac 1 {q_2+ \frac 1 {q_3+ \frac 1 {\ddots q_{n–1}+ \frac 1 {q_n}}}}&amp;lt;/math&amp;gt;}} &amp;amp;lt;!–– Esto va en la sección siguiente: Volviendo al caso &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; enteros, el algoritmo de Euclides permite encontrar los coeficientes enteros &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; de la [[Identidad de Bézout]] &amp;lt;math&amp;gt;au+bv=\mathrm{mcd}(a, b)&amp;lt;/math&amp;gt; de fundamental importancia en la [[Aritmética]]. ––&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Inversos modulares  ===&lt;br /&gt;
&lt;br /&gt;
Decimos que dos números enteros son ''congruentes módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;'' (aunque también se puede generalizar para cualquier otro dominio euclídeo) si al dividirlos entre &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; 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 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; es congruente con &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; se escribe &amp;lt;math&amp;gt;a\equiv b\pmod m&amp;lt;/math&amp;gt;, en el ejemplo anterior se tiene &amp;lt;math&amp;gt;7\equiv 12\pmod 5&amp;lt;/math&amp;gt;. Supóngase que se conocen los valores de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, pero que se desconoce el valor &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; de la siguiente ecuación: {{Ecuacion |&amp;lt;math&amp;gt;a x\equiv b\pmod m&amp;lt;/math&amp;gt;|2}} Basta con encontrar un valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; que tenga la característica de que &amp;lt;math&amp;gt;a^{–1} a\equiv 1\pmod m&amp;lt;/math&amp;gt;, pues de esta manera al multiplicar la ecuación {{eqnref|2}} por &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se tendría la solución deseada: {{Ecuacion | &amp;lt;math&amp;gt;x\equiv a^{–1} b\pmod m&amp;lt;/math&amp;gt;}} Al valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se le llama ''inverso modular'' de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Desafortunadamente este valor no siempre existe. Por ejemplo, con &amp;lt;math&amp;gt;a=4&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m=6&amp;lt;/math&amp;gt; no existe ningún número entero entero &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;a^{–1} 4\equiv 1\pmod 6&amp;lt;/math&amp;gt;. De hecho este valor existe si y sólo si &amp;lt;math&amp;gt;\mathrm{mcd}(a,m)=1&amp;lt;/math&amp;gt;. Más aún, si al usar el algoritmo de Euclides extendido (ahora con &amp;lt;math&amp;gt;b=m&amp;lt;/math&amp;gt;) se obtiene &amp;lt;math&amp;gt;1=as+mt&amp;lt;/math&amp;gt;, entonces el valor &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; es el inverso modular de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. &amp;amp;lt;!––LA DEMOSTRACIÓN NO ES BUENO COLOCARLA EN LA ENCICLOPEDIA––&amp;amp;gt; Por ejemplo, se desea resolver la ecuación {{Ecuacion |&amp;lt;math&amp;gt;5 x\equiv 2\pmod 9&amp;lt;/math&amp;gt;}} Entonces con el algoritmo de Euclides extendido se calcula que &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1=5(2)+9(–1)&amp;lt;/math&amp;gt;. Como &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1&amp;lt;/math&amp;gt; entonces 5 tiene un inverso modular. Más aún, como &amp;lt;math&amp;gt;1=5(2)+9(–1)&amp;lt;/math&amp;gt;, entonces ese inverso es 2. Entonces {{Ecuacion |&amp;lt;math&amp;gt;x\equiv 2(2)\pmod 9&amp;lt;/math&amp;gt;}} Es decir que el valor de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Véase [[Multiplicador modular inverso]] &lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
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:&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 418px; height: 225px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Paso&amp;lt;br&amp;gt;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Operación&amp;lt;br&amp;gt;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; | Significado&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 1&amp;lt;br&amp;gt;&lt;br /&gt;
| 89 dividido entre 55 es 1 y sobran 34&amp;lt;br&amp;gt;&lt;br /&gt;
| mcd(89,55) = mcd(55,34)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 2&amp;lt;br&amp;gt;&lt;br /&gt;
| 55 dividido entre 34 es 1 y sobran 21&amp;lt;br&amp;gt;&lt;br /&gt;
| mcd(55,34) = mcd(34,21)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 3&amp;lt;br&amp;gt;&lt;br /&gt;
| 34 dividido entre 21 es 1 y sobran 13&amp;lt;br&amp;gt;&lt;br /&gt;
| mcd(34,21) = mcd(21,13)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 4&amp;lt;br&amp;gt;&lt;br /&gt;
| 21 dividido entre 13 es 1 y sobran 8&amp;lt;br&amp;gt;&lt;br /&gt;
| mcd(21,13) = mcd(13,8)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 5&amp;lt;br&amp;gt;&lt;br /&gt;
| 13 dividido entre 8 es 1 y sobran 5&amp;lt;br&amp;gt;&lt;br /&gt;
| mcd(13,8) = mcd(8,5)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 6&amp;lt;br&amp;gt;&lt;br /&gt;
| 8 dividido entre 5 es 1 y sobran 3&amp;lt;br&amp;gt;&lt;br /&gt;
| mcd(8,5) = mcd(5,3)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 7&amp;lt;br&amp;gt;&lt;br /&gt;
| 5 dividido entre 3 es 1 y sobran 2&amp;lt;br&amp;gt;&lt;br /&gt;
| mcd(5,3) = mcd(3,2)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 8&amp;lt;br&amp;gt;&lt;br /&gt;
| 3 dividido entre 2 es 1 y sobran 1&amp;lt;br&amp;gt;&lt;br /&gt;
| mcd(3,2) = mcd(2,1)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot; | 9&amp;lt;br&amp;gt;&lt;br /&gt;
| 2 dividido entre 1 es 2 y sobra 0&amp;lt;br&amp;gt;&lt;br /&gt;
| mcd(2,1) = mcd(1,0)&amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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&amp;amp;gt;m''. &lt;br /&gt;
&lt;br /&gt;
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 . &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Implementación en pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 426px; height: 182px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''Si''' b = 0 '''entonces''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''El resultado es''' a &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''En otro caso''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es''' mcd(b,amod b)&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 432px; height: 89px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b): &lt;br /&gt;
'''&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
'''&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; El resultado es''' a &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 434px; height: 133px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo '''de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp; '''Si''' b = 0 '''entonces''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es '''(a,1,0) &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp; '''En otro caso''':&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es'''&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 430px; height: 48px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Divida ''a ''entre ''b'' para obtener un cociente ''q'' y un residuo''r'' &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es '''(a,s,t) &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 428px; height: 51px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función '''Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Divida ''a'' entre ''b'' para obtener un cociente ''q'' y un residuo ''r'' &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es''' (a,Q&amp;lt;sub&amp;gt;11&amp;lt;/sub&amp;gt;,Q&amp;lt;sub&amp;gt;12&amp;lt;/sub&amp;gt;) &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Acerca de la notación empleada: &lt;br /&gt;
&lt;br /&gt;
*''x'' gest ''y'' significa &amp;quot;asigne a la variable ''a ''el valor actual de ''b''&amp;quot;. En lenguajes como [[Lenguaje C|C]], [[Lenguaje de programación Java|Java]], [[C]], [[Python]] y [[Visual Basic]] esto significa simplemente &amp;lt;code&amp;gt;x = y&amp;lt;/code&amp;gt;. En otros lenguajes como [[Lenguaje de programación Pascal|Pascal]] se traduce en &amp;lt;code&amp;gt;a&amp;amp;nbsp;:= b&amp;lt;/code&amp;gt;, en [[Maxima]] es &amp;lt;code&amp;gt;a&amp;amp;nbsp;: b&amp;lt;/code&amp;gt;, en [[R–project|R]], S y [[Ocaml]] es &amp;lt;code&amp;gt;x &amp;amp;lt;– y&amp;lt;/code&amp;gt;, e inclusive se utiliza la flecha &amp;lt;code&amp;gt;x ← y&amp;lt;/code&amp;gt; como el caso de [[APL]]. &lt;br /&gt;
*(''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: &amp;lt;code&amp;gt;(x,y,z) = (a,b,c)&amp;lt;/code&amp;gt;. En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: &amp;lt;code&amp;gt;aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;&amp;lt;/code&amp;gt;. &lt;br /&gt;
*''a'' div ''b'' significa &amp;quot;el cociente de dividir ''a'' entre ''b''&amp;quot;. 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 &amp;lt;code&amp;gt;a/b&amp;lt;/code&amp;gt;. Otras maneras son &amp;lt;code&amp;gt;a\b&amp;lt;/code&amp;gt; (Visual Basic) , &amp;lt;code&amp;gt;a div b&amp;lt;/code&amp;gt; (Pascal) o bien &amp;lt;code&amp;gt;a//b&amp;lt;/code&amp;gt; (Python 3). &lt;br /&gt;
*''a'' mod ''b'' significa &amp;quot;el residuo de dividir ''a ''entre ''b''&amp;quot;. A esta operación se le conoce simplemente como ''módulo''. En muchos lenguajes de programación se implementa como &amp;lt;code&amp;gt;a&amp;amp;nbsp;% b&amp;lt;/code&amp;gt;, mientras que en otros es &amp;lt;code&amp;gt;a mod b&amp;lt;/code&amp;gt; (Visual Basic o Pascal) o bien &amp;lt;code&amp;gt;a rem b&amp;lt;/code&amp;gt; (Ada).&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*Von Zur Gathen, Joachim; Gerhard, Jürgen (2003). «The Euclidean Algorithm», Modern Computer Algebra. Cambridge&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 0-521-82646-2.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Shoup, Victor (2008). «Euclid´s algorithm», A Computational Introduction to Numbrer Theory and Algebra. Cambridge &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 978-0-521-85154-1.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Lipschutz, Seymour; Lipson, Marc (2009). «Propiedades de los enteros», Matemáticas Discretas. McGraw-Hill. ISBN 978-970-10-7236-3.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Brassard, Gilles; Bratley, Paul (1997). «Análisis de algoritmos», Fundamentos de Algoritmia. Madrid: PRENTICE HALL. ISBN &amp;lt;br&amp;gt;&amp;amp;nbsp;84-89660-00-X.&amp;lt;br&amp;gt; &lt;br /&gt;
*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. &amp;lt;br&amp;gt; &lt;br /&gt;
*Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford (2009). «Number-Theoretic Algorithms», Introduction to Algorithms. The MIT Press. ISBN 978-0-262-53305-8.&amp;lt;br&amp;gt; &lt;br /&gt;
*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&amp;amp;nbsp;968-9161-02-4.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Cárdenas, Humberto; Lluis, Emilio; Raggi, Francisco; Tomás, Francisco (2004).&amp;amp;nbsp;«Divisibilidad», Álgebra Superior. México: Trillas. ISBN 968-24-3783-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Pérez Segui, María Luisa (2006). «Divisibilidad», Teoría de Números. Instituto de Matemáticas, UNAM. ISBN 970-32-1170-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Baldor, Aurelio (2008). «Máximo común divisor», Álgebra. México: Grupo Editorial Patria. ISBN 978-970-817-000-0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67192</id>
		<title>Algoritmo de Euclides</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67192"/>
		<updated>2010-05-14T20:52:06Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mejorar|faltan las fuentes}} '''Algoritmo de Euclides:''' &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo original de Euclides  ==&lt;br /&gt;
&lt;br /&gt;
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 [[Conmensurable|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''. &lt;br /&gt;
&lt;br /&gt;
No cualquier par de segmentos es conmensurable, como encontraron los pitagóricos cuando establecen que&amp;amp;nbsp; no es un número racional, pero en el caso de dos segmentos conmensurables se desea hallar la mayor medida común posible. &lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;    '''''Para encontrar la máxima medida común de dos números que no sean primos entre sí.&lt;br /&gt;
Euclides VII-2.svg'''''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.&lt;br /&gt;
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.&lt;br /&gt;
Euclides. Elementos VII.2''&amp;lt;/pre&amp;gt; &lt;br /&gt;
En lenguaje moderno, el algoritmo se describe como sigue: &lt;br /&gt;
&lt;br /&gt;
#Dados dos segmentos ''AB'' y ''CD'' (con ''AB&amp;amp;gt;CD''), restamos ''CD'' de ''AB'' tantas veces como sea posible. Si no hay residuo, entonces ''CD'' es la máxima medida común. &lt;br /&gt;
#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. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
El hecho de que los segmentos son conmesurables es clave para asegurar que el proceso termina tarde o temprano &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides tradicional  ==&lt;br /&gt;
&lt;br /&gt;
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''. &lt;br /&gt;
&lt;br /&gt;
Según lo antes mencionado, para calcular el máximo común divisor de 2366 y 273 se puede proseguir de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| 2366 dividido entre 273 es 8 y sobran 182 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2366,273)=\mathrm{mcd}(273,182)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| 273 dividido entre 182 es 1 y sobran 91 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(273,182)=\mathrm{mcd}(182,91)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| 182 dividido entre 91 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(182,91)=\mathrm{mcd}(91,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
#Si ''b=0 ''entonces mcd(a,b) = a y el algoritmo termina &lt;br /&gt;
#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&lt;br /&gt;
&lt;br /&gt;
Asuma que llamamos a = r&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; y b = r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_0&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_1&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_0,r_1)=\mathrm{mcd}(r_1,r_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_2&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_1,r_2)=\mathrm{mcd}(r_2,r_3)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_4&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_2,r_3)=\mathrm{mcd}(r_3,r_4)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_{n-1}&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_n&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_{n-1},r_n)=\mathrm{mcd}(r_n,r_{n+1})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_{n+1}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; (el último residuo que no es cero). &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios P(x) = x&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; + 2x&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; + x y Q(x) = x&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; − 1 el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4-1)=\mathrm{mcd}(x^4-1,2x^3+2x)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4-1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,-x^2-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;-2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,-x^2-1)=\mathrm{mcd}(-x^2-1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es − x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; − 1. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;xmod y&amp;quot; significa &amp;quot;el residuo de dividir ''x'' entre y&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i-1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios &amp;lt;math&amp;gt;P(x)=x^5+2x^3+x&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;Q(x)=x^4–1&amp;lt;/math&amp;gt; el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4–1)=\mathrm{mcd}(x^4–1,2x^3+2x)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4–1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,–x^2–1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;–2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,–x^2–1)=\mathrm{mcd}(–x^2–1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;&amp;lt;math&amp;gt;x\bmod y&amp;lt;/math&amp;gt;&amp;quot; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i–1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides extendido  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo de Euclides extendido permite, además de encontrar un máximo común divisor de dos números enteros &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, expresarlo como la mínima combinación lineal de esos números, es decir, encontrar números enteros &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s+b t&amp;lt;/math&amp;gt;. Esto se generaliza también hacia cualquier dominio euclideano. &lt;br /&gt;
&lt;br /&gt;
=== Fundamentos  ===&lt;br /&gt;
&lt;br /&gt;
Existen varias maneras de explicar el algoritmo de Euclides extendido, una de las más comunes consiste en la siguiente: &lt;br /&gt;
&lt;br /&gt;
#Usar el algoritmo tradicional de Euclides. En cada paso, en lugar de &amp;quot;&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&amp;quot; se escribe la ecuación &amp;lt;math&amp;gt;a=b q+r&amp;lt;/math&amp;gt; (véase [[Algoritmo de la división]]). &lt;br /&gt;
#Se despejan los residuos de cada ecuación. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;2\times 2&amp;lt;/math&amp;gt; se usa la siguiente fórmula (vése [[Producto de matrices]]): {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}e&amp;amp;f\\g&amp;amp;h\end{bmatrix}\times\begin{bmatrix}a&amp;amp;b\\c&amp;amp;d\end{bmatrix}=\begin{bmatrix}e a+f c&amp;amp;e b+f d\\g a+h c&amp;amp;g b+h d\end{bmatrix}&amp;lt;/math&amp;gt;|1}} Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; que ahí se describen. Por cada valor &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; calculado se puede formar la matriz &amp;lt;math&amp;gt;\textstyle Q_i=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}&amp;lt;/math&amp;gt;. Usando la ecuación {{Eqnref|1}} de manera repetida se puede calcular el producto las primeras &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; matrices de este tipo: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_{i–1}\end{bmatrix}\times\cdots\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_1\end{bmatrix}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Resulta ser que los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; tienen la propiedad de que &amp;lt;math&amp;gt;r_i=a s_i+b t_i&amp;lt;/math&amp;gt;, es decir, expresan a &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; como una combinación lineal de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Particularmente, como &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=r_{n+1}&amp;lt;/math&amp;gt; entonces se tiene &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}&amp;lt;/math&amp;gt;, 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.&amp;amp;lt;!––Pero no colocaré la demostración en una enciclopedia––&amp;amp;gt; Es importante calcular &amp;lt;math&amp;gt;Q_i\times\cdots\times Q_3\times Q_2\times Q_1&amp;lt;/math&amp;gt; en ese mismo orden. La matriz &amp;lt;math&amp;gt;Q_1&amp;lt;/math&amp;gt; aparece en el extremo derecho y la matriz &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; en el izquierdo. &lt;br /&gt;
&lt;br /&gt;
Regresando al primer ejemplo, la sucesión de cocientes es &amp;lt;math&amp;gt;q_1=8&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_2=1&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;q_3=2&amp;lt;/math&amp;gt;. Entonces se puede calcular {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}–1&amp;amp;9\\3&amp;amp;–26\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–2\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–1\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–8\end{bmatrix}&amp;lt;/math&amp;gt;}} Utilizando el primer renglón de esta matriz se puede leer que &amp;lt;math&amp;gt;91=2366(–1)+273(9)&amp;lt;/math&amp;gt;, es decir, se ha encontrado la manera de expresar al máximo común divisor de 2366 y 273 como una combinación lineal. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; con la multiplicación de matrices: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix} =&lt;br /&gt;
\begin{bmatrix}s_i&amp;amp;t_i\\s_{i–1}–q_is_i&amp;amp;t_{i–1}–q_it_i\end{bmatrix} = \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times\begin{bmatrix}s_{i–1}&amp;amp;t_{i–1}\\s_i&amp;amp;t_i\end{bmatrix}&amp;lt;/math&amp;gt;}} De esta manera &amp;lt;math&amp;gt;s_{i+1} = s_{i–1}–q_is_i&amp;lt;/math&amp;gt; y además &amp;lt;math&amp;gt;t_{i+1} = t_{i–1}–q_it_i&amp;lt;/math&amp;gt;. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: {{Algoritmo|de Euclides extendido|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, y valores &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=as+bt&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a, r_1\gets b, s_0\gets 1, t_0\gets 0, s_1\gets 0, t_1\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## Divida &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;r_i &amp;lt;/math&amp;gt; para obtener el cociente &amp;lt;math&amp;gt;q_i &amp;lt;/math&amp;gt; y el residuo &amp;lt;math&amp;gt;r_{i+1} &amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;s_{i+1}\gets s_{i–1}–q_is_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;t_{i+1}\gets t_{i–1}–q_it_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; es un máximo común divisor de &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; y se expresa &amp;lt;math&amp;gt;r_{i–1}=as_{i–1}+bt_{i–1} &amp;lt;/math&amp;gt;&lt;br /&gt;
|2}} &lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
=== Simplificar fracciones  ===&lt;br /&gt;
&lt;br /&gt;
Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción &amp;lt;math&amp;gt;\textstyle\frac{65}{91}&amp;lt;/math&amp;gt; es equivalente con &amp;lt;math&amp;gt;\textstyle\frac 5 7&amp;lt;/math&amp;gt; (véase [[Número racional]]). De manera más general, &amp;lt;math&amp;gt;\textstyle\frac ab=\frac {ca}{cb}&amp;lt;/math&amp;gt; siempre que &amp;lt;math&amp;gt;c\ne0&amp;lt;/math&amp;gt;. Para reducir una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt;, sólo se necesita dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; entre su máximo común divisor. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si se desea reducir &amp;lt;math&amp;gt;\textstyle\frac{166}{249}&amp;lt;/math&amp;gt;, primero se usa el algoritmo de Euclides para encontrar &amp;lt;math&amp;gt;\mathrm{mcd}(166,249)=83&amp;lt;/math&amp;gt;. Se hacen las divisiones &amp;lt;math&amp;gt;\textstyle 166\div 83 = 2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\textstyle 249\div 83 = 3&amp;lt;/math&amp;gt;. Luego entonces se concluye que &amp;lt;math&amp;gt;\textstyle\frac{166}{249}=\frac 2 3&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Fracciones continuas  ===&lt;br /&gt;
&lt;br /&gt;
La sucesión de divisiones que se efectúan al seguir algoritmo de Euclides puede ser utilizada para expresar una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt; como [[Fracción continua]]. Esto se debe a que si &amp;lt;math&amp;gt;a = bq + r&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r\neq 0&amp;lt;/math&amp;gt;, entonces {{ecuación|&amp;lt;math&amp;gt;\frac a b = q + \frac 1 {\frac b r}&amp;lt;/math&amp;gt;|3}} &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para encontrar el máximo común divisor de &amp;lt;math&amp;gt;93164&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;5826&amp;lt;/math&amp;gt; el algoritmo genera la siguiente secuencia de divisiones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 93164 dividido entre 5826 es 15 y sobran 5774 &lt;br /&gt;
| &amp;lt;math&amp;gt;93164=5826\times 15+5774&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 5826 dividido entre 5774 es 1 y sobran 52 &lt;br /&gt;
| &amp;lt;math&amp;gt;5826=5774\times 1+52&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 5774 dividido entre 52 es 111 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;5774=52\times 111+2&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 52 dividido entre 2 es 26 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;52=2\times 26+0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Todas estas ecuaciones las podemos hacer parecidas a la ecuación {{eqnref | 3}}: &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5774}{52}=111+ \frac 1 {\frac{52}{2}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{52}{2}=26&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se substituye la segunda ecuación en la primera, se obtiene {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {\frac{5774}{52}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Si se repite este proceso de substitución entonces se obtiene la expresión deseada: {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {111+ \frac 1 {26}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma {{Ecuación|&amp;lt;math&amp;gt;\frac{a}{b}=q_1+ \frac 1 {q_2+ \frac 1 {q_3+ \frac 1 {\ddots q_{n–1}+ \frac 1 {q_n}}}}&amp;lt;/math&amp;gt;}} &amp;amp;lt;!–– Esto va en la sección siguiente: Volviendo al caso &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; enteros, el algoritmo de Euclides permite encontrar los coeficientes enteros &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; de la [[Identidad de Bézout]] &amp;lt;math&amp;gt;au+bv=\mathrm{mcd}(a, b)&amp;lt;/math&amp;gt; de fundamental importancia en la [[Aritmética]]. ––&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Inversos modulares  ===&lt;br /&gt;
&lt;br /&gt;
Decimos que dos números enteros son ''congruentes módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;'' (aunque también se puede generalizar para cualquier otro dominio euclídeo) si al dividirlos entre &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; 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 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; es congruente con &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; se escribe &amp;lt;math&amp;gt;a\equiv b\pmod m&amp;lt;/math&amp;gt;, en el ejemplo anterior se tiene &amp;lt;math&amp;gt;7\equiv 12\pmod 5&amp;lt;/math&amp;gt;. Supóngase que se conocen los valores de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, pero que se desconoce el valor &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; de la siguiente ecuación: {{Ecuacion |&amp;lt;math&amp;gt;a x\equiv b\pmod m&amp;lt;/math&amp;gt;|2}} Basta con encontrar un valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; que tenga la característica de que &amp;lt;math&amp;gt;a^{–1} a\equiv 1\pmod m&amp;lt;/math&amp;gt;, pues de esta manera al multiplicar la ecuación {{eqnref|2}} por &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se tendría la solución deseada: {{Ecuacion | &amp;lt;math&amp;gt;x\equiv a^{–1} b\pmod m&amp;lt;/math&amp;gt;}} Al valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se le llama ''inverso modular'' de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Desafortunadamente este valor no siempre existe. Por ejemplo, con &amp;lt;math&amp;gt;a=4&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m=6&amp;lt;/math&amp;gt; no existe ningún número entero entero &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;a^{–1} 4\equiv 1\pmod 6&amp;lt;/math&amp;gt;. De hecho este valor existe si y sólo si &amp;lt;math&amp;gt;\mathrm{mcd}(a,m)=1&amp;lt;/math&amp;gt;. Más aún, si al usar el algoritmo de Euclides extendido (ahora con &amp;lt;math&amp;gt;b=m&amp;lt;/math&amp;gt;) se obtiene &amp;lt;math&amp;gt;1=as+mt&amp;lt;/math&amp;gt;, entonces el valor &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; es el inverso modular de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. &amp;amp;lt;!––LA DEMOSTRACIÓN NO ES BUENO COLOCARLA EN LA ENCICLOPEDIA––&amp;amp;gt; Por ejemplo, se desea resolver la ecuación {{Ecuacion |&amp;lt;math&amp;gt;5 x\equiv 2\pmod 9&amp;lt;/math&amp;gt;}} Entonces con el algoritmo de Euclides extendido se calcula que &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1=5(2)+9(–1)&amp;lt;/math&amp;gt;. Como &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1&amp;lt;/math&amp;gt; entonces 5 tiene un inverso modular. Más aún, como &amp;lt;math&amp;gt;1=5(2)+9(–1)&amp;lt;/math&amp;gt;, entonces ese inverso es 2. Entonces {{Ecuacion |&amp;lt;math&amp;gt;x\equiv 2(2)\pmod 9&amp;lt;/math&amp;gt;}} Es decir que el valor de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Véase [[Multiplicador modular inverso]] &lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
[[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.]] &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;f_{10}=55&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;f_{11}=89&amp;lt;/math&amp;gt; se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 89 dividido entre 55 es 1 y sobran 34 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(89,55)=\mathrm{mcd}(55,34)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 55 dividido entre 34 es 1 y sobran 21 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(55,34)=\mathrm{mcd}(34,21)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 34 dividido entre 21 es 1 y sobran 13 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(34,21)=\mathrm{mcd}(21,13)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 21 dividido entre 13 es 1 y sobran 8 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(21,13)=\mathrm{mcd}(13,8)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 5 &lt;br /&gt;
| 13 dividido entre 8 es 1 y sobran 5 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(13,8)=\mathrm{mcd}(8,5)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 6 &lt;br /&gt;
| 8 dividido entre 5 es 1 y sobran 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(8,5)=\mathrm{mcd}(5,3)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 7 &lt;br /&gt;
| 5 dividido entre 3 es 1 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(5,3)=\mathrm{mcd}(3,2)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 8 &lt;br /&gt;
| 3 dividido entre 2 es 1 y sobran 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(3,2)=\mathrm{mcd}(2,1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 9 &lt;br /&gt;
| 2 dividido entre 1 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2,1)=\mathrm{mcd}(1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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&amp;amp;gt;m''. &lt;br /&gt;
&lt;br /&gt;
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 . &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Implementación en pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 426px; height: 182px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''Si''' b = 0 '''entonces''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''El resultado es''' a &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''En otro caso''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es''' mcd(b,amod b)&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 432px; height: 89px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b): &lt;br /&gt;
'''&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
'''&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; El resultado es''' a &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 434px; height: 133px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo '''de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp; '''Si''' b = 0 '''entonces''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es '''(a,1,0) &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp; '''En otro caso''':&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es'''&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 430px; height: 48px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Divida ''a ''entre ''b'' para obtener un cociente ''q'' y un residuo''r'' &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es '''(a,s,t) &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 428px; height: 51px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función '''Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Divida ''a'' entre ''b'' para obtener un cociente ''q'' y un residuo ''r'' &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es''' (a,Q&amp;lt;sub&amp;gt;11&amp;lt;/sub&amp;gt;,Q&amp;lt;sub&amp;gt;12&amp;lt;/sub&amp;gt;) &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Acerca de la notación empleada: &lt;br /&gt;
&lt;br /&gt;
*''x'' gest ''y'' significa &amp;quot;asigne a la variable ''a ''el valor actual de ''b''&amp;quot;. En lenguajes como [[Lenguaje C|C]], [[Lenguaje de programación Java|Java]], [[C]], [[Python]] y [[Visual Basic]] esto significa simplemente &amp;lt;code&amp;gt;x = y&amp;lt;/code&amp;gt;. En otros lenguajes como [[Lenguaje de programación Pascal|Pascal]] se traduce en &amp;lt;code&amp;gt;a&amp;amp;nbsp;:= b&amp;lt;/code&amp;gt;, en [[Maxima]] es &amp;lt;code&amp;gt;a&amp;amp;nbsp;: b&amp;lt;/code&amp;gt;, en [[R–project|R]], S y [[Ocaml]] es &amp;lt;code&amp;gt;x &amp;amp;lt;– y&amp;lt;/code&amp;gt;, e inclusive se utiliza la flecha &amp;lt;code&amp;gt;x ← y&amp;lt;/code&amp;gt; como el caso de [[APL]]. &lt;br /&gt;
*(''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: &amp;lt;code&amp;gt;(x,y,z) = (a,b,c)&amp;lt;/code&amp;gt;. En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: &amp;lt;code&amp;gt;aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;&amp;lt;/code&amp;gt;. &lt;br /&gt;
*''a'' div ''b'' significa &amp;quot;el cociente de dividir ''a'' entre ''b''&amp;quot;. 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 &amp;lt;code&amp;gt;a/b&amp;lt;/code&amp;gt;. Otras maneras son &amp;lt;code&amp;gt;a\b&amp;lt;/code&amp;gt; (Visual Basic) , &amp;lt;code&amp;gt;a div b&amp;lt;/code&amp;gt; (Pascal) o bien &amp;lt;code&amp;gt;a//b&amp;lt;/code&amp;gt; (Python 3). &lt;br /&gt;
*''a'' mod ''b'' significa &amp;quot;el residuo de dividir ''a ''entre ''b''&amp;quot;. A esta operación se le conoce simplemente como ''módulo''. En muchos lenguajes de programación se implementa como &amp;lt;code&amp;gt;a&amp;amp;nbsp;% b&amp;lt;/code&amp;gt;, mientras que en otros es &amp;lt;code&amp;gt;a mod b&amp;lt;/code&amp;gt; (Visual Basic o Pascal) o bien &amp;lt;code&amp;gt;a rem b&amp;lt;/code&amp;gt; (Ada).&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*Von Zur Gathen, Joachim; Gerhard, Jürgen (2003). «The Euclidean Algorithm», Modern Computer Algebra. Cambridge&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 0-521-82646-2.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Shoup, Victor (2008). «Euclid´s algorithm», A Computational Introduction to Numbrer Theory and Algebra. Cambridge &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 978-0-521-85154-1.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Lipschutz, Seymour; Lipson, Marc (2009). «Propiedades de los enteros», Matemáticas Discretas. McGraw-Hill. ISBN 978-970-10-7236-3.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Brassard, Gilles; Bratley, Paul (1997). «Análisis de algoritmos», Fundamentos de Algoritmia. Madrid: PRENTICE HALL. ISBN &amp;lt;br&amp;gt;&amp;amp;nbsp;84-89660-00-X.&amp;lt;br&amp;gt; &lt;br /&gt;
*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. &amp;lt;br&amp;gt; &lt;br /&gt;
*Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford (2009). «Number-Theoretic Algorithms», Introduction to Algorithms. The MIT Press. ISBN 978-0-262-53305-8.&amp;lt;br&amp;gt; &lt;br /&gt;
*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&amp;amp;nbsp;968-9161-02-4.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Cárdenas, Humberto; Lluis, Emilio; Raggi, Francisco; Tomás, Francisco (2004).&amp;amp;nbsp;«Divisibilidad», Álgebra Superior. México: Trillas. ISBN 968-24-3783-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Pérez Segui, María Luisa (2006). «Divisibilidad», Teoría de Números. Instituto de Matemáticas, UNAM. ISBN 970-32-1170-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Baldor, Aurelio (2008). «Máximo común divisor», Álgebra. México: Grupo Editorial Patria. ISBN 978-970-817-000-0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67180</id>
		<title>Algoritmo de Euclides</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67180"/>
		<updated>2010-05-14T20:47:29Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mejorar|faltan las fuentes}} '''Algoritmo de Euclides:''' &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo original de Euclides  ==&lt;br /&gt;
&lt;br /&gt;
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 [[Conmensurable|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''. &lt;br /&gt;
&lt;br /&gt;
No cualquier par de segmentos es conmensurable, como encontraron los pitagóricos cuando establecen que&amp;amp;nbsp; no es un número racional, pero en el caso de dos segmentos conmensurables se desea hallar la mayor medida común posible. &lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;    '''''Para encontrar la máxima medida común de dos números que no sean primos entre sí.&lt;br /&gt;
Euclides VII-2.svg'''''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.&lt;br /&gt;
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.&lt;br /&gt;
Euclides. Elementos VII.2''&amp;lt;/pre&amp;gt; &lt;br /&gt;
En lenguaje moderno, el algoritmo se describe como sigue: &lt;br /&gt;
&lt;br /&gt;
#Dados dos segmentos ''AB'' y ''CD'' (con ''AB&amp;amp;gt;CD''), restamos ''CD'' de ''AB'' tantas veces como sea posible. Si no hay residuo, entonces ''CD'' es la máxima medida común. &lt;br /&gt;
#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. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
El hecho de que los segmentos son conmesurables es clave para asegurar que el proceso termina tarde o temprano &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides tradicional  ==&lt;br /&gt;
&lt;br /&gt;
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''. &lt;br /&gt;
&lt;br /&gt;
Según lo antes mencionado, para calcular el máximo común divisor de 2366 y 273 se puede proseguir de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| 2366 dividido entre 273 es 8 y sobran 182 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2366,273)=\mathrm{mcd}(273,182)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| 273 dividido entre 182 es 1 y sobran 91 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(273,182)=\mathrm{mcd}(182,91)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| 182 dividido entre 91 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(182,91)=\mathrm{mcd}(91,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
#Si ''b=0 ''entonces mcd(a,b) = a y el algoritmo termina &lt;br /&gt;
#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&lt;br /&gt;
&lt;br /&gt;
Asuma que llamamos a = r&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; y b = r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_0&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_1&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_0,r_1)=\mathrm{mcd}(r_1,r_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_2&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_1,r_2)=\mathrm{mcd}(r_2,r_3)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_4&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_2,r_3)=\mathrm{mcd}(r_3,r_4)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_{n-1}&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_n&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_{n-1},r_n)=\mathrm{mcd}(r_n,r_{n+1})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_{n+1}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; (el último residuo que no es cero). &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios P(x) = x&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; + 2x&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; + x y Q(x) = x&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; − 1 el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4-1)=\mathrm{mcd}(x^4-1,2x^3+2x)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4-1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,-x^2-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;-2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,-x^2-1)=\mathrm{mcd}(-x^2-1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es − x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; − 1. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;xmod y&amp;quot; significa &amp;quot;el residuo de dividir ''x'' entre y&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i-1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios &amp;lt;math&amp;gt;P(x)=x^5+2x^3+x&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;Q(x)=x^4–1&amp;lt;/math&amp;gt; el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4–1)=\mathrm{mcd}(x^4–1,2x^3+2x)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4–1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,–x^2–1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;–2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,–x^2–1)=\mathrm{mcd}(–x^2–1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;&amp;lt;math&amp;gt;x\bmod y&amp;lt;/math&amp;gt;&amp;quot; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i–1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides extendido  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo de Euclides extendido permite, además de encontrar un máximo común divisor de dos números enteros &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, expresarlo como la mínima combinación lineal de esos números, es decir, encontrar números enteros &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s+b t&amp;lt;/math&amp;gt;. Esto se generaliza también hacia cualquier dominio euclideano. &lt;br /&gt;
&lt;br /&gt;
=== Fundamentos  ===&lt;br /&gt;
&lt;br /&gt;
Existen varias maneras de explicar el algoritmo de Euclides extendido, una de las más comunes consiste en la siguiente: &lt;br /&gt;
&lt;br /&gt;
#Usar el algoritmo tradicional de Euclides. En cada paso, en lugar de &amp;quot;&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&amp;quot; se escribe la ecuación &amp;lt;math&amp;gt;a=b q+r&amp;lt;/math&amp;gt; (véase [[Algoritmo de la división]]). &lt;br /&gt;
#Se despejan los residuos de cada ecuación. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;2\times 2&amp;lt;/math&amp;gt; se usa la siguiente fórmula (vése [[Producto de matrices]]): {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}e&amp;amp;f\\g&amp;amp;h\end{bmatrix}\times\begin{bmatrix}a&amp;amp;b\\c&amp;amp;d\end{bmatrix}=\begin{bmatrix}e a+f c&amp;amp;e b+f d\\g a+h c&amp;amp;g b+h d\end{bmatrix}&amp;lt;/math&amp;gt;|1}} Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; que ahí se describen. Por cada valor &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; calculado se puede formar la matriz &amp;lt;math&amp;gt;\textstyle Q_i=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}&amp;lt;/math&amp;gt;. Usando la ecuación {{Eqnref|1}} de manera repetida se puede calcular el producto las primeras &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; matrices de este tipo: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_{i–1}\end{bmatrix}\times\cdots\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_1\end{bmatrix}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Resulta ser que los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; tienen la propiedad de que &amp;lt;math&amp;gt;r_i=a s_i+b t_i&amp;lt;/math&amp;gt;, es decir, expresan a &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; como una combinación lineal de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Particularmente, como &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=r_{n+1}&amp;lt;/math&amp;gt; entonces se tiene &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}&amp;lt;/math&amp;gt;, 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.&amp;amp;lt;!––Pero no colocaré la demostración en una enciclopedia––&amp;amp;gt; Es importante calcular &amp;lt;math&amp;gt;Q_i\times\cdots\times Q_3\times Q_2\times Q_1&amp;lt;/math&amp;gt; en ese mismo orden. La matriz &amp;lt;math&amp;gt;Q_1&amp;lt;/math&amp;gt; aparece en el extremo derecho y la matriz &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; en el izquierdo. &lt;br /&gt;
&lt;br /&gt;
Regresando al primer ejemplo, la sucesión de cocientes es &amp;lt;math&amp;gt;q_1=8&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_2=1&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;q_3=2&amp;lt;/math&amp;gt;. Entonces se puede calcular {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}–1&amp;amp;9\\3&amp;amp;–26\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–2\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–1\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–8\end{bmatrix}&amp;lt;/math&amp;gt;}} Utilizando el primer renglón de esta matriz se puede leer que &amp;lt;math&amp;gt;91=2366(–1)+273(9)&amp;lt;/math&amp;gt;, es decir, se ha encontrado la manera de expresar al máximo común divisor de 2366 y 273 como una combinación lineal. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; con la multiplicación de matrices: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix} =&lt;br /&gt;
\begin{bmatrix}s_i&amp;amp;t_i\\s_{i–1}–q_is_i&amp;amp;t_{i–1}–q_it_i\end{bmatrix} = \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times\begin{bmatrix}s_{i–1}&amp;amp;t_{i–1}\\s_i&amp;amp;t_i\end{bmatrix}&amp;lt;/math&amp;gt;}} De esta manera &amp;lt;math&amp;gt;s_{i+1} = s_{i–1}–q_is_i&amp;lt;/math&amp;gt; y además &amp;lt;math&amp;gt;t_{i+1} = t_{i–1}–q_it_i&amp;lt;/math&amp;gt;. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: {{Algoritmo|de Euclides extendido|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, y valores &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=as+bt&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a, r_1\gets b, s_0\gets 1, t_0\gets 0, s_1\gets 0, t_1\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## Divida &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;r_i &amp;lt;/math&amp;gt; para obtener el cociente &amp;lt;math&amp;gt;q_i &amp;lt;/math&amp;gt; y el residuo &amp;lt;math&amp;gt;r_{i+1} &amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;s_{i+1}\gets s_{i–1}–q_is_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;t_{i+1}\gets t_{i–1}–q_it_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; es un máximo común divisor de &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; y se expresa &amp;lt;math&amp;gt;r_{i–1}=as_{i–1}+bt_{i–1} &amp;lt;/math&amp;gt;&lt;br /&gt;
|2}} &lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
=== Simplificar fracciones  ===&lt;br /&gt;
&lt;br /&gt;
Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción &amp;lt;math&amp;gt;\textstyle\frac{65}{91}&amp;lt;/math&amp;gt; es equivalente con &amp;lt;math&amp;gt;\textstyle\frac 5 7&amp;lt;/math&amp;gt; (véase [[Número racional]]). De manera más general, &amp;lt;math&amp;gt;\textstyle\frac ab=\frac {ca}{cb}&amp;lt;/math&amp;gt; siempre que &amp;lt;math&amp;gt;c\ne0&amp;lt;/math&amp;gt;. Para reducir una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt;, sólo se necesita dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; entre su máximo común divisor. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si se desea reducir &amp;lt;math&amp;gt;\textstyle\frac{166}{249}&amp;lt;/math&amp;gt;, primero se usa el algoritmo de Euclides para encontrar &amp;lt;math&amp;gt;\mathrm{mcd}(166,249)=83&amp;lt;/math&amp;gt;. Se hacen las divisiones &amp;lt;math&amp;gt;\textstyle 166\div 83 = 2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\textstyle 249\div 83 = 3&amp;lt;/math&amp;gt;. Luego entonces se concluye que &amp;lt;math&amp;gt;\textstyle\frac{166}{249}=\frac 2 3&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Fracciones continuas  ===&lt;br /&gt;
&lt;br /&gt;
La sucesión de divisiones que se efectúan al seguir algoritmo de Euclides puede ser utilizada para expresar una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt; como [[Fracción continua]]. Esto se debe a que si &amp;lt;math&amp;gt;a = bq + r&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r\neq 0&amp;lt;/math&amp;gt;, entonces {{ecuación|&amp;lt;math&amp;gt;\frac a b = q + \frac 1 {\frac b r}&amp;lt;/math&amp;gt;|3}} &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para encontrar el máximo común divisor de &amp;lt;math&amp;gt;93164&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;5826&amp;lt;/math&amp;gt; el algoritmo genera la siguiente secuencia de divisiones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 93164 dividido entre 5826 es 15 y sobran 5774 &lt;br /&gt;
| &amp;lt;math&amp;gt;93164=5826\times 15+5774&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 5826 dividido entre 5774 es 1 y sobran 52 &lt;br /&gt;
| &amp;lt;math&amp;gt;5826=5774\times 1+52&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 5774 dividido entre 52 es 111 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;5774=52\times 111+2&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 52 dividido entre 2 es 26 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;52=2\times 26+0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Todas estas ecuaciones las podemos hacer parecidas a la ecuación {{eqnref | 3}}: &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5774}{52}=111+ \frac 1 {\frac{52}{2}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{52}{2}=26&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se substituye la segunda ecuación en la primera, se obtiene {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {\frac{5774}{52}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Si se repite este proceso de substitución entonces se obtiene la expresión deseada: {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {111+ \frac 1 {26}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma {{Ecuación|&amp;lt;math&amp;gt;\frac{a}{b}=q_1+ \frac 1 {q_2+ \frac 1 {q_3+ \frac 1 {\ddots q_{n–1}+ \frac 1 {q_n}}}}&amp;lt;/math&amp;gt;}} &amp;amp;lt;!–– Esto va en la sección siguiente: Volviendo al caso &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; enteros, el algoritmo de Euclides permite encontrar los coeficientes enteros &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; de la [[Identidad de Bézout]] &amp;lt;math&amp;gt;au+bv=\mathrm{mcd}(a, b)&amp;lt;/math&amp;gt; de fundamental importancia en la [[Aritmética]]. ––&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Inversos modulares  ===&lt;br /&gt;
&lt;br /&gt;
Decimos que dos números enteros son ''congruentes módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;'' (aunque también se puede generalizar para cualquier otro dominio euclídeo) si al dividirlos entre &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; 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 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; es congruente con &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; se escribe &amp;lt;math&amp;gt;a\equiv b\pmod m&amp;lt;/math&amp;gt;, en el ejemplo anterior se tiene &amp;lt;math&amp;gt;7\equiv 12\pmod 5&amp;lt;/math&amp;gt;. Supóngase que se conocen los valores de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, pero que se desconoce el valor &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; de la siguiente ecuación: {{Ecuacion |&amp;lt;math&amp;gt;a x\equiv b\pmod m&amp;lt;/math&amp;gt;|2}} Basta con encontrar un valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; que tenga la característica de que &amp;lt;math&amp;gt;a^{–1} a\equiv 1\pmod m&amp;lt;/math&amp;gt;, pues de esta manera al multiplicar la ecuación {{eqnref|2}} por &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se tendría la solución deseada: {{Ecuacion | &amp;lt;math&amp;gt;x\equiv a^{–1} b\pmod m&amp;lt;/math&amp;gt;}} Al valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se le llama ''inverso modular'' de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Desafortunadamente este valor no siempre existe. Por ejemplo, con &amp;lt;math&amp;gt;a=4&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m=6&amp;lt;/math&amp;gt; no existe ningún número entero entero &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;a^{–1} 4\equiv 1\pmod 6&amp;lt;/math&amp;gt;. De hecho este valor existe si y sólo si &amp;lt;math&amp;gt;\mathrm{mcd}(a,m)=1&amp;lt;/math&amp;gt;. Más aún, si al usar el algoritmo de Euclides extendido (ahora con &amp;lt;math&amp;gt;b=m&amp;lt;/math&amp;gt;) se obtiene &amp;lt;math&amp;gt;1=as+mt&amp;lt;/math&amp;gt;, entonces el valor &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; es el inverso modular de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. &amp;amp;lt;!––LA DEMOSTRACIÓN NO ES BUENO COLOCARLA EN LA ENCICLOPEDIA––&amp;amp;gt; Por ejemplo, se desea resolver la ecuación {{Ecuacion |&amp;lt;math&amp;gt;5 x\equiv 2\pmod 9&amp;lt;/math&amp;gt;}} Entonces con el algoritmo de Euclides extendido se calcula que &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1=5(2)+9(–1)&amp;lt;/math&amp;gt;. Como &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1&amp;lt;/math&amp;gt; entonces 5 tiene un inverso modular. Más aún, como &amp;lt;math&amp;gt;1=5(2)+9(–1)&amp;lt;/math&amp;gt;, entonces ese inverso es 2. Entonces {{Ecuacion |&amp;lt;math&amp;gt;x\equiv 2(2)\pmod 9&amp;lt;/math&amp;gt;}} Es decir que el valor de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Véase [[Multiplicador modular inverso]] &lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
[[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.]] &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;f_{10}=55&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;f_{11}=89&amp;lt;/math&amp;gt; se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 89 dividido entre 55 es 1 y sobran 34 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(89,55)=\mathrm{mcd}(55,34)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 55 dividido entre 34 es 1 y sobran 21 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(55,34)=\mathrm{mcd}(34,21)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 34 dividido entre 21 es 1 y sobran 13 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(34,21)=\mathrm{mcd}(21,13)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 21 dividido entre 13 es 1 y sobran 8 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(21,13)=\mathrm{mcd}(13,8)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 5 &lt;br /&gt;
| 13 dividido entre 8 es 1 y sobran 5 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(13,8)=\mathrm{mcd}(8,5)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 6 &lt;br /&gt;
| 8 dividido entre 5 es 1 y sobran 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(8,5)=\mathrm{mcd}(5,3)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 7 &lt;br /&gt;
| 5 dividido entre 3 es 1 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(5,3)=\mathrm{mcd}(3,2)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 8 &lt;br /&gt;
| 3 dividido entre 2 es 1 y sobran 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(3,2)=\mathrm{mcd}(2,1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 9 &lt;br /&gt;
| 2 dividido entre 1 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2,1)=\mathrm{mcd}(1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; divisiones para calcular el máximo común divisor de &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;gt;m&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; bits, entonces el número promedio de divisiones necesarias es &amp;lt;math&amp;gt;\textstyle{\frac{\pi^2}{6}n}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; es el grado de los polinomios. &lt;br /&gt;
&lt;br /&gt;
== Implementación en pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 426px; height: 182px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''Si''' b = 0 '''entonces''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''El resultado es''' a &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''En otro caso''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es''' mcd(b,amod b)&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 432px; height: 89px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b): &lt;br /&gt;
'''&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
'''&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; El resultado es''' a &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 434px; height: 133px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo '''de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp; '''Si''' b = 0 '''entonces''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es '''(a,1,0) &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp; '''En otro caso''':&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es'''&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 430px; height: 48px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' Euclides(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Divida ''a ''entre ''b'' para obtener un cociente ''q'' y un residuo''r'' &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es '''(a,s,t) &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 428px; height: 51px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función '''Euclides(a,b):&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''Mientras haga lo siguiente''':&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Divida ''a'' entre ''b'' para obtener un cociente ''q'' y un residuo ''r'' &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es''' (a,Q&amp;lt;sub&amp;gt;11&amp;lt;/sub&amp;gt;,Q&amp;lt;sub&amp;gt;12&amp;lt;/sub&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Acerca de la notación empleada: &lt;br /&gt;
&lt;br /&gt;
*''x'' gest ''y'' significa &amp;quot;asigne a la variable ''a ''el valor actual de ''b''&amp;quot;. En lenguajes como [[Lenguaje C|C]], [[Lenguaje de programación Java|Java]], [[C]], [[Python]] y [[Visual Basic]] esto significa simplemente &amp;lt;code&amp;gt;x = y&amp;lt;/code&amp;gt;. En otros lenguajes como [[Lenguaje de programación Pascal|Pascal]] se traduce en &amp;lt;code&amp;gt;a&amp;amp;nbsp;:= b&amp;lt;/code&amp;gt;, en [[Maxima]] es &amp;lt;code&amp;gt;a&amp;amp;nbsp;: b&amp;lt;/code&amp;gt;, en [[R–project|R]], S y [[Ocaml]] es &amp;lt;code&amp;gt;x &amp;amp;lt;– y&amp;lt;/code&amp;gt;, e inclusive se utiliza la flecha &amp;lt;code&amp;gt;x ← y&amp;lt;/code&amp;gt; como el caso de [[APL]]. &lt;br /&gt;
*(''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: &amp;lt;code&amp;gt;(x,y,z) = (a,b,c)&amp;lt;/code&amp;gt;. En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: &amp;lt;code&amp;gt;aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;&amp;lt;/code&amp;gt;. &lt;br /&gt;
*''a'' div ''b'' significa &amp;quot;el cociente de dividir ''a'' entre ''b''&amp;quot;. 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 &amp;lt;code&amp;gt;a/b&amp;lt;/code&amp;gt;. Otras maneras son &amp;lt;code&amp;gt;a\b&amp;lt;/code&amp;gt; (Visual Basic) , &amp;lt;code&amp;gt;a div b&amp;lt;/code&amp;gt; (Pascal) o bien &amp;lt;code&amp;gt;a//b&amp;lt;/code&amp;gt; (Python 3). &lt;br /&gt;
*''a'' mod ''b'' significa &amp;quot;el residuo de dividir ''a ''entre ''b''&amp;quot;. A esta operación se le conoce simplemente como ''módulo''. En muchos lenguajes de programación se implementa como &amp;lt;code&amp;gt;a&amp;amp;nbsp;% b&amp;lt;/code&amp;gt;, mientras que en otros es &amp;lt;code&amp;gt;a mod b&amp;lt;/code&amp;gt; (Visual Basic o Pascal) o bien &amp;lt;code&amp;gt;a rem b&amp;lt;/code&amp;gt; (Ada).&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*Von Zur Gathen, Joachim; Gerhard, Jürgen (2003). «The Euclidean Algorithm», Modern Computer Algebra. Cambridge&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 0-521-82646-2.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Shoup, Victor (2008). «Euclid´s algorithm», A Computational Introduction to Numbrer Theory and Algebra. Cambridge &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 978-0-521-85154-1.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Lipschutz, Seymour; Lipson, Marc (2009). «Propiedades de los enteros», Matemáticas Discretas. McGraw-Hill. ISBN 978-970-10-7236-3.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Brassard, Gilles; Bratley, Paul (1997). «Análisis de algoritmos», Fundamentos de Algoritmia. Madrid: PRENTICE HALL. ISBN &amp;lt;br&amp;gt;&amp;amp;nbsp;84-89660-00-X.&amp;lt;br&amp;gt; &lt;br /&gt;
*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. &amp;lt;br&amp;gt; &lt;br /&gt;
*Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford (2009). «Number-Theoretic Algorithms», Introduction to Algorithms. The MIT Press. ISBN 978-0-262-53305-8.&amp;lt;br&amp;gt; &lt;br /&gt;
*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&amp;amp;nbsp;968-9161-02-4.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Cárdenas, Humberto; Lluis, Emilio; Raggi, Francisco; Tomás, Francisco (2004).&amp;amp;nbsp;«Divisibilidad», Álgebra Superior. México: Trillas. ISBN 968-24-3783-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Pérez Segui, María Luisa (2006). «Divisibilidad», Teoría de Números. Instituto de Matemáticas, UNAM. ISBN 970-32-1170-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Baldor, Aurelio (2008). «Máximo común divisor», Álgebra. México: Grupo Editorial Patria. ISBN 978-970-817-000-0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67171</id>
		<title>Algoritmo de Euclides</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67171"/>
		<updated>2010-05-14T20:44:37Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mejorar|faltan las fuentes}} '''Algoritmo de Euclides:''' &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo original de Euclides  ==&lt;br /&gt;
&lt;br /&gt;
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 [[Conmensurable|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''. &lt;br /&gt;
&lt;br /&gt;
No cualquier par de segmentos es conmensurable, como encontraron los pitagóricos cuando establecen que&amp;amp;nbsp; no es un número racional, pero en el caso de dos segmentos conmensurables se desea hallar la mayor medida común posible. &lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;    '''''Para encontrar la máxima medida común de dos números que no sean primos entre sí.&lt;br /&gt;
Euclides VII-2.svg'''''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.&lt;br /&gt;
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.&lt;br /&gt;
Euclides. Elementos VII.2''&amp;lt;/pre&amp;gt; &lt;br /&gt;
En lenguaje moderno, el algoritmo se describe como sigue: &lt;br /&gt;
&lt;br /&gt;
#Dados dos segmentos ''AB'' y ''CD'' (con ''AB&amp;amp;gt;CD''), restamos ''CD'' de ''AB'' tantas veces como sea posible. Si no hay residuo, entonces ''CD'' es la máxima medida común. &lt;br /&gt;
#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. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
El hecho de que los segmentos son conmesurables es clave para asegurar que el proceso termina tarde o temprano &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides tradicional  ==&lt;br /&gt;
&lt;br /&gt;
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''. &lt;br /&gt;
&lt;br /&gt;
Según lo antes mencionado, para calcular el máximo común divisor de 2366 y 273 se puede proseguir de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| 2366 dividido entre 273 es 8 y sobran 182 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2366,273)=\mathrm{mcd}(273,182)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| 273 dividido entre 182 es 1 y sobran 91 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(273,182)=\mathrm{mcd}(182,91)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| 182 dividido entre 91 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(182,91)=\mathrm{mcd}(91,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
#Si ''b=0 ''entonces mcd(a,b) = a y el algoritmo termina &lt;br /&gt;
#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&lt;br /&gt;
&lt;br /&gt;
Asuma que llamamos a = r&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; y b = r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_0&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_1&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_0,r_1)=\mathrm{mcd}(r_1,r_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_2&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_1,r_2)=\mathrm{mcd}(r_2,r_3)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_4&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_2,r_3)=\mathrm{mcd}(r_3,r_4)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_{n-1}&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_n&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_{n-1},r_n)=\mathrm{mcd}(r_n,r_{n+1})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_{n+1}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; (el último residuo que no es cero). &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios P(x) = x&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; + 2x&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; + x y Q(x) = x&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; − 1 el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4-1)=\mathrm{mcd}(x^4-1,2x^3+2x)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4-1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,-x^2-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;-2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,-x^2-1)=\mathrm{mcd}(-x^2-1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es − x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; − 1. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;xmod y&amp;quot; significa &amp;quot;el residuo de dividir ''x'' entre y&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i-1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios &amp;lt;math&amp;gt;P(x)=x^5+2x^3+x&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;Q(x)=x^4–1&amp;lt;/math&amp;gt; el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4–1)=\mathrm{mcd}(x^4–1,2x^3+2x)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4–1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,–x^2–1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;–2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,–x^2–1)=\mathrm{mcd}(–x^2–1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;&amp;lt;math&amp;gt;x\bmod y&amp;lt;/math&amp;gt;&amp;quot; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i–1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides extendido  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo de Euclides extendido permite, además de encontrar un máximo común divisor de dos números enteros &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, expresarlo como la mínima combinación lineal de esos números, es decir, encontrar números enteros &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s+b t&amp;lt;/math&amp;gt;. Esto se generaliza también hacia cualquier dominio euclideano. &lt;br /&gt;
&lt;br /&gt;
=== Fundamentos  ===&lt;br /&gt;
&lt;br /&gt;
Existen varias maneras de explicar el algoritmo de Euclides extendido, una de las más comunes consiste en la siguiente: &lt;br /&gt;
&lt;br /&gt;
#Usar el algoritmo tradicional de Euclides. En cada paso, en lugar de &amp;quot;&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&amp;quot; se escribe la ecuación &amp;lt;math&amp;gt;a=b q+r&amp;lt;/math&amp;gt; (véase [[Algoritmo de la división]]). &lt;br /&gt;
#Se despejan los residuos de cada ecuación. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;2\times 2&amp;lt;/math&amp;gt; se usa la siguiente fórmula (vése [[Producto de matrices]]): {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}e&amp;amp;f\\g&amp;amp;h\end{bmatrix}\times\begin{bmatrix}a&amp;amp;b\\c&amp;amp;d\end{bmatrix}=\begin{bmatrix}e a+f c&amp;amp;e b+f d\\g a+h c&amp;amp;g b+h d\end{bmatrix}&amp;lt;/math&amp;gt;|1}} Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; que ahí se describen. Por cada valor &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; calculado se puede formar la matriz &amp;lt;math&amp;gt;\textstyle Q_i=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}&amp;lt;/math&amp;gt;. Usando la ecuación {{Eqnref|1}} de manera repetida se puede calcular el producto las primeras &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; matrices de este tipo: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_{i–1}\end{bmatrix}\times\cdots\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_1\end{bmatrix}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Resulta ser que los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; tienen la propiedad de que &amp;lt;math&amp;gt;r_i=a s_i+b t_i&amp;lt;/math&amp;gt;, es decir, expresan a &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; como una combinación lineal de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Particularmente, como &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=r_{n+1}&amp;lt;/math&amp;gt; entonces se tiene &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}&amp;lt;/math&amp;gt;, 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.&amp;amp;lt;!––Pero no colocaré la demostración en una enciclopedia––&amp;amp;gt; Es importante calcular &amp;lt;math&amp;gt;Q_i\times\cdots\times Q_3\times Q_2\times Q_1&amp;lt;/math&amp;gt; en ese mismo orden. La matriz &amp;lt;math&amp;gt;Q_1&amp;lt;/math&amp;gt; aparece en el extremo derecho y la matriz &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; en el izquierdo. &lt;br /&gt;
&lt;br /&gt;
Regresando al primer ejemplo, la sucesión de cocientes es &amp;lt;math&amp;gt;q_1=8&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_2=1&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;q_3=2&amp;lt;/math&amp;gt;. Entonces se puede calcular {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}–1&amp;amp;9\\3&amp;amp;–26\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–2\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–1\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–8\end{bmatrix}&amp;lt;/math&amp;gt;}} Utilizando el primer renglón de esta matriz se puede leer que &amp;lt;math&amp;gt;91=2366(–1)+273(9)&amp;lt;/math&amp;gt;, es decir, se ha encontrado la manera de expresar al máximo común divisor de 2366 y 273 como una combinación lineal. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; con la multiplicación de matrices: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix} =&lt;br /&gt;
\begin{bmatrix}s_i&amp;amp;t_i\\s_{i–1}–q_is_i&amp;amp;t_{i–1}–q_it_i\end{bmatrix} = \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times\begin{bmatrix}s_{i–1}&amp;amp;t_{i–1}\\s_i&amp;amp;t_i\end{bmatrix}&amp;lt;/math&amp;gt;}} De esta manera &amp;lt;math&amp;gt;s_{i+1} = s_{i–1}–q_is_i&amp;lt;/math&amp;gt; y además &amp;lt;math&amp;gt;t_{i+1} = t_{i–1}–q_it_i&amp;lt;/math&amp;gt;. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: {{Algoritmo|de Euclides extendido|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, y valores &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=as+bt&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a, r_1\gets b, s_0\gets 1, t_0\gets 0, s_1\gets 0, t_1\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## Divida &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;r_i &amp;lt;/math&amp;gt; para obtener el cociente &amp;lt;math&amp;gt;q_i &amp;lt;/math&amp;gt; y el residuo &amp;lt;math&amp;gt;r_{i+1} &amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;s_{i+1}\gets s_{i–1}–q_is_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;t_{i+1}\gets t_{i–1}–q_it_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; es un máximo común divisor de &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; y se expresa &amp;lt;math&amp;gt;r_{i–1}=as_{i–1}+bt_{i–1} &amp;lt;/math&amp;gt;&lt;br /&gt;
|2}} &lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
=== Simplificar fracciones  ===&lt;br /&gt;
&lt;br /&gt;
Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción &amp;lt;math&amp;gt;\textstyle\frac{65}{91}&amp;lt;/math&amp;gt; es equivalente con &amp;lt;math&amp;gt;\textstyle\frac 5 7&amp;lt;/math&amp;gt; (véase [[Número racional]]). De manera más general, &amp;lt;math&amp;gt;\textstyle\frac ab=\frac {ca}{cb}&amp;lt;/math&amp;gt; siempre que &amp;lt;math&amp;gt;c\ne0&amp;lt;/math&amp;gt;. Para reducir una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt;, sólo se necesita dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; entre su máximo común divisor. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si se desea reducir &amp;lt;math&amp;gt;\textstyle\frac{166}{249}&amp;lt;/math&amp;gt;, primero se usa el algoritmo de Euclides para encontrar &amp;lt;math&amp;gt;\mathrm{mcd}(166,249)=83&amp;lt;/math&amp;gt;. Se hacen las divisiones &amp;lt;math&amp;gt;\textstyle 166\div 83 = 2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\textstyle 249\div 83 = 3&amp;lt;/math&amp;gt;. Luego entonces se concluye que &amp;lt;math&amp;gt;\textstyle\frac{166}{249}=\frac 2 3&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Fracciones continuas  ===&lt;br /&gt;
&lt;br /&gt;
La sucesión de divisiones que se efectúan al seguir algoritmo de Euclides puede ser utilizada para expresar una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt; como [[Fracción continua]]. Esto se debe a que si &amp;lt;math&amp;gt;a = bq + r&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r\neq 0&amp;lt;/math&amp;gt;, entonces {{ecuación|&amp;lt;math&amp;gt;\frac a b = q + \frac 1 {\frac b r}&amp;lt;/math&amp;gt;|3}} &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para encontrar el máximo común divisor de &amp;lt;math&amp;gt;93164&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;5826&amp;lt;/math&amp;gt; el algoritmo genera la siguiente secuencia de divisiones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 93164 dividido entre 5826 es 15 y sobran 5774 &lt;br /&gt;
| &amp;lt;math&amp;gt;93164=5826\times 15+5774&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 5826 dividido entre 5774 es 1 y sobran 52 &lt;br /&gt;
| &amp;lt;math&amp;gt;5826=5774\times 1+52&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 5774 dividido entre 52 es 111 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;5774=52\times 111+2&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 52 dividido entre 2 es 26 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;52=2\times 26+0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Todas estas ecuaciones las podemos hacer parecidas a la ecuación {{eqnref | 3}}: &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5774}{52}=111+ \frac 1 {\frac{52}{2}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{52}{2}=26&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se substituye la segunda ecuación en la primera, se obtiene {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {\frac{5774}{52}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Si se repite este proceso de substitución entonces se obtiene la expresión deseada: {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {111+ \frac 1 {26}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma {{Ecuación|&amp;lt;math&amp;gt;\frac{a}{b}=q_1+ \frac 1 {q_2+ \frac 1 {q_3+ \frac 1 {\ddots q_{n–1}+ \frac 1 {q_n}}}}&amp;lt;/math&amp;gt;}} &amp;amp;lt;!–– Esto va en la sección siguiente: Volviendo al caso &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; enteros, el algoritmo de Euclides permite encontrar los coeficientes enteros &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; de la [[Identidad de Bézout]] &amp;lt;math&amp;gt;au+bv=\mathrm{mcd}(a, b)&amp;lt;/math&amp;gt; de fundamental importancia en la [[Aritmética]]. ––&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Inversos modulares  ===&lt;br /&gt;
&lt;br /&gt;
Decimos que dos números enteros son ''congruentes módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;'' (aunque también se puede generalizar para cualquier otro dominio euclídeo) si al dividirlos entre &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; 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 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; es congruente con &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; se escribe &amp;lt;math&amp;gt;a\equiv b\pmod m&amp;lt;/math&amp;gt;, en el ejemplo anterior se tiene &amp;lt;math&amp;gt;7\equiv 12\pmod 5&amp;lt;/math&amp;gt;. Supóngase que se conocen los valores de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, pero que se desconoce el valor &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; de la siguiente ecuación: {{Ecuacion |&amp;lt;math&amp;gt;a x\equiv b\pmod m&amp;lt;/math&amp;gt;|2}} Basta con encontrar un valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; que tenga la característica de que &amp;lt;math&amp;gt;a^{–1} a\equiv 1\pmod m&amp;lt;/math&amp;gt;, pues de esta manera al multiplicar la ecuación {{eqnref|2}} por &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se tendría la solución deseada: {{Ecuacion | &amp;lt;math&amp;gt;x\equiv a^{–1} b\pmod m&amp;lt;/math&amp;gt;}} Al valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se le llama ''inverso modular'' de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Desafortunadamente este valor no siempre existe. Por ejemplo, con &amp;lt;math&amp;gt;a=4&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m=6&amp;lt;/math&amp;gt; no existe ningún número entero entero &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;a^{–1} 4\equiv 1\pmod 6&amp;lt;/math&amp;gt;. De hecho este valor existe si y sólo si &amp;lt;math&amp;gt;\mathrm{mcd}(a,m)=1&amp;lt;/math&amp;gt;. Más aún, si al usar el algoritmo de Euclides extendido (ahora con &amp;lt;math&amp;gt;b=m&amp;lt;/math&amp;gt;) se obtiene &amp;lt;math&amp;gt;1=as+mt&amp;lt;/math&amp;gt;, entonces el valor &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; es el inverso modular de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. &amp;amp;lt;!––LA DEMOSTRACIÓN NO ES BUENO COLOCARLA EN LA ENCICLOPEDIA––&amp;amp;gt; Por ejemplo, se desea resolver la ecuación {{Ecuacion |&amp;lt;math&amp;gt;5 x\equiv 2\pmod 9&amp;lt;/math&amp;gt;}} Entonces con el algoritmo de Euclides extendido se calcula que &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1=5(2)+9(–1)&amp;lt;/math&amp;gt;. Como &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1&amp;lt;/math&amp;gt; entonces 5 tiene un inverso modular. Más aún, como &amp;lt;math&amp;gt;1=5(2)+9(–1)&amp;lt;/math&amp;gt;, entonces ese inverso es 2. Entonces {{Ecuacion |&amp;lt;math&amp;gt;x\equiv 2(2)\pmod 9&amp;lt;/math&amp;gt;}} Es decir que el valor de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Véase [[Multiplicador modular inverso]] &lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
[[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.]] &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;f_{10}=55&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;f_{11}=89&amp;lt;/math&amp;gt; se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 89 dividido entre 55 es 1 y sobran 34 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(89,55)=\mathrm{mcd}(55,34)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 55 dividido entre 34 es 1 y sobran 21 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(55,34)=\mathrm{mcd}(34,21)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 34 dividido entre 21 es 1 y sobran 13 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(34,21)=\mathrm{mcd}(21,13)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 21 dividido entre 13 es 1 y sobran 8 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(21,13)=\mathrm{mcd}(13,8)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 5 &lt;br /&gt;
| 13 dividido entre 8 es 1 y sobran 5 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(13,8)=\mathrm{mcd}(8,5)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 6 &lt;br /&gt;
| 8 dividido entre 5 es 1 y sobran 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(8,5)=\mathrm{mcd}(5,3)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 7 &lt;br /&gt;
| 5 dividido entre 3 es 1 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(5,3)=\mathrm{mcd}(3,2)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 8 &lt;br /&gt;
| 3 dividido entre 2 es 1 y sobran 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(3,2)=\mathrm{mcd}(2,1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 9 &lt;br /&gt;
| 2 dividido entre 1 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2,1)=\mathrm{mcd}(1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; divisiones para calcular el máximo común divisor de &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;gt;m&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; bits, entonces el número promedio de divisiones necesarias es &amp;lt;math&amp;gt;\textstyle{\frac{\pi^2}{6}n}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; es el grado de los polinomios. &lt;br /&gt;
&lt;br /&gt;
== Implementación en pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 426px; height: 182px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b): &lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''Si''' b = 0 '''entonces''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''El resultado es''' a &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''En otro caso''': &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es''' mcd(b,amod b)&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 432px; height: 89px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b): &lt;br /&gt;
'''&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Mientras haga lo siguiente''': &lt;br /&gt;
&lt;br /&gt;
'''&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; El resultado es''' a &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 434px; height: 133px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo '''de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' Euclides(a,b):&lt;br /&gt;
&amp;amp;nbsp; '''Si''' b = 0 '''entonces''':&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es '''(a,1,0)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp; '''En otro caso''':&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 430px; height: 48px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' Euclides(a,b):&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''Mientras haga lo siguiente''':&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Divida ''a ''entre ''b'' para obtener un cociente ''q'' y un residuo''r'' &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es '''(a,s,t) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Acerca de la notación empleada: &lt;br /&gt;
&lt;br /&gt;
*''x'' gest ''y'' significa &amp;quot;asigne a la variable ''a ''el valor actual de ''b''&amp;quot;. En lenguajes como [[Lenguaje C|C]], [[Lenguaje de programación Java|Java]], [[C]], [[Python]] y [[Visual Basic]] esto significa simplemente &amp;lt;code&amp;gt;x = y&amp;lt;/code&amp;gt;. En otros lenguajes como [[Lenguaje de programación Pascal|Pascal]] se traduce en &amp;lt;code&amp;gt;a&amp;amp;nbsp;:= b&amp;lt;/code&amp;gt;, en [[Maxima]] es &amp;lt;code&amp;gt;a&amp;amp;nbsp;: b&amp;lt;/code&amp;gt;, en [[R–project|R]], S y [[Ocaml]] es &amp;lt;code&amp;gt;x &amp;amp;lt;– y&amp;lt;/code&amp;gt;, e inclusive se utiliza la flecha &amp;lt;code&amp;gt;x ← y&amp;lt;/code&amp;gt; como el caso de [[APL]]. &lt;br /&gt;
*(''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: &amp;lt;code&amp;gt;(x,y,z) = (a,b,c)&amp;lt;/code&amp;gt;. En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: &amp;lt;code&amp;gt;aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;&amp;lt;/code&amp;gt;. &lt;br /&gt;
*''a'' div ''b'' significa &amp;quot;el cociente de dividir ''a'' entre ''b''&amp;quot;. 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 &amp;lt;code&amp;gt;a/b&amp;lt;/code&amp;gt;. Otras maneras son &amp;lt;code&amp;gt;a\b&amp;lt;/code&amp;gt; (Visual Basic) , &amp;lt;code&amp;gt;a div b&amp;lt;/code&amp;gt; (Pascal) o bien &amp;lt;code&amp;gt;a//b&amp;lt;/code&amp;gt; (Python 3). &lt;br /&gt;
*''a'' mod ''b'' significa &amp;quot;el residuo de dividir ''a ''entre ''b''&amp;quot;. A esta operación se le conoce simplemente como ''módulo''. En muchos lenguajes de programación se implementa como &amp;lt;code&amp;gt;a&amp;amp;nbsp;% b&amp;lt;/code&amp;gt;, mientras que en otros es &amp;lt;code&amp;gt;a mod b&amp;lt;/code&amp;gt; (Visual Basic o Pascal) o bien &amp;lt;code&amp;gt;a rem b&amp;lt;/code&amp;gt; (Ada).&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*Von Zur Gathen, Joachim; Gerhard, Jürgen (2003). «The Euclidean Algorithm», Modern Computer Algebra. Cambridge&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 0-521-82646-2.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Shoup, Victor (2008). «Euclid´s algorithm», A Computational Introduction to Numbrer Theory and Algebra. Cambridge &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 978-0-521-85154-1.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Lipschutz, Seymour; Lipson, Marc (2009). «Propiedades de los enteros», Matemáticas Discretas. McGraw-Hill. ISBN 978-970-10-7236-3.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Brassard, Gilles; Bratley, Paul (1997). «Análisis de algoritmos», Fundamentos de Algoritmia. Madrid: PRENTICE HALL. ISBN &amp;lt;br&amp;gt;&amp;amp;nbsp;84-89660-00-X.&amp;lt;br&amp;gt; &lt;br /&gt;
*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. &amp;lt;br&amp;gt; &lt;br /&gt;
*Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford (2009). «Number-Theoretic Algorithms», Introduction to Algorithms. The MIT Press. ISBN 978-0-262-53305-8.&amp;lt;br&amp;gt; &lt;br /&gt;
*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&amp;amp;nbsp;968-9161-02-4.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Cárdenas, Humberto; Lluis, Emilio; Raggi, Francisco; Tomás, Francisco (2004).&amp;amp;nbsp;«Divisibilidad», Álgebra Superior. México: Trillas. ISBN 968-24-3783-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Pérez Segui, María Luisa (2006). «Divisibilidad», Teoría de Números. Instituto de Matemáticas, UNAM. ISBN 970-32-1170-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Baldor, Aurelio (2008). «Máximo común divisor», Álgebra. México: Grupo Editorial Patria. ISBN 978-970-817-000-0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67157</id>
		<title>Algoritmo de Euclides</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67157"/>
		<updated>2010-05-14T20:38:43Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mejorar|faltan las fuentes}} '''Algoritmo de Euclides:''' &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo original de Euclides  ==&lt;br /&gt;
&lt;br /&gt;
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 [[Conmensurable|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''. &lt;br /&gt;
&lt;br /&gt;
No cualquier par de segmentos es conmensurable, como encontraron los pitagóricos cuando establecen que&amp;amp;nbsp; no es un número racional, pero en el caso de dos segmentos conmensurables se desea hallar la mayor medida común posible. &lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;    '''''Para encontrar la máxima medida común de dos números que no sean primos entre sí.&lt;br /&gt;
Euclides VII-2.svg'''''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.&lt;br /&gt;
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.&lt;br /&gt;
Euclides. Elementos VII.2''&amp;lt;/pre&amp;gt; &lt;br /&gt;
En lenguaje moderno, el algoritmo se describe como sigue: &lt;br /&gt;
&lt;br /&gt;
#Dados dos segmentos ''AB'' y ''CD'' (con ''AB&amp;amp;gt;CD''), restamos ''CD'' de ''AB'' tantas veces como sea posible. Si no hay residuo, entonces ''CD'' es la máxima medida común. &lt;br /&gt;
#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. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
El hecho de que los segmentos son conmesurables es clave para asegurar que el proceso termina tarde o temprano &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides tradicional  ==&lt;br /&gt;
&lt;br /&gt;
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''. &lt;br /&gt;
&lt;br /&gt;
Según lo antes mencionado, para calcular el máximo común divisor de 2366 y 273 se puede proseguir de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| 2366 dividido entre 273 es 8 y sobran 182 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2366,273)=\mathrm{mcd}(273,182)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| 273 dividido entre 182 es 1 y sobran 91 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(273,182)=\mathrm{mcd}(182,91)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| 182 dividido entre 91 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(182,91)=\mathrm{mcd}(91,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
#Si ''b=0 ''entonces mcd(a,b) = a y el algoritmo termina &lt;br /&gt;
#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&lt;br /&gt;
&lt;br /&gt;
Asuma que llamamos a = r&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; y b = r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_0&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_1&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_0,r_1)=\mathrm{mcd}(r_1,r_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_2&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_1,r_2)=\mathrm{mcd}(r_2,r_3)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_4&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_2,r_3)=\mathrm{mcd}(r_3,r_4)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_{n-1}&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_n&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_{n-1},r_n)=\mathrm{mcd}(r_n,r_{n+1})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_{n+1}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; (el último residuo que no es cero). &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios P(x) = x&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; + 2x&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; + x y Q(x) = x&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; − 1 el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4-1)=\mathrm{mcd}(x^4-1,2x^3+2x)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4-1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,-x^2-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;-2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,-x^2-1)=\mathrm{mcd}(-x^2-1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es − x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; − 1. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;xmod y&amp;quot; significa &amp;quot;el residuo de dividir ''x'' entre y&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i-1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios &amp;lt;math&amp;gt;P(x)=x^5+2x^3+x&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;Q(x)=x^4–1&amp;lt;/math&amp;gt; el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4–1)=\mathrm{mcd}(x^4–1,2x^3+2x)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4–1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,–x^2–1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;–2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,–x^2–1)=\mathrm{mcd}(–x^2–1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;&amp;lt;math&amp;gt;x\bmod y&amp;lt;/math&amp;gt;&amp;quot; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i–1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides extendido  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo de Euclides extendido permite, además de encontrar un máximo común divisor de dos números enteros &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, expresarlo como la mínima combinación lineal de esos números, es decir, encontrar números enteros &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s+b t&amp;lt;/math&amp;gt;. Esto se generaliza también hacia cualquier dominio euclideano. &lt;br /&gt;
&lt;br /&gt;
=== Fundamentos  ===&lt;br /&gt;
&lt;br /&gt;
Existen varias maneras de explicar el algoritmo de Euclides extendido, una de las más comunes consiste en la siguiente: &lt;br /&gt;
&lt;br /&gt;
#Usar el algoritmo tradicional de Euclides. En cada paso, en lugar de &amp;quot;&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&amp;quot; se escribe la ecuación &amp;lt;math&amp;gt;a=b q+r&amp;lt;/math&amp;gt; (véase [[Algoritmo de la división]]). &lt;br /&gt;
#Se despejan los residuos de cada ecuación. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;2\times 2&amp;lt;/math&amp;gt; se usa la siguiente fórmula (vése [[Producto de matrices]]): {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}e&amp;amp;f\\g&amp;amp;h\end{bmatrix}\times\begin{bmatrix}a&amp;amp;b\\c&amp;amp;d\end{bmatrix}=\begin{bmatrix}e a+f c&amp;amp;e b+f d\\g a+h c&amp;amp;g b+h d\end{bmatrix}&amp;lt;/math&amp;gt;|1}} Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; que ahí se describen. Por cada valor &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; calculado se puede formar la matriz &amp;lt;math&amp;gt;\textstyle Q_i=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}&amp;lt;/math&amp;gt;. Usando la ecuación {{Eqnref|1}} de manera repetida se puede calcular el producto las primeras &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; matrices de este tipo: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_{i–1}\end{bmatrix}\times\cdots\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_1\end{bmatrix}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Resulta ser que los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; tienen la propiedad de que &amp;lt;math&amp;gt;r_i=a s_i+b t_i&amp;lt;/math&amp;gt;, es decir, expresan a &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; como una combinación lineal de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Particularmente, como &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=r_{n+1}&amp;lt;/math&amp;gt; entonces se tiene &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}&amp;lt;/math&amp;gt;, 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.&amp;amp;lt;!––Pero no colocaré la demostración en una enciclopedia––&amp;amp;gt; Es importante calcular &amp;lt;math&amp;gt;Q_i\times\cdots\times Q_3\times Q_2\times Q_1&amp;lt;/math&amp;gt; en ese mismo orden. La matriz &amp;lt;math&amp;gt;Q_1&amp;lt;/math&amp;gt; aparece en el extremo derecho y la matriz &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; en el izquierdo. &lt;br /&gt;
&lt;br /&gt;
Regresando al primer ejemplo, la sucesión de cocientes es &amp;lt;math&amp;gt;q_1=8&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_2=1&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;q_3=2&amp;lt;/math&amp;gt;. Entonces se puede calcular {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}–1&amp;amp;9\\3&amp;amp;–26\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–2\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–1\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–8\end{bmatrix}&amp;lt;/math&amp;gt;}} Utilizando el primer renglón de esta matriz se puede leer que &amp;lt;math&amp;gt;91=2366(–1)+273(9)&amp;lt;/math&amp;gt;, es decir, se ha encontrado la manera de expresar al máximo común divisor de 2366 y 273 como una combinación lineal. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; con la multiplicación de matrices: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix} =&lt;br /&gt;
\begin{bmatrix}s_i&amp;amp;t_i\\s_{i–1}–q_is_i&amp;amp;t_{i–1}–q_it_i\end{bmatrix} = \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times\begin{bmatrix}s_{i–1}&amp;amp;t_{i–1}\\s_i&amp;amp;t_i\end{bmatrix}&amp;lt;/math&amp;gt;}} De esta manera &amp;lt;math&amp;gt;s_{i+1} = s_{i–1}–q_is_i&amp;lt;/math&amp;gt; y además &amp;lt;math&amp;gt;t_{i+1} = t_{i–1}–q_it_i&amp;lt;/math&amp;gt;. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: {{Algoritmo|de Euclides extendido|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, y valores &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=as+bt&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a, r_1\gets b, s_0\gets 1, t_0\gets 0, s_1\gets 0, t_1\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## Divida &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;r_i &amp;lt;/math&amp;gt; para obtener el cociente &amp;lt;math&amp;gt;q_i &amp;lt;/math&amp;gt; y el residuo &amp;lt;math&amp;gt;r_{i+1} &amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;s_{i+1}\gets s_{i–1}–q_is_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;t_{i+1}\gets t_{i–1}–q_it_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; es un máximo común divisor de &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; y se expresa &amp;lt;math&amp;gt;r_{i–1}=as_{i–1}+bt_{i–1} &amp;lt;/math&amp;gt;&lt;br /&gt;
|2}} &lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
=== Simplificar fracciones  ===&lt;br /&gt;
&lt;br /&gt;
Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción &amp;lt;math&amp;gt;\textstyle\frac{65}{91}&amp;lt;/math&amp;gt; es equivalente con &amp;lt;math&amp;gt;\textstyle\frac 5 7&amp;lt;/math&amp;gt; (véase [[Número racional]]). De manera más general, &amp;lt;math&amp;gt;\textstyle\frac ab=\frac {ca}{cb}&amp;lt;/math&amp;gt; siempre que &amp;lt;math&amp;gt;c\ne0&amp;lt;/math&amp;gt;. Para reducir una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt;, sólo se necesita dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; entre su máximo común divisor. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si se desea reducir &amp;lt;math&amp;gt;\textstyle\frac{166}{249}&amp;lt;/math&amp;gt;, primero se usa el algoritmo de Euclides para encontrar &amp;lt;math&amp;gt;\mathrm{mcd}(166,249)=83&amp;lt;/math&amp;gt;. Se hacen las divisiones &amp;lt;math&amp;gt;\textstyle 166\div 83 = 2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\textstyle 249\div 83 = 3&amp;lt;/math&amp;gt;. Luego entonces se concluye que &amp;lt;math&amp;gt;\textstyle\frac{166}{249}=\frac 2 3&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Fracciones continuas  ===&lt;br /&gt;
&lt;br /&gt;
La sucesión de divisiones que se efectúan al seguir algoritmo de Euclides puede ser utilizada para expresar una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt; como [[Fracción continua]]. Esto se debe a que si &amp;lt;math&amp;gt;a = bq + r&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r\neq 0&amp;lt;/math&amp;gt;, entonces {{ecuación|&amp;lt;math&amp;gt;\frac a b = q + \frac 1 {\frac b r}&amp;lt;/math&amp;gt;|3}} &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para encontrar el máximo común divisor de &amp;lt;math&amp;gt;93164&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;5826&amp;lt;/math&amp;gt; el algoritmo genera la siguiente secuencia de divisiones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 93164 dividido entre 5826 es 15 y sobran 5774 &lt;br /&gt;
| &amp;lt;math&amp;gt;93164=5826\times 15+5774&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 5826 dividido entre 5774 es 1 y sobran 52 &lt;br /&gt;
| &amp;lt;math&amp;gt;5826=5774\times 1+52&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 5774 dividido entre 52 es 111 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;5774=52\times 111+2&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 52 dividido entre 2 es 26 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;52=2\times 26+0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Todas estas ecuaciones las podemos hacer parecidas a la ecuación {{eqnref | 3}}: &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5774}{52}=111+ \frac 1 {\frac{52}{2}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{52}{2}=26&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se substituye la segunda ecuación en la primera, se obtiene {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {\frac{5774}{52}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Si se repite este proceso de substitución entonces se obtiene la expresión deseada: {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {111+ \frac 1 {26}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma {{Ecuación|&amp;lt;math&amp;gt;\frac{a}{b}=q_1+ \frac 1 {q_2+ \frac 1 {q_3+ \frac 1 {\ddots q_{n–1}+ \frac 1 {q_n}}}}&amp;lt;/math&amp;gt;}} &amp;amp;lt;!–– Esto va en la sección siguiente: Volviendo al caso &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; enteros, el algoritmo de Euclides permite encontrar los coeficientes enteros &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; de la [[Identidad de Bézout]] &amp;lt;math&amp;gt;au+bv=\mathrm{mcd}(a, b)&amp;lt;/math&amp;gt; de fundamental importancia en la [[Aritmética]]. ––&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Inversos modulares  ===&lt;br /&gt;
&lt;br /&gt;
Decimos que dos números enteros son ''congruentes módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;'' (aunque también se puede generalizar para cualquier otro dominio euclídeo) si al dividirlos entre &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; 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 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; es congruente con &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; se escribe &amp;lt;math&amp;gt;a\equiv b\pmod m&amp;lt;/math&amp;gt;, en el ejemplo anterior se tiene &amp;lt;math&amp;gt;7\equiv 12\pmod 5&amp;lt;/math&amp;gt;. Supóngase que se conocen los valores de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, pero que se desconoce el valor &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; de la siguiente ecuación: {{Ecuacion |&amp;lt;math&amp;gt;a x\equiv b\pmod m&amp;lt;/math&amp;gt;|2}} Basta con encontrar un valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; que tenga la característica de que &amp;lt;math&amp;gt;a^{–1} a\equiv 1\pmod m&amp;lt;/math&amp;gt;, pues de esta manera al multiplicar la ecuación {{eqnref|2}} por &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se tendría la solución deseada: {{Ecuacion | &amp;lt;math&amp;gt;x\equiv a^{–1} b\pmod m&amp;lt;/math&amp;gt;}} Al valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se le llama ''inverso modular'' de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Desafortunadamente este valor no siempre existe. Por ejemplo, con &amp;lt;math&amp;gt;a=4&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m=6&amp;lt;/math&amp;gt; no existe ningún número entero entero &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;a^{–1} 4\equiv 1\pmod 6&amp;lt;/math&amp;gt;. De hecho este valor existe si y sólo si &amp;lt;math&amp;gt;\mathrm{mcd}(a,m)=1&amp;lt;/math&amp;gt;. Más aún, si al usar el algoritmo de Euclides extendido (ahora con &amp;lt;math&amp;gt;b=m&amp;lt;/math&amp;gt;) se obtiene &amp;lt;math&amp;gt;1=as+mt&amp;lt;/math&amp;gt;, entonces el valor &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; es el inverso modular de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. &amp;amp;lt;!––LA DEMOSTRACIÓN NO ES BUENO COLOCARLA EN LA ENCICLOPEDIA––&amp;amp;gt; Por ejemplo, se desea resolver la ecuación {{Ecuacion |&amp;lt;math&amp;gt;5 x\equiv 2\pmod 9&amp;lt;/math&amp;gt;}} Entonces con el algoritmo de Euclides extendido se calcula que &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1=5(2)+9(–1)&amp;lt;/math&amp;gt;. Como &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1&amp;lt;/math&amp;gt; entonces 5 tiene un inverso modular. Más aún, como &amp;lt;math&amp;gt;1=5(2)+9(–1)&amp;lt;/math&amp;gt;, entonces ese inverso es 2. Entonces {{Ecuacion |&amp;lt;math&amp;gt;x\equiv 2(2)\pmod 9&amp;lt;/math&amp;gt;}} Es decir que el valor de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Véase [[Multiplicador modular inverso]] &lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
[[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.]] &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;f_{10}=55&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;f_{11}=89&amp;lt;/math&amp;gt; se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 89 dividido entre 55 es 1 y sobran 34 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(89,55)=\mathrm{mcd}(55,34)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 55 dividido entre 34 es 1 y sobran 21 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(55,34)=\mathrm{mcd}(34,21)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 34 dividido entre 21 es 1 y sobran 13 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(34,21)=\mathrm{mcd}(21,13)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 21 dividido entre 13 es 1 y sobran 8 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(21,13)=\mathrm{mcd}(13,8)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 5 &lt;br /&gt;
| 13 dividido entre 8 es 1 y sobran 5 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(13,8)=\mathrm{mcd}(8,5)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 6 &lt;br /&gt;
| 8 dividido entre 5 es 1 y sobran 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(8,5)=\mathrm{mcd}(5,3)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 7 &lt;br /&gt;
| 5 dividido entre 3 es 1 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(5,3)=\mathrm{mcd}(3,2)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 8 &lt;br /&gt;
| 3 dividido entre 2 es 1 y sobran 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(3,2)=\mathrm{mcd}(2,1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 9 &lt;br /&gt;
| 2 dividido entre 1 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2,1)=\mathrm{mcd}(1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; divisiones para calcular el máximo común divisor de &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;gt;m&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; bits, entonces el número promedio de divisiones necesarias es &amp;lt;math&amp;gt;\textstyle{\frac{\pi^2}{6}n}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; es el grado de los polinomios. &lt;br /&gt;
&lt;br /&gt;
== Implementación en pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 429px; height: 163px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b):&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''Si''' b = 0 '''entonces''':&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''El resultado es''' a&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp; '''En otro caso''':&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''El resultado es''' mcd(b,amod b)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;width: 432px; height: 89px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Algoritmo''' de Euclides tradicional implementado de manera recurrente&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| '''Función''' mcd(a,b):&lt;br /&gt;
'''Mientras haga lo siguiente''':&lt;br /&gt;
&lt;br /&gt;
'''El resultado es''' a &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Acerca de la notación empleada: &lt;br /&gt;
&lt;br /&gt;
*''x'' gest ''y'' significa &amp;quot;asigne a la variable ''a ''el valor actual de ''b''&amp;quot;. En lenguajes como [[Lenguaje C|C]], [[Lenguaje de programación Java|Java]], [[C]], [[Python]] y [[Visual Basic]] esto significa simplemente &amp;lt;code&amp;gt;x = y&amp;lt;/code&amp;gt;. En otros lenguajes como [[Lenguaje de programación Pascal|Pascal]] se traduce en &amp;lt;code&amp;gt;a&amp;amp;nbsp;:= b&amp;lt;/code&amp;gt;, en [[Maxima]] es &amp;lt;code&amp;gt;a&amp;amp;nbsp;: b&amp;lt;/code&amp;gt;, en [[R–project|R]], S y [[Ocaml]] es &amp;lt;code&amp;gt;x &amp;amp;lt;– y&amp;lt;/code&amp;gt;, e inclusive se utiliza la flecha &amp;lt;code&amp;gt;x ← y&amp;lt;/code&amp;gt; como el caso de [[APL]]. &lt;br /&gt;
*(''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: &amp;lt;code&amp;gt;(x,y,z) = (a,b,c)&amp;lt;/code&amp;gt;. En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: &amp;lt;code&amp;gt;aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;&amp;lt;/code&amp;gt;. &lt;br /&gt;
*''a'' div ''b'' significa &amp;quot;el cociente de dividir ''a'' entre ''b''&amp;quot;. 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 &amp;lt;code&amp;gt;a/b&amp;lt;/code&amp;gt;. Otras maneras son &amp;lt;code&amp;gt;a\b&amp;lt;/code&amp;gt; (Visual Basic) , &amp;lt;code&amp;gt;a div b&amp;lt;/code&amp;gt; (Pascal) o bien &amp;lt;code&amp;gt;a//b&amp;lt;/code&amp;gt; (Python 3). &lt;br /&gt;
*''a'' mod ''b'' significa &amp;quot;el residuo de dividir ''a ''entre ''b''&amp;quot;. A esta operación se le conoce simplemente como ''módulo''. En muchos lenguajes de programación se implementa como &amp;lt;code&amp;gt;a&amp;amp;nbsp;% b&amp;lt;/code&amp;gt;, mientras que en otros es &amp;lt;code&amp;gt;a mod b&amp;lt;/code&amp;gt; (Visual Basic o Pascal) o bien &amp;lt;code&amp;gt;a rem b&amp;lt;/code&amp;gt; (Ada).&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*Von Zur Gathen, Joachim; Gerhard, Jürgen (2003). «The Euclidean Algorithm», Modern Computer Algebra. Cambridge&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 0-521-82646-2.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Shoup, Victor (2008). «Euclid´s algorithm», A Computational Introduction to Numbrer Theory and Algebra. Cambridge &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 978-0-521-85154-1.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Lipschutz, Seymour; Lipson, Marc (2009). «Propiedades de los enteros», Matemáticas Discretas. McGraw-Hill. ISBN 978-970-10-7236-3.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Brassard, Gilles; Bratley, Paul (1997). «Análisis de algoritmos», Fundamentos de Algoritmia. Madrid: PRENTICE HALL. ISBN &amp;lt;br&amp;gt;&amp;amp;nbsp;84-89660-00-X.&amp;lt;br&amp;gt; &lt;br /&gt;
*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. &amp;lt;br&amp;gt; &lt;br /&gt;
*Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford (2009). «Number-Theoretic Algorithms», Introduction to Algorithms. The MIT Press. ISBN 978-0-262-53305-8.&amp;lt;br&amp;gt; &lt;br /&gt;
*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&amp;amp;nbsp;968-9161-02-4.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Cárdenas, Humberto; Lluis, Emilio; Raggi, Francisco; Tomás, Francisco (2004).&amp;amp;nbsp;«Divisibilidad», Álgebra Superior. México: Trillas. ISBN 968-24-3783-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Pérez Segui, María Luisa (2006). «Divisibilidad», Teoría de Números. Instituto de Matemáticas, UNAM. ISBN 970-32-1170-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Baldor, Aurelio (2008). «Máximo común divisor», Álgebra. México: Grupo Editorial Patria. ISBN 978-970-817-000-0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Plantilla:Algoritmo&amp;diff=67148</id>
		<title>Plantilla:Algoritmo</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Plantilla:Algoritmo&amp;diff=67148"/>
		<updated>2010-05-14T20:32:13Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '{{Algoritmo|de Euclides extendido implementado de manera iterativa con matrices| '''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':''' :&amp;lt;math&amp;gt;Q\gets\begin{pmatrix}1&amp;amp;0\\0&amp;amp;1\end{…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Algoritmo|de Euclides extendido implementado de manera iterativa con matrices|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:&amp;lt;math&amp;gt;Q\gets\begin{pmatrix}1&amp;amp;0\\0&amp;amp;1\end{pmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::Divida &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; para obtener un cociente &amp;lt;math&amp;gt;q &amp;lt;/math&amp;gt; y un residuo &amp;lt;math&amp;gt;r &amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;Q\gets\begin{pmatrix}0&amp;amp;1\\1&amp;amp;-q\end{pmatrix}\times Q&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,b)\gets(b,r)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;(a,Q_{1 1},Q_{1 2})&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67144</id>
		<title>Algoritmo de Euclides</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67144"/>
		<updated>2010-05-14T20:31:23Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mejorar|faltan las fuentes}} '''Algoritmo de Euclides:''' &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo original de Euclides  ==&lt;br /&gt;
&lt;br /&gt;
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 [[Conmensurable|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''. &lt;br /&gt;
&lt;br /&gt;
No cualquier par de segmentos es conmensurable, como encontraron los pitagóricos cuando establecen que&amp;amp;nbsp; no es un número racional, pero en el caso de dos segmentos conmensurables se desea hallar la mayor medida común posible. &lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;    '''''Para encontrar la máxima medida común de dos números que no sean primos entre sí.&lt;br /&gt;
Euclides VII-2.svg'''''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.&lt;br /&gt;
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.&lt;br /&gt;
Euclides. Elementos VII.2''&amp;lt;/pre&amp;gt; &lt;br /&gt;
En lenguaje moderno, el algoritmo se describe como sigue: &lt;br /&gt;
&lt;br /&gt;
#Dados dos segmentos ''AB'' y ''CD'' (con ''AB&amp;amp;gt;CD''), restamos ''CD'' de ''AB'' tantas veces como sea posible. Si no hay residuo, entonces ''CD'' es la máxima medida común. &lt;br /&gt;
#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. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
El hecho de que los segmentos son conmesurables es clave para asegurar que el proceso termina tarde o temprano &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides tradicional  ==&lt;br /&gt;
&lt;br /&gt;
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''. &lt;br /&gt;
&lt;br /&gt;
Según lo antes mencionado, para calcular el máximo común divisor de 2366 y 273 se puede proseguir de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| 2366 dividido entre 273 es 8 y sobran 182 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2366,273)=\mathrm{mcd}(273,182)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| 273 dividido entre 182 es 1 y sobran 91 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(273,182)=\mathrm{mcd}(182,91)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| 182 dividido entre 91 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(182,91)=\mathrm{mcd}(91,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
#Si ''b=0 ''entonces mcd(a,b) = a y el algoritmo termina &lt;br /&gt;
#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&lt;br /&gt;
&lt;br /&gt;
Asuma que llamamos a = r&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; y b = r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_0&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_1&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_0,r_1)=\mathrm{mcd}(r_1,r_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_2&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_1,r_2)=\mathrm{mcd}(r_2,r_3)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_4&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_2,r_3)=\mathrm{mcd}(r_3,r_4)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_{n-1}&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_n&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_{n-1},r_n)=\mathrm{mcd}(r_n,r_{n+1})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_{n+1}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; (el último residuo que no es cero). &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios P(x) = x&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; + 2x&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; + x y Q(x) = x&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; − 1 el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4-1)=\mathrm{mcd}(x^4-1,2x^3+2x)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4-1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,-x^2-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;-2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,-x^2-1)=\mathrm{mcd}(-x^2-1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es − x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; − 1. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;xmod y&amp;quot; significa &amp;quot;el residuo de dividir ''x'' entre y&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i-1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios &amp;lt;math&amp;gt;P(x)=x^5+2x^3+x&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;Q(x)=x^4–1&amp;lt;/math&amp;gt; el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4–1)=\mathrm{mcd}(x^4–1,2x^3+2x)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4–1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,–x^2–1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;–2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,–x^2–1)=\mathrm{mcd}(–x^2–1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;&amp;lt;math&amp;gt;x\bmod y&amp;lt;/math&amp;gt;&amp;quot; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i–1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides extendido  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo de Euclides extendido permite, además de encontrar un máximo común divisor de dos números enteros &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, expresarlo como la mínima combinación lineal de esos números, es decir, encontrar números enteros &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s+b t&amp;lt;/math&amp;gt;. Esto se generaliza también hacia cualquier dominio euclideano. &lt;br /&gt;
&lt;br /&gt;
=== Fundamentos  ===&lt;br /&gt;
&lt;br /&gt;
Existen varias maneras de explicar el algoritmo de Euclides extendido, una de las más comunes consiste en la siguiente: &lt;br /&gt;
&lt;br /&gt;
#Usar el algoritmo tradicional de Euclides. En cada paso, en lugar de &amp;quot;&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&amp;quot; se escribe la ecuación &amp;lt;math&amp;gt;a=b q+r&amp;lt;/math&amp;gt; (véase [[Algoritmo de la división]]). &lt;br /&gt;
#Se despejan los residuos de cada ecuación. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;2\times 2&amp;lt;/math&amp;gt; se usa la siguiente fórmula (vése [[Producto de matrices]]): {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}e&amp;amp;f\\g&amp;amp;h\end{bmatrix}\times\begin{bmatrix}a&amp;amp;b\\c&amp;amp;d\end{bmatrix}=\begin{bmatrix}e a+f c&amp;amp;e b+f d\\g a+h c&amp;amp;g b+h d\end{bmatrix}&amp;lt;/math&amp;gt;|1}} Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; que ahí se describen. Por cada valor &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; calculado se puede formar la matriz &amp;lt;math&amp;gt;\textstyle Q_i=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}&amp;lt;/math&amp;gt;. Usando la ecuación {{Eqnref|1}} de manera repetida se puede calcular el producto las primeras &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; matrices de este tipo: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_{i–1}\end{bmatrix}\times\cdots\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_1\end{bmatrix}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Resulta ser que los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; tienen la propiedad de que &amp;lt;math&amp;gt;r_i=a s_i+b t_i&amp;lt;/math&amp;gt;, es decir, expresan a &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; como una combinación lineal de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Particularmente, como &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=r_{n+1}&amp;lt;/math&amp;gt; entonces se tiene &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}&amp;lt;/math&amp;gt;, 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.&amp;amp;lt;!––Pero no colocaré la demostración en una enciclopedia––&amp;amp;gt; Es importante calcular &amp;lt;math&amp;gt;Q_i\times\cdots\times Q_3\times Q_2\times Q_1&amp;lt;/math&amp;gt; en ese mismo orden. La matriz &amp;lt;math&amp;gt;Q_1&amp;lt;/math&amp;gt; aparece en el extremo derecho y la matriz &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; en el izquierdo. &lt;br /&gt;
&lt;br /&gt;
Regresando al primer ejemplo, la sucesión de cocientes es &amp;lt;math&amp;gt;q_1=8&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_2=1&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;q_3=2&amp;lt;/math&amp;gt;. Entonces se puede calcular {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}–1&amp;amp;9\\3&amp;amp;–26\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–2\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–1\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–8\end{bmatrix}&amp;lt;/math&amp;gt;}} Utilizando el primer renglón de esta matriz se puede leer que &amp;lt;math&amp;gt;91=2366(–1)+273(9)&amp;lt;/math&amp;gt;, es decir, se ha encontrado la manera de expresar al máximo común divisor de 2366 y 273 como una combinación lineal. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; con la multiplicación de matrices: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix} =&lt;br /&gt;
\begin{bmatrix}s_i&amp;amp;t_i\\s_{i–1}–q_is_i&amp;amp;t_{i–1}–q_it_i\end{bmatrix} = \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times\begin{bmatrix}s_{i–1}&amp;amp;t_{i–1}\\s_i&amp;amp;t_i\end{bmatrix}&amp;lt;/math&amp;gt;}} De esta manera &amp;lt;math&amp;gt;s_{i+1} = s_{i–1}–q_is_i&amp;lt;/math&amp;gt; y además &amp;lt;math&amp;gt;t_{i+1} = t_{i–1}–q_it_i&amp;lt;/math&amp;gt;. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: {{Algoritmo|de Euclides extendido|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, y valores &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=as+bt&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a, r_1\gets b, s_0\gets 1, t_0\gets 0, s_1\gets 0, t_1\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## Divida &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;r_i &amp;lt;/math&amp;gt; para obtener el cociente &amp;lt;math&amp;gt;q_i &amp;lt;/math&amp;gt; y el residuo &amp;lt;math&amp;gt;r_{i+1} &amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;s_{i+1}\gets s_{i–1}–q_is_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;t_{i+1}\gets t_{i–1}–q_it_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; es un máximo común divisor de &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; y se expresa &amp;lt;math&amp;gt;r_{i–1}=as_{i–1}+bt_{i–1} &amp;lt;/math&amp;gt;&lt;br /&gt;
|2}} &lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
=== Simplificar fracciones  ===&lt;br /&gt;
&lt;br /&gt;
Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción &amp;lt;math&amp;gt;\textstyle\frac{65}{91}&amp;lt;/math&amp;gt; es equivalente con &amp;lt;math&amp;gt;\textstyle\frac 5 7&amp;lt;/math&amp;gt; (véase [[Número racional]]). De manera más general, &amp;lt;math&amp;gt;\textstyle\frac ab=\frac {ca}{cb}&amp;lt;/math&amp;gt; siempre que &amp;lt;math&amp;gt;c\ne0&amp;lt;/math&amp;gt;. Para reducir una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt;, sólo se necesita dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; entre su máximo común divisor. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si se desea reducir &amp;lt;math&amp;gt;\textstyle\frac{166}{249}&amp;lt;/math&amp;gt;, primero se usa el algoritmo de Euclides para encontrar &amp;lt;math&amp;gt;\mathrm{mcd}(166,249)=83&amp;lt;/math&amp;gt;. Se hacen las divisiones &amp;lt;math&amp;gt;\textstyle 166\div 83 = 2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\textstyle 249\div 83 = 3&amp;lt;/math&amp;gt;. Luego entonces se concluye que &amp;lt;math&amp;gt;\textstyle\frac{166}{249}=\frac 2 3&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Fracciones continuas  ===&lt;br /&gt;
&lt;br /&gt;
La sucesión de divisiones que se efectúan al seguir algoritmo de Euclides puede ser utilizada para expresar una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt; como [[Fracción continua]]. Esto se debe a que si &amp;lt;math&amp;gt;a = bq + r&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r\neq 0&amp;lt;/math&amp;gt;, entonces {{ecuación|&amp;lt;math&amp;gt;\frac a b = q + \frac 1 {\frac b r}&amp;lt;/math&amp;gt;|3}} &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para encontrar el máximo común divisor de &amp;lt;math&amp;gt;93164&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;5826&amp;lt;/math&amp;gt; el algoritmo genera la siguiente secuencia de divisiones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 93164 dividido entre 5826 es 15 y sobran 5774 &lt;br /&gt;
| &amp;lt;math&amp;gt;93164=5826\times 15+5774&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 5826 dividido entre 5774 es 1 y sobran 52 &lt;br /&gt;
| &amp;lt;math&amp;gt;5826=5774\times 1+52&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 5774 dividido entre 52 es 111 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;5774=52\times 111+2&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 52 dividido entre 2 es 26 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;52=2\times 26+0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Todas estas ecuaciones las podemos hacer parecidas a la ecuación {{eqnref | 3}}: &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5774}{52}=111+ \frac 1 {\frac{52}{2}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{52}{2}=26&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se substituye la segunda ecuación en la primera, se obtiene {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {\frac{5774}{52}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Si se repite este proceso de substitución entonces se obtiene la expresión deseada: {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {111+ \frac 1 {26}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma {{Ecuación|&amp;lt;math&amp;gt;\frac{a}{b}=q_1+ \frac 1 {q_2+ \frac 1 {q_3+ \frac 1 {\ddots q_{n–1}+ \frac 1 {q_n}}}}&amp;lt;/math&amp;gt;}} &amp;amp;lt;!–– Esto va en la sección siguiente: Volviendo al caso &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; enteros, el algoritmo de Euclides permite encontrar los coeficientes enteros &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; de la [[Identidad de Bézout]] &amp;lt;math&amp;gt;au+bv=\mathrm{mcd}(a, b)&amp;lt;/math&amp;gt; de fundamental importancia en la [[Aritmética]]. ––&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Inversos modulares  ===&lt;br /&gt;
&lt;br /&gt;
Decimos que dos números enteros son ''congruentes módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;'' (aunque también se puede generalizar para cualquier otro dominio euclídeo) si al dividirlos entre &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; 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 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; es congruente con &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; se escribe &amp;lt;math&amp;gt;a\equiv b\pmod m&amp;lt;/math&amp;gt;, en el ejemplo anterior se tiene &amp;lt;math&amp;gt;7\equiv 12\pmod 5&amp;lt;/math&amp;gt;. Supóngase que se conocen los valores de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, pero que se desconoce el valor &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; de la siguiente ecuación: {{Ecuacion |&amp;lt;math&amp;gt;a x\equiv b\pmod m&amp;lt;/math&amp;gt;|2}} Basta con encontrar un valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; que tenga la característica de que &amp;lt;math&amp;gt;a^{–1} a\equiv 1\pmod m&amp;lt;/math&amp;gt;, pues de esta manera al multiplicar la ecuación {{eqnref|2}} por &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se tendría la solución deseada: {{Ecuacion | &amp;lt;math&amp;gt;x\equiv a^{–1} b\pmod m&amp;lt;/math&amp;gt;}} Al valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se le llama ''inverso modular'' de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Desafortunadamente este valor no siempre existe. Por ejemplo, con &amp;lt;math&amp;gt;a=4&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m=6&amp;lt;/math&amp;gt; no existe ningún número entero entero &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;a^{–1} 4\equiv 1\pmod 6&amp;lt;/math&amp;gt;. De hecho este valor existe si y sólo si &amp;lt;math&amp;gt;\mathrm{mcd}(a,m)=1&amp;lt;/math&amp;gt;. Más aún, si al usar el algoritmo de Euclides extendido (ahora con &amp;lt;math&amp;gt;b=m&amp;lt;/math&amp;gt;) se obtiene &amp;lt;math&amp;gt;1=as+mt&amp;lt;/math&amp;gt;, entonces el valor &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; es el inverso modular de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. &amp;amp;lt;!––LA DEMOSTRACIÓN NO ES BUENO COLOCARLA EN LA ENCICLOPEDIA––&amp;amp;gt; Por ejemplo, se desea resolver la ecuación {{Ecuacion |&amp;lt;math&amp;gt;5 x\equiv 2\pmod 9&amp;lt;/math&amp;gt;}} Entonces con el algoritmo de Euclides extendido se calcula que &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1=5(2)+9(–1)&amp;lt;/math&amp;gt;. Como &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1&amp;lt;/math&amp;gt; entonces 5 tiene un inverso modular. Más aún, como &amp;lt;math&amp;gt;1=5(2)+9(–1)&amp;lt;/math&amp;gt;, entonces ese inverso es 2. Entonces {{Ecuacion |&amp;lt;math&amp;gt;x\equiv 2(2)\pmod 9&amp;lt;/math&amp;gt;}} Es decir que el valor de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Véase [[Multiplicador modular inverso]] &lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
[[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.]] &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;f_{10}=55&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;f_{11}=89&amp;lt;/math&amp;gt; se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 89 dividido entre 55 es 1 y sobran 34 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(89,55)=\mathrm{mcd}(55,34)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 55 dividido entre 34 es 1 y sobran 21 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(55,34)=\mathrm{mcd}(34,21)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 34 dividido entre 21 es 1 y sobran 13 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(34,21)=\mathrm{mcd}(21,13)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 21 dividido entre 13 es 1 y sobran 8 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(21,13)=\mathrm{mcd}(13,8)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 5 &lt;br /&gt;
| 13 dividido entre 8 es 1 y sobran 5 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(13,8)=\mathrm{mcd}(8,5)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 6 &lt;br /&gt;
| 8 dividido entre 5 es 1 y sobran 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(8,5)=\mathrm{mcd}(5,3)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 7 &lt;br /&gt;
| 5 dividido entre 3 es 1 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(5,3)=\mathrm{mcd}(3,2)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 8 &lt;br /&gt;
| 3 dividido entre 2 es 1 y sobran 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(3,2)=\mathrm{mcd}(2,1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 9 &lt;br /&gt;
| 2 dividido entre 1 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2,1)=\mathrm{mcd}(1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; divisiones para calcular el máximo común divisor de &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;gt;m&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; bits, entonces el número promedio de divisiones necesarias es &amp;lt;math&amp;gt;\textstyle{\frac{\pi^2}{6}n}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; es el grado de los polinomios. &lt;br /&gt;
&lt;br /&gt;
== Implementación en pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
{{Algoritmo|de Euclides tradicional implementado de manera recurrente|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:'''Si''' &amp;lt;math&amp;gt;b=0 &amp;lt;/math&amp;gt; '''entonces:'''&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt;&lt;br /&gt;
:'''En otro caso:'''&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;\mathrm{mcd}(b,a\bmod b)&amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides tradicional implementado de manera iterativa|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,b)\gets(b,a\bmod b)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides extendido implementado de manera recurrente|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:'''Si''' &amp;lt;math&amp;gt;b=0 &amp;lt;/math&amp;gt; '''entonces:'''&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;(a,1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''En otro caso:'''&lt;br /&gt;
::&amp;lt;math&amp;gt;(d,s,t)\gets{\it Euclides}(b,a\bmod b)&amp;lt;/math&amp;gt;&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;(d,t,s–(a\div b) t)&amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides extendido implementado de manera iterativa|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:&amp;lt;math&amp;gt;(s,t,s^\prime,t^\prime)\gets(1,0,0,1)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::Divida &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; para obtener un cociente &amp;lt;math&amp;gt;q &amp;lt;/math&amp;gt; y un residuo &amp;lt;math&amp;gt;r &amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,s,t,b,s^\prime,t^\prime)\gets(b,s^\prime,t^\prime,r,s–s^\prime q,t–t^\prime q)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;(a,s,t)&amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides extendido implementado de manera iterativa con matrices|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:&amp;lt;math&amp;gt;Q\gets\begin{pmatrix}1&amp;amp;0\\0&amp;amp;1\end{pmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::Divida &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; para obtener un cociente &amp;lt;math&amp;gt;q &amp;lt;/math&amp;gt; y un residuo &amp;lt;math&amp;gt;r &amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;Q\gets\begin{pmatrix}0&amp;amp;1\\1&amp;amp;–q\end{pmatrix}\times Q&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,b)\gets(b,r)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;(a,Q_{1 1},Q_{1 2})&amp;lt;/math&amp;gt;&lt;br /&gt;
}} &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Acerca de la notación empleada: &lt;br /&gt;
&lt;br /&gt;
*''x'' gest ''y'' significa &amp;quot;asigne a la variable ''a ''el valor actual de ''b''&amp;quot;. En lenguajes como [[Lenguaje C|C]], [[Lenguaje de programación Java|Java]], [[C]], [[Python]] y [[Visual Basic]] esto significa simplemente &amp;lt;code&amp;gt;x = y&amp;lt;/code&amp;gt;. En otros lenguajes como [[Lenguaje de programación Pascal|Pascal]] se traduce en &amp;lt;code&amp;gt;a&amp;amp;nbsp;:= b&amp;lt;/code&amp;gt;, en [[Maxima]] es &amp;lt;code&amp;gt;a&amp;amp;nbsp;: b&amp;lt;/code&amp;gt;, en [[R–project|R]], S y [[Ocaml]] es &amp;lt;code&amp;gt;x &amp;amp;lt;– y&amp;lt;/code&amp;gt;, e inclusive se utiliza la flecha &amp;lt;code&amp;gt;x ← y&amp;lt;/code&amp;gt; como el caso de [[APL]]. &lt;br /&gt;
*(''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: &amp;lt;code&amp;gt;(x,y,z) = (a,b,c)&amp;lt;/code&amp;gt;. En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: &amp;lt;code&amp;gt;aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;&amp;lt;/code&amp;gt;. &lt;br /&gt;
*''a'' div ''b'' significa &amp;quot;el cociente de dividir ''a'' entre ''b''&amp;quot;. 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 &amp;lt;code&amp;gt;a/b&amp;lt;/code&amp;gt;. Otras maneras son &amp;lt;code&amp;gt;a\b&amp;lt;/code&amp;gt; (Visual Basic) , &amp;lt;code&amp;gt;a div b&amp;lt;/code&amp;gt; (Pascal) o bien &amp;lt;code&amp;gt;a//b&amp;lt;/code&amp;gt; (Python 3). &lt;br /&gt;
*''a'' mod ''b'' significa &amp;quot;el residuo de dividir ''a ''entre ''b''&amp;quot;. A esta operación se le conoce simplemente como ''módulo''. En muchos lenguajes de programación se implementa como &amp;lt;code&amp;gt;a&amp;amp;nbsp;% b&amp;lt;/code&amp;gt;, mientras que en otros es &amp;lt;code&amp;gt;a mod b&amp;lt;/code&amp;gt; (Visual Basic o Pascal) o bien &amp;lt;code&amp;gt;a rem b&amp;lt;/code&amp;gt; (Ada).&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*Von Zur Gathen, Joachim; Gerhard, Jürgen (2003). «The Euclidean Algorithm», Modern Computer Algebra. Cambridge&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 0-521-82646-2.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*Shoup, Victor (2008). «Euclid´s algorithm», A Computational Introduction to Numbrer Theory and Algebra. Cambridge &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 978-0-521-85154-1.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Lipschutz, Seymour; Lipson, Marc (2009). «Propiedades de los enteros», Matemáticas Discretas. McGraw-Hill. ISBN 978-970-10-7236-3.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Brassard, Gilles; Bratley, Paul (1997). «Análisis de algoritmos», Fundamentos de Algoritmia. Madrid: PRENTICE HALL. ISBN &amp;lt;br&amp;gt;&amp;amp;nbsp;84-89660-00-X.&amp;lt;br&amp;gt; &lt;br /&gt;
*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. &amp;lt;br&amp;gt; &lt;br /&gt;
*Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford (2009). «Number-Theoretic Algorithms», Introduction to Algorithms. The MIT Press. ISBN 978-0-262-53305-8.&amp;lt;br&amp;gt; &lt;br /&gt;
*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&amp;amp;nbsp;968-9161-02-4.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp; Cárdenas, Humberto; Lluis, Emilio; Raggi, Francisco; Tomás, Francisco (2004).&amp;amp;nbsp;«Divisibilidad», Álgebra Superior. México: Trillas. ISBN 968-24-3783-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Pérez Segui, María Luisa (2006). «Divisibilidad», Teoría de Números. Instituto de Matemáticas, UNAM. ISBN 970-32-1170-0.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;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.&amp;lt;br&amp;gt; &lt;br /&gt;
*&amp;amp;nbsp;Baldor, Aurelio (2008). «Máximo común divisor», Álgebra. México: Grupo Editorial Patria. ISBN 978-970-817-000-0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67088</id>
		<title>Algoritmo de Euclides</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=67088"/>
		<updated>2010-05-14T20:04:40Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mejorar|faltan las fuentes}} '''Algoritmo de Euclides:''' &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo original de Euclides  ==&lt;br /&gt;
&lt;br /&gt;
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 [[Conmensurable|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''. &lt;br /&gt;
&lt;br /&gt;
No cualquier par de segmentos es conmensurable, como encontraron los pitagóricos cuando establecen que&amp;amp;nbsp; no es un número racional, pero en el caso de dos segmentos conmensurables se desea hallar la mayor medida común posible. &lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;    '''''Para encontrar la máxima medida común de dos números que no sean primos entre sí.&lt;br /&gt;
Euclides VII-2.svg'''''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.&lt;br /&gt;
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.&lt;br /&gt;
Euclides. Elementos VII.2''&amp;lt;/pre&amp;gt; &lt;br /&gt;
En lenguaje moderno, el algoritmo se describe como sigue: &lt;br /&gt;
&lt;br /&gt;
#Dados dos segmentos ''AB'' y ''CD'' (con ''AB&amp;amp;gt;CD''), restamos ''CD'' de ''AB'' tantas veces como sea posible. Si no hay residuo, entonces ''CD'' es la máxima medida común. &lt;br /&gt;
#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. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
El hecho de que los segmentos son conmesurables es clave para asegurar que el proceso termina tarde o temprano &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides tradicional  ==&lt;br /&gt;
&lt;br /&gt;
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''. &lt;br /&gt;
&lt;br /&gt;
Según lo antes mencionado, para calcular el máximo común divisor de 2366 y 273 se puede proseguir de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| 2366 dividido entre 273 es 8 y sobran 182 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2366,273)=\mathrm{mcd}(273,182)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| 273 dividido entre 182 es 1 y sobran 91 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(273,182)=\mathrm{mcd}(182,91)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| 182 dividido entre 91 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(182,91)=\mathrm{mcd}(91,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
#Si ''b=0 ''entonces mcd(a,b) = a y el algoritmo termina &lt;br /&gt;
#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&lt;br /&gt;
&lt;br /&gt;
Asuma que llamamos a = r&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; y b = r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_0&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_1&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_0,r_1)=\mathrm{mcd}(r_1,r_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_2&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_1,r_2)=\mathrm{mcd}(r_2,r_3)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_4&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_2,r_3)=\mathrm{mcd}(r_3,r_4)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_{n-1}&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_n&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_{n-1},r_n)=\mathrm{mcd}(r_n,r_{n+1})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_{n+1}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; (el último residuo que no es cero). &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios P(x) = x&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; + 2x&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; + x y Q(x) = x&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; − 1 el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4-1)=\mathrm{mcd}(x^4-1,2x^3+2x)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4-1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,-x^2-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;-2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,-x^2-1)=\mathrm{mcd}(-x^2-1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es − x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; − 1. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;xmod y&amp;quot; significa &amp;quot;el residuo de dividir ''x'' entre y&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i-1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios &amp;lt;math&amp;gt;P(x)=x^5+2x^3+x&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;Q(x)=x^4–1&amp;lt;/math&amp;gt; el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4–1)=\mathrm{mcd}(x^4–1,2x^3+2x)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4–1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,–x^2–1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;–2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,–x^2–1)=\mathrm{mcd}(–x^2–1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;&amp;lt;math&amp;gt;x\bmod y&amp;lt;/math&amp;gt;&amp;quot; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i–1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides extendido  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo de Euclides extendido permite, además de encontrar un máximo común divisor de dos números enteros &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, expresarlo como la mínima combinación lineal de esos números, es decir, encontrar números enteros &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s+b t&amp;lt;/math&amp;gt;. Esto se generaliza también hacia cualquier dominio euclideano. &lt;br /&gt;
&lt;br /&gt;
=== Fundamentos  ===&lt;br /&gt;
&lt;br /&gt;
Existen varias maneras de explicar el algoritmo de Euclides extendido, una de las más comunes consiste en la siguiente: &lt;br /&gt;
&lt;br /&gt;
#Usar el algoritmo tradicional de Euclides. En cada paso, en lugar de &amp;quot;&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&amp;quot; se escribe la ecuación &amp;lt;math&amp;gt;a=b q+r&amp;lt;/math&amp;gt; (véase [[Algoritmo de la división]]). &lt;br /&gt;
#Se despejan los residuos de cada ecuación. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;2\times 2&amp;lt;/math&amp;gt; se usa la siguiente fórmula (vése [[Producto de matrices]]): {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}e&amp;amp;f\\g&amp;amp;h\end{bmatrix}\times\begin{bmatrix}a&amp;amp;b\\c&amp;amp;d\end{bmatrix}=\begin{bmatrix}e a+f c&amp;amp;e b+f d\\g a+h c&amp;amp;g b+h d\end{bmatrix}&amp;lt;/math&amp;gt;|1}} Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; que ahí se describen. Por cada valor &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; calculado se puede formar la matriz &amp;lt;math&amp;gt;\textstyle Q_i=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}&amp;lt;/math&amp;gt;. Usando la ecuación {{Eqnref|1}} de manera repetida se puede calcular el producto las primeras &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; matrices de este tipo: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_{i–1}\end{bmatrix}\times\cdots\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_1\end{bmatrix}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Resulta ser que los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; tienen la propiedad de que &amp;lt;math&amp;gt;r_i=a s_i+b t_i&amp;lt;/math&amp;gt;, es decir, expresan a &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; como una combinación lineal de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Particularmente, como &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=r_{n+1}&amp;lt;/math&amp;gt; entonces se tiene &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}&amp;lt;/math&amp;gt;, 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.&amp;amp;lt;!––Pero no colocaré la demostración en una enciclopedia––&amp;amp;gt; Es importante calcular &amp;lt;math&amp;gt;Q_i\times\cdots\times Q_3\times Q_2\times Q_1&amp;lt;/math&amp;gt; en ese mismo orden. La matriz &amp;lt;math&amp;gt;Q_1&amp;lt;/math&amp;gt; aparece en el extremo derecho y la matriz &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; en el izquierdo. &lt;br /&gt;
&lt;br /&gt;
Regresando al primer ejemplo, la sucesión de cocientes es &amp;lt;math&amp;gt;q_1=8&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_2=1&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;q_3=2&amp;lt;/math&amp;gt;. Entonces se puede calcular {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}–1&amp;amp;9\\3&amp;amp;–26\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–2\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–1\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–8\end{bmatrix}&amp;lt;/math&amp;gt;}} Utilizando el primer renglón de esta matriz se puede leer que &amp;lt;math&amp;gt;91=2366(–1)+273(9)&amp;lt;/math&amp;gt;, es decir, se ha encontrado la manera de expresar al máximo común divisor de 2366 y 273 como una combinación lineal. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; con la multiplicación de matrices: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix} =&lt;br /&gt;
\begin{bmatrix}s_i&amp;amp;t_i\\s_{i–1}–q_is_i&amp;amp;t_{i–1}–q_it_i\end{bmatrix} = \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times\begin{bmatrix}s_{i–1}&amp;amp;t_{i–1}\\s_i&amp;amp;t_i\end{bmatrix}&amp;lt;/math&amp;gt;}} De esta manera &amp;lt;math&amp;gt;s_{i+1} = s_{i–1}–q_is_i&amp;lt;/math&amp;gt; y además &amp;lt;math&amp;gt;t_{i+1} = t_{i–1}–q_it_i&amp;lt;/math&amp;gt;. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: {{Algoritmo|de Euclides extendido|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, y valores &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=as+bt&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a, r_1\gets b, s_0\gets 1, t_0\gets 0, s_1\gets 0, t_1\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## Divida &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;r_i &amp;lt;/math&amp;gt; para obtener el cociente &amp;lt;math&amp;gt;q_i &amp;lt;/math&amp;gt; y el residuo &amp;lt;math&amp;gt;r_{i+1} &amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;s_{i+1}\gets s_{i–1}–q_is_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;t_{i+1}\gets t_{i–1}–q_it_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; es un máximo común divisor de &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; y se expresa &amp;lt;math&amp;gt;r_{i–1}=as_{i–1}+bt_{i–1} &amp;lt;/math&amp;gt;&lt;br /&gt;
|2}} &lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
=== Simplificar fracciones  ===&lt;br /&gt;
&lt;br /&gt;
Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción &amp;lt;math&amp;gt;\textstyle\frac{65}{91}&amp;lt;/math&amp;gt; es equivalente con &amp;lt;math&amp;gt;\textstyle\frac 5 7&amp;lt;/math&amp;gt; (véase [[Número racional]]). De manera más general, &amp;lt;math&amp;gt;\textstyle\frac ab=\frac {ca}{cb}&amp;lt;/math&amp;gt; siempre que &amp;lt;math&amp;gt;c\ne0&amp;lt;/math&amp;gt;. Para reducir una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt;, sólo se necesita dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; entre su máximo común divisor. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si se desea reducir &amp;lt;math&amp;gt;\textstyle\frac{166}{249}&amp;lt;/math&amp;gt;, primero se usa el algoritmo de Euclides para encontrar &amp;lt;math&amp;gt;\mathrm{mcd}(166,249)=83&amp;lt;/math&amp;gt;. Se hacen las divisiones &amp;lt;math&amp;gt;\textstyle 166\div 83 = 2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\textstyle 249\div 83 = 3&amp;lt;/math&amp;gt;. Luego entonces se concluye que &amp;lt;math&amp;gt;\textstyle\frac{166}{249}=\frac 2 3&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Fracciones continuas  ===&lt;br /&gt;
&lt;br /&gt;
La sucesión de divisiones que se efectúan al seguir algoritmo de Euclides puede ser utilizada para expresar una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt; como [[Fracción continua]]. Esto se debe a que si &amp;lt;math&amp;gt;a = bq + r&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r\neq 0&amp;lt;/math&amp;gt;, entonces {{ecuación|&amp;lt;math&amp;gt;\frac a b = q + \frac 1 {\frac b r}&amp;lt;/math&amp;gt;|3}} &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para encontrar el máximo común divisor de &amp;lt;math&amp;gt;93164&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;5826&amp;lt;/math&amp;gt; el algoritmo genera la siguiente secuencia de divisiones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 93164 dividido entre 5826 es 15 y sobran 5774 &lt;br /&gt;
| &amp;lt;math&amp;gt;93164=5826\times 15+5774&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 5826 dividido entre 5774 es 1 y sobran 52 &lt;br /&gt;
| &amp;lt;math&amp;gt;5826=5774\times 1+52&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 5774 dividido entre 52 es 111 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;5774=52\times 111+2&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 52 dividido entre 2 es 26 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;52=2\times 26+0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Todas estas ecuaciones las podemos hacer parecidas a la ecuación {{eqnref | 3}}: &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5774}{52}=111+ \frac 1 {\frac{52}{2}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{52}{2}=26&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se substituye la segunda ecuación en la primera, se obtiene {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {\frac{5774}{52}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Si se repite este proceso de substitución entonces se obtiene la expresión deseada: {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {111+ \frac 1 {26}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma {{Ecuación|&amp;lt;math&amp;gt;\frac{a}{b}=q_1+ \frac 1 {q_2+ \frac 1 {q_3+ \frac 1 {\ddots q_{n–1}+ \frac 1 {q_n}}}}&amp;lt;/math&amp;gt;}} &amp;amp;lt;!–– Esto va en la sección siguiente: Volviendo al caso &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; enteros, el algoritmo de Euclides permite encontrar los coeficientes enteros &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; de la [[Identidad de Bézout]] &amp;lt;math&amp;gt;au+bv=\mathrm{mcd}(a, b)&amp;lt;/math&amp;gt; de fundamental importancia en la [[Aritmética]]. ––&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Inversos modulares  ===&lt;br /&gt;
&lt;br /&gt;
Decimos que dos números enteros son ''congruentes módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;'' (aunque también se puede generalizar para cualquier otro dominio euclídeo) si al dividirlos entre &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; 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 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; es congruente con &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; se escribe &amp;lt;math&amp;gt;a\equiv b\pmod m&amp;lt;/math&amp;gt;, en el ejemplo anterior se tiene &amp;lt;math&amp;gt;7\equiv 12\pmod 5&amp;lt;/math&amp;gt;. Supóngase que se conocen los valores de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, pero que se desconoce el valor &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; de la siguiente ecuación: {{Ecuacion |&amp;lt;math&amp;gt;a x\equiv b\pmod m&amp;lt;/math&amp;gt;|2}} Basta con encontrar un valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; que tenga la característica de que &amp;lt;math&amp;gt;a^{–1} a\equiv 1\pmod m&amp;lt;/math&amp;gt;, pues de esta manera al multiplicar la ecuación {{eqnref|2}} por &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se tendría la solución deseada: {{Ecuacion | &amp;lt;math&amp;gt;x\equiv a^{–1} b\pmod m&amp;lt;/math&amp;gt;}} Al valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se le llama ''inverso modular'' de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Desafortunadamente este valor no siempre existe. Por ejemplo, con &amp;lt;math&amp;gt;a=4&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m=6&amp;lt;/math&amp;gt; no existe ningún número entero entero &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;a^{–1} 4\equiv 1\pmod 6&amp;lt;/math&amp;gt;. De hecho este valor existe si y sólo si &amp;lt;math&amp;gt;\mathrm{mcd}(a,m)=1&amp;lt;/math&amp;gt;. Más aún, si al usar el algoritmo de Euclides extendido (ahora con &amp;lt;math&amp;gt;b=m&amp;lt;/math&amp;gt;) se obtiene &amp;lt;math&amp;gt;1=as+mt&amp;lt;/math&amp;gt;, entonces el valor &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; es el inverso modular de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. &amp;amp;lt;!––LA DEMOSTRACIÓN NO ES BUENO COLOCARLA EN LA ENCICLOPEDIA––&amp;amp;gt; Por ejemplo, se desea resolver la ecuación {{Ecuacion |&amp;lt;math&amp;gt;5 x\equiv 2\pmod 9&amp;lt;/math&amp;gt;}} Entonces con el algoritmo de Euclides extendido se calcula que &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1=5(2)+9(–1)&amp;lt;/math&amp;gt;. Como &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1&amp;lt;/math&amp;gt; entonces 5 tiene un inverso modular. Más aún, como &amp;lt;math&amp;gt;1=5(2)+9(–1)&amp;lt;/math&amp;gt;, entonces ese inverso es 2. Entonces {{Ecuacion |&amp;lt;math&amp;gt;x\equiv 2(2)\pmod 9&amp;lt;/math&amp;gt;}} Es decir que el valor de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Véase [[Multiplicador modular inverso]] &lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
[[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.]] &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;f_{10}=55&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;f_{11}=89&amp;lt;/math&amp;gt; se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 89 dividido entre 55 es 1 y sobran 34 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(89,55)=\mathrm{mcd}(55,34)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 55 dividido entre 34 es 1 y sobran 21 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(55,34)=\mathrm{mcd}(34,21)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 34 dividido entre 21 es 1 y sobran 13 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(34,21)=\mathrm{mcd}(21,13)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 21 dividido entre 13 es 1 y sobran 8 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(21,13)=\mathrm{mcd}(13,8)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 5 &lt;br /&gt;
| 13 dividido entre 8 es 1 y sobran 5 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(13,8)=\mathrm{mcd}(8,5)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 6 &lt;br /&gt;
| 8 dividido entre 5 es 1 y sobran 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(8,5)=\mathrm{mcd}(5,3)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 7 &lt;br /&gt;
| 5 dividido entre 3 es 1 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(5,3)=\mathrm{mcd}(3,2)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 8 &lt;br /&gt;
| 3 dividido entre 2 es 1 y sobran 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(3,2)=\mathrm{mcd}(2,1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 9 &lt;br /&gt;
| 2 dividido entre 1 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2,1)=\mathrm{mcd}(1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; divisiones para calcular el máximo común divisor de &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;gt;m&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; bits, entonces el número promedio de divisiones necesarias es &amp;lt;math&amp;gt;\textstyle{\frac{\pi^2}{6}n}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; es el grado de los polinomios. &lt;br /&gt;
&lt;br /&gt;
== Implementación en pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
{{Algoritmo|de Euclides tradicional implementado de manera recurrente|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:'''Si''' &amp;lt;math&amp;gt;b=0 &amp;lt;/math&amp;gt; '''entonces:'''&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt;&lt;br /&gt;
:'''En otro caso:'''&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;\mathrm{mcd}(b,a\bmod b)&amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides tradicional implementado de manera iterativa|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,b)\gets(b,a\bmod b)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides extendido implementado de manera recurrente|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:'''Si''' &amp;lt;math&amp;gt;b=0 &amp;lt;/math&amp;gt; '''entonces:'''&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;(a,1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''En otro caso:'''&lt;br /&gt;
::&amp;lt;math&amp;gt;(d,s,t)\gets{\it Euclides}(b,a\bmod b)&amp;lt;/math&amp;gt;&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;(d,t,s–(a\div b) t)&amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides extendido implementado de manera iterativa|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:&amp;lt;math&amp;gt;(s,t,s^\prime,t^\prime)\gets(1,0,0,1)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::Divida &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; para obtener un cociente &amp;lt;math&amp;gt;q &amp;lt;/math&amp;gt; y un residuo &amp;lt;math&amp;gt;r &amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,s,t,b,s^\prime,t^\prime)\gets(b,s^\prime,t^\prime,r,s–s^\prime q,t–t^\prime q)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;(a,s,t)&amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides extendido implementado de manera iterativa con matrices|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:&amp;lt;math&amp;gt;Q\gets\begin{pmatrix}1&amp;amp;0\\0&amp;amp;1\end{pmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::Divida &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; para obtener un cociente &amp;lt;math&amp;gt;q &amp;lt;/math&amp;gt; y un residuo &amp;lt;math&amp;gt;r &amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;Q\gets\begin{pmatrix}0&amp;amp;1\\1&amp;amp;–q\end{pmatrix}\times Q&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,b)\gets(b,r)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;(a,Q_{1 1},Q_{1 2})&amp;lt;/math&amp;gt;&lt;br /&gt;
}} Acerca de la notación empleada: &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;x\gets y&amp;lt;/math&amp;gt; significa &amp;quot;asigne a la variable &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; el valor actual de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot;. En lenguajes como [[Lenguaje C|C]], [[Lenguaje de programación Java|Java]], [[C]], [[Python]] y [[Visual Basic]] esto significa simplemente &amp;lt;code&amp;gt;x = y&amp;lt;/code&amp;gt;. En otros lenguajes como [[Lenguaje de programación Pascal|Pascal]] se traduce en &amp;lt;code&amp;gt;a&amp;amp;nbsp;:= b&amp;lt;/code&amp;gt;, en [[Maxima]] es &amp;lt;code&amp;gt;a&amp;amp;nbsp;: b&amp;lt;/code&amp;gt;, en [[R–project|R]], S y [[Ocaml]] es &amp;lt;code&amp;gt;x &amp;amp;lt;– y&amp;lt;/code&amp;gt;, e inclusive se utiliza la flecha &amp;lt;code&amp;gt;x ← y&amp;lt;/code&amp;gt; como el caso de [[APL]]. &lt;br /&gt;
*&amp;lt;math&amp;gt;(x,y,z)\gets(a,b,c)&amp;lt;/math&amp;gt; significa que primero se evalúan los valores &amp;lt;math&amp;gt;a,b,c&amp;lt;/math&amp;gt; y luego se asigna &amp;lt;math&amp;gt;x\gets a,y\gets b,z\gets c&amp;lt;/math&amp;gt;, etc. En lenguajes como Python, [[Ruby]] o Maxima esta instrucción tiene una estructura muy similar, como por ejemplo en Python: &amp;lt;code&amp;gt;(x,y,z) = (a,b,c)&amp;lt;/code&amp;gt;. En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: &amp;lt;code&amp;gt;aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;&amp;lt;/code&amp;gt;. &lt;br /&gt;
*&amp;lt;math&amp;gt;a\div b&amp;lt;/math&amp;gt; significa &amp;quot;el cociente de dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&amp;quot;. 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 &amp;lt;code&amp;gt;a/b&amp;lt;/code&amp;gt;. Otras maneras son &amp;lt;code&amp;gt;a\b&amp;lt;/code&amp;gt; (Visual Basic) , &amp;lt;code&amp;gt;a div b&amp;lt;/code&amp;gt; (Pascal) o bien &amp;lt;code&amp;gt;a//b&amp;lt;/code&amp;gt; (Python 3). &lt;br /&gt;
*&amp;lt;math&amp;gt;a\bmod b&amp;lt;/math&amp;gt; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&amp;quot;. A esta operación se le conoce simplemente como ''módulo''. En muchos lenguajes de programación se implementa como &amp;lt;code&amp;gt;a&amp;amp;nbsp;% b&amp;lt;/code&amp;gt;, mientras que en otros es &amp;lt;code&amp;gt;a mod b&amp;lt;/code&amp;gt; (Visual Basic o Pascal) o bien &amp;lt;code&amp;gt;a rem b&amp;lt;/code&amp;gt; (Ada).&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*Von Zur Gathen, Joachim; Gerhard, Jürgen (2003). «The Euclidean Algorithm», Modern Computer Algebra. Cambridge&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 0-521-82646-2.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Shoup, Victor (2008). «Euclid´s algorithm», A Computational Introduction to Numbrer Theory and Algebra. Cambridge &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; University Press. ISBN 978-0-521-85154-1.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*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.&amp;lt;br&amp;gt;&lt;br /&gt;
*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.&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;amp;nbsp; Lipschutz, Seymour; Lipson, Marc (2009). «Propiedades de los enteros», Matemáticas Discretas. McGraw-Hill. ISBN 978-970-10-7236-3.&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;amp;nbsp; Brassard, Gilles; Bratley, Paul (1997). «Análisis de algoritmos», Fundamentos de Algoritmia. Madrid: PRENTICE HALL. ISBN &amp;lt;br&amp;gt;&amp;amp;nbsp;84-89660-00-X.&amp;lt;br&amp;gt;&lt;br /&gt;
*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. &amp;lt;br&amp;gt;&lt;br /&gt;
*Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford (2009). «Number-Theoretic Algorithms», Introduction to Algorithms. The MIT Press. ISBN 978-0-262-53305-8.&amp;lt;br&amp;gt;&lt;br /&gt;
*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&amp;amp;nbsp;968-9161-02-4.&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;amp;nbsp; Cárdenas, Humberto; Lluis, Emilio; Raggi, Francisco; Tomás, Francisco (2004).&amp;amp;nbsp;«Divisibilidad», Álgebra Superior. México: Trillas. ISBN 968-24-3783-0.&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;amp;nbsp;Pérez Segui, María Luisa (2006). «Divisibilidad», Teoría de Números. Instituto de Matemáticas, UNAM. ISBN 970-32-1170-0.&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;amp;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.&amp;lt;br&amp;gt;&lt;br /&gt;
*&amp;amp;nbsp;Baldor, Aurelio (2008). «Máximo común divisor», Álgebra. México: Grupo Editorial Patria. ISBN 978-970-817-000-0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=65857</id>
		<title>Algoritmo de Euclides</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=65857"/>
		<updated>2010-05-13T18:51:12Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Algoritmo de Euclides:''' &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo original de Euclides  ==&lt;br /&gt;
&lt;br /&gt;
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 [[Conmensurable|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''. &lt;br /&gt;
&lt;br /&gt;
No cualquier par de segmentos es conmensurable, como encontraron los pitagóricos cuando establecen que&amp;amp;nbsp; no es un número racional, pero en el caso de dos segmentos conmensurables se desea hallar la mayor medida común posible. &lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;    '''''Para encontrar la máxima medida común de dos números que no sean primos entre sí.&lt;br /&gt;
Euclides VII-2.svg'''''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.''&lt;br /&gt;
&lt;br /&gt;
''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.&lt;br /&gt;
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.&lt;br /&gt;
Euclides. Elementos VII.2''&amp;lt;/pre&amp;gt; &lt;br /&gt;
En lenguaje moderno, el algoritmo se describe como sigue: &lt;br /&gt;
&lt;br /&gt;
#Dados dos segmentos ''AB'' y ''CD'' (con ''AB&amp;amp;gt;CD''), restamos ''CD'' de ''AB'' tantas veces como sea posible. Si no hay residuo, entonces ''CD'' es la máxima medida común. &lt;br /&gt;
#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. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
El hecho de que los segmentos son conmesurables es clave para asegurar que el proceso termina tarde o temprano &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides tradicional  ==&lt;br /&gt;
&lt;br /&gt;
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''. &lt;br /&gt;
&lt;br /&gt;
Según lo antes mencionado, para calcular el máximo común divisor de 2366 y 273 se puede proseguir de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| 2366 dividido entre 273 es 8 y sobran 182 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2366,273)=\mathrm{mcd}(273,182)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| 273 dividido entre 182 es 1 y sobran 91 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(273,182)=\mathrm{mcd}(182,91)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| 182 dividido entre 91 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(182,91)=\mathrm{mcd}(91,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
#Si ''b=0 ''entonces mcd(a,b) = a y el algoritmo termina &lt;br /&gt;
#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&lt;br /&gt;
&lt;br /&gt;
Asuma que llamamos a = r&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; y b = r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_0&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_1&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_0,r_1)=\mathrm{mcd}(r_1,r_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_2&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_1,r_2)=\mathrm{mcd}(r_2,r_3)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;r_2&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_3&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_3&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_4&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_2,r_3)=\mathrm{mcd}(r_3,r_4)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_{n-1}&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_n&amp;lt;/math&amp;gt; y sobran &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_{n-1},r_n)=\mathrm{mcd}(r_n,r_{n+1})&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_{n+1}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; (el último residuo que no es cero). &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios P(x) = x&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; + 2x&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; + x y Q(x) = x&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; − 1 el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4-1)=\mathrm{mcd}(x^4-1,2x^3+2x)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4-1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,-x^2-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;-2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,-x^2-1)=\mathrm{mcd}(-x^2-1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es − x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; − 1.&lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;xmod y&amp;quot; significa &amp;quot;el residuo de dividir ''x'' entre y&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i-1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios &amp;lt;math&amp;gt;P(x)=x^5+2x^3+x&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;Q(x)=x^4–1&amp;lt;/math&amp;gt; el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4–1)=\mathrm{mcd}(x^4–1,2x^3+2x)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4–1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,–x^2–1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;–2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,–x^2–1)=\mathrm{mcd}(–x^2–1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;&amp;lt;math&amp;gt;x\bmod y&amp;lt;/math&amp;gt;&amp;quot; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i–1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides extendido  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo de Euclides extendido permite, además de encontrar un máximo común divisor de dos números enteros &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, expresarlo como la mínima combinación lineal de esos números, es decir, encontrar números enteros &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s+b t&amp;lt;/math&amp;gt;. Esto se generaliza también hacia cualquier dominio euclideano. &lt;br /&gt;
&lt;br /&gt;
=== Fundamentos  ===&lt;br /&gt;
&lt;br /&gt;
Existen varias maneras de explicar el algoritmo de Euclides extendido, una de las más comunes consiste en la siguiente: &lt;br /&gt;
&lt;br /&gt;
#Usar el algoritmo tradicional de Euclides. En cada paso, en lugar de &amp;quot;&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&amp;quot; se escribe la ecuación &amp;lt;math&amp;gt;a=b q+r&amp;lt;/math&amp;gt; (véase [[Algoritmo de la división]]). &lt;br /&gt;
#Se despejan los residuos de cada ecuación. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;2\times 2&amp;lt;/math&amp;gt; se usa la siguiente fórmula (vése [[Producto de matrices]]): {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}e&amp;amp;f\\g&amp;amp;h\end{bmatrix}\times\begin{bmatrix}a&amp;amp;b\\c&amp;amp;d\end{bmatrix}=\begin{bmatrix}e a+f c&amp;amp;e b+f d\\g a+h c&amp;amp;g b+h d\end{bmatrix}&amp;lt;/math&amp;gt;|1}} Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; que ahí se describen. Por cada valor &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; calculado se puede formar la matriz &amp;lt;math&amp;gt;\textstyle Q_i=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}&amp;lt;/math&amp;gt;. Usando la ecuación {{Eqnref|1}} de manera repetida se puede calcular el producto las primeras &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; matrices de este tipo: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_{i–1}\end{bmatrix}\times\cdots\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_1\end{bmatrix}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Resulta ser que los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; tienen la propiedad de que &amp;lt;math&amp;gt;r_i=a s_i+b t_i&amp;lt;/math&amp;gt;, es decir, expresan a &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; como una combinación lineal de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Particularmente, como &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=r_{n+1}&amp;lt;/math&amp;gt; entonces se tiene &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}&amp;lt;/math&amp;gt;, 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.&amp;amp;lt;!––Pero no colocaré la demostración en una enciclopedia––&amp;amp;gt; Es importante calcular &amp;lt;math&amp;gt;Q_i\times\cdots\times Q_3\times Q_2\times Q_1&amp;lt;/math&amp;gt; en ese mismo orden. La matriz &amp;lt;math&amp;gt;Q_1&amp;lt;/math&amp;gt; aparece en el extremo derecho y la matriz &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; en el izquierdo. &lt;br /&gt;
&lt;br /&gt;
Regresando al primer ejemplo, la sucesión de cocientes es &amp;lt;math&amp;gt;q_1=8&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_2=1&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;q_3=2&amp;lt;/math&amp;gt;. Entonces se puede calcular {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}–1&amp;amp;9\\3&amp;amp;–26\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–2\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–1\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–8\end{bmatrix}&amp;lt;/math&amp;gt;}} Utilizando el primer renglón de esta matriz se puede leer que &amp;lt;math&amp;gt;91=2366(–1)+273(9)&amp;lt;/math&amp;gt;, es decir, se ha encontrado la manera de expresar al máximo común divisor de 2366 y 273 como una combinación lineal. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; con la multiplicación de matrices: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix} =&lt;br /&gt;
\begin{bmatrix}s_i&amp;amp;t_i\\s_{i–1}–q_is_i&amp;amp;t_{i–1}–q_it_i\end{bmatrix} = \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times\begin{bmatrix}s_{i–1}&amp;amp;t_{i–1}\\s_i&amp;amp;t_i\end{bmatrix}&amp;lt;/math&amp;gt;}} De esta manera &amp;lt;math&amp;gt;s_{i+1} = s_{i–1}–q_is_i&amp;lt;/math&amp;gt; y además &amp;lt;math&amp;gt;t_{i+1} = t_{i–1}–q_it_i&amp;lt;/math&amp;gt;. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: {{Algoritmo|de Euclides extendido|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, y valores &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=as+bt&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a, r_1\gets b, s_0\gets 1, t_0\gets 0, s_1\gets 0, t_1\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## Divida &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;r_i &amp;lt;/math&amp;gt; para obtener el cociente &amp;lt;math&amp;gt;q_i &amp;lt;/math&amp;gt; y el residuo &amp;lt;math&amp;gt;r_{i+1} &amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;s_{i+1}\gets s_{i–1}–q_is_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;t_{i+1}\gets t_{i–1}–q_it_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; es un máximo común divisor de &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; y se expresa &amp;lt;math&amp;gt;r_{i–1}=as_{i–1}+bt_{i–1} &amp;lt;/math&amp;gt;&lt;br /&gt;
|2}} &lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
=== Simplificar fracciones  ===&lt;br /&gt;
&lt;br /&gt;
Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción &amp;lt;math&amp;gt;\textstyle\frac{65}{91}&amp;lt;/math&amp;gt; es equivalente con &amp;lt;math&amp;gt;\textstyle\frac 5 7&amp;lt;/math&amp;gt; (véase [[Número racional]]). De manera más general, &amp;lt;math&amp;gt;\textstyle\frac ab=\frac {ca}{cb}&amp;lt;/math&amp;gt; siempre que &amp;lt;math&amp;gt;c\ne0&amp;lt;/math&amp;gt;. Para reducir una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt;, sólo se necesita dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; entre su máximo común divisor. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si se desea reducir &amp;lt;math&amp;gt;\textstyle\frac{166}{249}&amp;lt;/math&amp;gt;, primero se usa el algoritmo de Euclides para encontrar &amp;lt;math&amp;gt;\mathrm{mcd}(166,249)=83&amp;lt;/math&amp;gt;. Se hacen las divisiones &amp;lt;math&amp;gt;\textstyle 166\div 83 = 2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\textstyle 249\div 83 = 3&amp;lt;/math&amp;gt;. Luego entonces se concluye que &amp;lt;math&amp;gt;\textstyle\frac{166}{249}=\frac 2 3&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Fracciones continuas  ===&lt;br /&gt;
&lt;br /&gt;
La sucesión de divisiones que se efectúan al seguir algoritmo de Euclides puede ser utilizada para expresar una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt; como [[Fracción continua]]. Esto se debe a que si &amp;lt;math&amp;gt;a = bq + r&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r\neq 0&amp;lt;/math&amp;gt;, entonces {{ecuación|&amp;lt;math&amp;gt;\frac a b = q + \frac 1 {\frac b r}&amp;lt;/math&amp;gt;|3}} &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para encontrar el máximo común divisor de &amp;lt;math&amp;gt;93164&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;5826&amp;lt;/math&amp;gt; el algoritmo genera la siguiente secuencia de divisiones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 93164 dividido entre 5826 es 15 y sobran 5774 &lt;br /&gt;
| &amp;lt;math&amp;gt;93164=5826\times 15+5774&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 5826 dividido entre 5774 es 1 y sobran 52 &lt;br /&gt;
| &amp;lt;math&amp;gt;5826=5774\times 1+52&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 5774 dividido entre 52 es 111 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;5774=52\times 111+2&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 52 dividido entre 2 es 26 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;52=2\times 26+0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Todas estas ecuaciones las podemos hacer parecidas a la ecuación {{eqnref | 3}}: &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5774}{52}=111+ \frac 1 {\frac{52}{2}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{52}{2}=26&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se substituye la segunda ecuación en la primera, se obtiene {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {\frac{5774}{52}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Si se repite este proceso de substitución entonces se obtiene la expresión deseada: {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {111+ \frac 1 {26}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma {{Ecuación|&amp;lt;math&amp;gt;\frac{a}{b}=q_1+ \frac 1 {q_2+ \frac 1 {q_3+ \frac 1 {\ddots q_{n–1}+ \frac 1 {q_n}}}}&amp;lt;/math&amp;gt;}} &amp;amp;lt;!–– Esto va en la sección siguiente: Volviendo al caso &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; enteros, el algoritmo de Euclides permite encontrar los coeficientes enteros &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; de la [[Identidad de Bézout]] &amp;lt;math&amp;gt;au+bv=\mathrm{mcd}(a, b)&amp;lt;/math&amp;gt; de fundamental importancia en la [[Aritmética]]. ––&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Inversos modulares  ===&lt;br /&gt;
&lt;br /&gt;
Decimos que dos números enteros son ''congruentes módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;'' (aunque también se puede generalizar para cualquier otro dominio euclídeo) si al dividirlos entre &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; 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 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; es congruente con &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; se escribe &amp;lt;math&amp;gt;a\equiv b\pmod m&amp;lt;/math&amp;gt;, en el ejemplo anterior se tiene &amp;lt;math&amp;gt;7\equiv 12\pmod 5&amp;lt;/math&amp;gt;. Supóngase que se conocen los valores de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, pero que se desconoce el valor &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; de la siguiente ecuación: {{Ecuacion |&amp;lt;math&amp;gt;a x\equiv b\pmod m&amp;lt;/math&amp;gt;|2}} Basta con encontrar un valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; que tenga la característica de que &amp;lt;math&amp;gt;a^{–1} a\equiv 1\pmod m&amp;lt;/math&amp;gt;, pues de esta manera al multiplicar la ecuación {{eqnref|2}} por &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se tendría la solución deseada: {{Ecuacion | &amp;lt;math&amp;gt;x\equiv a^{–1} b\pmod m&amp;lt;/math&amp;gt;}} Al valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se le llama ''inverso modular'' de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Desafortunadamente este valor no siempre existe. Por ejemplo, con &amp;lt;math&amp;gt;a=4&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m=6&amp;lt;/math&amp;gt; no existe ningún número entero entero &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;a^{–1} 4\equiv 1\pmod 6&amp;lt;/math&amp;gt;. De hecho este valor existe si y sólo si &amp;lt;math&amp;gt;\mathrm{mcd}(a,m)=1&amp;lt;/math&amp;gt;. Más aún, si al usar el algoritmo de Euclides extendido (ahora con &amp;lt;math&amp;gt;b=m&amp;lt;/math&amp;gt;) se obtiene &amp;lt;math&amp;gt;1=as+mt&amp;lt;/math&amp;gt;, entonces el valor &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; es el inverso modular de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. &amp;amp;lt;!––LA DEMOSTRACIÓN NO ES BUENO COLOCARLA EN LA ENCICLOPEDIA––&amp;amp;gt; Por ejemplo, se desea resolver la ecuación {{Ecuacion |&amp;lt;math&amp;gt;5 x\equiv 2\pmod 9&amp;lt;/math&amp;gt;}} Entonces con el algoritmo de Euclides extendido se calcula que &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1=5(2)+9(–1)&amp;lt;/math&amp;gt;. Como &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1&amp;lt;/math&amp;gt; entonces 5 tiene un inverso modular. Más aún, como &amp;lt;math&amp;gt;1=5(2)+9(–1)&amp;lt;/math&amp;gt;, entonces ese inverso es 2. Entonces {{Ecuacion |&amp;lt;math&amp;gt;x\equiv 2(2)\pmod 9&amp;lt;/math&amp;gt;}} Es decir que el valor de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Véase [[Multiplicador modular inverso]] &lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
[[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.]] &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;f_{10}=55&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;f_{11}=89&amp;lt;/math&amp;gt; se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 89 dividido entre 55 es 1 y sobran 34 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(89,55)=\mathrm{mcd}(55,34)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 55 dividido entre 34 es 1 y sobran 21 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(55,34)=\mathrm{mcd}(34,21)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 34 dividido entre 21 es 1 y sobran 13 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(34,21)=\mathrm{mcd}(21,13)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 21 dividido entre 13 es 1 y sobran 8 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(21,13)=\mathrm{mcd}(13,8)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 5 &lt;br /&gt;
| 13 dividido entre 8 es 1 y sobran 5 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(13,8)=\mathrm{mcd}(8,5)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 6 &lt;br /&gt;
| 8 dividido entre 5 es 1 y sobran 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(8,5)=\mathrm{mcd}(5,3)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 7 &lt;br /&gt;
| 5 dividido entre 3 es 1 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(5,3)=\mathrm{mcd}(3,2)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 8 &lt;br /&gt;
| 3 dividido entre 2 es 1 y sobran 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(3,2)=\mathrm{mcd}(2,1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 9 &lt;br /&gt;
| 2 dividido entre 1 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2,1)=\mathrm{mcd}(1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; divisiones para calcular el máximo común divisor de &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;gt;m&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; bits, entonces el número promedio de divisiones necesarias es &amp;lt;math&amp;gt;\textstyle{\frac{\pi^2}{6}n}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; es el grado de los polinomios. &lt;br /&gt;
&lt;br /&gt;
== Implementación en pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
{{Algoritmo|de Euclides tradicional implementado de manera recurrente|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:'''Si''' &amp;lt;math&amp;gt;b=0 &amp;lt;/math&amp;gt; '''entonces:'''&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt;&lt;br /&gt;
:'''En otro caso:'''&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;\mathrm{mcd}(b,a\bmod b)&amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides tradicional implementado de manera iterativa|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,b)\gets(b,a\bmod b)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides extendido implementado de manera recurrente|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:'''Si''' &amp;lt;math&amp;gt;b=0 &amp;lt;/math&amp;gt; '''entonces:'''&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;(a,1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''En otro caso:'''&lt;br /&gt;
::&amp;lt;math&amp;gt;(d,s,t)\gets{\it Euclides}(b,a\bmod b)&amp;lt;/math&amp;gt;&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;(d,t,s–(a\div b) t)&amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides extendido implementado de manera iterativa|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:&amp;lt;math&amp;gt;(s,t,s^\prime,t^\prime)\gets(1,0,0,1)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::Divida &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; para obtener un cociente &amp;lt;math&amp;gt;q &amp;lt;/math&amp;gt; y un residuo &amp;lt;math&amp;gt;r &amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,s,t,b,s^\prime,t^\prime)\gets(b,s^\prime,t^\prime,r,s–s^\prime q,t–t^\prime q)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;(a,s,t)&amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides extendido implementado de manera iterativa con matrices|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:&amp;lt;math&amp;gt;Q\gets\begin{pmatrix}1&amp;amp;0\\0&amp;amp;1\end{pmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::Divida &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; para obtener un cociente &amp;lt;math&amp;gt;q &amp;lt;/math&amp;gt; y un residuo &amp;lt;math&amp;gt;r &amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;Q\gets\begin{pmatrix}0&amp;amp;1\\1&amp;amp;–q\end{pmatrix}\times Q&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,b)\gets(b,r)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;(a,Q_{1 1},Q_{1 2})&amp;lt;/math&amp;gt;&lt;br /&gt;
}} Acerca de la notación empleada: &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;x\gets y&amp;lt;/math&amp;gt; significa &amp;quot;asigne a la variable &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; el valor actual de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot;. En lenguajes como [[Lenguaje C|C]], [[Lenguaje de programación Java|Java]], [[C]], [[Python]] y [[Visual Basic]] esto significa simplemente &amp;lt;code&amp;gt;x = y&amp;lt;/code&amp;gt;. En otros lenguajes como [[Lenguaje de programación Pascal|Pascal]] se traduce en &amp;lt;code&amp;gt;a&amp;amp;nbsp;:= b&amp;lt;/code&amp;gt;, en [[Maxima]] es &amp;lt;code&amp;gt;a&amp;amp;nbsp;: b&amp;lt;/code&amp;gt;, en [[R–project|R]], S y [[Ocaml]] es &amp;lt;code&amp;gt;x &amp;amp;lt;– y&amp;lt;/code&amp;gt;, e inclusive se utiliza la flecha &amp;lt;code&amp;gt;x ← y&amp;lt;/code&amp;gt; como el caso de [[APL]]. &lt;br /&gt;
*&amp;lt;math&amp;gt;(x,y,z)\gets(a,b,c)&amp;lt;/math&amp;gt; significa que primero se evalúan los valores &amp;lt;math&amp;gt;a,b,c&amp;lt;/math&amp;gt; y luego se asigna &amp;lt;math&amp;gt;x\gets a,y\gets b,z\gets c&amp;lt;/math&amp;gt;, etc. En lenguajes como Python, [[Ruby]] o Maxima esta instrucción tiene una estructura muy similar, como por ejemplo en Python: &amp;lt;code&amp;gt;(x,y,z) = (a,b,c)&amp;lt;/code&amp;gt;. En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: &amp;lt;code&amp;gt;aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;&amp;lt;/code&amp;gt;. &lt;br /&gt;
*&amp;lt;math&amp;gt;a\div b&amp;lt;/math&amp;gt; significa &amp;quot;el cociente de dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&amp;quot;. 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 &amp;lt;code&amp;gt;a/b&amp;lt;/code&amp;gt;. Otras maneras son &amp;lt;code&amp;gt;a\b&amp;lt;/code&amp;gt; (Visual Basic) , &amp;lt;code&amp;gt;a div b&amp;lt;/code&amp;gt; (Pascal) o bien &amp;lt;code&amp;gt;a//b&amp;lt;/code&amp;gt; (Python 3). &lt;br /&gt;
*&amp;lt;math&amp;gt;a\bmod b&amp;lt;/math&amp;gt; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&amp;quot;. A esta operación se le conoce simplemente como ''módulo''. En muchos lenguajes de programación se implementa como &amp;lt;code&amp;gt;a&amp;amp;nbsp;% b&amp;lt;/code&amp;gt;, mientras que en otros es &amp;lt;code&amp;gt;a mod b&amp;lt;/code&amp;gt; (Visual Basic o Pascal) o bien &amp;lt;code&amp;gt;a rem b&amp;lt;/code&amp;gt; (Ada).&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=65800</id>
		<title>Algoritmo de Euclides</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=65800"/>
		<updated>2010-05-13T18:29:31Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Algoritmo de Euclides: &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo original de Euclides  ==&lt;br /&gt;
&lt;br /&gt;
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 [[Conmensurable|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''. &lt;br /&gt;
&lt;br /&gt;
No cualquier par de segmentos es conmensurable, como encontraron los pitagóricos cuando establecen que&amp;amp;nbsp; no es un número racional, pero en el caso de dos segmentos conmensurables se desea hallar la mayor medida común posible. &lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; En lenguaje moderno, el algoritmo se describe como sigue: &lt;br /&gt;
&lt;br /&gt;
#Dados dos segmentos ''AB'' y ''CD'' (con ''AB&amp;amp;gt;CD''), restamos ''CD'' de ''AB'' tantas veces como sea posible. Si no hay residuo, entonces ''CD'' es la máxima medida común. &lt;br /&gt;
#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. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
El hecho de que los segmentos son conmesurables es clave para asegurar que el proceso termina tarde o temprano &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides tradicional  ==&lt;br /&gt;
&lt;br /&gt;
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''. &lt;br /&gt;
&lt;br /&gt;
Según lo antes mencionado, para calcular el máximo común divisor de 2366 y 273 se puede proseguir de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 2366 dividido entre 273 es 8 y sobran 182 &lt;br /&gt;
| mcd(2366,273) = mcd(273,182) &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 273 dividido entre 182 es 1 y sobran 91 &lt;br /&gt;
| mcd(273,182) = mcd(182,91) &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 182 dividido entre 91 es 2 y sobra 0 &lt;br /&gt;
| mcd(182,91) = mcd(91,0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
#Si ''b'' = 0 entonces mcd(a,b) = a y el algoritmo termina &lt;br /&gt;
#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&lt;br /&gt;
&lt;br /&gt;
Asuma que llamamos ''a = r&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; y b = r''&amp;lt;sub&amp;gt;''1''&amp;lt;/sub&amp;gt;. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| r&amp;lt;sub&amp;gt;0 &amp;lt;/sub&amp;gt;dividido entre r&amp;lt;sub&amp;gt;1 &amp;lt;/sub&amp;gt;es q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; y sobran r&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(r&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;) = mcd(r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;) &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; dividido entre r&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; es q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; y sobran r&amp;lt;sub&amp;gt;3 &amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;) = mcd(r&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;) &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| r&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; dividido entre r&amp;lt;sub&amp;gt;3 &amp;lt;/sub&amp;gt;es q&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; y sobran r&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(r&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;) = mcd(r&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt;) &lt;br /&gt;
| – &lt;br /&gt;
| ''n'' &lt;br /&gt;
| r&amp;lt;sub&amp;gt;n − 1&amp;lt;/sub&amp;gt; dividido entre r&amp;lt;sub&amp;gt;n &amp;lt;/sub&amp;gt;es qn y sobran r&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; &lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| ''n + 1''&amp;lt;br&amp;gt; &lt;br /&gt;
| r&amp;lt;sub&amp;gt;n &amp;lt;/sub&amp;gt;dividido entre r&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; es q&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; y sobra 0&amp;lt;br&amp;gt; &lt;br /&gt;
| mcd(r&amp;lt;sub&amp;gt;n − 1&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;) = mcd(r&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt;)&amp;lt;br&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_{n+1}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; (el último residuo que no es cero). &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios &amp;lt;math&amp;gt;P(x)=x^5+2x^3+x&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;Q(x)=x^4–1&amp;lt;/math&amp;gt; el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4–1)=\mathrm{mcd}(x^4–1,2x^3+2x)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;x^4–1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4–1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,–x^2–1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;–2x&amp;lt;/math&amp;gt; y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,–x^2–1)=\mathrm{mcd}(–x^2–1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es &amp;lt;math&amp;gt;–x^2–1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;&amp;lt;math&amp;gt;x\bmod y&amp;lt;/math&amp;gt;&amp;quot; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i–1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides extendido  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo de Euclides extendido permite, además de encontrar un máximo común divisor de dos números enteros &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, expresarlo como la mínima combinación lineal de esos números, es decir, encontrar números enteros &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s+b t&amp;lt;/math&amp;gt;. Esto se generaliza también hacia cualquier dominio euclideano. &lt;br /&gt;
&lt;br /&gt;
=== Fundamentos  ===&lt;br /&gt;
&lt;br /&gt;
Existen varias maneras de explicar el algoritmo de Euclides extendido, una de las más comunes consiste en la siguiente: &lt;br /&gt;
&lt;br /&gt;
#Usar el algoritmo tradicional de Euclides. En cada paso, en lugar de &amp;quot;&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&amp;quot; se escribe la ecuación &amp;lt;math&amp;gt;a=b q+r&amp;lt;/math&amp;gt; (véase [[Algoritmo de la división]]). &lt;br /&gt;
#Se despejan los residuos de cada ecuación. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;2\times 2&amp;lt;/math&amp;gt; se usa la siguiente fórmula (vése [[Producto de matrices]]): {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}e&amp;amp;f\\g&amp;amp;h\end{bmatrix}\times\begin{bmatrix}a&amp;amp;b\\c&amp;amp;d\end{bmatrix}=\begin{bmatrix}e a+f c&amp;amp;e b+f d\\g a+h c&amp;amp;g b+h d\end{bmatrix}&amp;lt;/math&amp;gt;|1}} Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; que ahí se describen. Por cada valor &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; calculado se puede formar la matriz &amp;lt;math&amp;gt;\textstyle Q_i=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}&amp;lt;/math&amp;gt;. Usando la ecuación {{Eqnref|1}} de manera repetida se puede calcular el producto las primeras &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; matrices de este tipo: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_{i–1}\end{bmatrix}\times\cdots\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_1\end{bmatrix}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Resulta ser que los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; tienen la propiedad de que &amp;lt;math&amp;gt;r_i=a s_i+b t_i&amp;lt;/math&amp;gt;, es decir, expresan a &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; como una combinación lineal de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Particularmente, como &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=r_{n+1}&amp;lt;/math&amp;gt; entonces se tiene &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}&amp;lt;/math&amp;gt;, 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.&amp;amp;lt;!––Pero no colocaré la demostración en una enciclopedia––&amp;amp;gt; Es importante calcular &amp;lt;math&amp;gt;Q_i\times\cdots\times Q_3\times Q_2\times Q_1&amp;lt;/math&amp;gt; en ese mismo orden. La matriz &amp;lt;math&amp;gt;Q_1&amp;lt;/math&amp;gt; aparece en el extremo derecho y la matriz &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; en el izquierdo. &lt;br /&gt;
&lt;br /&gt;
Regresando al primer ejemplo, la sucesión de cocientes es &amp;lt;math&amp;gt;q_1=8&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_2=1&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;q_3=2&amp;lt;/math&amp;gt;. Entonces se puede calcular {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}–1&amp;amp;9\\3&amp;amp;–26\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;–2\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–1\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–8\end{bmatrix}&amp;lt;/math&amp;gt;}} Utilizando el primer renglón de esta matriz se puede leer que &amp;lt;math&amp;gt;91=2366(–1)+273(9)&amp;lt;/math&amp;gt;, es decir, se ha encontrado la manera de expresar al máximo común divisor de 2366 y 273 como una combinación lineal. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; con la multiplicación de matrices: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix} =&lt;br /&gt;
\begin{bmatrix}s_i&amp;amp;t_i\\s_{i–1}–q_is_i&amp;amp;t_{i–1}–q_it_i\end{bmatrix} = \begin{bmatrix}0&amp;amp;1\\1&amp;amp;–q_i\end{bmatrix}\times\begin{bmatrix}s_{i–1}&amp;amp;t_{i–1}\\s_i&amp;amp;t_i\end{bmatrix}&amp;lt;/math&amp;gt;}} De esta manera &amp;lt;math&amp;gt;s_{i+1} = s_{i–1}–q_is_i&amp;lt;/math&amp;gt; y además &amp;lt;math&amp;gt;t_{i+1} = t_{i–1}–q_it_i&amp;lt;/math&amp;gt;. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: {{Algoritmo|de Euclides extendido|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, y valores &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=as+bt&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a, r_1\gets b, s_0\gets 1, t_0\gets 0, s_1\gets 0, t_1\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## Divida &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;r_i &amp;lt;/math&amp;gt; para obtener el cociente &amp;lt;math&amp;gt;q_i &amp;lt;/math&amp;gt; y el residuo &amp;lt;math&amp;gt;r_{i+1} &amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;s_{i+1}\gets s_{i–1}–q_is_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;t_{i+1}\gets t_{i–1}–q_it_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i–1} &amp;lt;/math&amp;gt; es un máximo común divisor de &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; y se expresa &amp;lt;math&amp;gt;r_{i–1}=as_{i–1}+bt_{i–1} &amp;lt;/math&amp;gt;&lt;br /&gt;
|2}} &lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
=== Simplificar fracciones  ===&lt;br /&gt;
&lt;br /&gt;
Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción &amp;lt;math&amp;gt;\textstyle\frac{65}{91}&amp;lt;/math&amp;gt; es equivalente con &amp;lt;math&amp;gt;\textstyle\frac 5 7&amp;lt;/math&amp;gt; (véase [[Número racional]]). De manera más general, &amp;lt;math&amp;gt;\textstyle\frac ab=\frac {ca}{cb}&amp;lt;/math&amp;gt; siempre que &amp;lt;math&amp;gt;c\ne0&amp;lt;/math&amp;gt;. Para reducir una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt;, sólo se necesita dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; entre su máximo común divisor. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si se desea reducir &amp;lt;math&amp;gt;\textstyle\frac{166}{249}&amp;lt;/math&amp;gt;, primero se usa el algoritmo de Euclides para encontrar &amp;lt;math&amp;gt;\mathrm{mcd}(166,249)=83&amp;lt;/math&amp;gt;. Se hacen las divisiones &amp;lt;math&amp;gt;\textstyle 166\div 83 = 2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\textstyle 249\div 83 = 3&amp;lt;/math&amp;gt;. Luego entonces se concluye que &amp;lt;math&amp;gt;\textstyle\frac{166}{249}=\frac 2 3&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Fracciones continuas  ===&lt;br /&gt;
&lt;br /&gt;
La sucesión de divisiones que se efectúan al seguir algoritmo de Euclides puede ser utilizada para expresar una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt; como [[Fracción continua]]. Esto se debe a que si &amp;lt;math&amp;gt;a = bq + r&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r\neq 0&amp;lt;/math&amp;gt;, entonces {{ecuación|&amp;lt;math&amp;gt;\frac a b = q + \frac 1 {\frac b r}&amp;lt;/math&amp;gt;|3}} &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para encontrar el máximo común divisor de &amp;lt;math&amp;gt;93164&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;5826&amp;lt;/math&amp;gt; el algoritmo genera la siguiente secuencia de divisiones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 93164 dividido entre 5826 es 15 y sobran 5774 &lt;br /&gt;
| &amp;lt;math&amp;gt;93164=5826\times 15+5774&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 5826 dividido entre 5774 es 1 y sobran 52 &lt;br /&gt;
| &amp;lt;math&amp;gt;5826=5774\times 1+52&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 5774 dividido entre 52 es 111 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;5774=52\times 111+2&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 52 dividido entre 2 es 26 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;52=2\times 26+0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Todas estas ecuaciones las podemos hacer parecidas a la ecuación {{eqnref | 3}}: &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5774}{52}=111+ \frac 1 {\frac{52}{2}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{52}{2}=26&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se substituye la segunda ecuación en la primera, se obtiene {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {\frac{5774}{52}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Si se repite este proceso de substitución entonces se obtiene la expresión deseada: {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {111+ \frac 1 {26}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma {{Ecuación|&amp;lt;math&amp;gt;\frac{a}{b}=q_1+ \frac 1 {q_2+ \frac 1 {q_3+ \frac 1 {\ddots q_{n–1}+ \frac 1 {q_n}}}}&amp;lt;/math&amp;gt;}} &amp;amp;lt;!–– Esto va en la sección siguiente: Volviendo al caso &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; enteros, el algoritmo de Euclides permite encontrar los coeficientes enteros &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; de la [[Identidad de Bézout]] &amp;lt;math&amp;gt;au+bv=\mathrm{mcd}(a, b)&amp;lt;/math&amp;gt; de fundamental importancia en la [[Aritmética]]. ––&amp;amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Inversos modulares  ===&lt;br /&gt;
&lt;br /&gt;
Decimos que dos números enteros son ''congruentes módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;'' (aunque también se puede generalizar para cualquier otro dominio euclídeo) si al dividirlos entre &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; 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 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; es congruente con &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; se escribe &amp;lt;math&amp;gt;a\equiv b\pmod m&amp;lt;/math&amp;gt;, en el ejemplo anterior se tiene &amp;lt;math&amp;gt;7\equiv 12\pmod 5&amp;lt;/math&amp;gt;. Supóngase que se conocen los valores de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, pero que se desconoce el valor &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; de la siguiente ecuación: {{Ecuacion |&amp;lt;math&amp;gt;a x\equiv b\pmod m&amp;lt;/math&amp;gt;|2}} Basta con encontrar un valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; que tenga la característica de que &amp;lt;math&amp;gt;a^{–1} a\equiv 1\pmod m&amp;lt;/math&amp;gt;, pues de esta manera al multiplicar la ecuación {{eqnref|2}} por &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se tendría la solución deseada: {{Ecuacion | &amp;lt;math&amp;gt;x\equiv a^{–1} b\pmod m&amp;lt;/math&amp;gt;}} Al valor &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; se le llama ''inverso modular'' de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Desafortunadamente este valor no siempre existe. Por ejemplo, con &amp;lt;math&amp;gt;a=4&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m=6&amp;lt;/math&amp;gt; no existe ningún número entero entero &amp;lt;math&amp;gt;a^{–1}&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;a^{–1} 4\equiv 1\pmod 6&amp;lt;/math&amp;gt;. De hecho este valor existe si y sólo si &amp;lt;math&amp;gt;\mathrm{mcd}(a,m)=1&amp;lt;/math&amp;gt;. Más aún, si al usar el algoritmo de Euclides extendido (ahora con &amp;lt;math&amp;gt;b=m&amp;lt;/math&amp;gt;) se obtiene &amp;lt;math&amp;gt;1=as+mt&amp;lt;/math&amp;gt;, entonces el valor &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; es el inverso modular de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. &amp;amp;lt;!––LA DEMOSTRACIÓN NO ES BUENO COLOCARLA EN LA ENCICLOPEDIA––&amp;amp;gt; Por ejemplo, se desea resolver la ecuación {{Ecuacion |&amp;lt;math&amp;gt;5 x\equiv 2\pmod 9&amp;lt;/math&amp;gt;}} Entonces con el algoritmo de Euclides extendido se calcula que &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1=5(2)+9(–1)&amp;lt;/math&amp;gt;. Como &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1&amp;lt;/math&amp;gt; entonces 5 tiene un inverso modular. Más aún, como &amp;lt;math&amp;gt;1=5(2)+9(–1)&amp;lt;/math&amp;gt;, entonces ese inverso es 2. Entonces {{Ecuacion |&amp;lt;math&amp;gt;x\equiv 2(2)\pmod 9&amp;lt;/math&amp;gt;}} Es decir que el valor de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Véase [[Multiplicador modular inverso]] &lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
[[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.]] &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;f_{10}=55&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;f_{11}=89&amp;lt;/math&amp;gt; se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| – &lt;br /&gt;
! Paso &lt;br /&gt;
! Operación &lt;br /&gt;
! Significado &lt;br /&gt;
| – &lt;br /&gt;
| 1 &lt;br /&gt;
| 89 dividido entre 55 es 1 y sobran 34 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(89,55)=\mathrm{mcd}(55,34)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 2 &lt;br /&gt;
| 55 dividido entre 34 es 1 y sobran 21 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(55,34)=\mathrm{mcd}(34,21)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 3 &lt;br /&gt;
| 34 dividido entre 21 es 1 y sobran 13 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(34,21)=\mathrm{mcd}(21,13)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 4 &lt;br /&gt;
| 21 dividido entre 13 es 1 y sobran 8 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(21,13)=\mathrm{mcd}(13,8)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 5 &lt;br /&gt;
| 13 dividido entre 8 es 1 y sobran 5 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(13,8)=\mathrm{mcd}(8,5)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 6 &lt;br /&gt;
| 8 dividido entre 5 es 1 y sobran 3 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(8,5)=\mathrm{mcd}(5,3)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 7 &lt;br /&gt;
| 5 dividido entre 3 es 1 y sobran 2 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(5,3)=\mathrm{mcd}(3,2)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 8 &lt;br /&gt;
| 3 dividido entre 2 es 1 y sobran 1 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(3,2)=\mathrm{mcd}(2,1)&amp;lt;/math&amp;gt; &lt;br /&gt;
| – &lt;br /&gt;
| 9 &lt;br /&gt;
| 2 dividido entre 1 es 2 y sobra 0 &lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2,1)=\mathrm{mcd}(1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; divisiones para calcular el máximo común divisor de &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;gt;m&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; bits, entonces el número promedio de divisiones necesarias es &amp;lt;math&amp;gt;\textstyle{\frac{\pi^2}{6}n}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; es el grado de los polinomios. &lt;br /&gt;
&lt;br /&gt;
== Implementación en pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
{{Algoritmo|de Euclides tradicional implementado de manera recurrente|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:'''Si''' &amp;lt;math&amp;gt;b=0 &amp;lt;/math&amp;gt; '''entonces:'''&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt;&lt;br /&gt;
:'''En otro caso:'''&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;\mathrm{mcd}(b,a\bmod b)&amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides tradicional implementado de manera iterativa|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,b)\gets(b,a\bmod b)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides extendido implementado de manera recurrente|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:'''Si''' &amp;lt;math&amp;gt;b=0 &amp;lt;/math&amp;gt; '''entonces:'''&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;(a,1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''En otro caso:'''&lt;br /&gt;
::&amp;lt;math&amp;gt;(d,s,t)\gets{\it Euclides}(b,a\bmod b)&amp;lt;/math&amp;gt;&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;(d,t,s–(a\div b) t)&amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides extendido implementado de manera iterativa|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:&amp;lt;math&amp;gt;(s,t,s^\prime,t^\prime)\gets(1,0,0,1)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::Divida &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; para obtener un cociente &amp;lt;math&amp;gt;q &amp;lt;/math&amp;gt; y un residuo &amp;lt;math&amp;gt;r &amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,s,t,b,s^\prime,t^\prime)\gets(b,s^\prime,t^\prime,r,s–s^\prime q,t–t^\prime q)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;(a,s,t)&amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides extendido implementado de manera iterativa con matrices|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:&amp;lt;math&amp;gt;Q\gets\begin{pmatrix}1&amp;amp;0\\0&amp;amp;1\end{pmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::Divida &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; para obtener un cociente &amp;lt;math&amp;gt;q &amp;lt;/math&amp;gt; y un residuo &amp;lt;math&amp;gt;r &amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;Q\gets\begin{pmatrix}0&amp;amp;1\\1&amp;amp;–q\end{pmatrix}\times Q&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,b)\gets(b,r)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;(a,Q_{1 1},Q_{1 2})&amp;lt;/math&amp;gt;&lt;br /&gt;
}} Acerca de la notación empleada: &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;x\gets y&amp;lt;/math&amp;gt; significa &amp;quot;asigne a la variable &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; el valor actual de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot;. En lenguajes como [[Lenguaje C|C]], [[Lenguaje de programación Java|Java]], [[C]], [[Python]] y [[Visual Basic]] esto significa simplemente &amp;lt;code&amp;gt;x = y&amp;lt;/code&amp;gt;. En otros lenguajes como [[Lenguaje de programación Pascal|Pascal]] se traduce en &amp;lt;code&amp;gt;a&amp;amp;nbsp;:= b&amp;lt;/code&amp;gt;, en [[Maxima]] es &amp;lt;code&amp;gt;a&amp;amp;nbsp;: b&amp;lt;/code&amp;gt;, en [[R–project|R]], S y [[Ocaml]] es &amp;lt;code&amp;gt;x &amp;amp;lt;– y&amp;lt;/code&amp;gt;, e inclusive se utiliza la flecha &amp;lt;code&amp;gt;x ← y&amp;lt;/code&amp;gt; como el caso de [[APL]]. &lt;br /&gt;
*&amp;lt;math&amp;gt;(x,y,z)\gets(a,b,c)&amp;lt;/math&amp;gt; significa que primero se evalúan los valores &amp;lt;math&amp;gt;a,b,c&amp;lt;/math&amp;gt; y luego se asigna &amp;lt;math&amp;gt;x\gets a,y\gets b,z\gets c&amp;lt;/math&amp;gt;, etc. En lenguajes como Python, [[Ruby]] o Maxima esta instrucción tiene una estructura muy similar, como por ejemplo en Python: &amp;lt;code&amp;gt;(x,y,z) = (a,b,c)&amp;lt;/code&amp;gt;. En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: &amp;lt;code&amp;gt;aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;&amp;lt;/code&amp;gt;. &lt;br /&gt;
*&amp;lt;math&amp;gt;a\div b&amp;lt;/math&amp;gt; significa &amp;quot;el cociente de dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&amp;quot;. 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 &amp;lt;code&amp;gt;a/b&amp;lt;/code&amp;gt;. Otras maneras son &amp;lt;code&amp;gt;a\b&amp;lt;/code&amp;gt; (Visual Basic) , &amp;lt;code&amp;gt;a div b&amp;lt;/code&amp;gt; (Pascal) o bien &amp;lt;code&amp;gt;a//b&amp;lt;/code&amp;gt; (Python 3). &lt;br /&gt;
*&amp;lt;math&amp;gt;a\bmod b&amp;lt;/math&amp;gt; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&amp;quot;. A esta operación se le conoce simplemente como ''módulo''. En muchos lenguajes de programación se implementa como &amp;lt;code&amp;gt;a&amp;amp;nbsp;% b&amp;lt;/code&amp;gt;, mientras que en otros es &amp;lt;code&amp;gt;a mod b&amp;lt;/code&amp;gt; (Visual Basic o Pascal) o bien &amp;lt;code&amp;gt;a rem b&amp;lt;/code&amp;gt; (Ada).&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=64629</id>
		<title>Algoritmo de Euclides</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Euclides&amp;diff=64629"/>
		<updated>2010-05-12T19:07:53Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '==== {{Referencia}}{{Construcción}}Algoritmo de Euclides &amp;lt;br&amp;gt; ====  El algoritmo de Euclides es un método antiguo y eficaz para calcular el máximo común divisor (MCD). Fue o…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== {{Referencia}}{{Construcción}}Algoritmo de Euclides &amp;lt;br&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo original de Euclides  ==&lt;br /&gt;
&lt;br /&gt;
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 [[Conmensurable|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''. &lt;br /&gt;
&lt;br /&gt;
No cualquier par de segmentos es conmensurable, como encontraron los pitagóricos cuando establecen que&amp;amp;nbsp; no es un número racional, pero en el caso de dos segmentos conmensurables se desea hallar la mayor medida común posible. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&amp;lt;div style=&amp;quot;width: 75%;&amp;quot;&amp;gt;{{cita|1='''Para encontrar la máxima medida común de dos números que no sean primos entre sí.'''&lt;br /&gt;
[[Archivo:Euclides VII-2.svg|center|200px]]&lt;br /&gt;
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''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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''.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
|2=[[Euclides]]. ''[[Elementos de Euclides|Elementos]] VII.2''}}&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;br&amp;gt; En lenguaje moderno, el algoritmo se describe como sigue: &lt;br /&gt;
&lt;br /&gt;
#Dados dos segmentos ''AB'' y ''CD'' (con ''AB&amp;amp;gt;CD''), restamos ''CD'' de ''AB'' tantas veces como sea posible. Si no hay residuo, entonces ''CD'' es la máxima medida común. &lt;br /&gt;
#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. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
El hecho de que los segmentos son conmesurables es clave para asegurar que el proceso termina tarde o temprano &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides tradicional  ==&lt;br /&gt;
&lt;br /&gt;
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''. &lt;br /&gt;
&lt;br /&gt;
Según lo antes mencionado, para calcular el máximo común divisor de 2366 y 273 se puede proseguir de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso&lt;br /&gt;
! Operación&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2366 dividido entre 273 es 8 y sobran 182&lt;br /&gt;
| mcd(2366,273) = mcd(273,182)&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 273 dividido entre 182 es 1 y sobran 91&lt;br /&gt;
| mcd(273,182) = mcd(182,91)&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 182 dividido entre 91 es 2 y sobra 0&lt;br /&gt;
| mcd(182,91) = mcd(91,0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
#Si ''b'' = 0 entonces mcd(a,b) = a y el algoritmo termina &lt;br /&gt;
#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&lt;br /&gt;
&lt;br /&gt;
Asuma que llamamos ''a = r&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; y b = r''&amp;lt;sub&amp;gt;''1''&amp;lt;/sub&amp;gt;. Aplicando estas reglas se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso&lt;br /&gt;
! Operación&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| r&amp;lt;sub&amp;gt;0 &amp;lt;/sub&amp;gt;dividido entre r&amp;lt;sub&amp;gt;1 &amp;lt;/sub&amp;gt;es q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; y sobran r&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
| mcd(r&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;) = mcd(r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; dividido entre r&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; es q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; y sobran r&amp;lt;sub&amp;gt;3 &amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
| mcd(r&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;) = mcd(r&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| r&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; dividido entre r&amp;lt;sub&amp;gt;3 &amp;lt;/sub&amp;gt;es q&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt; y sobran r&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
| mcd(r&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;) = mcd(r&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| ''n''&lt;br /&gt;
| r&amp;lt;sub&amp;gt;n − 1&amp;lt;/sub&amp;gt; dividido entre r&amp;lt;sub&amp;gt;n &amp;lt;/sub&amp;gt;es qn y sobran r&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ''n + 1''&amp;lt;br&amp;gt;&lt;br /&gt;
| r&amp;lt;sub&amp;gt;n &amp;lt;/sub&amp;gt;dividido entre r&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; es q&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt; y sobra 0&amp;lt;br&amp;gt;&lt;br /&gt;
| mcd(r&amp;lt;sub&amp;gt;n − 1&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;) = mcd(r&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;n + 1&amp;lt;/sub&amp;gt;)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;r_n&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q_{n+1}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(r_n,r_{n+1})=\mathrm{mcd}(r_{n+1},0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;r_{n+1}&amp;lt;/math&amp;gt; (el último residuo que no es cero). &lt;br /&gt;
&lt;br /&gt;
=== Generalización  ===&lt;br /&gt;
&lt;br /&gt;
En realidad el algoritmo de Euclides funciona no sólo para los números naturales, sino para cualesquiera elementos donde exista una &amp;quot;división con residuo&amp;quot;. 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. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para calcular el máximo común divisor de los polinomios &amp;lt;math&amp;gt;P(x)=x^5+2x^3+x&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;Q(x)=x^4-1&amp;lt;/math&amp;gt; el algoritmo de Euclides sugiere la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso&lt;br /&gt;
! Operación&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| &amp;lt;math&amp;gt;x^5+2x^3+x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^5+2x^3+x,x^4-1)=\mathrm{mcd}(x^4-1,2x^3+2x)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| &amp;lt;math&amp;gt;x^4-1&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;\textstyle{\frac12x}&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(x^4-1,2x^3+2x)=\mathrm{mcd}(2x^3+2x,-x^2-1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| &amp;lt;math&amp;gt;2x^3+2x&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;-2x&amp;lt;/math&amp;gt; y sobra 0&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2x^3+2x,-x^2-1)=\mathrm{mcd}(-x^2-1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
De esta manera se concluye que su máximo común divisor es &amp;lt;math&amp;gt;-x^2-1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Se puede expresar este algoritmo de manera más formal usando [[Pseudocódigo]]. En este caso la expresión &amp;quot;&amp;lt;math&amp;gt;x\bmod y&amp;lt;/math&amp;gt;&amp;quot; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot; (véase [[Aritmética modular]]). {{Algoritmo|de Euclides|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_1\gets b&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq 0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## &amp;lt;math&amp;gt;r_{i+1}\gets r_{i-1}\bmod r_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
|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 &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Algoritmo de Euclides extendido  ==&lt;br /&gt;
&lt;br /&gt;
El algoritmo de Euclides extendido permite, además de encontrar un máximo común divisor de dos números enteros &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, expresarlo como la mínima combinación lineal de esos números, es decir, encontrar números enteros &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s+b t&amp;lt;/math&amp;gt;. Esto se generaliza también hacia cualquier dominio euclideano. &lt;br /&gt;
&lt;br /&gt;
=== Fundamentos  ===&lt;br /&gt;
&lt;br /&gt;
Existen varias maneras de explicar el algoritmo de Euclides extendido, una de las más comunes consiste en la siguiente: &lt;br /&gt;
&lt;br /&gt;
#Usar el algoritmo tradicional de Euclides. En cada paso, en lugar de &amp;quot;&amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; dividido entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt; y sobra &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&amp;quot; se escribe la ecuación &amp;lt;math&amp;gt;a=b q+r&amp;lt;/math&amp;gt; (véase [[Algoritmo de la división]]). &lt;br /&gt;
#Se despejan los residuos de cada ecuación. &lt;br /&gt;
#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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;2\times 2&amp;lt;/math&amp;gt; se usa la siguiente fórmula (vése [[Producto de matrices]]): {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}e&amp;amp;f\\g&amp;amp;h\end{bmatrix}\times\begin{bmatrix}a&amp;amp;b\\c&amp;amp;d\end{bmatrix}=\begin{bmatrix}e a+f c&amp;amp;e b+f d\\g a+h c&amp;amp;g b+h d\end{bmatrix}&amp;lt;/math&amp;gt;|1}} Supóngase que se utiliza el algoritmo de Euclides tradicional para calcular los valores &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; que ahí se describen. Por cada valor &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; calculado se puede formar la matriz &amp;lt;math&amp;gt;\textstyle Q_i=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;-q_i\end{bmatrix}&amp;lt;/math&amp;gt;. Usando la ecuación {{Eqnref|1}} de manera repetida se puede calcular el producto las primeras &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; matrices de este tipo: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;-q_i\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;-q_{i-1}\end{bmatrix}\times\cdots\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;-q_1\end{bmatrix}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Resulta ser que los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; tienen la propiedad de que &amp;lt;math&amp;gt;r_i=a s_i+b t_i&amp;lt;/math&amp;gt;, es decir, expresan a &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; como una combinación lineal de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;. Particularmente, como &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=r_{n+1}&amp;lt;/math&amp;gt; entonces se tiene &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=a s_{n+1}+b t_{n+1}&amp;lt;/math&amp;gt;, 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.&amp;lt;!--Pero no colocaré la demostración en una enciclopedia--&amp;gt; Es importante calcular &amp;lt;math&amp;gt;Q_i\times\cdots\times Q_3\times Q_2\times Q_1&amp;lt;/math&amp;gt; en ese mismo orden. La matriz &amp;lt;math&amp;gt;Q_1&amp;lt;/math&amp;gt; aparece en el extremo derecho y la matriz &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; en el izquierdo. &lt;br /&gt;
&lt;br /&gt;
Regresando al primer ejemplo, la sucesión de cocientes es &amp;lt;math&amp;gt;q_1=8&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;q_2=1&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;q_3=2&amp;lt;/math&amp;gt;. Entonces se puede calcular {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}-1&amp;amp;9\\3&amp;amp;-26\end{bmatrix}=\begin{bmatrix}0&amp;amp;1\\1&amp;amp;-2\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;-1\end{bmatrix}\times \begin{bmatrix}0&amp;amp;1\\1&amp;amp;-8\end{bmatrix}&amp;lt;/math&amp;gt;}} Utilizando el primer renglón de esta matriz se puede leer que &amp;lt;math&amp;gt;91=2366(-1)+273(9)&amp;lt;/math&amp;gt;, es decir, se ha encontrado la manera de expresar al máximo común divisor de 2366 y 273 como una combinación lineal. &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal  ===&lt;br /&gt;
&lt;br /&gt;
Para expresar el algoritmo de Euclides extendido es conveniente notar la manera en que se calculan los valores &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; con la multiplicación de matrices: {{Ecuación | &amp;lt;math&amp;gt;\begin{bmatrix}s_i&amp;amp;t_i\\s_{i+1}&amp;amp;t_{i+1}\end{bmatrix} =&lt;br /&gt;
\begin{bmatrix}s_i&amp;amp;t_i\\s_{i-1}-q_is_i&amp;amp;t_{i-1}-q_it_i\end{bmatrix} = \begin{bmatrix}0&amp;amp;1\\1&amp;amp;-q_i\end{bmatrix}\times\begin{bmatrix}s_{i-1}&amp;amp;t_{i-1}\\s_i&amp;amp;t_i\end{bmatrix}&amp;lt;/math&amp;gt;}} De esta manera &amp;lt;math&amp;gt;s_{i+1} = s_{i-1}-q_is_i&amp;lt;/math&amp;gt; y además &amp;lt;math&amp;gt;t_{i+1} = t_{i-1}-q_it_i&amp;lt;/math&amp;gt;. Por lo tanto el algoritmo en pseudocódigo se puede expresar como sigue: {{Algoritmo|de Euclides extendido|&lt;br /&gt;
'''Entrada:''' Valores &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; pertenecientes a un dominio euclídeo&lt;br /&gt;
&lt;br /&gt;
'''Salida:''' Un máximo común divisor de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, y valores &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; tales que &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)=as+bt&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;r_0\gets a, r_1\gets b, s_0\gets 1, t_0\gets 0, s_1\gets 0, t_1\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;i\gets 1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''Mientras''' &amp;lt;math&amp;gt;r_i\neq0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
## Divida &amp;lt;math&amp;gt;r_{i-1} &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;r_i &amp;lt;/math&amp;gt; para obtener el cociente &amp;lt;math&amp;gt;q_i &amp;lt;/math&amp;gt; y el residuo &amp;lt;math&amp;gt;r_{i+1} &amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;s_{i+1}\gets s_{i-1}-q_is_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;t_{i+1}\gets t_{i-1}-q_it_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## &amp;lt;math&amp;gt;i\gets i+1&amp;lt;/math&amp;gt;&lt;br /&gt;
# '''El resultado es:''' &amp;lt;math&amp;gt;r_{i-1} &amp;lt;/math&amp;gt; es un máximo común divisor de &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; y se expresa &amp;lt;math&amp;gt;r_{i-1}=as_{i-1}+bt_{i-1} &amp;lt;/math&amp;gt;&lt;br /&gt;
|2}} &lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
=== Simplificar fracciones  ===&lt;br /&gt;
&lt;br /&gt;
Al momento de hacer cálculos con fracciones, es de gran importancia saber cómo simplificarlas. Por ejemplo, la fracción &amp;lt;math&amp;gt;\textstyle\frac{65}{91}&amp;lt;/math&amp;gt; es equivalente con &amp;lt;math&amp;gt;\textstyle\frac 5 7&amp;lt;/math&amp;gt; (véase [[Número racional]]). De manera más general, &amp;lt;math&amp;gt;\textstyle\frac ab=\frac {ca}{cb}&amp;lt;/math&amp;gt; siempre que &amp;lt;math&amp;gt;c\ne0&amp;lt;/math&amp;gt;. Para reducir una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt;, sólo se necesita dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; entre su máximo común divisor. &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si se desea reducir &amp;lt;math&amp;gt;\textstyle\frac{166}{249}&amp;lt;/math&amp;gt;, primero se usa el algoritmo de Euclides para encontrar &amp;lt;math&amp;gt;\mathrm{mcd}(166,249)=83&amp;lt;/math&amp;gt;. Se hacen las divisiones &amp;lt;math&amp;gt;\textstyle 166\div 83 = 2&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;\textstyle 249\div 83 = 3&amp;lt;/math&amp;gt;. Luego entonces se concluye que &amp;lt;math&amp;gt;\textstyle\frac{166}{249}=\frac 2 3&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
=== Fracciones continuas  ===&lt;br /&gt;
&lt;br /&gt;
La sucesión de divisiones que se efectúan al seguir algoritmo de Euclides puede ser utilizada para expresar una fracción cualquiera &amp;lt;math&amp;gt;\textstyle\frac a b&amp;lt;/math&amp;gt; como [[Fracción continua]]. Esto se debe a que si &amp;lt;math&amp;gt;a = bq + r&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;r\neq 0&amp;lt;/math&amp;gt;, entonces {{ecuación|&amp;lt;math&amp;gt;\frac a b = q + \frac 1 {\frac b r}&amp;lt;/math&amp;gt;|3}} &lt;br /&gt;
&lt;br /&gt;
Por ejemplo, para encontrar el máximo común divisor de &amp;lt;math&amp;gt;93164&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;5826&amp;lt;/math&amp;gt; el algoritmo genera la siguiente secuencia de divisiones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso&lt;br /&gt;
! Operación&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 93164 dividido entre 5826 es 15 y sobran 5774&lt;br /&gt;
| &amp;lt;math&amp;gt;93164=5826\times 15+5774&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 5826 dividido entre 5774 es 1 y sobran 52&lt;br /&gt;
| &amp;lt;math&amp;gt;5826=5774\times 1+52&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 5774 dividido entre 52 es 111 y sobran 2&lt;br /&gt;
| &amp;lt;math&amp;gt;5774=52\times 111+2&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 52 dividido entre 2 es 26 y sobra 0&lt;br /&gt;
| &amp;lt;math&amp;gt;52=2\times 26+0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Todas estas ecuaciones las podemos hacer parecidas a la ecuación {{eqnref | 3}}: &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{93164}{5826}=15+ \frac 1 {\frac{5826}{5774}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5826}{5774}=1+ \frac 1 {\frac{5774}{52}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{5774}{52}=111+ \frac 1 {\frac{52}{2}}&amp;lt;/math&amp;gt; &lt;br /&gt;
#&amp;lt;math&amp;gt;\textstyle\frac{52}{2}=26&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si se substituye la segunda ecuación en la primera, se obtiene {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {\frac{5774}{52}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Si se repite este proceso de substitución entonces se obtiene la expresión deseada: {{Ecuación|&amp;lt;math&amp;gt;\frac{93164}{5826}=15+ \frac 1 {1+ \frac 1 {111+ \frac 1 {26}}}&amp;lt;/math&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
De manera más general, la fracción continua encontrada con este algoritmo siempre es de la forma {{Ecuación|&amp;lt;math&amp;gt;\frac{a}{b}=q_1+ \frac 1 {q_2+ \frac 1 {q_3+ \frac 1 {\ddots q_{n-1}+ \frac 1 {q_n}}}}&amp;lt;/math&amp;gt;}} &amp;lt;!-- Esto va en la sección siguiente: Volviendo al caso &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; enteros, el algoritmo de Euclides permite encontrar los coeficientes enteros &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; de la [[identidad de Bézout]] &amp;lt;math&amp;gt;au+bv=\mathrm{mcd}(a, b)&amp;lt;/math&amp;gt; de fundamental importancia en la [[aritmética]]. --&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Inversos modulares  ===&lt;br /&gt;
&lt;br /&gt;
Decimos que dos números enteros son ''congruentes módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;'' (aunque también se puede generalizar para cualquier otro dominio euclídeo) si al dividirlos entre &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; 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 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; es congruente con &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; se escribe &amp;lt;math&amp;gt;a\equiv b\pmod m&amp;lt;/math&amp;gt;, en el ejemplo anterior se tiene &amp;lt;math&amp;gt;7\equiv 12\pmod 5&amp;lt;/math&amp;gt;. Supóngase que se conocen los valores de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, pero que se desconoce el valor &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; de la siguiente ecuación: {{Ecuacion |&amp;lt;math&amp;gt;a x\equiv b\pmod m&amp;lt;/math&amp;gt;|2}} Basta con encontrar un valor &amp;lt;math&amp;gt;a^{-1}&amp;lt;/math&amp;gt; que tenga la característica de que &amp;lt;math&amp;gt;a^{-1} a\equiv 1\pmod m&amp;lt;/math&amp;gt;, pues de esta manera al multiplicar la ecuación {{eqnref|2}} por &amp;lt;math&amp;gt;a^{-1}&amp;lt;/math&amp;gt; se tendría la solución deseada: {{Ecuacion | &amp;lt;math&amp;gt;x\equiv a^{-1} b\pmod m&amp;lt;/math&amp;gt;}} Al valor &amp;lt;math&amp;gt;a^{-1}&amp;lt;/math&amp;gt; se le llama ''inverso modular'' de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Desafortunadamente este valor no siempre existe. Por ejemplo, con &amp;lt;math&amp;gt;a=4&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m=6&amp;lt;/math&amp;gt; no existe ningún número entero entero &amp;lt;math&amp;gt;a^{-1}&amp;lt;/math&amp;gt; tal que &amp;lt;math&amp;gt;a^{-1} 4\equiv 1\pmod 6&amp;lt;/math&amp;gt;. De hecho este valor existe si y sólo si &amp;lt;math&amp;gt;\mathrm{mcd}(a,m)=1&amp;lt;/math&amp;gt;. Más aún, si al usar el algoritmo de Euclides extendido (ahora con &amp;lt;math&amp;gt;b=m&amp;lt;/math&amp;gt;) se obtiene &amp;lt;math&amp;gt;1=as+mt&amp;lt;/math&amp;gt;, entonces el valor &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; es el inverso modular de &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; módulo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. &amp;lt;!--LA DEMOSTRACIÓN NO ES BUENO COLOCARLA EN LA ENCICLOPEDIA--&amp;gt; Por ejemplo, se desea resolver la ecuación {{Ecuacion |&amp;lt;math&amp;gt;5 x\equiv 2\pmod 9&amp;lt;/math&amp;gt;}} Entonces con el algoritmo de Euclides extendido se calcula que &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1=5(2)+9(-1)&amp;lt;/math&amp;gt;. Como &amp;lt;math&amp;gt;\mathrm{mcd}(5,9)=1&amp;lt;/math&amp;gt; entonces 5 tiene un inverso modular. Más aún, como &amp;lt;math&amp;gt;1=5(2)+9(-1)&amp;lt;/math&amp;gt;, entonces ese inverso es 2. Entonces {{Ecuacion |&amp;lt;math&amp;gt;x\equiv 2(2)\pmod 9&amp;lt;/math&amp;gt;}} Es decir que el valor de &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; es &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Véase [[Multiplicador modular inverso]] &lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
[[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.]] &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;f_{10}=55&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;f_{11}=89&amp;lt;/math&amp;gt; se obtiene la siguiente secuencia de operaciones: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Paso&lt;br /&gt;
! Operación&lt;br /&gt;
! Significado&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 89 dividido entre 55 es 1 y sobran 34&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(89,55)=\mathrm{mcd}(55,34)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 55 dividido entre 34 es 1 y sobran 21&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(55,34)=\mathrm{mcd}(34,21)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 34 dividido entre 21 es 1 y sobran 13&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(34,21)=\mathrm{mcd}(21,13)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 21 dividido entre 13 es 1 y sobran 8&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(21,13)=\mathrm{mcd}(13,8)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 13 dividido entre 8 es 1 y sobran 5&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(13,8)=\mathrm{mcd}(8,5)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 8 dividido entre 5 es 1 y sobran 3&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(8,5)=\mathrm{mcd}(5,3)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 5 dividido entre 3 es 1 y sobran 2&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(5,3)=\mathrm{mcd}(3,2)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 3 dividido entre 2 es 1 y sobran 1&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(3,2)=\mathrm{mcd}(2,1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 2 dividido entre 1 es 2 y sobra 0&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathrm{mcd}(2,1)=\mathrm{mcd}(1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; divisiones para calcular el máximo común divisor de &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; y &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;gt;m&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; bits, entonces el número promedio de divisiones necesarias es &amp;lt;math&amp;gt;\textstyle{\frac{\pi^2}{6}n}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal O(\log n)&amp;lt;/math&amp;gt; donde &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; es el grado de los polinomios. &lt;br /&gt;
&lt;br /&gt;
== Implementación en pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
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: &lt;br /&gt;
&lt;br /&gt;
{{Algoritmo|de Euclides tradicional implementado de manera recurrente|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:'''Si''' &amp;lt;math&amp;gt;b=0 &amp;lt;/math&amp;gt; '''entonces:'''&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt;&lt;br /&gt;
:'''En otro caso:'''&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;\mathrm{mcd}(b,a\bmod b)&amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides tradicional implementado de manera iterativa|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;\mathrm{mcd}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,b)\gets(b,a\bmod b)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides extendido implementado de manera recurrente|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:'''Si''' &amp;lt;math&amp;gt;b=0 &amp;lt;/math&amp;gt; '''entonces:'''&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;(a,1,0)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''En otro caso:'''&lt;br /&gt;
::&amp;lt;math&amp;gt;(d,s,t)\gets{\it Euclides}(b,a\bmod b)&amp;lt;/math&amp;gt;&lt;br /&gt;
::'''El resultado es''' &amp;lt;math&amp;gt;(d,t,s-(a\div b) t)&amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides extendido implementado de manera iterativa|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:&amp;lt;math&amp;gt;(s,t,s^\prime,t^\prime)\gets(1,0,0,1)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::Divida &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; para obtener un cociente &amp;lt;math&amp;gt;q &amp;lt;/math&amp;gt; y un residuo &amp;lt;math&amp;gt;r &amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,s,t,b,s^\prime,t^\prime)\gets(b,s^\prime,t^\prime,r,s-s^\prime q,t-t^\prime q)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;(a,s,t)&amp;lt;/math&amp;gt;&lt;br /&gt;
}} {{Algoritmo|de Euclides extendido implementado de manera iterativa con matrices|&lt;br /&gt;
'''Función''' &amp;lt;math&amp;gt;{\it Euclides}(a,b)&amp;lt;/math&amp;gt;''':'''&lt;br /&gt;
:&amp;lt;math&amp;gt;Q\gets\begin{pmatrix}1&amp;amp;0\\0&amp;amp;1\end{pmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''Mientras''' &amp;lt;math&amp;gt;b\ne0&amp;lt;/math&amp;gt; '''haga lo siguiente:'''&lt;br /&gt;
::Divida &amp;lt;math&amp;gt;a &amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b &amp;lt;/math&amp;gt; para obtener un cociente &amp;lt;math&amp;gt;q &amp;lt;/math&amp;gt; y un residuo &amp;lt;math&amp;gt;r &amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;Q\gets\begin{pmatrix}0&amp;amp;1\\1&amp;amp;-q\end{pmatrix}\times Q&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;(a,b)\gets(b,r)&amp;lt;/math&amp;gt;&lt;br /&gt;
:'''El resultado es''' &amp;lt;math&amp;gt;(a,Q_{1 1},Q_{1 2})&amp;lt;/math&amp;gt;&lt;br /&gt;
}} Acerca de la notación empleada: &lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;x\gets y&amp;lt;/math&amp;gt; significa &amp;quot;asigne a la variable &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; el valor actual de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;&amp;quot;. En lenguajes como [[Lenguaje C|C]], [[Lenguaje de programación Java|Java]], [[C]], [[Python]] y [[Visual Basic]] esto significa simplemente &amp;lt;code&amp;gt;x = y&amp;lt;/code&amp;gt;. En otros lenguajes como [[Lenguaje de programación Pascal|Pascal]] se traduce en &amp;lt;code&amp;gt;a&amp;amp;nbsp;:= b&amp;lt;/code&amp;gt;, en [[Maxima]] es &amp;lt;code&amp;gt;a&amp;amp;nbsp;: b&amp;lt;/code&amp;gt;, en [[R-project|R]], S y [[Ocaml]] es &amp;lt;code&amp;gt;x &amp;amp;lt;- y&amp;lt;/code&amp;gt;, e inclusive se utiliza la flecha &amp;lt;code&amp;gt;x ← y&amp;lt;/code&amp;gt; como el caso de [[APL]]. &lt;br /&gt;
*&amp;lt;math&amp;gt;(x,y,z)\gets(a,b,c)&amp;lt;/math&amp;gt; significa que primero se evalúan los valores &amp;lt;math&amp;gt;a,b,c&amp;lt;/math&amp;gt; y luego se asigna &amp;lt;math&amp;gt;x\gets a,y\gets b,z\gets c&amp;lt;/math&amp;gt;, etc. En lenguajes como Python, [[Ruby]] o Maxima esta instrucción tiene una estructura muy similar, como por ejemplo en Python: &amp;lt;code&amp;gt;(x,y,z) = (a,b,c)&amp;lt;/code&amp;gt;. En otros lenguajes es necesario el uso de variables auxiliares, como por ejemplo en lenguaje C: &amp;lt;code&amp;gt;aux1 = b; aux2 = c; x = a; y = aux1; z = aux2;&amp;lt;/code&amp;gt;. &lt;br /&gt;
*&amp;lt;math&amp;gt;a\div b&amp;lt;/math&amp;gt; significa &amp;quot;el cociente de dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&amp;quot;. 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 &amp;lt;code&amp;gt;a/b&amp;lt;/code&amp;gt;. Otras maneras son &amp;lt;code&amp;gt;a\b&amp;lt;/code&amp;gt; (Visual Basic) , &amp;lt;code&amp;gt;a div b&amp;lt;/code&amp;gt; (Pascal) o bien &amp;lt;code&amp;gt;a//b&amp;lt;/code&amp;gt; (Python 3). &lt;br /&gt;
*&amp;lt;math&amp;gt;a\bmod b&amp;lt;/math&amp;gt; significa &amp;quot;el residuo de dividir &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; entre &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&amp;quot;. A esta operación se le conoce simplemente como ''módulo''. En muchos lenguajes de programación se implementa como &amp;lt;code&amp;gt;a&amp;amp;nbsp;% b&amp;lt;/code&amp;gt;, mientras que en otros es &amp;lt;code&amp;gt;a mod b&amp;lt;/code&amp;gt; (Visual Basic o Pascal) o bien &amp;lt;code&amp;gt;a rem b&amp;lt;/code&amp;gt; (Ada).&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
{{listaref}} &amp;lt;!-- Recomiendo revisarlos en este orden (así influyeron en la redacción del artículo)--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*{{cita libro&lt;br /&gt;
| autor = von zur Gathen, Joachim; Gerhard, Jürgen&lt;br /&gt;
| capítulo = The Euclidean Algorithm&lt;br /&gt;
| título = [http://math-www.uni-paderborn.de/mca/ Modern Computer Algebra]&lt;br /&gt;
| año = 2003&lt;br /&gt;
| editorial = Cambridge University Press&lt;br /&gt;
| id = ISBN 0-521-82646-2&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
| autor = Shoup, Victor&lt;br /&gt;
| capítulo = Euclid’s algorithm&lt;br /&gt;
| título = [http://www.shoup.net/ntb/ A Computational Introduction to Number Theory and Algebra]&lt;br /&gt;
| año = 2008&lt;br /&gt;
| editorial = Cambridge University Press&lt;br /&gt;
| id = ISBN 978-0-521-85154-1&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
| autor = Johnsonbaugh, Richard&lt;br /&gt;
| capítulo = Introducción a la teoría de números&lt;br /&gt;
| título = Matemáticas Discretas&lt;br /&gt;
| año = 2005&lt;br /&gt;
| editorial = México: PEARSON EDUCACIÓN&lt;br /&gt;
| id = ISBN 970-26-0637-3&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
| autor = Ralph P. Grimaldi&lt;br /&gt;
| capítulo = Propiedades de los números enteros: Inducción matemática&lt;br /&gt;
| título = Matemáticas Discreta y Combinatoria&lt;br /&gt;
| año = 1998&lt;br /&gt;
| editorial = México: Addison Wesley Longman de México&lt;br /&gt;
| id = ISBN 968-444-324-2&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
| autor = Lipschutz, Seymour; Lipson, Marc&lt;br /&gt;
| capítulo = Propiedades de los enteros&lt;br /&gt;
| título = Matemáticas Discretas&lt;br /&gt;
| año = 2009&lt;br /&gt;
| editorial = McGraw-Hill&lt;br /&gt;
| id = ISBN 978-970-10-7236-3&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
| autor = Brassard, Gilles; Bratley, Paul&lt;br /&gt;
| capítulo = Análisis de algoritmos&lt;br /&gt;
| título = Fundamentos de Algoritmia&lt;br /&gt;
| año = 1997&lt;br /&gt;
| editorial = Madrid: PRENTICE HALL&lt;br /&gt;
| id = ISBN 84-89660-00-X&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
| autor = Vallée, Brigitte&lt;br /&gt;
| título = Dynamical Analysis of &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;-Euclidean Algorithms&lt;br /&gt;
| año = 2002&lt;br /&gt;
| publicación = Journal of Algorithms&lt;br /&gt;
| volumen = 44&lt;br /&gt;
| número = 1&lt;br /&gt;
| id = ISSN 0196-6774 , pp. 246-285 &amp;lt;!-- No estoy seguro del ISSN, favor de verificar--&amp;gt;&lt;br /&gt;
| url = http://users.info.unicaen.fr/~brigitte/Publications/bourdon-daireaux-vallee.ps&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
| autor = Cormen, Thomas; Leiserson, Charles; Rivest, Ronald; Stein, Clifford&lt;br /&gt;
| capítulo = Number-Theoretic Algorithms&lt;br /&gt;
| título = Introduction to Algorithms&lt;br /&gt;
| año = 2009&lt;br /&gt;
| editorial = The MIT Press&lt;br /&gt;
| id = ISBN 978-0-262-53305-8&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
| autor = Barrera Mora, Fernando&lt;br /&gt;
| capítulo = Definiciones y resultados generales&lt;br /&gt;
| 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]&lt;br /&gt;
| año = 2005&lt;br /&gt;
| editorial = Publicaciones Electrónicas de la Sociedad Matemática Mexicana&lt;br /&gt;
| id = ISBN 968-9161-02-4&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
| autor = Cárdenas, Humberto; Lluis, Emilio; Raggi, Francisco; Tomás, Francisco&lt;br /&gt;
| capítulo = Divisibilidad&lt;br /&gt;
| título = Álgebra Superior&lt;br /&gt;
| año = 2004&lt;br /&gt;
| editorial = México: Trillas&lt;br /&gt;
| id = ISBN 968-24-3783-0&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
| autor = Pérez Seguí, María Luisa&lt;br /&gt;
| capítulo = Divisibilidad&lt;br /&gt;
| título = Teoría de Números&lt;br /&gt;
| año = 2006&lt;br /&gt;
| editorial = Instituto de Matemáticas, UNAM&lt;br /&gt;
| id = ISBN 970-32-1170-0&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
| autor = Sánchez Velázquez, Jesús&lt;br /&gt;
| capítulo = Algoritmos para números grandes&lt;br /&gt;
| título = Introducción al análisis de algoritmos&lt;br /&gt;
| año = 1998&lt;br /&gt;
| editorial = México: Trillas&lt;br /&gt;
| id = ISBN 968-24-4341-5&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
| autor = Baldor, Aurelio&lt;br /&gt;
| capítulo = Máximo común divisor&lt;br /&gt;
| título = Álgebra&lt;br /&gt;
| año = 2008&lt;br /&gt;
| editorial = México: Grupo Editorial Patria&lt;br /&gt;
| id = ISBN 978-970-817-000-0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Kruskal&amp;diff=59076</id>
		<title>Algoritmo de Kruskal</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Kruskal&amp;diff=59076"/>
		<updated>2010-05-05T18:27:59Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}}Al algoritmo de Kruskal es un algoritmo de la teoría de grafos para encontrar un árbol recubridor mínimo en un grafo conexo y ponderado. Es decir, busca un subconjunto de aristas que, formando un árbol, incluyen todos los vértices y donde el valor total de todas las aristas del árbol es el mínimo. Si el grafo no es conexo, entonces busca un bosque expandido mínimo (un árbol expandido mínimo para cada componente conexa). El algoritmo de Kruskal es un ejemplo de algoritmo voraz.&amp;lt;br&amp;gt;Un ejemplo de árbol expandido mínimo. Cada punto representa un vértice, el cual puede ser un árbol por sí mismo. Se usa el Algoritmo para buscar las distancias más cortas (árbol expandido) que conectan todos los puntos o vértices. &lt;br /&gt;
&lt;br /&gt;
Funciona de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
*&amp;amp;nbsp; se crea un bosque B (un conjunto de árboles), donde cada vértice del grafo es un árbol separado &lt;br /&gt;
*&amp;amp;nbsp; se crea un conjunto C que contenga a todas las aristas del grafo &lt;br /&gt;
*&amp;amp;nbsp; mientras C es no vacío &lt;br /&gt;
*&amp;amp;nbsp; eliminar una arista de peso mínimo de C &lt;br /&gt;
*&amp;amp;nbsp; si esa arista conecta dos árboles diferentes se añade al bosque, combinando los dos árboles en un solo árbol &lt;br /&gt;
*&amp;amp;nbsp; en caso contrario, se desecha la arista&lt;br /&gt;
&lt;br /&gt;
Al acabar el algoritmo, el bosque tiene un solo componente, el cual forma un árbol de expansión mínimo del grafo.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
  1  '''function''' Kruskal(''G'')&lt;br /&gt;
  2    '''for each''' vertex ''v'' in ''G'' do&lt;br /&gt;
  3      Define an elementary cluster ''C''(''v'') ← {''v''}.&lt;br /&gt;
  4    Initialize a priority queue ''Q'' to contain all edges in ''G'', using the weights as keys.&lt;br /&gt;
  5    Define a tree ''T'' ← Ø       //''T'' will ultimately contain the edges of the MST&lt;br /&gt;
  6     // n es el número total de vértices&lt;br /&gt;
  7    '''while''' ''T'' has fewer than ''n''-1 edges '''do'''&lt;br /&gt;
 8      // edge u, v is the minimum weighted route from/to v&lt;br /&gt;
 9      (''u'',''v'') ← ''Q''.removeMin()&lt;br /&gt;
 10      // previene ciclos en T. suma u, v solo si T no contiene una arista que una u y v. &lt;br /&gt;
 11      // Nótese que el cluster contiene más de un vértice si una arista une un par de&lt;br /&gt;
 12      // vértices que han sido añadidos al árbol.&lt;br /&gt;
 13      Let ''C''(''v'') be the cluster containing ''v'', and let ''C''(''u'') be the cluster containing ''u''.&lt;br /&gt;
 14      '''if''' ''C''(''v'') ≠ ''C''(''u'') '''then'''&lt;br /&gt;
 15        Add edge (''v'',''u'') to ''T''.&lt;br /&gt;
 16        Merge ''C''(''v'') and ''C''(''u'') into one cluster, that is, union ''C''(''v'') and ''C''(''u'').&lt;br /&gt;
 17    '''return''' tree ''T''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
''m'' el número de aristas del grafo y ''n'' el número de vértices, el algoritmo de Kruskal muestra una complejidad [[Cota superior asintótica|O]](''m'' log ''m'') o, equivalentemente, O(''m'' log ''n''), cuando se ejecuta sobre estructuras de datos simples. Los tiempos de ejecución son equivalentes porque: &lt;br /&gt;
&lt;br /&gt;
*''m'' es a lo sumo ''n''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; y log ''n''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; = 2log''n'' es O(log ''n''). &lt;br /&gt;
*ignorando los vértices aislados, los cuales forman su propia componente del árbol de expansión mínimo, ''n'' ≤ 2''m'', así que log ''n'' es O(log ''m'').&lt;br /&gt;
&lt;br /&gt;
Se puede conseguir esta complejidad de la siguiente manera: primero se ordenan las aristas por su peso usando una ordenación por comparación ([[Comparison sort]]) con una complejidad del orden de O(''m'' log ''m''); esto permite que el paso &amp;quot;eliminar una arista de peso mínimo de ''C''&amp;quot; se ejecute en tiempo constante. Lo siguiente es usar una estructura de datos sobre conjuntos disjuntos ([[Disjoint-set data structure]]) para controlar qué vértices están en qué componentes. Es necesario hacer orden de O(''m'') operaciones ya que por cada arista hay dos operaciones de búsqueda y posiblemente una unión de conjuntos. Incluso una estructura de datos sobre conjuntos disjuntos simple con uniones por rangos puede ejecutar las operaciones mencionadas en O(''m'' log ''n''). Por tanto, la complejidad total es del orden de O(''m'' log ''m'') = O(''m'' log ''n''). &lt;br /&gt;
&lt;br /&gt;
Con la condición de que las aristas estén ordenadas o puedan ser ordenadas en un tiempo lineal (por ejemplo, mediante el [[Ordenamiento por cuentas]] o con el [[Ordenamiento Radix]]), el algoritmo puede usar estructuras de datos de conjuntos disjuntos más complejas para ejecutarse en tiempos del orden de O(m α(''n'')), donde α es la inversa (tiene un crecimiento extremadamente lento) de la [[Función de Ackermann]]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Demostración de la corrección  ==&lt;br /&gt;
&lt;br /&gt;
Sea ''P'' un grafo conexo y valuado y sea ''Y'' el subgrafo de ''P'' producido por el algoritmo. ''Y'' no puede tener ciclos porque cada vez que se añade una arista, ésta debe conectar vértices de dos árboles diferentes y no vértices dentro de un subárbol. ''Y'' no puede ser disconexa ya que la primera arista que une dos componentes de ''Y'' debería haber sido añadida por el algoritmo. Por tanto, ''Y'' es un árbol expandido de ''P''. &lt;br /&gt;
&lt;br /&gt;
Sea ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' el árbol expandido de peso mínimo de ''P'', el cual tiene el mayor número de aristas en común con ''Y''. Si ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;''=''Y'' entonces ''Y'' es un árbol de expansión mínimo. Por otro lado, sea ''e'' la primera arista considerada por el algoritmo que está en ''Y'' y que no está en ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;''. Sean ''C&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' y ''C&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;'' las componentes de ''P'' que conecta la arista ''e''. Ya que ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' es un árbol, ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;+e'' tiene un ciclo y existe una arista diferente ''f'' en ese ciclo que también conecta ''C&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' y ''C&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;''. Entonces ''Y&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;''=''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;+e-f'' es también un árbol expandido. Ya que ''e'' fue considerada por el algoritmo antes que ''f'', el peso de ''e'' es al menos igual que que el peso de ''f'' y ya que ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' es un árbol expandido mínimo, los pesos de esas dos aristas deben ser de hecho iguales. Por tanto, ''Y&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;'' es un árbol expandido mínimo con más aristas en común con ''Y'' que las que tiene ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'', contradiciendo las hipótesis que se habían establecido antes para ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;''. Esto prueba que ''Y'' debe ser un árbol expandido de peso mínimo. &lt;br /&gt;
&lt;br /&gt;
Otros algoritmos para este problema son el [[Algoritmo de Prim]] y el [[Algoritmo de Boruvka]]. &lt;br /&gt;
&lt;br /&gt;
{{VT|Implementación del algoritmo de Kruskal en Java}} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Ejemplo  ==&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;prettytable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Prim Algorithm 0.svg|200px]] &lt;br /&gt;
| Este es el grafo original. Los números de las aristas indican su peso. Ninguna de las aristas está resaltada.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 1.svg|200px]] &lt;br /&gt;
| '''AD''' y '''CE''' son las aristas más cortas, con peso 5, y '''AD''' se ha elegido [[Arbitrariamente]], por tanto se resalta.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 2.svg|200px]] &lt;br /&gt;
| Sin embargo, ahora es '''CE''' la arista más pequeña que no forma ciclos, con peso 5, por lo que se resalta como segunda arista.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 3.svg|200px]] &lt;br /&gt;
| La siguiente arista, '''DF''' con peso 6, ha sido resaltada utilizando el mismo método.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 4.svg|200px]] &lt;br /&gt;
| La siguientes aristas más pequeñas son '''AB''' y '''BE''', ambas con peso 7. '''AB''' se elige arbitrariamente, y se resalta. La arista '''BD''' se resalta en rojo, porque formaría un ciclo '''ABD''' si se hubiera elegido.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 5.svg|200px]] &lt;br /&gt;
| El proceso continúa marcando las aristas, '''BE''' con peso 7. Muchas otras aristas se marcan en rojo en este paso: '''BC''' (formaría el ciclo '''BCE'''), '''DE''' (formaría el ciclo '''DEBA'''), y '''FE''' (formaría el ciclo '''FEBAD''').&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 6.svg|200px]] &lt;br /&gt;
| Finalmente, el proceso termina con la arista '''EG''' de peso 9, y se ha encontrado el [[Árbol expandido mínimo]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*J. B. Kruskal: ''On the shortest spanning subtree and the traveling salesman problem''. En: Proceedings of the American Mathematical Society''. 7 (1956), pp. 48–50'' &lt;br /&gt;
*[[Thomas H. Cormen]], [[Charles E. Leiserson]], [[Ronald L. Rivest]] y [[Clifford Stein]]. ''[[Introduction to Algorithms]]'', Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Sección 23.2: The algorithms of Kruskal and Prim, pp.567–574.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Kruskal&amp;diff=59071</id>
		<title>Algoritmo de Kruskal</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Kruskal&amp;diff=59071"/>
		<updated>2010-05-05T18:23:39Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}}Al algoritmo de Kruskal es un algoritmo de la teoría de grafos para encontrar un árbol recubridor mínimo en un grafo conexo y ponderado. Es decir, busca un subconjunto de aristas que, formando un árbol, incluyen todos los vértices y donde el valor total de todas las aristas del árbol es el mínimo. Si el grafo no es conexo, entonces busca un bosque expandido mínimo (un árbol expandido mínimo para cada componente conexa). El algoritmo de Kruskal es un ejemplo de algoritmo voraz.&amp;lt;br&amp;gt;Un ejemplo de árbol expandido mínimo. Cada punto representa un vértice, el cual puede ser un árbol por sí mismo. Se usa el Algoritmo para buscar las distancias más cortas (árbol expandido) que conectan todos los puntos o vértices. &lt;br /&gt;
&lt;br /&gt;
Funciona de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
*&amp;amp;nbsp; se crea un bosque B (un conjunto de árboles), donde cada vértice del grafo es un árbol separado &lt;br /&gt;
*&amp;amp;nbsp; se crea un conjunto C que contenga a todas las aristas del grafo &lt;br /&gt;
*&amp;amp;nbsp; mientras C es no vacío &lt;br /&gt;
*&amp;amp;nbsp; eliminar una arista de peso mínimo de C &lt;br /&gt;
*&amp;amp;nbsp; si esa arista conecta dos árboles diferentes se añade al bosque, combinando los dos árboles en un solo árbol &lt;br /&gt;
*&amp;amp;nbsp; en caso contrario, se desecha la arista&lt;br /&gt;
&lt;br /&gt;
Al acabar el algoritmo, el bosque tiene un solo componente, el cual forma un árbol de expansión mínimo del grafo.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
  1  '''function''' Kruskal(''G'')&lt;br /&gt;
  2    '''for each''' vertex ''v'' in ''G'' do&lt;br /&gt;
  3      Define an elementary cluster ''C''(''v'') ← {''v''}.&lt;br /&gt;
  4    Initialize a priority queue ''Q'' to contain all edges in ''G'', using the weights as keys.&lt;br /&gt;
  5    Define a tree ''T'' ← Ø       //''T'' will ultimately contain the edges of the MST&lt;br /&gt;
  6     // n es el número total de vértices&lt;br /&gt;
  7    '''while''' ''T'' has fewer than ''n''-1 edges '''do'''&lt;br /&gt;
 8      // edge u, v is the minimum weighted route from/to v&lt;br /&gt;
 9      (''u'',''v'') ← ''Q''.removeMin()&lt;br /&gt;
 10      // previene ciclos en T. suma u, v solo si T no contiene una arista que una u y v. &lt;br /&gt;
 11      // Nótese que el cluster contiene más de un vértice si una arista une un par de&lt;br /&gt;
 12      // vértices que han sido añadidos al árbol.&lt;br /&gt;
 13      Let ''C''(''v'') be the cluster containing ''v'', and let ''C''(''u'') be the cluster containing ''u''.&lt;br /&gt;
 14      '''if''' ''C''(''v'') ≠ ''C''(''u'') '''then'''&lt;br /&gt;
 15        Add edge (''v'',''u'') to ''T''.&lt;br /&gt;
 16        Merge ''C''(''v'') and ''C''(''u'') into one cluster, that is, union ''C''(''v'') and ''C''(''u'').&lt;br /&gt;
 17    '''return''' tree ''T''&lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
''m'' el número de aristas del grafo y ''n'' el número de vértices, el algoritmo de Kruskal muestra una complejidad [[Cota superior asintótica|O]](''m'' log ''m'') o, equivalentemente, O(''m'' log ''n''), cuando se ejecuta sobre estructuras de datos simples. Los tiempos de ejecución son equivalentes porque: &lt;br /&gt;
&lt;br /&gt;
*''m'' es a lo sumo ''n''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; y log ''n''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; = 2log''n'' es O(log ''n''). &lt;br /&gt;
*ignorando los vértices aislados, los cuales forman su propia componente del árbol de expansión mínimo, ''n'' ≤ 2''m'', así que log ''n'' es O(log ''m'').&lt;br /&gt;
&lt;br /&gt;
Se puede conseguir esta complejidad de la siguiente manera: primero se ordenan las aristas por su peso usando una ordenación por comparación ([[Comparison sort]]) con una complejidad del orden de O(''m'' log ''m''); esto permite que el paso &amp;quot;eliminar una arista de peso mínimo de ''C''&amp;quot; se ejecute en tiempo constante. Lo siguiente es usar una estructura de datos sobre conjuntos disjuntos ([[Disjoint-set data structure]]) para controlar qué vértices están en qué componentes. Es necesario hacer orden de O(''m'') operaciones ya que por cada arista hay dos operaciones de búsqueda y posiblemente una unión de conjuntos. Incluso una estructura de datos sobre conjuntos disjuntos simple con uniones por rangos puede ejecutar las operaciones mencionadas en O(''m'' log ''n''). Por tanto, la complejidad total es del orden de O(''m'' log ''m'') = O(''m'' log ''n''). &lt;br /&gt;
&lt;br /&gt;
Con la condición de que las aristas estén ordenadas o puedan ser ordenadas en un tiempo lineal (por ejemplo, mediante el [[Ordenamiento por cuentas]] o con el [[Ordenamiento Radix]]), el algoritmo puede usar estructuras de datos de conjuntos disjuntos más complejas para ejecutarse en tiempos del orden de O(m α(''n'')), donde α es la inversa (tiene un crecimiento extremadamente lento) de la [[Función de Ackermann]]. &lt;br /&gt;
&lt;br /&gt;
== Demostración de la corrección  ==&lt;br /&gt;
&lt;br /&gt;
Sea ''P'' un grafo conexo y valuado y sea ''Y'' el subgrafo de ''P'' producido por el algoritmo. ''Y'' no puede tener ciclos porque cada vez que se añade una arista, ésta debe conectar vértices de dos árboles diferentes y no vértices dentro de un subárbol. ''Y'' no puede ser disconexa ya que la primera arista que une dos componentes de ''Y'' debería haber sido añadida por el algoritmo. Por tanto, ''Y'' es un árbol expandido de ''P''. &lt;br /&gt;
&lt;br /&gt;
Sea ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' el árbol expandido de peso mínimo de ''P'', el cual tiene el mayor número de aristas en común con ''Y''. Si ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;''=''Y'' entonces ''Y'' es un árbol de expansión mínimo. Por otro lado, sea ''e'' la primera arista considerada por el algoritmo que está en ''Y'' y que no está en ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;''. Sean ''C&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' y ''C&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;'' las componentes de ''P'' que conecta la arista ''e''. Ya que ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' es un árbol, ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;+e'' tiene un ciclo y existe una arista diferente ''f'' en ese ciclo que también conecta ''C&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' y ''C&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;''. Entonces ''Y&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;''=''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;+e-f'' es también un árbol expandido. Ya que ''e'' fue considerada por el algoritmo antes que ''f'', el peso de ''e'' es al menos igual que que el peso de ''f'' y ya que ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' es un árbol expandido mínimo, los pesos de esas dos aristas deben ser de hecho iguales. Por tanto, ''Y&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;'' es un árbol expandido mínimo con más aristas en común con ''Y'' que las que tiene ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'', contradiciendo las hipótesis que se habían establecido antes para ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;''. Esto prueba que ''Y'' debe ser un árbol expandido de peso mínimo. &lt;br /&gt;
&lt;br /&gt;
Otros algoritmos para este problema son el [[Algoritmo de Prim]] y el [[Algoritmo de Boruvka]]. &lt;br /&gt;
&lt;br /&gt;
{{VT|Implementación del algoritmo de Kruskal en Java}} &lt;br /&gt;
&lt;br /&gt;
== Ejemplo  ==&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;prettytable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Prim Algorithm 0.svg|200px]] &lt;br /&gt;
| Este es el grafo original. Los números de las aristas indican su peso. Ninguna de las aristas está resaltada.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 1.svg|200px]] &lt;br /&gt;
| '''AD''' y '''CE''' son las aristas más cortas, con peso 5, y '''AD''' se ha elegido [[Arbitrariamente]], por tanto se resalta.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 2.svg|200px]] &lt;br /&gt;
| Sin embargo, ahora es '''CE''' la arista más pequeña que no forma ciclos, con peso 5, por lo que se resalta como segunda arista.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 3.svg|200px]] &lt;br /&gt;
| La siguiente arista, '''DF''' con peso 6, ha sido resaltada utilizando el mismo método.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 4.svg|200px]] &lt;br /&gt;
| La siguientes aristas más pequeñas son '''AB''' y '''BE''', ambas con peso 7. '''AB''' se elige arbitrariamente, y se resalta. La arista '''BD''' se resalta en rojo, porque formaría un ciclo '''ABD''' si se hubiera elegido.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 5.svg|200px]] &lt;br /&gt;
| El proceso continúa marcando las aristas, '''BE''' con peso 7. Muchas otras aristas se marcan en rojo en este paso: '''BC''' (formaría el ciclo '''BCE'''), '''DE''' (formaría el ciclo '''DEBA'''), y '''FE''' (formaría el ciclo '''FEBAD''').&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 6.svg|200px]] &lt;br /&gt;
| Finalmente, el proceso termina con la arista '''EG''' de peso 9, y se ha encontrado el [[Árbol expandido mínimo]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*J. B. Kruskal: ''On the shortest spanning subtree and the traveling salesman problem''. En: Proceedings of the American Mathematical Society''. 7 (1956), pp. 48–50'' &lt;br /&gt;
*[[Thomas H. Cormen]], [[Charles E. Leiserson]], [[Ronald L. Rivest]] y [[Clifford Stein]]. ''[[Introduction to Algorithms]]'', Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Sección 23.2: The algorithms of Kruskal and Prim, pp.567–574.&lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_Kruskal&amp;diff=59067</id>
		<title>Algoritmo de Kruskal</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_Kruskal&amp;diff=59067"/>
		<updated>2010-05-05T18:21:45Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '===== {{Referencia}}El algoritmo de Kruskal &amp;lt;br&amp;gt;  =====  Es un algoritmo de la teoría de grafos para encontrar un árbol recubridor mínimo en un grafo conexo y ponderado. Es d…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===== {{Referencia}}El algoritmo de Kruskal &amp;lt;br&amp;gt;  =====&lt;br /&gt;
&lt;br /&gt;
Es un algoritmo de la teoría de grafos para encontrar un árbol recubridor mínimo en un grafo conexo y ponderado. Es decir, busca un subconjunto de aristas que, formando un árbol, incluyen todos los vértices y donde el valor total de todas las aristas del árbol es el mínimo. Si el grafo no es conexo, entonces busca un bosque expandido mínimo (un árbol expandido mínimo para cada componente conexa). El algoritmo de Kruskal es un ejemplo de algoritmo voraz.&amp;lt;br&amp;gt;Un ejemplo de árbol expandido mínimo. Cada punto representa un vértice, el cual puede ser un árbol por sí mismo. Se usa el Algoritmo para buscar las distancias más cortas (árbol expandido) que conectan todos los puntos o vértices. &lt;br /&gt;
&lt;br /&gt;
Funciona de la siguiente manera: &lt;br /&gt;
&lt;br /&gt;
*&amp;amp;nbsp; se crea un bosque B (un conjunto de árboles), donde cada vértice del grafo es un árbol separado &lt;br /&gt;
*&amp;amp;nbsp; se crea un conjunto C que contenga a todas las aristas del grafo &lt;br /&gt;
*&amp;amp;nbsp; mientras C es no vacío &lt;br /&gt;
*&amp;amp;nbsp; eliminar una arista de peso mínimo de C &lt;br /&gt;
*&amp;amp;nbsp; si esa arista conecta dos árboles diferentes se añade al bosque, combinando los dos árboles en un solo árbol &lt;br /&gt;
*&amp;amp;nbsp; en caso contrario, se desecha la arista&lt;br /&gt;
&lt;br /&gt;
Al acabar el algoritmo, el bosque tiene un solo componente, el cual forma un árbol de expansión mínimo del grafo.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Pseudocódigo  ==&lt;br /&gt;
&lt;br /&gt;
  1  '''function''' Kruskal(''G'')&lt;br /&gt;
  2    '''for each''' vertex ''v'' in ''G'' do&lt;br /&gt;
  3      Define an elementary cluster ''C''(''v'') ← {''v''}.&lt;br /&gt;
  4    Initialize a priority queue ''Q'' to contain all edges in ''G'', using the weights as keys.&lt;br /&gt;
  5    Define a tree ''T'' ← Ø       //''T'' will ultimately contain the edges of the MST&lt;br /&gt;
  6     // n es el número total de vértices&lt;br /&gt;
  7    '''while''' ''T'' has fewer than ''n''-1 edges '''do'''&lt;br /&gt;
 8      // edge u, v is the minimum weighted route from/to v&lt;br /&gt;
 9      (''u'',''v'') ← ''Q''.removeMin()&lt;br /&gt;
 10      // previene ciclos en T. suma u, v solo si T no contiene una arista que una u y v. &lt;br /&gt;
 11      // Nótese que el cluster contiene más de un vértice si una arista une un par de&lt;br /&gt;
 12      // vértices que han sido añadidos al árbol.&lt;br /&gt;
 13      Let ''C''(''v'') be the cluster containing ''v'', and let ''C''(''u'') be the cluster containing ''u''.&lt;br /&gt;
 14      '''if''' ''C''(''v'') ≠ ''C''(''u'') '''then'''&lt;br /&gt;
 15        Add edge (''v'',''u'') to ''T''.&lt;br /&gt;
 16        Merge ''C''(''v'') and ''C''(''u'') into one cluster, that is, union ''C''(''v'') and ''C''(''u'').&lt;br /&gt;
 17    '''return''' tree ''T''&lt;br /&gt;
&lt;br /&gt;
== Complejidad del algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
''m'' el número de aristas del grafo y ''n'' el número de vértices, el algoritmo de Kruskal muestra una complejidad [[Cota superior asintótica|O]](''m'' log ''m'') o, equivalentemente, O(''m'' log ''n''), cuando se ejecuta sobre estructuras de datos simples. Los tiempos de ejecución son equivalentes porque: &lt;br /&gt;
&lt;br /&gt;
*''m'' es a lo sumo ''n''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; y log ''n''&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; = 2log''n'' es O(log ''n''). &lt;br /&gt;
*ignorando los vértices aislados, los cuales forman su propia componente del árbol de expansión mínimo, ''n'' ≤ 2''m'', así que log ''n'' es O(log ''m'').&lt;br /&gt;
&lt;br /&gt;
Se puede conseguir esta complejidad de la siguiente manera: primero se ordenan las aristas por su peso usando una ordenación por comparación ([[Comparison sort]]) con una complejidad del orden de O(''m'' log ''m''); esto permite que el paso &amp;quot;eliminar una arista de peso mínimo de ''C''&amp;quot; se ejecute en tiempo constante. Lo siguiente es usar una estructura de datos sobre conjuntos disjuntos ([[Disjoint-set data structure]]) para controlar qué vértices están en qué componentes. Es necesario hacer orden de O(''m'') operaciones ya que por cada arista hay dos operaciones de búsqueda y posiblemente una unión de conjuntos. Incluso una estructura de datos sobre conjuntos disjuntos simple con uniones por rangos puede ejecutar las operaciones mencionadas en O(''m'' log ''n''). Por tanto, la complejidad total es del orden de O(''m'' log ''m'') = O(''m'' log ''n''). &lt;br /&gt;
&lt;br /&gt;
Con la condición de que las aristas estén ordenadas o puedan ser ordenadas en un tiempo lineal (por ejemplo, mediante el [[Ordenamiento por cuentas]] o con el [[Ordenamiento Radix]]), el algoritmo puede usar estructuras de datos de conjuntos disjuntos más complejas para ejecutarse en tiempos del orden de O(m α(''n'')), donde α es la inversa (tiene un crecimiento extremadamente lento) de la [[Función de Ackermann]]. &lt;br /&gt;
&lt;br /&gt;
== Demostración de la corrección  ==&lt;br /&gt;
&lt;br /&gt;
Sea ''P'' un grafo conexo y valuado y sea ''Y'' el subgrafo de ''P'' producido por el algoritmo. ''Y'' no puede tener ciclos porque cada vez que se añade una arista, ésta debe conectar vértices de dos árboles diferentes y no vértices dentro de un subárbol. ''Y'' no puede ser disconexa ya que la primera arista que une dos componentes de ''Y'' debería haber sido añadida por el algoritmo. Por tanto, ''Y'' es un árbol expandido de ''P''. &lt;br /&gt;
&lt;br /&gt;
Sea ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' el árbol expandido de peso mínimo de ''P'', el cual tiene el mayor número de aristas en común con ''Y''. Si ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;''=''Y'' entonces ''Y'' es un árbol de expansión mínimo. Por otro lado, sea ''e'' la primera arista considerada por el algoritmo que está en ''Y'' y que no está en ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;''. Sean ''C&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' y ''C&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;'' las componentes de ''P'' que conecta la arista ''e''. Ya que ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' es un árbol, ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;+e'' tiene un ciclo y existe una arista diferente ''f'' en ese ciclo que también conecta ''C&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' y ''C&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;''. Entonces ''Y&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;''=''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;+e-f'' es también un árbol expandido. Ya que ''e'' fue considerada por el algoritmo antes que ''f'', el peso de ''e'' es al menos igual que que el peso de ''f'' y ya que ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'' es un árbol expandido mínimo, los pesos de esas dos aristas deben ser de hecho iguales. Por tanto, ''Y&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;'' es un árbol expandido mínimo con más aristas en común con ''Y'' que las que tiene ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;'', contradiciendo las hipótesis que se habían establecido antes para ''Y&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;''. Esto prueba que ''Y'' debe ser un árbol expandido de peso mínimo. &lt;br /&gt;
&lt;br /&gt;
Otros algoritmos para este problema son el [[Algoritmo de Prim]] y el [[Algoritmo de Boruvka]]. &lt;br /&gt;
&lt;br /&gt;
{{VT|Implementación del algoritmo de Kruskal en Java}} &lt;br /&gt;
&lt;br /&gt;
== Ejemplo  ==&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;prettytable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Prim Algorithm 0.svg|200px]] &lt;br /&gt;
| Este es el grafo original. Los números de las aristas indican su peso. Ninguna de las aristas está resaltada.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 1.svg|200px]] &lt;br /&gt;
| '''AD''' y '''CE''' son las aristas más cortas, con peso 5, y '''AD''' se ha elegido [[Arbitrariamente]], por tanto se resalta.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 2.svg|200px]] &lt;br /&gt;
| Sin embargo, ahora es '''CE''' la arista más pequeña que no forma ciclos, con peso 5, por lo que se resalta como segunda arista.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 3.svg|200px]] &lt;br /&gt;
| La siguiente arista, '''DF''' con peso 6, ha sido resaltada utilizando el mismo método.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 4.svg|200px]] &lt;br /&gt;
| La siguientes aristas más pequeñas son '''AB''' y '''BE''', ambas con peso 7. '''AB''' se elige arbitrariamente, y se resalta. La arista '''BD''' se resalta en rojo, porque formaría un ciclo '''ABD''' si se hubiera elegido.&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 5.svg|200px]] &lt;br /&gt;
| El proceso continúa marcando las aristas, '''BE''' con peso 7. Muchas otras aristas se marcan en rojo en este paso: '''BC''' (formaría el ciclo '''BCE'''), '''DE''' (formaría el ciclo '''DEBA'''), y '''FE''' (formaría el ciclo '''FEBAD''').&lt;br /&gt;
|-&lt;br /&gt;
| [[Image:Kruskal Algorithm 6.svg|200px]] &lt;br /&gt;
| Finalmente, el proceso termina con la arista '''EG''' de peso 9, y se ha encontrado el [[Árbol expandido mínimo]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
*J. B. Kruskal: ''On the shortest spanning subtree and the traveling salesman problem''. En: Proceedings of the American Mathematical Society''. 7 (1956), pp. 48–50'' &lt;br /&gt;
*[[Thomas H. Cormen]], [[Charles E. Leiserson]], [[Ronald L. Rivest]] y [[Clifford Stein]]. ''[[Introduction to Algorithms]]'', Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Sección 23.2: The algorithms of Kruskal and Prim, pp.567–574.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_ordenamiento&amp;diff=59056</id>
		<title>Algoritmo de ordenamiento</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_ordenamiento&amp;diff=59056"/>
		<updated>2010-05-05T18:12:37Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Definición|Nombre=Algoritmo de ordenamiento|imagen=Sorting_quicksort_.JPG|concepto=Algoritmo que pone elementos de una lista o un vector en una secuencia dada por una relación de orden}}'''Algoritmo de ordenamiento'''. En computación y matemáticas un algoritmo de ordenamiento es un algoritmo que pone elementos de una lista o un vector en una secuencia dada por una relación de orden, es decir, el resultado de salida ha de ser una permutación — o reordenamiento— de la entrada que satisfaga la relación de orden dada. Las relaciones de orden más usadas son el orden numérico y el orden lexicográfico. Los ordenamientos eficientes son importantes para optimizar el uso de otros algoritmos (como los de búsqueda y fusión) que requieren listas ordenadas para una ejecución rápida. También es útil para poner datos en forma canónica y para generar resultados legibles por humanos. &lt;br /&gt;
&lt;br /&gt;
Desde los comienzos de la computación, el problema del ordenamiento ha atraído gran cantidad de investigación, tal vez debido a la complejidad de resolverlo eficientemente a pesar de su planteamiento simple y familiar. Por ejemplo, BubbleSort fue analizado desde [[1956]].[1] Aunque muchos puedan considerarlo un problema resuelto, nuevos y útiles algoritmos de ordenamiento se siguen inventado hasta el día de hoy (por ejemplo, el ordenamiento de biblioteca se publicó por primera vez en el [[2004]]). Los algoritmos de ordenamiento son comunes en las clases introductorias a la computación, donde la abundancia de algoritmos para el problema proporciona una gentil introducción a la variedad de conceptos núcleo de los algoritmos, como notación de O mayúscula, algoritmos divide y vencerás, estructuras de datos, análisis de los casos peor, mejor, y promedio, y límites inferiores. &lt;br /&gt;
&lt;br /&gt;
== Clasificación  ==&lt;br /&gt;
&lt;br /&gt;
Los algoritmos de ordenamiento se pueden clasificar de las siguientes maneras: &lt;br /&gt;
&lt;br /&gt;
1. La más común es clasificar según el lugar donde se realice la ordenación &lt;br /&gt;
&lt;br /&gt;
*Algoritmos de ordenamiento interno: en la memoria del ordenador. &lt;br /&gt;
*Algoritmos de ordenamiento externo: en un lugar externo como un disco duro.&lt;br /&gt;
&lt;br /&gt;
2. Por el tiempo que tardan en realizar la ordenación, dadas entradas ya ordenadas o inversamente ordenadas: &lt;br /&gt;
&lt;br /&gt;
*Algoritmos de ordenación natural: Tarda lo mínimo posible cuando la entrada está ordenada. &lt;br /&gt;
*Algoritmos de ordenación no natural: Tarda lo mínimo posible cuando la entrada está inversamente ordenada.&lt;br /&gt;
&lt;br /&gt;
3. Por estabilidad: un ordenamiento estable mantiene el orden relativo que tenían originalmente los elementos con claves iguales. Por ejemplo, si una lista ordenada por fecha se reordena en orden alfabético con un algoritmo estable, todos los elementos cuya clave alfabética sea la misma quedarán en orden de fecha. Otro caso sería cuando no interesan las mayúsculas y minúsculas, pero se quiere que si una clave aBC estaba antes que AbC, en el resultado ambas claves aparezcan juntas y en el orden original: aBC, AbC. Cuando los elementos son indistinguibles (porque cada elemento se ordena por la clave completa) la estabilidad no interesa. Los algoritmos de ordenamiento que no son estables se pueden implementar para que sí lo sean. Una manera de hacer esto es modificar artificialmente la clave de ordenamiento de modo que la posición original en la lista participe del ordenamiento en caso de coincidencia. &lt;br /&gt;
&lt;br /&gt;
Los algoritmos se distinguen por las siguientes características: &lt;br /&gt;
&lt;br /&gt;
*[[Complejidad computacional]] (peor caso, caso promedio y mejor caso) en términos de n, el tamaño de la lista o arreglo. Para esto se usa el concepto de orden de una función y se usa la notación O(n). El mejor comportamiento para ordenar (si no se aprovecha la estructura de las claves) es O(n log n). Los algoritmos más simples son cuadráticos, es decir O(n²). Los algoritmos que aprovechan la estructura de las claves de ordenamiento (p. ej. bucket sort) pueden ordenar en O(kn) donde k es el tamaño del espacio de claves. Como dicho tamaño es conocido a priori, se puede decir que estos algoritmos tienen un desempeño lineal, es decir O(n). &lt;br /&gt;
*Uso de memoria y otros recursos computacionales. También se usa la notación O(n).&lt;br /&gt;
&lt;br /&gt;
== Estabilidad  ==&lt;br /&gt;
&lt;br /&gt;
Los algoritmos de ordenamiento estable mantienen un relativo preorden total. Esto significa que un algoritmo es estable solo cuando hay dos registros R y S con la misma clave y con R apareciendo antes que S en la lista original. &lt;br /&gt;
&lt;br /&gt;
Cuando elementos iguales (indistinguibles entre sí), como números enteros, o más generalmente, cualquier tipo de dato en donde el elemento entero es la clave, la estabilidad no es un problema. De todas formas, se asume que los siguientes pares de números están por ser ordenados por su primer componente: &lt;br /&gt;
&lt;br /&gt;
(4, 1) (3, 7) (3, 1) (5, 6) &lt;br /&gt;
&lt;br /&gt;
En este caso, dos resultados diferentes son posibles, uno de los cuales mantiene un orden relativo de registros con claves iguales, y una en la que no: &lt;br /&gt;
&lt;br /&gt;
(3, 7) (3, 1) (4, 1) (5, 6) (orden mantenido). &lt;br /&gt;
&lt;br /&gt;
(3, 1) (3, 7) (4, 1) (5, 6) (orden cambiado). &lt;br /&gt;
&lt;br /&gt;
Los algoritmos de ordenamiento inestable pueden cambiar el orden relativo de registros con claves iguales, pero los algoritmos estables nunca lo hacen. Los algoritmos inestables pueden ser implementados especialmente para ser estables. Una forma de hacerlo es extender artificialmente el cotejamiento de claves, para que las comparaciones entre dos objetos con claves iguales sean decididas usando el orden de las entradas original. Recordar este orden entre dos objetos con claves iguales es una solución poco práctica, ya que generalmente acarrea tener almacenamiento adicional. &lt;br /&gt;
&lt;br /&gt;
Ordenar según una clave primaria, secundaria, terciara, etc., puede ser realizado utilizando cualquier método de ordenamiento, tomando todas las claves en consideración (en otras palabras, usando una sola clave compuesta). Si un método de ordenamiento es estable, es posible ordenar múltiples ítems, cada vez con una clave distinta. En este caso, las claves necesitan estar aplicadas en orden de aumentar la prioridad. Ejemplo: ordenar pares de números, usando ambos valores. &lt;br /&gt;
&lt;br /&gt;
(4, 1) (3, 7) (3, 1) (4, 6) (original) &lt;br /&gt;
&lt;br /&gt;
(4, 1) (3, 1) (4, 6) (3, 7) (después de ser ordenado por el segundo valor) &lt;br /&gt;
&lt;br /&gt;
(3, 1) (3, 7) (4, 1) (4, 6) (después de ser ordenado por el primer valor) &lt;br /&gt;
&lt;br /&gt;
Por otro lado: (3, 7) (3, 1) (4, 1) (4, 6) (después de ser ordenado por el primer valor) &lt;br /&gt;
&lt;br /&gt;
(3, 1) (4, 1) (4, 6) (3, 7) (después de ser ordenando por el segundo valor, el orden por el primer valor es perturbado) &lt;br /&gt;
&lt;br /&gt;
== Listado de algoritmos de ordenamiento  ==&lt;br /&gt;
&lt;br /&gt;
Algunos algoritmos de ordenamiento agrupados según estabilidad tomando en cuenta la [[Complejidad computacional|complejidad computacional]]. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#cecece&amp;quot; align=&amp;quot;center&amp;quot; colspan=&amp;quot;5&amp;quot; | '''Estables'''&lt;br /&gt;
|- bgcolor=&amp;quot;#dedede&amp;quot;&lt;br /&gt;
| Nombre traducido &lt;br /&gt;
| Nombre original &lt;br /&gt;
| Complejidad &lt;br /&gt;
| Memoria &lt;br /&gt;
| Método&lt;br /&gt;
|-&lt;br /&gt;
| Ordenamiento de burbuja &lt;br /&gt;
| Bubblesort &lt;br /&gt;
| O(''n''²) &lt;br /&gt;
| O(1) &lt;br /&gt;
| Intercambio&lt;br /&gt;
|-&lt;br /&gt;
| Ordenamiento de burbuja bidireccional &lt;br /&gt;
| Cocktail sort &lt;br /&gt;
| O(''n''²) &lt;br /&gt;
| O(1) &lt;br /&gt;
| Intercambio&lt;br /&gt;
|-&lt;br /&gt;
| Ordenamiento por inserción &lt;br /&gt;
| Insertion sort &lt;br /&gt;
| O(''n''²) &lt;br /&gt;
| O(1) &lt;br /&gt;
| Inserción&lt;br /&gt;
|-&lt;br /&gt;
| Ordenamiento por casilleros &lt;br /&gt;
| Bucket sort &lt;br /&gt;
| O(''n'') &lt;br /&gt;
| O(''n'') &lt;br /&gt;
| No comparativo&lt;br /&gt;
|-&lt;br /&gt;
| Ordenamiento por cuentas &lt;br /&gt;
| Counting sort &lt;br /&gt;
| O(''n''+''k'') &lt;br /&gt;
| O(''n''+''k'') &lt;br /&gt;
| No comparativo&lt;br /&gt;
|-&lt;br /&gt;
| Ordenamiento por mezcla &lt;br /&gt;
| Merge sort &lt;br /&gt;
| O(''n'' log ''n'') &lt;br /&gt;
| O(''n'') &lt;br /&gt;
| Mezcla&lt;br /&gt;
|-&lt;br /&gt;
| Ordenamiento con árbol binario &lt;br /&gt;
| Binary tree sort &lt;br /&gt;
| O(''n'' log ''n'') &lt;br /&gt;
| O(''n'') &lt;br /&gt;
| Inserción&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| Pigeonhole sort &lt;br /&gt;
| O(''n''+''k'') &lt;br /&gt;
| O(''k'') &lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Ordenamiento Radix &lt;br /&gt;
| Radix sort &lt;br /&gt;
| O(''nk'') &lt;br /&gt;
| O(''n'') &lt;br /&gt;
| No comparativo&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| Distribution sort &lt;br /&gt;
| O(''n''³) versión recursiva &lt;br /&gt;
| O(''n''²) &lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| Gnome sort &lt;br /&gt;
| O(''n''²) &lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#cecece&amp;quot; align=&amp;quot;center&amp;quot; colspan=&amp;quot;5&amp;quot; | '''Inestables'''&lt;br /&gt;
|- bgcolor=&amp;quot;#dedede&amp;quot;&lt;br /&gt;
| Nombre traducido &lt;br /&gt;
| Nombre original &lt;br /&gt;
| Complejidad &lt;br /&gt;
| Memoria &lt;br /&gt;
| Método&lt;br /&gt;
|-&lt;br /&gt;
| Ordenamiento Shell &lt;br /&gt;
| Shell sort &lt;br /&gt;
| O(''n''&amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;1.25&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt;) &lt;br /&gt;
| O(1) &lt;br /&gt;
| Inserción&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| Comb sort &lt;br /&gt;
| O(''n'' log ''n'') &lt;br /&gt;
| O(1) &lt;br /&gt;
| Intercambio&lt;br /&gt;
|-&lt;br /&gt;
| Ordenamiento por selección &lt;br /&gt;
| Selection sort &lt;br /&gt;
| O(''n''²) &lt;br /&gt;
| O(1) &lt;br /&gt;
| Selección&lt;br /&gt;
|-&lt;br /&gt;
| Ordenamiento por montículos &lt;br /&gt;
| Heapsort &lt;br /&gt;
| O(''n'' log ''n'') &lt;br /&gt;
| O(1) &lt;br /&gt;
| Selección&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| Smoothsort &lt;br /&gt;
| O(''n'' log ''n'') &lt;br /&gt;
| O(1) &lt;br /&gt;
| Selección&lt;br /&gt;
|-&lt;br /&gt;
| Ordenamiento rápido &lt;br /&gt;
| Quicksort &lt;br /&gt;
| Promedio: O(''n'' log ''n''),&amp;lt;br&amp;gt;peor caso: O(''n''²) &lt;br /&gt;
| O(log ''n'') &lt;br /&gt;
| Partición&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| Several Unique Sort &lt;br /&gt;
| Promedio: O(''n'' u),&amp;lt;br&amp;gt;peor caso: O(''n''²);&amp;lt;br&amp;gt;u=n; u = número único de registros &lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#cecece&amp;quot; align=&amp;quot;center&amp;quot; colspan=&amp;quot;5&amp;quot; | '''Cuestionables, imprácticos'''&lt;br /&gt;
|- bgcolor=&amp;quot;#dedede&amp;quot;&lt;br /&gt;
| Nombre traducido &lt;br /&gt;
| Nombre original &lt;br /&gt;
| Complejidad &lt;br /&gt;
| Memoria &lt;br /&gt;
| Método&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| Bogosort &lt;br /&gt;
| O(''n'' × ''n''!), peor: no termina &lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| Pancake sorting &lt;br /&gt;
| O(''n''), excepto en&amp;lt;br&amp;gt;máquinas de [[John von Neumann|Von Neumann]] &lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| Randomsort &lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Referencias  ==&lt;br /&gt;
&lt;br /&gt;
1.↑ [http://www.cs.duke.edu/~ola/papers/bubble.pdf Bubble Sort: An archaeological algorithm analysis]. [[Owen Astrachan]]. &lt;br /&gt;
&lt;br /&gt;
== Fuentes  ==&lt;br /&gt;
&lt;br /&gt;
*[http://es.wikipedia.org/wiki/Algoritmo_de_ordenamiento Wikipedia]. &lt;br /&gt;
*[http://blog.zerial.org/ficheros/Informe_Ordenamiento.pdf Explicación de los distintos métodos de ordenamiento en Java]. (pdf) &lt;br /&gt;
*[http://es.tldp.org/Tutoriales/doc-programacion-algoritmos-ordenacion/alg_orden.pdf Discusión sobre varios algoritmos de ordenación y sus características]. (''licencia GFDL'') (pdf) &lt;br /&gt;
*[http://dvegaf.iespana.es Animación de algoritmos de ordenamient]. &lt;br /&gt;
*[http://vision.bc.edu/%7Edmartin/teaching/sorting/anim-html/all.html Animación de algoritmos de ordenamiento]. (''en inglés'') &lt;br /&gt;
*[http://xistral.ei.uvigo.es/MTPAlgoritmos/index.php?action=VisualizarAlgoritmos&amp;amp;tipo=Ordenacion ALT: Algorithm Learning Tool. Herramienta de apoyo a la enseñanza de algoritmos que muestra gráficamente su funcionamiento. Permite implementar algoritmos propios y realizar una ejecución dinámica e interactiva]. &lt;br /&gt;
*[http://tutorial-python.com.ar Códigos de Ordenamiento en Python].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Matemáticas]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmos_no_determin%C3%ADsticos&amp;diff=59048</id>
		<title>Algoritmos no determinísticos</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmos_no_determin%C3%ADsticos&amp;diff=59048"/>
		<updated>2010-05-05T18:08:09Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Algoritmo no determinístico'''. En Ciencias de la computación, es un algoritmo que con la misma entrada ofrece muchos posibles resultados. No se puede saber de antemano cuál será el resultado de la ejecución de un algoritmo no determinístico. &lt;br /&gt;
&lt;br /&gt;
== Uso  ==&lt;br /&gt;
&lt;br /&gt;
En la teoría estándar de la computación la definición de algoritmo deja en claro que de por sí un algoritmo es determinístico. Sin embargo, los algoritmos no determinísticos emplean modelos de computación tales como la Máquina de Turing probabilística, que no son determinísticos. Se considera entonces que los algoritmos no determinísticos son un caso especial. &lt;br /&gt;
&lt;br /&gt;
== Convirtiendo algoritmos no determinísticos en determinísticos  ==&lt;br /&gt;
&lt;br /&gt;
Una forma de simular algoritmos no determinísticos N mediante el empleo de otros deterministícos D puede realizarse tratando los estados de N como estados de D. Esto significa que D puede tracear todas las posibilidades y trayectorias de ejecución del algoritmo N. Otra posibilidad es emplear algoritmos de generación de números aleatorios que consisten en perturbar los estados mediante el establecimiento de todas las posibilidades mediante un generador de números aleatorios. El resultado es un algoritmo determinístico probabilístico. &lt;br /&gt;
&lt;br /&gt;
== Fuente  ==&lt;br /&gt;
&lt;br /&gt;
*[http://es.wikipedia.org/wiki/Algoritmo_no_determinista Wikipedia, enciclopedia libre]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Vuelta_atr%C3%A1s_(backtracking)&amp;diff=59046</id>
		<title>Vuelta atrás (backtracking)</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Vuelta_atr%C3%A1s_(backtracking)&amp;diff=59046"/>
		<updated>2010-05-05T18:06:36Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mejorar|Faltan las fuentes}} '''&amp;quot;Vuelta atrás&amp;quot;, (Backtracking)'''. &lt;br /&gt;
&lt;br /&gt;
Estrategia para encontrar soluciones a problemas que satisfacen restricciones. El término &amp;quot;backtrack&amp;quot; fue acuñado por primera vez por el matemático estadounidense D. H. Lehmer en los años [[1950]]. &lt;br /&gt;
&lt;br /&gt;
== Concepto  ==&lt;br /&gt;
&lt;br /&gt;
En su forma básica, la idea de backtracking se asemeja a un recorrido en profundidad dentro de un grafo dirigido. El grafo en cuestión suele ser un árbol, o por lo menos no contiene ciclos. Sea cual sea su estructura, existe sólo implícitamente. El objetivo del recorrido es encontrar soluciones para algún problema. Esto se consigue construyendo soluciones parciales a medida que progresa el recorrido; estas soluciones parciales limitan las regiones en las que se puede encontrar una solución completa. El recorrido tiene éxito si, procediendo de esta forma, se puede definir por completo una solución. En este caso el algoritmo puede bien detenerse (si lo único que se necesita es una solución del problema) o bien seguir buscando soluciones alternativas (si deseamos examinarlas todas). Por otra parte, el recorrido no tiene éxito si en alguna etapa la solución parcial construida hasta el momento no se puede completar. En tal caso, el recorrido vuelve atrás exactamente igual que en un recorrido en profundidad, eliminando sobre la marcha los elementos que se hubieran añadido en cada fase. Cuando vuelve a un nodo que tiene uno o más vecinos sin explorar, prosigue el recorrido de una solución. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
                         Algoritmo de Backtracking&lt;br /&gt;
&lt;br /&gt;
                         proc Backtracking (↕X[1 . . . i ]: TSolución, ↑ok: B)&lt;br /&gt;
                         variables L: ListaComponentes&lt;br /&gt;
                         inicio&lt;br /&gt;
                             si EsSolución (X) entonces ok   CIERTO&lt;br /&gt;
                             en otro caso&lt;br /&gt;
                                  ok   FALSO&lt;br /&gt;
                                  L=Candidatos (X)&lt;br /&gt;
                                  mientras ¬ok ^ ¬Vacía (L) hacer&lt;br /&gt;
                                  X[i + 1]   Cabeza (L); L   Resto (L)&lt;br /&gt;
                                  Backtracking (X, ok)&lt;br /&gt;
                                  finmientras&lt;br /&gt;
                             finsi&lt;br /&gt;
                         fin&lt;br /&gt;
&lt;br /&gt;
Podemos visualizar el funcionamiento de una técnica de backtracking como la exploración en profundidad de un grafo. &lt;br /&gt;
&lt;br /&gt;
Cada vértice del grafo es un posible estado de la solución del problema. Cada arco del grafo representa la transición entre dos estados de la solución (i.e., la toma de una decisión). &lt;br /&gt;
&lt;br /&gt;
Típicamente el tamaño de este grafo será inmenso, por lo que no existirá de manera explícita. En cada momento sólo tenemos en una estructura los nodos que van desde el estado inicial al estado actual. Si cada secuencia de decisiones distinta da lugar a un estado diferente, el grafo es un árbol (el árbol de estados). &lt;br /&gt;
&lt;br /&gt;
== Enfoque  ==&lt;br /&gt;
&lt;br /&gt;
Los problemas que deben satisfacer un determinado tipo de restricciones son problemas completos, donde el orden de los elementos de la solución no importa. Estos problemas consisten en un conjunto (o lista) de variables a la que a cada una se le debe asignar un valor sujeto a las restricciones del problema. La técnica va creando todas las posibles combinaciones de elementos para obtener una solución. Su principal virtud es que en la mayoría de las implementaciones se puede evitar combinaciones, estableciendo funciones de acotación (o poda) reduciendo el [[Eficiencia de los algoritmos|tiempo]] de ejecución. &lt;br /&gt;
&lt;br /&gt;
Vuelta atrás está muy relacionado con la [[Búsqueda combinatoria]]. &lt;br /&gt;
&lt;br /&gt;
== Diseño e implementación  ==&lt;br /&gt;
&lt;br /&gt;
Esencialmente, la idea es encontrar la mejor combinación posible en un momento determinado, por eso, se dice que este tipo de algoritmo es una [[Búsqueda en profundidad]]. Durante la búsqueda, si se encuentra una alternativa incorrecta, la búsqueda retrocede hasta el paso anterior y toma la siguiente alternativa. Cuando se han terminado las posibilidades, se vuelve a la elección anterior y se toma la siguiente opción (hijo [si nos referimos a un árbol]). Si no hay más alternativas la búsqueda falla. De esta manera, se crea un árbol implícito, en el que cada nodo es un estado de la solución (solución parcial en el caso de nodos interiores o solución total en el caso de los nodos hoja). &lt;br /&gt;
&lt;br /&gt;
Normalmente, se suele implementar este tipo de algoritmos como un procedimiento [[Recursividad|recursivo]]. Así, en cada llamada al procedimiento se toma una variable y se le asignan todos los valores posibles, llamando a su vez al procedimiento para cada uno de los nuevos estados. La diferencia con la [[Búsqueda en profundidad]] es que se suelen diseñar funciones de cota, de forma que no se generen algunos estados si no van a conducir a ninguna solución, o a una solución peor de la que ya se tiene. De esta forma se ahorra espacio en memoria y tiempo de ejecución. &lt;br /&gt;
&lt;br /&gt;
== Heurísticas  ==&lt;br /&gt;
&lt;br /&gt;
Algunas heurísticas son comúnmente usadas para acelerar el proceso. Como las variables se pueden procesar en cualquier orden, generalmente es más eficiente intentar ser lo más restrictivo posible con las primeras (esto es, las primeras con menores valores posibles). Este proceso poda el [[Árbol (estructura de datos)|árbol de búsqueda]] antes de que se tome la decisión y se llame a la subrutina recursiva. &lt;br /&gt;
&lt;br /&gt;
Cuando se elige qué valor se va a asignar, muchas implementaciones hacen un examen hacia delante (FC, Forward Checking), para ver qué valor restringirá el menor número posible de valores, de forma que se anticipa en a) preservar una posible solución y b) hace que la solución encontrada no tenga restricciones destacadas. &lt;br /&gt;
&lt;br /&gt;
Algunas implementaciones muy sofisticadas usan una función de cotas, que examina si es posible encontrar una solución a partir de una solución parcial. Además, se comprueba si la solución parcial que falla puede incrementar significativamente la eficiencia del algoritmo. Por el uso de estas funciones de cota, se debe ser muy minucioso en su implementación de forma que sean poco costosas computacionalmente hablando, ya que lo más normal es que se ejecuten en para cada nodo o paso del algoritmo. Cabe destacar, que las cotas eficaces se crean de forma parecida a las funciones [[Heurística]]s, esto es, relajando las restricciones para conseguir mayor eficiencia. &lt;br /&gt;
&lt;br /&gt;
Con el objetivo de mantener la solución actual con coste mínimo, los algoritmos vuelta atrás mantienen el coste de la mejor solución en una variable que va variando con cada nueva mejor solución encontrada. Así, si una solución es peor que la que se acaba de encontrar, el algoritmo no actualizará la solución. De esta forma, devolverá siempre la mejor solución que haya encontrado. &lt;br /&gt;
&lt;br /&gt;
== Ejemplos de aplicación de backtracking  ==&lt;br /&gt;
&lt;br /&gt;
SATISFABILITY &lt;br /&gt;
&lt;br /&gt;
Inicialmente A contiene la expresión booleana que constituye el problema. &lt;br /&gt;
&lt;br /&gt;
Elegir subproblema de A, p.ejemplo&amp;amp;nbsp;: (x+y+z)(x'+y)(y'+z)(z'+x)(x'+y'+z'). &lt;br /&gt;
&lt;br /&gt;
Elegir una cláusula con mínimo número de literales. &lt;br /&gt;
&lt;br /&gt;
Elegir una variable x, y, z,... dentro de la cláusula y crear 2 subproblemas reemplazando x=V y x=F. &lt;br /&gt;
&lt;br /&gt;
En el caso x=V &lt;br /&gt;
&lt;br /&gt;
        Omitir las cláusulas donde aparece x.&lt;br /&gt;
&lt;br /&gt;
        Omitir x' en las cláusulas que aparece x'.&lt;br /&gt;
&lt;br /&gt;
En el caso x=F &lt;br /&gt;
&lt;br /&gt;
        Omitir las cláusulas donde aparece x'.&lt;br /&gt;
&lt;br /&gt;
        Omitir x en las cláusulas que aparece x.&lt;br /&gt;
&lt;br /&gt;
Test &lt;br /&gt;
&lt;br /&gt;
Si no quedan cláusulas. STOP. (solución encontrada). &lt;br /&gt;
&lt;br /&gt;
Si hay una cláusula vacía. DROP. &lt;br /&gt;
&lt;br /&gt;
En otro caso añadir a A &lt;br /&gt;
&lt;br /&gt;
Nota: Observemos que si encontramos a A vacío entonces la expresión booleana no puede ser satisfecha. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; '''HAMILTON CYCLE (VIAJANTE DE COMERCIO)''' &lt;br /&gt;
&lt;br /&gt;
En este caso los subproblemas S son caminos que parten de a y llegan a b a través de un sucesión de nodos T. (b es el mismo a lo largo de todo el algoritmo). &lt;br /&gt;
&lt;br /&gt;
Inicialmente A contiene solamente el camino (a, vacío, b). &lt;br /&gt;
&lt;br /&gt;
Elegimos un subproblema S cualquiera de A (y lo borramos de A) y añadimos ramas (c, a) del grafo (las c's son las adyacentes de a) . Estos caminos extendidos son los hijos. Ahora cada c juega el rol de a. &lt;br /&gt;
&lt;br /&gt;
Examinamos c/ hijo: &lt;br /&gt;
&lt;br /&gt;
Test: &lt;br /&gt;
&lt;br /&gt;
1)Si G-T forma un camino hamiltoniano STOP (solución hallada) &lt;br /&gt;
&lt;br /&gt;
2)Si G-T tiene un nodo de grado uno (excepto a y b) o si G-T-{a, b} es disconexo entonces DROP este subproblema . &lt;br /&gt;
&lt;br /&gt;
3) Si 1) y 2) fallan add subproblema en A. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; '''EXACT COVER''' &lt;br /&gt;
&lt;br /&gt;
Dado un conjunto finito U y una familia se subconjuntos {Tj} de U definimos una matriz A donde cada fila se corresponde con un elemento ui de U y cada columna de A con un subconjunto Tj . Ponemos aij=1 si uiU pertenece a Tj y aij=0 en caso contrario. Interpretamos que xj=1 significa que elegimos Tj y 0 en caso contrario. &lt;br /&gt;
&lt;br /&gt;
Se trata de averiguar si es factible Ax=1 donde A y x son binarias y las componentes de 1 son unos. &lt;br /&gt;
&lt;br /&gt;
S0= un vector de ceros (raíz del árbol) &lt;br /&gt;
&lt;br /&gt;
Cada nodo S del árbol es una sucesión x cuyas primeras k componentes le han sido asignados un 1 o un 0 y el resto de componentes son ceros. Reemplazamos S por 2 subproblemas Si (i=1,2) poniendo xk+1 =1 y xk+1=0 respectivamente. &lt;br /&gt;
&lt;br /&gt;
Test &lt;br /&gt;
&lt;br /&gt;
if Ax=1 STOP &lt;br /&gt;
&lt;br /&gt;
if Ax&amp;amp;gt;1 DROP Si &lt;br /&gt;
&lt;br /&gt;
if Ax&amp;amp;lt;1 add Si to A &lt;br /&gt;
&lt;br /&gt;
== Ejemplos de problemas comunes resueltos usando Vuelta Atrás  ==&lt;br /&gt;
&lt;br /&gt;
'''Problema de las N Reinas''' &lt;br /&gt;
&lt;br /&gt;
Disponemos de un tablero de ajedrez de tamaño NxN, y se trata de colocar en él N reinas de manera que no se amenacen según las normas del ajedrez. &lt;br /&gt;
&lt;br /&gt;
        proc NReinas (↕[1 . . . i ]: TSolución, ↓N: N, ↑ok: B)&lt;br /&gt;
        variables j&amp;amp;nbsp;: N&lt;br /&gt;
        inicio&lt;br /&gt;
            si i=N entonces ok=CIERTO &lt;br /&gt;
            en otro caso&lt;br /&gt;
                ok=FALSO&lt;br /&gt;
                j=1&lt;br /&gt;
                mientras ¬ok ^ (j≤N) hacer&lt;br /&gt;
                    si EsFactible (R, j) entonces&lt;br /&gt;
                        R[i + 1]= j &lt;br /&gt;
                    NReinas (R, N, ok)&lt;br /&gt;
                    finsi&lt;br /&gt;
                    j=j+1&lt;br /&gt;
                finmientras&lt;br /&gt;
            finsi&lt;br /&gt;
        fin&lt;br /&gt;
&lt;br /&gt;
        func EsFactible (↓R[1 . . . i ]: TSolución, ↓j&amp;amp;nbsp;: N): B&lt;br /&gt;
        variables factible: B&lt;br /&gt;
        inicio&lt;br /&gt;
            factible=CIERTO&lt;br /&gt;
            k=1&lt;br /&gt;
                mientras factible ^ (k≤i) hacer&lt;br /&gt;
                    si (j=R[k])\/(i+1−k= |j−R[k]|) entonces&lt;br /&gt;
                    factible=FALSO&lt;br /&gt;
                    finsi&lt;br /&gt;
                    k=k+1&lt;br /&gt;
                finmientras&lt;br /&gt;
            devolver factible&lt;br /&gt;
         fin&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''Problema de la mochila 0,1''' &lt;br /&gt;
&lt;br /&gt;
Dados n elementos e1,e2,...,en con pesos p1,p2,...,pn y beneficios b1,b2,...,bn, y dada una mochila capaz de albergar hasta un máximo de peso M (capacidad de la mochila), queremos encontrar cuáles de los n elementos hemos de introducir en la mochila de forma que la suma de los beneficios de los elementos escogidos sea máxima, sujeto a la restricción de que tales elementos no pueden superar la capacidad de la mochila.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''Problema del laberinto''' &lt;br /&gt;
&lt;br /&gt;
Se tiene una matriz bidimensional de nxn casillas para representar un laberinto cuadrado. Cada casilla está marcada como visitada o no visitada. Se debe ir desde la casilla (1,1) a la (n, n) haciendo movimientos horizontales y verticales. &lt;br /&gt;
&lt;br /&gt;
*[[Problema de las parejas]] &lt;br /&gt;
*[[Formación de una palabra con n cubos]] &lt;br /&gt;
*[[Sudoku backtracking|Sudoku]] &lt;br /&gt;
*[[Problema del laberinto]] &lt;br /&gt;
*[[Problema del laberinto con límite]] &lt;br /&gt;
*[[Problema del dominó]] &lt;br /&gt;
*[[Problema de los movimientos de un caballo]] &lt;br /&gt;
*[[Problema del reparto del botín]] &lt;br /&gt;
*[[Problema de la mochila utilizando Vuelta Atrás]] &lt;br /&gt;
*[[Minimización de cableado en placa]] &lt;br /&gt;
*[[Coloreado de grafos]] &lt;br /&gt;
*[[Problema del viajante sobre grafos dirigidos]] &lt;br /&gt;
*[[Las ocho reinas]]&lt;br /&gt;
&lt;br /&gt;
== Backtracking para la enumeración  ==&lt;br /&gt;
&lt;br /&gt;
El problema de la enumeración consiste en encontrar todas las soluciones del problema, es por ello que tendremos que recorrer el árbol de estados al completo. &lt;br /&gt;
&lt;br /&gt;
       Algoritmo de Backtracking para la enumeración:&lt;br /&gt;
&lt;br /&gt;
       proc Bactracking Enum(↕X[1 . . . i ]: TSolución, ↑num: N)&lt;br /&gt;
       variables L: ListaComponentes&lt;br /&gt;
       inicio&lt;br /&gt;
             si EsSolución (X) entonces num   num+1&lt;br /&gt;
                  EscribeSolución (X)&lt;br /&gt;
             en otro caso&lt;br /&gt;
                  L   Candidatos (X) &lt;br /&gt;
                  mientras ¬Vacía (L) hacer  &lt;br /&gt;
                       X[i + 1]   Cabeza (L); L   Resto (L) &lt;br /&gt;
                       BacktrackingEnum (X, num)&lt;br /&gt;
                  finmientras&lt;br /&gt;
             finsi&lt;br /&gt;
       fin&lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
Vuelta atrás se usa en la implementación de los [[Lenguajes de programación]] tales como [[Planner|Lenguaje de programación Planner]] y [[Prolog]]. Además, se usa en los análisis sintácticos de los compiladores. Su uso en [[Inteligencia artificial]] ha sido muy importante, dando lugar a nuevos tipos de búsquedas como el [[A*|A estrella]]. &lt;br /&gt;
&lt;br /&gt;
== Branch &amp;amp;amp; Bound ( Ramificación y poda )  ==&lt;br /&gt;
&lt;br /&gt;
Este método busca una solución como en el método de backtracking, pero cada solución tiene asociado un costo y la solución que se busca es una de mínimo costo llamada óptima. Además de ramificar una solución padre (branch) en hijos se trata de eliminar de consideración aquellos hijos cuyos descendientes tienen un costo que supera al óptimo buscado acotando el costo de los descendientes del hijo (bound). La forma de acotar es un arte que depende de cada problema. La acotacion reduce el tiempo de búsqueda de la solución óptima al &amp;quot;podar&amp;quot; (pruning) los subarboles de descendientes costosos. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo&amp;diff=59042</id>
		<title>Algoritmo</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo&amp;diff=59042"/>
		<updated>2010-05-05T18:03:14Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}}&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Algoritmo&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
En [[Matemáticas|Matemática]], ciencias de la computación y disciplinas relacionadas, un algoritmo (del latín, dixit algorithmus y éste a su vez del matemático persa [[Al Juarismi]]) es un conjunto reescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos sucesivos que no generen dudas a quien lo ejecute. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final y se obtiene una solución. Los algoritmos son objeto de estudio de la algoritmia.&amp;lt;br&amp;gt;En la vida cotidiana se emplean algoritmos en multitud de ocasiones para resolver problemas. Algunos ejemplos son los manuales de usuario, que muestran algoritmos para usar un aparato, o las instrucciones que recibe un trabajador por parte de su patrón. Algunos ejemplos en matemáticas son el algoritmo de la división para calcular el cociente de dos números, el algoritmo de Euclides para obtener el máximo común divisor de dos enteros positivos, o el método de [[Carl Friedrich Gauss|Gauss]] para resolver un sistema lineal de ecuaciones. &lt;br /&gt;
&lt;br /&gt;
== Características principales y definición formal  ==&lt;br /&gt;
&lt;br /&gt;
En general, no existe ningún consenso definitivo en cuanto a la definición formal de algoritmo. Muchos autores los señalan como listas de instrucciones para resolver un problema abstracto, es decir, que un número finito de pasos convierten los datos de un problema (entrada) en una solución (salida). Sin embargo cabe notar que algunos algoritmos no necesariamente tienen que terminar o resolver un problema en particular. Por ejemplo, una versión modificada de la criba de Eratóstenes que nunca termine de calcular números primos no deja de ser un algoritmo.&amp;lt;br&amp;gt;A lo largo de la historia varios autores han tratado de definir formalmente a los algoritmos utilizando modelos matemáticos como máquinas de Turing entre otros. Sin embargo estos modelos están sujetos a un tipo particular de datos como son números, símbolos o gráficas mientras que, en general, los algoritmos funcionan sobre una basta cantidad de estructuras de datos.datos.En general, la parte común en todas las definiciones se puede resumir en las siguientes tres propiedades siempre y cuando no consideremos algoritmos paralelos:&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Tiempo secuencial. Un algoritmo funciona en tiempo discretizado –paso a paso–, definiendo así una secuencia de estados &amp;quot;computacionales&amp;quot; por cada entrada válida (la entrada son los datos que se le suministran al algoritmo antes de comenzar). &amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Estado abstracto. Cada estado computacional puede ser descrito formalmente utilizando una estructura de primer orden y cada algoritmo es independiente de su implementación (los algoritmos son objetos abstractos) de manera que en un algoritmo las estructuras de primer orden son invariantes bajo isomorfismo. &amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Exploración acotada. La transición de un estado al siguiente queda completamente determinada por una descripción fija y finita; es decir, entre cada estado y el siguiente solamente se puede tomar en cuenta una cantidad fija y limitada de términos del estado actual. &amp;lt;br&amp;gt;En resumen, un algoritmo es cualquier cosa que funcione paso a paso, donde cada paso se pueda describir sin ambigüedad y sin hacer referencia a una computadora en particular, y además tiene un límite fijo en cuanto a la cantidad de datos que se pueden leer/escribir en un solo paso. Esta amplia definición abarca tanto a algoritmos prácticos como aquellos que solo funcionan en teoría, por ejemplo el método de Newton y la eliminación de Gauss-Jordan funcionan, al menos en principio, con números de precisión infinita; sin embargo no es posible programar la precisión infinita en una computadora, y no por ello dejan de ser algoritmos. En particular es posible considerar una cuarta propiedad que puede ser usada para validar la tesis de Church-Turing de que toda función calculable se puede programar en una máquina de Turing (o equivalentemente, en un lenguaje de programación suficientemente general):&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Aritmetizabilidad. Solamente operaciones innegablemente calculables están disponibles en el paso inicial. &lt;br /&gt;
&lt;br /&gt;
== Medios de expresión de un algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
Los algoritmos pueden ser expresados de muchas maneras, incluyendo al lenguaje natural, pseudocódigo, diagramas de flujo y lenguajes de programación entre otros. Las descripciones en lenguaje natural tienden a ser ambiguas y extensas. El usar pseudocódigo y diagramas de flujo evita muchas ambigüedades del lenguaje natural. Dichas expresiones son formas más estructuradas para representar algoritmos; no obstante, se mantienen independientes de un lenguaje de programación específico.&amp;lt;br&amp;gt;La descripción de un algoritmo usualmente se hace en tres niveles:&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 1.Descripción de alto nivel. Se establece el problema, se selecciona un modelo matemático y se explica el algoritmo de manera verbal, posiblemente con ilustraciones y omitiendo detalles. &amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 2.Descripción formal. Se usa pseudocódigo para describir la secuencia de pasos que encuentran la solución. &amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 3.Implementación. Se muestra el algoritmo expresado en un lenguaje de programación específico o algún objeto capaz de llevar a cabo instrucciones. &amp;lt;br&amp;gt;También es posible incluir un teorema que demuestre que el algoritmo es correcto, un análisis de complejidad o ambos.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Diagrama de flujo  ===&lt;br /&gt;
&lt;br /&gt;
Los diagramas de flujo son descripciones gráficas de algoritmos; usan símbolos conectados con flechas para indicar la secuencia de instrucciones y están regidos por ISO.&amp;lt;br&amp;gt;Los diagramas de flujo son usados para representar algoritmos pequeños, ya que abarcan mucho espacio y su construcción es laboriosa. Por su facilidad de lectura son usados como introducción a los algoritmos, descripción de un lenguaje y descripción de procesos a personas ajenas a la computación.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Pseudocódigo  ===&lt;br /&gt;
&lt;br /&gt;
Pseudocódigo es la descripción de un algoritmo que asemeja a un lenguaje de programación pero con algunas convenciones del lenguaje natural (de ahí que tenga el prefijo pseudo, que significa falso). Tiene varias ventajas con respecto a los diagramas de flujo, entre las que se destaca el poco espacio que se requiere para representar instrucciones complejas. El pseudocódigo no está regido por ningún estándar.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Sistemas formales&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
La teoría de autómatas y la teoría de funciones recursivas proveen modelos matemáticos que formalizan el concepto de algoritmo. Los modelos más comunes son la máquina de Turing, máquina de registro y funciones μ-recursivas. Estos modelos son tan precisos como un lenguaje máquina, careciendo de expresiones coloquiales o ambigüedad, sin embargo se mantienen independientes de cualquier computadora y de cualquier implementación.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Implementación  ===&lt;br /&gt;
&lt;br /&gt;
Muchos algoritmos son ideados para implementarse en un programa. Sin embargo, los algoritmos pueden ser implementados en otros medios, como una red neuronal, un circuito eléctrico o un aparato mecánico y eléctrico. Algunos algoritmos inclusive se diseñan especialmente para implementarse usando lápiz y papel. El algoritmo de multiplicación tradicional, el algoritmo de Euclides, la criba de Eratóstenes y muchas formas de resolver la raíz cuadrada son sólo algunos ejemplos.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Algoritmos como funciones  ==&lt;br /&gt;
&lt;br /&gt;
Esquemática de un algoritmo solucionando un problema de ciclo hamiltoniano.&amp;lt;br&amp;gt;Un algoritmo se puede concebir como una función que transforma los datos de un problema (entrada) en los datos de una solución (salida). Más aún, los datos se pueden representar a su vez como secuencias de bits, y en general, de símbolos cualesquiera. Como cada secuencia de bits representa a un número natural (véase Sistema binario), entonces los algoritmos son en esencia funciones de los números naturales en los números naturales que sí se pueden calcular. Es decir que todo algoritmo calcula una función donde cada número natural es la codificación de un problema o de una solución.&amp;lt;br&amp;gt;En ocasiones los algoritmos son susceptibles de nunca terminar, por ejemplo, cuando entran a un bucle infinito. Cuando esto ocurre, el algoritmo nunca devuelve ningún valor de salida, y podemos decir que la función queda indefinida para ese valor de entrada. Por esta razón se considera que los algoritmos son funciones parciales, es decir, no necesariamente definidas en todo su dominio de definición.&amp;lt;br&amp;gt;Cuando una función puede ser calculada por medios algorítmicos, sin importar la cantidad de memoria que ocupe o el tiempo que se tarde, se dice que dicha función es computable. No todas las funciones entre secuencias datos son computables. El problema de la parada es un ejemplo.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Análisis de algoritmos  ==&lt;br /&gt;
&lt;br /&gt;
Como medida de la eficiencia de un algoritmo, se suelen estudiar los recursos (memoria y tiempo) que consume el algoritmo. El análisis de algoritmos se ha desarrollado para obtener valores que de alguna forma indiquen (o especifiquen) la evolución del gasto de tiempo y memoria en función del tamaño de los valores de entrada.&amp;lt;br&amp;gt;El análisis y estudio de los algoritmos es una disciplina de las ciencias de la computación y, en la mayoría de los casos, su estudio es completamente abstracto sin usar ningún tipo de lenguaje de programación ni cualquier otra implementación; por eso, en ese sentido, comparte las características de las disciplinas matemáticas. Así, el análisis de los algoritmos se centra en los principios básicos del algoritmo, no en los de la implementación particular. Una forma de plasmar (o algunas veces &amp;quot;codificar&amp;quot;) un algoritmo es escribirlo en pseudocódigo o utilizar un lenguaje muy simple tal como Léxico, cuyos códigos pueden estar en el idioma del programador.&amp;lt;br&amp;gt;Algunos escritores restringen la definición de algoritmo a procedimientos que deben acabar en algún momento, mientras que otros consideran procedimientos que podrían ejecutarse eternamente sin pararse, suponiendo el caso en el que existiera algún dispositivo físico que fuera capaz de funcionar eternamente. En este último caso, la finalización con éxito del algoritmo no se podría definir como la terminación de éste con una salida satisfactoria, sino que el éxito estaría definido en función de las secuencias de salidas dadas durante un periodo de vida de la ejecución del algoritmo. Por ejemplo, un algoritmo que verifica que hay más ceros que unos en una secuencia binaria infinita debe ejecutarse siempre para que pueda devolver un valor útil. Si se implementa correctamente, el valor devuelto por el algoritmo será válido, hasta que evalúe el siguiente dígito binario. De esta forma, mientras evalúa la siguiente secuencia podrán leerse dos tipos de señales: una señal positiva (en el caso de que el número de ceros sea mayor que el de unos) y una negativa en caso contrario. Finalmente, la salida de este algoritmo se define como la devolución de valores exclusivamente positivos si hay más ceros que unos en la secuencia y, en cualquier otro caso, devolverá una mezcla de señales positivas y negativas.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Ejemplo de algoritmo&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
El problema consiste en encontrar el máximo de un conjunto de números. Para un ejemplo más complejo véase Algoritmo de Euclides.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Descripción de alto nivel&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Dado un conjunto finito C de números, se tiene el problema de encontrar el número más grande. Sin pérdida de generalidad se puede asumir que dicho conjunto no es vacío y que sus elementos están numerados como. &amp;lt;br&amp;gt;Es decir, dado un conjunto se pide encontrar m tal que para todo elemento x que pertenece al conjunto C.&amp;lt;br&amp;gt;Para encontrar el elemento máximo, se asume que el primer elemento (c0) es el máximo; luego, se recorre el conjunto y se compara cada valor con el valor del máximo número encontrado hasta ese momento. En el caso que un elemento sea mayor que el máximo, se asigna su valor al máximo. Cuando se termina de recorrer la lista, el máximo número que se ha encontrado es el máximo de todo el conjunto.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
El algoritmo puede ser escrito de una manera más formal en el siguiente pseudocódigo:&amp;lt;br&amp;gt;Algoritmo Encontrar el máximo de un conjunto&amp;lt;br&amp;gt;función max(C)&amp;lt;br&amp;gt;//C es un conjunto no vacío de números// &amp;lt;br&amp;gt;n ← | C | // | C | es el número de elementos de C// &amp;lt;br&amp;gt;m ← c0 &amp;lt;br&amp;gt;para i ← 1 hasta n hacer &amp;lt;br&amp;gt;si ci &amp;amp;gt; m entonces &amp;lt;br&amp;gt;m ← ci &amp;lt;br&amp;gt;devolver m &amp;lt;br&amp;gt;Sobre la notación:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*&amp;quot;←&amp;quot; representa una asignación: m ← x significa que la variable m toma el valor de x; &lt;br /&gt;
*&amp;quot;devolver&amp;quot; termina el algoritmo y devuelve el valor a su derecha (en este caso, el máximo de C).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementación&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
En lenguaje C++:&amp;lt;br&amp;gt;int max(int c[], int n){&amp;lt;br&amp;gt; int i, m = c[0];&amp;lt;br&amp;gt; for (i = 1; i &amp;amp;lt; n; i++)&amp;lt;br&amp;gt; if (c[i] &amp;amp;gt; m) m = c[i];&amp;lt;br&amp;gt; return m;&amp;lt;br&amp;gt;} &lt;br /&gt;
&lt;br /&gt;
== Tipos de algoritmos según su función  ==&lt;br /&gt;
&lt;br /&gt;
*[[Algoritmo de ordenamiento]] &lt;br /&gt;
*[[Algoritmo de búsqueda]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Técnicas de diseño de algoritmos  ==&lt;br /&gt;
&lt;br /&gt;
*[[Algoritmos voraces]] (greedy): seleccionan los elementos más prometedores del conjunto de candidatos hasta encontrar una solución. En la mayoría de los casos la solución no es óptima. &lt;br /&gt;
*[[Algoritmos paralelos]]: permiten la división de un problema en subproblemas de forma que se puedan ejecutar de forma simultánea en varios procesadores. &lt;br /&gt;
*[[Algoritmos probabilísticos]]: algunos de los pasos de este tipo de algoritmos están en función de valores pseudoaleatorios. &lt;br /&gt;
*[[Algoritmos determinísticos]]: el comportamiento del algoritmo es lineal: cada paso del algoritmo tiene únicamente un paso sucesor y otro antecesor. &lt;br /&gt;
*[[Algoritmos no determinísticos]]: el comportamiento del algoritmo tiene forma de árbol y a cada paso del algoritmo puede bifurcarse a cualquier número de pasos inmediatamente posteriores, además todas las ramas se ejecutan simultáneamente. &lt;br /&gt;
*[[Divide y vencerás]]: dividen el problema en subconjuntos disjuntos obteniendo una solución de cada uno de ellos para después unirlas, logrando así la solución al problema completo. &lt;br /&gt;
*[[Metaheurísticas]]: encuentran soluciones aproximadas (no óptimas) a problemas basándose en un conocimiento anterior (a veces llamado experiencia) de los mismos. &lt;br /&gt;
*[[Programación dinámica]]: intenta resolver problemas disminuyendo su coste computacional aumentando el coste espacial. &lt;br /&gt;
*[[Ramificación y acotación]]: se basa en la construcción de las soluciones al problema mediante un árbol implícito que se recorre de forma controlada encontrando las mejores soluciones. &lt;br /&gt;
*[[Vuelta atrás (backtracking)]]: se construye el espacio de soluciones del problema en un árbol que se examina completamente, almacenando las soluciones menos costosas.&lt;br /&gt;
&lt;br /&gt;
== Bibliografía  ==&lt;br /&gt;
&lt;br /&gt;
*Fundamentos de Algoritmia, G. Brassard y P. Bratley. (ISBN 848966000) &lt;br /&gt;
*The Art of Computer Programming, Knuth, D. E. [quien fue también, el creador del TeX] &lt;br /&gt;
*Introduction to Algorithms (2nd ed), Cormen, T. H., Leiserson, C. E., Rivest, R. L. y Stein, C. &lt;br /&gt;
*Introduction to Algorithms. A Creative Approach, Mamber, U. &lt;br /&gt;
*Algorithms in C (3r ed), Sedgewick, R. (también existen versiones en C++ y Java) &lt;br /&gt;
*The Design and Analysis of Computer Algorithms, Aho, A. &lt;br /&gt;
*Método de las 6'D. Modelamiento - Algoritmo - Programación. Enfoque orientado a las estructuras lógicas (2da ed.), Juan José Flores Cueto y Carmen Bertolotti Zuñiga, 2008. &lt;br /&gt;
*Método de las 6'D. Modelamiento - Algoritmo - Programación. Enfoque orientado a los arreglos (1ra ed.), Juan José Flores Cueto y Gustavo Tataje Salas, 2009.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Fuente&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
*Wikipedia, enciclopedia libre&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Matriz&amp;diff=59037</id>
		<title>Matriz</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Matriz&amp;diff=59037"/>
		<updated>2010-05-05T18:01:54Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mejorar|este artículo carece de plantilla; de espacios innecesarios; de hipervinculos; de una correcta separación entre párrafos y de la fuente}} &lt;br /&gt;
&lt;br /&gt;
Matriz (Matemática) &lt;br /&gt;
&lt;br /&gt;
En [[Matemáticas|Matemática]], una matriz es una tabla bidimensional de números consistente en cantidades abstractas con las que se pueden realizar operaciones matemáticas, como por ejemplo la suma, la multiplicación y descomposición de las mismas de varias formas, lo que también las hace un concepto clave en el campo del álgebra lineal. . Las matrices se utilizan para describir sistema de ecuaciones lineales, realizar un seguimiento de los coeficientes de una aplicación lineal y registrar los datos que dependen de varios parámetros. Las matrices se describen en el campo de la teoría de matrices. &lt;br /&gt;
&lt;br /&gt;
== Definiciones y notaciones  ==&lt;br /&gt;
&lt;br /&gt;
Una matriz es una tabla cuadrada o rectangular de datos (llamados elementos o entradas de la matriz) ordenados en filas y columnas, donde una fila es cada una de las líneas horizontales de la matriz y una columna es cada una de las líneas verticales. A una matriz con m filas y n columnas se le denomina matriz m-por-n (escrito m×n), y a m y n dimensiones de la matriz. Las dimensiones de una matriz siempre se dan con el número de filas primero y el número de columnas después. Comúnmente se dice que una matriz m-por-n tiene un orden de m × n (&amp;quot;orden&amp;quot; tiene el significado de tamaño). Dos matrices se dice que son iguales si son del mismo orden y tienen los mismos elementos. Al elemento de una matriz que se encuentra en la fila i-ésima y la columna j-ésima se le llama elemento i,j o elemento (i,j)-iésimo de la matriz. Se vuelve a poner primero las filas y después las columnas. Casi siempre, se denotan a las matrices con letras mayúsculas mientras que se utilizan las correspondientes letras en minúsculas para denotar a los elementos de las mismas. Por ejemplo, al elemento de una matriz A que se encuentra en la fila i-ésima y la columna j-ésima se le denota como ai,j o a[i,j]. Notaciones alternativas son A[i,j] o Ai,j. Además de utilizar letras mayúsculas para representar matrices, numerosos autores representan a las matrices con fuentes en negrita para distinguirlas de otros tipos de variables. Así A es una matriz, mientras que A es un escalar. Normalmente se escribe para definir una matriz A m × n con cada entrada en la matriz A[i,j] llamada aij para todo 1 ≤ i ≤ m y 1 ≤ j ≤ n. Sin embargo, la convención del inicio de los índices i y j en 1 no es universal: algunos lenguajes de programación comienzan en cero, en cuál caso se tiene 0 ≤ i ≤ m − 1 y 0 ≤ j ≤ n − 1. Una matriz con una sola columna o una sola fila se denomina a menudo vector, y se interpreta como un elemento del espacio euclídeo. Una matriz 1 × n (una fila y n columnas) se denomina vector fila, y una matriz m × 1 (una columna y m filas) se denomina vector columna. &lt;br /&gt;
&lt;br /&gt;
'''''Ejemplo''''' &lt;br /&gt;
&lt;br /&gt;
La matriz A: es una matriz 4x3. El elemento A[2,3] o a2,3 es 7. La matriz B: es una matriz 1×5, o un vector fila con 5 elementos. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Operaciones básicas  ==&lt;br /&gt;
&lt;br /&gt;
=== Suma o adición  ===&lt;br /&gt;
&lt;br /&gt;
Dadas las matrices m-por-n ,A y B, su suma A + B es la matriz m-por-n calculada sumando los elementos correspondientes (i.e. (A + B)[i, j] = A[i, j] + B[i,&amp;amp;nbsp;j] ). Es decir, sumar cada uno de los elementos homólogos de las matrices a sumar. Por ejemplo:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Propiedades  ====&lt;br /&gt;
&lt;br /&gt;
Asociativa Dadas las matrices m×n A, B y C A + (B + C) = (A + B) + C Conmutativa Dadas las matrices m×n A y B A + B = B + A Existencia de matriz cero o matriz nula A + 0 = 0 + A = A Existencia de matriz opuesta con gr-A = [-aij] A + (-A) = 0 &lt;br /&gt;
&lt;br /&gt;
=== Producto por un escalar  ===&lt;br /&gt;
&lt;br /&gt;
Dada una matriz A y un escalar c, su producto cA se calcula multiplicando el escalar por cada elemento de A (i.e. (cA)[i, j] = cA[i, j] ). Ejemplo &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Propiedades  ====&lt;br /&gt;
&lt;br /&gt;
Sean A y B matrices y c y d escalares. Clausura: Si A es matriz y c es escalar, entonces cA es matriz. Asociatividad: (cd)A = c(dA) Elemento Neutro: 1·A = A Distributividad: De escalar: c(A+B) = cA+cB De matriz: (c+d)A = cA+dA&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Producto  ===&lt;br /&gt;
&lt;br /&gt;
Diagrama esquemático que ilustra el producto de dos matrices A y B dando como resultado la matriz AB. El producto de dos matrices se puede definir sólo si el número de columnas de la matriz izquierda es el mismo que el número de filas de la matriz derecha. Si A es una matriz m×n y B es una matriz n×p, entonces su producto matricial AB es la matriz m×p (m filas, p columnas) dada por: para cada par i y j. Por ejemplo:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Propiedades  ====&lt;br /&gt;
&lt;br /&gt;
Si los elementos de la matriz pertenecen a un cuerpo, y puede definirse el producto, el producto de matrices tiene las siguientes propiedades: Propiedad asociativa: (AB)C = A(BC). Propiedad distributiva por la derecha: (A + B)C = AC + BC. Propiedad distributiva por la izquierda: C(A + B) = CA + CB. En general, el producto de matrices tiene divisores de cero: Si A.B = 0 , No necesariamente A ó B son matrices nulas El producto de matrices no verifica la propiedad de simplificación: Si A.B = A.C, No necesariamente B=C El producto de dos matrices generalmente no es conmutativo, es decir, AB ≠ BA. La división entre matrices, es decir, la operación que podría producir el cociente A / B, no se encuentra definida. Sin embargo, existe el concepto de matriz inversa, sólo aplicable a las matrices cuadradas.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Aplicaciones lineales  ===&lt;br /&gt;
&lt;br /&gt;
Las matrices pueden representar convenientemente aplicaciones lineales (también conocidas como &amp;quot;transformaciones lineales&amp;quot;) entre dos espacios vectoriales de dimensión finita. Así, si ℝn es el espacio euclídeo n-dimensional cuyos vectores se pueden representar como vectores columna (matrices n-por-1), para cada aplicación lineal f&amp;amp;nbsp;: ℝn → ℝm existe una única matriz A m por n de tal forma que para cada vector x de ℝn,,se dice que la matriz A &amp;quot;representa&amp;quot; la aplicación lineal f, o que A es la matriz coordenada de f. El producto de matrices claramente corresponde a la composición de las aplicaciones. Si la matriz k por m B representa otra aplicación lineal g&amp;amp;nbsp;: ℝm → ℝk, entonces la composición g&amp;amp;nbsp;o&amp;amp;nbsp;f se representa por BA: Esto se desprende de la mencionada propiedad asociativa del producto de matrices. Más en general, una aplicación lineal de un espacio vectorial n-dimensional en otro espacio vectorial m-dimensional (no necesariamente ℝn) se representa por una matriz m por n, a condición de que se haya elegido una base para cada uno de ellos.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Rango  ===&lt;br /&gt;
&lt;br /&gt;
El rango de una matriz A es la dimensión de la imagen de la aplicación lineal representada por A, que coincide con la dimensión de los espacios vectoriales generados por las filas o columnas de A. También puede ser definido sin referencia al álgebra lineal de la siguiente manera: el rango de una matriz m por n A es el más pequeño número k de tal manera que A puede escribirse como un producto BC donde B es una matriz m por k y C es una matriz k por n (aunque ésta no es una manera práctica de calcular el rango). Transpuesta La transpuesta de una matriz m-por-n A es la matriz n-por-m AT (algunas veces denotada por At) formada al intercambiar las filas y columnas, i.e. La transposición de matrices tiene las siguientes propiedades: Si A describe una aplicación lineal respecto a dos bases, entonces la matriz AT describe la transpuesta de una aplicación lineal respecto a las bases del espacio dual.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Matrices cuadradas y definiciones relacionadas  ==&lt;br /&gt;
&lt;br /&gt;
Una matriz cuadrada es una matriz que tiene el mismo número de filas que de columnas. El conjunto de todas las matrices cuadradas n-por-n junto a la suma y la multiplicación de matrices, es un anillo que generalmente no es conmutativo. M(n,R), el anillo de las matrices cuadradas reales, es un álgebra asociativa real unitaria. M(n,C), el anillo de las matrices cuadradas complejas, es un álgebra asociativa compleja. La matriz identidad In de orden n es la matriz n por n en la cual todos los elementos de la diagonal principal son iguales a 1 y todos los demás elementos son iguales a 0. La matriz identidad se denomina así porque satisface las ecuaciones MIn&amp;amp;nbsp;=&amp;amp;nbsp;M y InN&amp;amp;nbsp;=&amp;amp;nbsp;N para cualquier matriz M m por n y N n por k. Por ejemplo, si n = 3: La matriz identidad es el elemento unitario en el anillo de matrices cuadradas. Los elementos invertibles de este anillo se llaman matrices inversibles o matrices no singulares. Una matriz A n por n es invertible si y sólo si existe una matriz B tal que AB = In = BA. En este caso, B es la matriz inversa de A, identificada por A-1 . El conjunto de todas las matrices invertibles n por n forma un grupo (concretamente un grupo de Lie) bajo la multiplicación de matrices, el grupo lineal general. Si λ es un número y v no es un vector nulo tal que Av = λv, entonces se dice que v es un vector propio de A y que λ es su valor propio asociado. El número λ es un valor propio de A si y sólo si A−λIn no es invertible, lo que sucede si y sólo si pA(λ) = 0, donde pA(x) es el polinomio característico de A. pA(x) es un polinomio de grado n y por lo tanto, tiene n raíces complejas múltiples raíces si se cuentan de acuerdo a su multiplicidad. Cada matriz cuadrada tiene como mucho n valores propios complejos. El determinante de una matriz cuadrada A es el producto de sus n valores propios, pero también puede ser definida por la fórmula de Leibniz. Las matrices invertibles son precisamente las matrices cuyo determinante es distinto de cero. El algoritmo de eliminación gaussiana puede ser usado para calcular el determinante, el rango y la inversa de una matriz y para resolver sistema de ecuaciones. La traza de una matriz cuadrada es la suma de los elementos de la diagonal, lo que equivale a la suma de sus n valores propios.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Las matrices en la Computación  ==&lt;br /&gt;
&lt;br /&gt;
mente en la computación, por su facilidad y liviandad para manipular información. En este contexto, son la mejor forma para representar [gráficos], y son muy utilizadas en el cálculo numérico. &lt;br /&gt;
&lt;br /&gt;
Historia &lt;br /&gt;
&lt;br /&gt;
El origen de las matrices es muy antiguo. Un cuadrado mágico, 3 por 3, se registra en la literatura china hacia el 650 a. C. Es larga la historia del uso de las matrices para resolver ecuaciones lineales. Un importante texto matemático chino que proviene del año 300 a. C. a 200 a. C., Nueve capítulos sobre el Arte de las matemáticas (Jiu Zhang Suan Shu), es el primer ejemplo conocido de uso del método de matrices para resolver un sistema de ecuaciones simultáneas. En el capítulo séptimo, &amp;quot;Ni mucho ni poco&amp;quot;, el concepto de determinante apareció por primera vez, dos mil años antes de su publicación por el matemático japonéses Se japonés Seki Kōwa en 1683 y el matemático alemán Gottfried Leibniz en 1693. Los &amp;quot;cuadrados mágicos&amp;quot; eran conocidos por los matemáticos árabes, posiblemente desde comienzos del siglo VII, quienes a su vez pudieron tomarlos de los matemáticos y astrónomos de la India, junto con otros aspectos de las matemáticas combinatorias. Todo esto sugiere que la idea provino de China. Los primeros &amp;quot;cuadrados mágicos&amp;quot; de orden 5 y 6 aparecieron en Bagdad en el 983, en la Enciclopedia de la Hermandad de Pureza (Rasa'il Ihkwan al-Safa). Después del desarrollo de la teoría de determinantes por Seki Kowa y Leibniz, a finales del siglo XVII, Cramer presentó en 1750 la ahora denominada regla de Cramer. Carl Friedrich Gauss y Wilhelm Jordan desarrollaron la eliminación de Gauss-Jordan en el siglo XIX. El término &amp;quot;matriz&amp;quot; fue acuñado en 1848, por J.J. Sylvester. En 1853, Hamilton hizo algunos aportes a la teoría de matrices. Carley introdujo en 1858 la notación matricial, como forma abreviada de escribir un sistema de m ecuaciones lineales con n incógnitas.Grassmann, Frobenius y van Neumann están entre los matemáticos famosos que trabajaron sobre la teoría de matrices. Olga Taussky-Todd (1906-1995), durante la II Guerra Mundial, usó la teoría de matrices para investigar el fenómeno de aeroelasticidad llamado fluttering. Una matriz es una tabla cuadrada o rectangular de datos (llamados elementos o entradas de la matriz) ordenados en filas y columnas, donde una fila es cada una de las líneas horizontales de la matriz y una columna es cada una de las líneas verticales. A una matriz con m filas y n columnas se le denomina matriz m-por-n (escrito m×n), y a m y n dimensiones de la matriz. Las dimensiones de una matriz siempre se dan con el número de filas primero y el número de columnas después. Comúnmente se dice que una matriz m-por-n tiene un orden de m × n (&amp;quot;orden&amp;quot; tiene el significado de tamaño). Dos matrices se dice que son iguales si son del mismo orden y tienen los mismos elementos. Al elemento de una matriz que se encuentra en la fila i-ésima y la columna j-ésima se le llama elemento i,j o elemento (i,j)-iésimo de la matriz. Se vuelve a poner primero las filas y después las columnas. &lt;br /&gt;
&lt;br /&gt;
Las matrices son utilizadas ampliamente en la computación, por su facilidad y liviandad para manipular información. En este contexto, son la mejor forma para representar [gráficos], y son muy utilizadas en el cálculo numérico. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Fuente&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
1.&amp;amp;nbsp; a b Swaney, Mark. History of Magic Squares.&amp;lt;br&amp;gt; 2.&amp;amp;nbsp; Shen Kangshen et al. (ed.) (1999). Nine Chapters of the Mathematical Art, Companion and Commentary. Oxford University Press. cited byOtto Bretscher (2005). Linear Algebra with Applications, 3rd ed. edición, Prentice-Hall, pp. 1. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Matemáticas]] [[Category:Álgebra|Álgebra]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Matriz&amp;diff=59036</id>
		<title>Matriz</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Matriz&amp;diff=59036"/>
		<updated>2010-05-05T18:01:14Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mejorar|este artículo carece de plantilla; de espacios innecesarios; de hipervinculos; de una correcta separación entre párrafos y de la fuente}} &lt;br /&gt;
&lt;br /&gt;
Matriz (Matemática) &lt;br /&gt;
&lt;br /&gt;
En [[Matemáticas|Matemática]], una matriz es una tabla bidimensional de números consistente en cantidades abstractas con las que se pueden realizar operaciones matemáticas, como por ejemplo la suma, la multiplicación y descomposición de las mismas de varias formas, lo que también las hace un concepto clave en el campo del álgebra lineal. . Las matrices se utilizan para describir sistema de ecuaciones lineales, realizar un seguimiento de los coeficientes de una aplicación lineal y registrar los datos que dependen de varios parámetros. Las matrices se describen en el campo de la teoría de matrices. &lt;br /&gt;
&lt;br /&gt;
== Definiciones y notaciones  ==&lt;br /&gt;
&lt;br /&gt;
Una matriz es una tabla cuadrada o rectangular de datos (llamados elementos o entradas de la matriz) ordenados en filas y columnas, donde una fila es cada una de las líneas horizontales de la matriz y una columna es cada una de las líneas verticales. A una matriz con m filas y n columnas se le denomina matriz m-por-n (escrito m×n), y a m y n dimensiones de la matriz. Las dimensiones de una matriz siempre se dan con el número de filas primero y el número de columnas después. Comúnmente se dice que una matriz m-por-n tiene un orden de m × n (&amp;quot;orden&amp;quot; tiene el significado de tamaño). Dos matrices se dice que son iguales si son del mismo orden y tienen los mismos elementos. Al elemento de una matriz que se encuentra en la fila i-ésima y la columna j-ésima se le llama elemento i,j o elemento (i,j)-iésimo de la matriz. Se vuelve a poner primero las filas y después las columnas. Casi siempre, se denotan a las matrices con letras mayúsculas mientras que se utilizan las correspondientes letras en minúsculas para denotar a los elementos de las mismas. Por ejemplo, al elemento de una matriz A que se encuentra en la fila i-ésima y la columna j-ésima se le denota como ai,j o a[i,j]. Notaciones alternativas son A[i,j] o Ai,j. Además de utilizar letras mayúsculas para representar matrices, numerosos autores representan a las matrices con fuentes en negrita para distinguirlas de otros tipos de variables. Así A es una matriz, mientras que A es un escalar. Normalmente se escribe para definir una matriz A m × n con cada entrada en la matriz A[i,j] llamada aij para todo 1 ≤ i ≤ m y 1 ≤ j ≤ n. Sin embargo, la convención del inicio de los índices i y j en 1 no es universal: algunos lenguajes de programación comienzan en cero, en cuál caso se tiene 0 ≤ i ≤ m − 1 y 0 ≤ j ≤ n − 1. Una matriz con una sola columna o una sola fila se denomina a menudo vector, y se interpreta como un elemento del espacio euclídeo. Una matriz 1 × n (una fila y n columnas) se denomina vector fila, y una matriz m × 1 (una columna y m filas) se denomina vector columna. &lt;br /&gt;
&lt;br /&gt;
'''''Ejemplo''''' &lt;br /&gt;
&lt;br /&gt;
La matriz A: es una matriz 4x3. El elemento A[2,3] o a2,3 es 7. La matriz B: es una matriz 1×5, o un vector fila con 5 elementos. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Operaciones básicas  ==&lt;br /&gt;
&lt;br /&gt;
=== Suma o adición  ===&lt;br /&gt;
&lt;br /&gt;
Dadas las matrices m-por-n ,A y B, su suma A + B es la matriz m-por-n calculada sumando los elementos correspondientes (i.e. (A + B)[i, j] = A[i, j] + B[i,&amp;amp;nbsp;j] ). Es decir, sumar cada uno de los elementos homólogos de las matrices a sumar. Por ejemplo:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Propiedades  ====&lt;br /&gt;
&lt;br /&gt;
Asociativa Dadas las matrices m×n A, B y C A + (B + C) = (A + B) + C Conmutativa Dadas las matrices m×n A y B A + B = B + A Existencia de matriz cero o matriz nula A + 0 = 0 + A = A Existencia de matriz opuesta con gr-A = [-aij] A + (-A) = 0 &lt;br /&gt;
&lt;br /&gt;
=== Producto por un escalar  ===&lt;br /&gt;
&lt;br /&gt;
Dada una matriz A y un escalar c, su producto cA se calcula multiplicando el escalar por cada elemento de A (i.e. (cA)[i, j] = cA[i, j] ). Ejemplo &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Propiedades  ====&lt;br /&gt;
&lt;br /&gt;
Sean A y B matrices y c y d escalares. Clausura: Si A es matriz y c es escalar, entonces cA es matriz. Asociatividad: (cd)A = c(dA) Elemento Neutro: 1·A = A Distributividad: De escalar: c(A+B) = cA+cB De matriz: (c+d)A = cA+dA&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Producto  ===&lt;br /&gt;
&lt;br /&gt;
Diagrama esquemático que ilustra el producto de dos matrices A y B dando como resultado la matriz AB. El producto de dos matrices se puede definir sólo si el número de columnas de la matriz izquierda es el mismo que el número de filas de la matriz derecha. Si A es una matriz m×n y B es una matriz n×p, entonces su producto matricial AB es la matriz m×p (m filas, p columnas) dada por: para cada par i y j. Por ejemplo:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Propiedades  ====&lt;br /&gt;
&lt;br /&gt;
Si los elementos de la matriz pertenecen a un cuerpo, y puede definirse el producto, el producto de matrices tiene las siguientes propiedades: Propiedad asociativa: (AB)C = A(BC). Propiedad distributiva por la derecha: (A + B)C = AC + BC. Propiedad distributiva por la izquierda: C(A + B) = CA + CB. En general, el producto de matrices tiene divisores de cero: Si A.B = 0 , No necesariamente A ó B son matrices nulas El producto de matrices no verifica la propiedad de simplificación: Si A.B = A.C, No necesariamente B=C El producto de dos matrices generalmente no es conmutativo, es decir, AB ≠ BA. La división entre matrices, es decir, la operación que podría producir el cociente A / B, no se encuentra definida. Sin embargo, existe el concepto de matriz inversa, sólo aplicable a las matrices cuadradas.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Aplicaciones lineales  ===&lt;br /&gt;
&lt;br /&gt;
Las matrices pueden representar convenientemente aplicaciones lineales (también conocidas como &amp;quot;transformaciones lineales&amp;quot;) entre dos espacios vectoriales de dimensión finita. Así, si ℝn es el espacio euclídeo n-dimensional cuyos vectores se pueden representar como vectores columna (matrices n-por-1), para cada aplicación lineal f&amp;amp;nbsp;: ℝn → ℝm existe una única matriz A m por n de tal forma que para cada vector x de ℝn,,se dice que la matriz A &amp;quot;representa&amp;quot; la aplicación lineal f, o que A es la matriz coordenada de f. El producto de matrices claramente corresponde a la composición de las aplicaciones. Si la matriz k por m B representa otra aplicación lineal g&amp;amp;nbsp;: ℝm → ℝk, entonces la composición g&amp;amp;nbsp;o&amp;amp;nbsp;f se representa por BA: Esto se desprende de la mencionada propiedad asociativa del producto de matrices. Más en general, una aplicación lineal de un espacio vectorial n-dimensional en otro espacio vectorial m-dimensional (no necesariamente ℝn) se representa por una matriz m por n, a condición de que se haya elegido una base para cada uno de ellos.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Rango  ===&lt;br /&gt;
&lt;br /&gt;
El rango de una matriz A es la dimensión de la imagen de la aplicación lineal representada por A, que coincide con la dimensión de los espacios vectoriales generados por las filas o columnas de A. También puede ser definido sin referencia al álgebra lineal de la siguiente manera: el rango de una matriz m por n A es el más pequeño número k de tal manera que A puede escribirse como un producto BC donde B es una matriz m por k y C es una matriz k por n (aunque ésta no es una manera práctica de calcular el rango). Transpuesta La transpuesta de una matriz m-por-n A es la matriz n-por-m AT (algunas veces denotada por At) formada al intercambiar las filas y columnas, i.e. La transposición de matrices tiene las siguientes propiedades: Si A describe una aplicación lineal respecto a dos bases, entonces la matriz AT describe la transpuesta de una aplicación lineal respecto a las bases del espacio dual.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Matrices cuadradas y definiciones relacionadas  ==&lt;br /&gt;
&lt;br /&gt;
Una matriz cuadrada es una matriz que tiene el mismo número de filas que de columnas. El conjunto de todas las matrices cuadradas n-por-n junto a la suma y la multiplicación de matrices, es un anillo que generalmente no es conmutativo. M(n,R), el anillo de las matrices cuadradas reales, es un álgebra asociativa real unitaria. M(n,C), el anillo de las matrices cuadradas complejas, es un álgebra asociativa compleja. La matriz identidad In de orden n es la matriz n por n en la cual todos los elementos de la diagonal principal son iguales a 1 y todos los demás elementos son iguales a 0. La matriz identidad se denomina así porque satisface las ecuaciones MIn&amp;amp;nbsp;=&amp;amp;nbsp;M y InN&amp;amp;nbsp;=&amp;amp;nbsp;N para cualquier matriz M m por n y N n por k. Por ejemplo, si n = 3: La matriz identidad es el elemento unitario en el anillo de matrices cuadradas. Los elementos invertibles de este anillo se llaman matrices inversibles o matrices no singulares. Una matriz A n por n es invertible si y sólo si existe una matriz B tal que AB = In = BA. En este caso, B es la matriz inversa de A, identificada por A-1 . El conjunto de todas las matrices invertibles n por n forma un grupo (concretamente un grupo de Lie) bajo la multiplicación de matrices, el grupo lineal general. Si λ es un número y v no es un vector nulo tal que Av = λv, entonces se dice que v es un vector propio de A y que λ es su valor propio asociado. El número λ es un valor propio de A si y sólo si A−λIn no es invertible, lo que sucede si y sólo si pA(λ) = 0, donde pA(x) es el polinomio característico de A. pA(x) es un polinomio de grado n y por lo tanto, tiene n raíces complejas múltiples raíces si se cuentan de acuerdo a su multiplicidad. Cada matriz cuadrada tiene como mucho n valores propios complejos. El determinante de una matriz cuadrada A es el producto de sus n valores propios, pero también puede ser definida por la fórmula de Leibniz. Las matrices invertibles son precisamente las matrices cuyo determinante es distinto de cero. El algoritmo de eliminación gaussiana puede ser usado para calcular el determinante, el rango y la inversa de una matriz y para resolver sistema de ecuaciones. La traza de una matriz cuadrada es la suma de los elementos de la diagonal, lo que equivale a la suma de sus n valores propios.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Las matrices en la Computación  ==&lt;br /&gt;
&lt;br /&gt;
mente en la computación, por su facilidad y liviandad para manipular información. En este contexto, son la mejor forma para representar [gráficos], y son muy utilizadas en el cálculo numérico. &lt;br /&gt;
&lt;br /&gt;
Historia &lt;br /&gt;
&lt;br /&gt;
El origen de las matrices es muy antiguo. Un cuadrado mágico, 3 por 3, se registra en la literatura china hacia el 650 a. C. Es larga la historia del uso de las matrices para resolver ecuaciones lineales. Un importante texto matemático chino que proviene del año 300 a. C. a 200 a. C., Nueve capítulos sobre el Arte de las matemáticas (Jiu Zhang Suan Shu), es el primer ejemplo conocido de uso del método de matrices para resolver un sistema de ecuaciones simultáneas. En el capítulo séptimo, &amp;quot;Ni mucho ni poco&amp;quot;, el concepto de determinante apareció por primera vez, dos mil años antes de su publicación por el matemático japonéses Se japonés Seki Kōwa en 1683 y el matemático alemán Gottfried Leibniz en 1693. Los &amp;quot;cuadrados mágicos&amp;quot; eran conocidos por los matemáticos árabes, posiblemente desde comienzos del siglo VII, quienes a su vez pudieron tomarlos de los matemáticos y astrónomos de la India, junto con otros aspectos de las matemáticas combinatorias. Todo esto sugiere que la idea provino de China. Los primeros &amp;quot;cuadrados mágicos&amp;quot; de orden 5 y 6 aparecieron en Bagdad en el 983, en la Enciclopedia de la Hermandad de Pureza (Rasa'il Ihkwan al-Safa). Después del desarrollo de la teoría de determinantes por Seki Kowa y Leibniz, a finales del siglo XVII, Cramer presentó en 1750 la ahora denominada regla de Cramer. Carl Friedrich Gauss y Wilhelm Jordan desarrollaron la eliminación de Gauss-Jordan en el siglo XIX. El término &amp;quot;matriz&amp;quot; fue acuñado en 1848, por J.J. Sylvester. En 1853, Hamilton hizo algunos aportes a la teoría de matrices. Carley introdujo en 1858 la notación matricial, como forma abreviada de escribir un sistema de m ecuaciones lineales con n incógnitas.Grassmann, Frobenius y van Neumann están entre los matemáticos famosos que trabajaron sobre la teoría de matrices. Olga Taussky-Todd (1906-1995), durante la II Guerra Mundial, usó la teoría de matrices para investigar el fenómeno de aeroelasticidad llamado fluttering. Una matriz es una tabla cuadrada o rectangular de datos (llamados elementos o entradas de la matriz) ordenados en filas y columnas, donde una fila es cada una de las líneas horizontales de la matriz y una columna es cada una de las líneas verticales. A una matriz con m filas y n columnas se le denomina matriz m-por-n (escrito m×n), y a m y n dimensiones de la matriz. Las dimensiones de una matriz siempre se dan con el número de filas primero y el número de columnas después. Comúnmente se dice que una matriz m-por-n tiene un orden de m × n (&amp;quot;orden&amp;quot; tiene el significado de tamaño). Dos matrices se dice que son iguales si son del mismo orden y tienen los mismos elementos. Al elemento de una matriz que se encuentra en la fila i-ésima y la columna j-ésima se le llama elemento i,j o elemento (i,j)-iésimo de la matriz. Se vuelve a poner primero las filas y después las columnas. &lt;br /&gt;
&lt;br /&gt;
Las matrices son utilizadas ampliamente en la computación, por su facilidad y liviandad para manipular información. En este contexto, son la mejor forma para representar [gráficos], y son muy utilizadas en el cálculo numérico. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Fuente&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
1.&amp;amp;nbsp; a b Swaney, Mark. History of Magic Squares.&amp;lt;br&amp;gt; 2.&amp;amp;nbsp; Shen Kangshen et al. (ed.) (1999). Nine Chapters of the Mathematical Art, Companion and Commentary. Oxford University Press. cited byOtto Bretscher (2005). Linear Algebra with Applications, 3rd ed. edición, Prentice-Hall, pp. 1. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Matemáticas]][[Category:Álgebra|Álgebra]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmos_no_determin%C3%ADsticos&amp;diff=58558</id>
		<title>Algoritmos no determinísticos</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmos_no_determin%C3%ADsticos&amp;diff=58558"/>
		<updated>2010-05-05T00:52:15Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '{{Referencia}}Algoritmo no determinista   En Ciencias de la computación, un algoritmo no determinístico es un algoritmo que con la misma entrada ofrece muchos posibles resulta…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}}Algoritmo no determinista &lt;br /&gt;
&lt;br /&gt;
En Ciencias de la computación, un algoritmo no determinístico es un algoritmo que con la misma entrada ofrece muchos posibles resultados. No se puede saber de antemano cuál será el resultado de la ejecución de un algoritmo no determinístico. &lt;br /&gt;
&lt;br /&gt;
== Uso  ==&lt;br /&gt;
&lt;br /&gt;
En la teoría estándar de la computación la definición de algoritmo deja en claro que de por sí un algoritmo es determinístico. Sin embargo, los algoritmos no determinísticos emplean modelos de computación tales como la Máquina de Turing probabilística, que no son determinísticos. Se considera entonces que los algoritmos no determinísticos son un caso especial. &lt;br /&gt;
&lt;br /&gt;
== Convirtiendo algoritmos no determinísticos en determinísticos ==&lt;br /&gt;
&lt;br /&gt;
Una forma de simular algoritmos no determinísticos N mediante el empleo de otros deterministícos D puede realizarse tratando los estados de N como estados de D. Esto significa que D puede tracear todas las posibilidades y trayectorias de ejecución del algoritmo N. Otra posibilidad es emplear algoritmos de generación de números aleatorios que consisten en perturbar los estados mediante el establecimiento de todas las posibilidades mediante un generador de números aleatorios. El resultado es un algoritmo determinístico probabilístico. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fuente  ==&lt;br /&gt;
&lt;br /&gt;
*&amp;amp;nbsp;Wikipedia, enciclopedia libre&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Estructura_secuencial&amp;diff=56765</id>
		<title>Estructura secuencial</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Estructura_secuencial&amp;diff=56765"/>
		<updated>2010-04-30T18:25:56Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}}Estructuras secuenciales&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
La estructura secuencial es aquella en la que una acción (instrucción) sigue a otra en secuencia. Las tareas se suceden de tal modo que la salida de una es la entrada de la siguiente y así sucesivamente hasta el fin del proceso. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Componentes&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;nbsp;Asignación&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
La asignación consiste, en el paso de valores o resultados a una zona de la memoria. Dicha zona será reconocida con el nombre de la variable que recibe el valor. La asignación se puede clasificar de la siguiente forma:&amp;lt;br&amp;gt;• Simples: Consiste en pasar un valor constate a una variable (a=15)&amp;lt;br&amp;gt;• Contador: Consiste en usarla como un verificador del número de veces que se realiza un proceso (a=a+1)&amp;lt;br&amp;gt;• Acumulador: Consiste en usarla como un sumador en un proceso (a=a+b)&amp;lt;br&amp;gt;• De trabajo: Donde puede recibir el resultado de una operación matemática que involucre muchas variables (a=c+b*2/4). &lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;nbsp;Lectura&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
La lectura consiste en recibir desde un dispositivo de entrada (p.ej. el teclado) un valor. Esta operación se representa en un pseudocodigo como sigue:&amp;lt;br&amp;gt;Leer a, b&amp;lt;br&amp;gt;Donde “a” y “b” son las variables que recibirán los valores &lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;nbsp;Escritura&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Consiste en mandar por un dispositivo de salida (p.ej. monitor o impresora) un resultado o mensaje. Este proceso se representa en un pseudocodigo como sigue: &lt;br /&gt;
&lt;br /&gt;
Escribe “El resultado es:”, R&amp;lt;br&amp;gt;Donde “El resultado es:” es un mensaje que se desea aparezca y R es una variable que contiene un valor.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Ejemplos&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
Los algoritmos que necesitan de estructuras secuenciales para su solución son los mas difíciles de comprender y mas sencillos de identificar los procesos que realizará el programa que nos llevarán a la solución del mismo.&amp;lt;br&amp;gt;En algunos algoritmos se omite la declaración de variables, en casos que el algoritmo no es complicado. &lt;br /&gt;
&lt;br /&gt;
Ejercicio 1 &lt;br /&gt;
&lt;br /&gt;
Hacer el rastreo manual para:&amp;lt;br&amp;gt; a = 2&amp;lt;br&amp;gt; a = a + 1&amp;lt;br&amp;gt; b = a * 2&amp;lt;br&amp;gt; b = b - 1&amp;lt;br&amp;gt; c = a + 2 * b&amp;lt;br&amp;gt;Presentar &amp;quot;c&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
RASTREO: Para el rastreo hay que asignarle a cada línea un número, de la siguiente manera, de antemano ya nos habremos fijado que el valor de salida es el de la variable c, el problema sería saber el valor de esta variable c que se mostrará finalmente.&amp;lt;br&amp;gt;1) a = 2&amp;lt;br&amp;gt;2) a = a + 1&amp;lt;br&amp;gt;3) b = a * 2&amp;lt;br&amp;gt;4) b = b - 1&amp;lt;br&amp;gt;5) c = a + 2 * b&amp;lt;br&amp;gt;6) Presentar &amp;quot;c&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Línea 1: a=2&amp;lt;br&amp;gt;Línea 2: a=2+1=3&amp;lt;br&amp;gt;Línea 3: b=3*2=6&amp;lt;br&amp;gt;Línea 4: b=6-1=5&amp;lt;br&amp;gt;Línea 5: c=3+2*5=13&amp;lt;br&amp;gt;Línea 6: Se presenta 13&amp;lt;br&amp;gt;El valor de la variable c será 13. &lt;br /&gt;
&lt;br /&gt;
Ejercicio 2 &lt;br /&gt;
&lt;br /&gt;
Hacer el algoritmo para escribir un programa que evalúe la expresión &amp;lt;br&amp;gt;Solución: observe que los valores de ingreso serán para las variables x, w. &lt;br /&gt;
&lt;br /&gt;
Algoritmo&amp;lt;br&amp;gt;Inicio&amp;lt;br&amp;gt;Declare Resultado, x, w&amp;lt;br&amp;gt;Leer x,w&amp;lt;br&amp;gt; Resultado (x+w)/(2*w)&amp;lt;br&amp;gt; Mostrar Resultado&amp;lt;br&amp;gt;Fin &lt;br /&gt;
&lt;br /&gt;
Variables&amp;lt;br&amp;gt;resultado: valor de la expresión luego de ser evaluada.&amp;lt;br&amp;gt;x&amp;amp;nbsp;: guarda un valor numérico ingresado.&amp;lt;br&amp;gt;w&amp;amp;nbsp;: guarda un valor numérico ingresado. &lt;br /&gt;
&lt;br /&gt;
Programa&amp;lt;br&amp;gt;#include&amp;amp;lt;stdio.h&amp;amp;gt;&amp;lt;br&amp;gt;main(void)&amp;lt;br&amp;gt;{float resultado,x,w;&amp;lt;br&amp;gt;//se escriben dos valores separados por la barra espaciadora&amp;lt;br&amp;gt;printf(&amp;quot;ingrese el valor de x , también de w \n&amp;quot;); &amp;lt;br&amp;gt;//se leen o capturan dos valores escritos en las variables x y w.&amp;lt;br&amp;gt;scanf(&amp;quot;%f&amp;amp;nbsp;%f&amp;quot;,&amp;amp;amp;x,&amp;amp;amp;w);&amp;lt;br&amp;gt;//Se evalúa la expresión y el resultado es asignado a la variable resultado.&amp;lt;br&amp;gt;resultado=(x+w)/(2*w);&amp;lt;br&amp;gt;//se imprime el valor de la variable resultado.&amp;lt;br&amp;gt;printf(&amp;quot;%f&amp;quot;,resultado);&amp;lt;br&amp;gt;}&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Referencia&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
*Urbaez, Wilder.''&amp;amp;nbsp;Explicamos las estructuras secuenciales, cómo se representan en pseudocódigo y algunos ejemplos prácticos de las mismas. ''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Estructura_secuencial&amp;diff=56764</id>
		<title>Estructura secuencial</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Estructura_secuencial&amp;diff=56764"/>
		<updated>2010-04-30T18:24:10Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '{{Referencia}}&amp;lt;br&amp;gt;   Estructuras secuenciales&amp;lt;br&amp;gt;   &amp;lt;br&amp;gt;   La estructura secuencial es aquella en la que una acción (instrucción) sigue a otra en secuencia. Las tareas se suce…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}}&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Estructuras secuenciales&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
La estructura secuencial es aquella en la que una acción (instrucción) sigue a otra en secuencia. Las tareas se suceden de tal modo que la salida de una es la entrada de la siguiente y así sucesivamente hasta el fin del proceso. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Componentes&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;nbsp;Asignación&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
La asignación consiste, en el paso de valores o resultados a una zona de la memoria. Dicha zona será reconocida con el nombre de la variable que recibe el valor. La asignación se puede clasificar de la siguiente forma:&amp;lt;br&amp;gt;• Simples: Consiste en pasar un valor constate a una variable (a=15)&amp;lt;br&amp;gt;• Contador: Consiste en usarla como un verificador del número de veces que se realiza un proceso (a=a+1)&amp;lt;br&amp;gt;• Acumulador: Consiste en usarla como un sumador en un proceso (a=a+b)&amp;lt;br&amp;gt;• De trabajo: Donde puede recibir el resultado de una operación matemática que involucre muchas variables (a=c+b*2/4). &lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;nbsp;Lectura&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
La lectura consiste en recibir desde un dispositivo de entrada (p.ej. el teclado) un valor. Esta operación se representa en un pseudocodigo como sigue:&amp;lt;br&amp;gt;Leer a, b&amp;lt;br&amp;gt;Donde “a” y “b” son las variables que recibirán los valores &lt;br /&gt;
&lt;br /&gt;
=== &amp;amp;nbsp;Escritura&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Consiste en mandar por un dispositivo de salida (p.ej. monitor o impresora) un resultado o mensaje. Este proceso se representa en un pseudocodigo como sigue: &lt;br /&gt;
&lt;br /&gt;
Escribe “El resultado es:”, R&amp;lt;br&amp;gt;Donde “El resultado es:” es un mensaje que se desea aparezca y R es una variable que contiene un valor.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Ejemplos&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
Los algoritmos que necesitan de estructuras secuenciales para su solución son los mas difíciles de comprender y mas sencillos de identificar los procesos que realizará el programa que nos llevarán a la solución del mismo.&amp;lt;br&amp;gt;En algunos algoritmos se omite la declaración de variables, en casos que el algoritmo no es complicado. &lt;br /&gt;
&lt;br /&gt;
Ejercicio 1 &lt;br /&gt;
&lt;br /&gt;
Hacer el rastreo manual para:&amp;lt;br&amp;gt; a = 2&amp;lt;br&amp;gt; a = a + 1&amp;lt;br&amp;gt; b = a * 2&amp;lt;br&amp;gt; b = b - 1&amp;lt;br&amp;gt; c = a + 2 * b&amp;lt;br&amp;gt;Presentar &amp;quot;c&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
RASTREO: Para el rastreo hay que asignarle a cada línea un número, de la siguiente manera, de antemano ya nos habremos fijado que el valor de salida es el de la variable c, el problema sería saber el valor de esta variable c que se mostrará finalmente.&amp;lt;br&amp;gt;1) a = 2&amp;lt;br&amp;gt;2) a = a + 1&amp;lt;br&amp;gt;3) b = a * 2&amp;lt;br&amp;gt;4) b = b - 1&amp;lt;br&amp;gt;5) c = a + 2 * b&amp;lt;br&amp;gt;6) Presentar &amp;quot;c&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Línea 1: a=2&amp;lt;br&amp;gt;Línea 2: a=2+1=3&amp;lt;br&amp;gt;Línea 3: b=3*2=6&amp;lt;br&amp;gt;Línea 4: b=6-1=5&amp;lt;br&amp;gt;Línea 5: c=3+2*5=13&amp;lt;br&amp;gt;Línea 6: Se presenta 13&amp;lt;br&amp;gt;El valor de la variable c será 13. &lt;br /&gt;
&lt;br /&gt;
Ejercicio 2 &lt;br /&gt;
&lt;br /&gt;
Hacer el algoritmo para escribir un programa que evalúe la expresión &amp;lt;br&amp;gt;Solución: observe que los valores de ingreso serán para las variables x, w. &lt;br /&gt;
&lt;br /&gt;
Algoritmo&amp;lt;br&amp;gt;Inicio&amp;lt;br&amp;gt;Declare Resultado, x, w&amp;lt;br&amp;gt;Leer x,w&amp;lt;br&amp;gt; Resultado (x+w)/(2*w)&amp;lt;br&amp;gt; Mostrar Resultado&amp;lt;br&amp;gt;Fin &lt;br /&gt;
&lt;br /&gt;
Variables&amp;lt;br&amp;gt;resultado: valor de la expresión luego de ser evaluada.&amp;lt;br&amp;gt;x&amp;amp;nbsp;: guarda un valor numérico ingresado.&amp;lt;br&amp;gt;w&amp;amp;nbsp;: guarda un valor numérico ingresado. &lt;br /&gt;
&lt;br /&gt;
Programa&amp;lt;br&amp;gt;#include&amp;amp;lt;stdio.h&amp;amp;gt;&amp;lt;br&amp;gt;main(void)&amp;lt;br&amp;gt;{float resultado,x,w;&amp;lt;br&amp;gt;//se escriben dos valores separados por la barra espaciadora&amp;lt;br&amp;gt;printf(&amp;quot;ingrese el valor de x , también de w \n&amp;quot;); &amp;lt;br&amp;gt;//se leen o capturan dos valores escritos en las variables x y w.&amp;lt;br&amp;gt;scanf(&amp;quot;%f&amp;amp;nbsp;%f&amp;quot;,&amp;amp;amp;x,&amp;amp;amp;w);&amp;lt;br&amp;gt;//Se evalúa la expresión y el resultado es asignado a la variable resultado.&amp;lt;br&amp;gt;resultado=(x+w)/(2*w);&amp;lt;br&amp;gt;//se imprime el valor de la variable resultado.&amp;lt;br&amp;gt;printf(&amp;quot;%f&amp;quot;,resultado);&amp;lt;br&amp;gt;}&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Referencia&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
*Urbaez, Wilder.''&amp;amp;nbsp;Explicamos las estructuras secuenciales, cómo se representan en pseudocódigo y algunos ejemplos prácticos de las mismas. ''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo&amp;diff=56760</id>
		<title>Algoritmo</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo&amp;diff=56760"/>
		<updated>2010-04-30T17:57:44Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Algoritmo&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En [[Matemáticas|Matemática]], ciencias de la computación y disciplinas relacionadas, un algoritmo (del latín, dixit algorithmus y éste a su vez del matemático persa [[Al Juarismi]]) es un conjunto reescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos sucesivos que no generen dudas a quien lo ejecute. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final y se obtiene una solución. Los algoritmos son objeto de estudio de la algoritmia.&amp;lt;br&amp;gt;En la vida cotidiana se emplean algoritmos en multitud de ocasiones para resolver problemas. Algunos ejemplos son los manuales de usuario, que muestran algoritmos para usar un aparato, o las instrucciones que recibe un trabajador por parte de su patrón. Algunos ejemplos en matemáticas son el algoritmo de la división para calcular el cociente de dos números, el algoritmo de Euclides para obtener el máximo común divisor de dos enteros positivos, o el método de [[Carl Friedrich Gauss|Gauss]] para resolver un sistema lineal de ecuaciones. &lt;br /&gt;
&lt;br /&gt;
== Características principales y definición formal  ==&lt;br /&gt;
&lt;br /&gt;
En general, no existe ningún consenso definitivo en cuanto a la definición formal de algoritmo. Muchos autores los señalan como listas de instrucciones para resolver un problema abstracto, es decir, que un número finito de pasos convierten los datos de un problema (entrada) en una solución (salida). Sin embargo cabe notar que algunos algoritmos no necesariamente tienen que terminar o resolver un problema en particular. Por ejemplo, una versión modificada de la criba de Eratóstenes que nunca termine de calcular números primos no deja de ser un algoritmo.&amp;lt;br&amp;gt;A lo largo de la historia varios autores han tratado de definir formalmente a los algoritmos utilizando modelos matemáticos como máquinas de Turing entre otros. Sin embargo estos modelos están sujetos a un tipo particular de datos como son números, símbolos o gráficas mientras que, en general, los algoritmos funcionan sobre una basta cantidad de estructuras de datos.datos.En general, la parte común en todas las definiciones se puede resumir en las siguientes tres propiedades siempre y cuando no consideremos algoritmos paralelos:&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Tiempo secuencial. Un algoritmo funciona en tiempo discretizado –paso a paso–, definiendo así una secuencia de estados &amp;quot;computacionales&amp;quot; por cada entrada válida (la entrada son los datos que se le suministran al algoritmo antes de comenzar). &amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Estado abstracto. Cada estado computacional puede ser descrito formalmente utilizando una estructura de primer orden y cada algoritmo es independiente de su implementación (los algoritmos son objetos abstractos) de manera que en un algoritmo las estructuras de primer orden son invariantes bajo isomorfismo. &amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Exploración acotada. La transición de un estado al siguiente queda completamente determinada por una descripción fija y finita; es decir, entre cada estado y el siguiente solamente se puede tomar en cuenta una cantidad fija y limitada de términos del estado actual. &amp;lt;br&amp;gt;En resumen, un algoritmo es cualquier cosa que funcione paso a paso, donde cada paso se pueda describir sin ambigüedad y sin hacer referencia a una computadora en particular, y además tiene un límite fijo en cuanto a la cantidad de datos que se pueden leer/escribir en un solo paso. Esta amplia definición abarca tanto a algoritmos prácticos como aquellos que solo funcionan en teoría, por ejemplo el método de Newton y la eliminación de Gauss-Jordan funcionan, al menos en principio, con números de precisión infinita; sin embargo no es posible programar la precisión infinita en una computadora, y no por ello dejan de ser algoritmos. En particular es posible considerar una cuarta propiedad que puede ser usada para validar la tesis de Church-Turing de que toda función calculable se puede programar en una máquina de Turing (o equivalentemente, en un lenguaje de programación suficientemente general):&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; Aritmetizabilidad. Solamente operaciones innegablemente calculables están disponibles en el paso inicial. &lt;br /&gt;
&lt;br /&gt;
== Medios de expresión de un algoritmo  ==&lt;br /&gt;
&lt;br /&gt;
Los algoritmos pueden ser expresados de muchas maneras, incluyendo al lenguaje natural, pseudocódigo, diagramas de flujo y lenguajes de programación entre otros. Las descripciones en lenguaje natural tienden a ser ambiguas y extensas. El usar pseudocódigo y diagramas de flujo evita muchas ambigüedades del lenguaje natural. Dichas expresiones son formas más estructuradas para representar algoritmos; no obstante, se mantienen independientes de un lenguaje de programación específico.&amp;lt;br&amp;gt;La descripción de un algoritmo usualmente se hace en tres niveles:&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 1.Descripción de alto nivel. Se establece el problema, se selecciona un modelo matemático y se explica el algoritmo de manera verbal, posiblemente con ilustraciones y omitiendo detalles. &amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 2.Descripción formal. Se usa pseudocódigo para describir la secuencia de pasos que encuentran la solución. &amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 3.Implementación. Se muestra el algoritmo expresado en un lenguaje de programación específico o algún objeto capaz de llevar a cabo instrucciones. &amp;lt;br&amp;gt;También es posible incluir un teorema que demuestre que el algoritmo es correcto, un análisis de complejidad o ambos.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Diagrama de flujo  ===&lt;br /&gt;
&lt;br /&gt;
Los diagramas de flujo son descripciones gráficas de algoritmos; usan símbolos conectados con flechas para indicar la secuencia de instrucciones y están regidos por ISO.&amp;lt;br&amp;gt;Los diagramas de flujo son usados para representar algoritmos pequeños, ya que abarcan mucho espacio y su construcción es laboriosa. Por su facilidad de lectura son usados como introducción a los algoritmos, descripción de un lenguaje y descripción de procesos a personas ajenas a la computación.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Pseudocódigo  ===&lt;br /&gt;
&lt;br /&gt;
Pseudocódigo es la descripción de un algoritmo que asemeja a un lenguaje de programación pero con algunas convenciones del lenguaje natural (de ahí que tenga el prefijo pseudo, que significa falso). Tiene varias ventajas con respecto a los diagramas de flujo, entre las que se destaca el poco espacio que se requiere para representar instrucciones complejas. El pseudocódigo no está regido por ningún estándar.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Sistemas formales&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
La teoría de autómatas y la teoría de funciones recursivas proveen modelos matemáticos que formalizan el concepto de algoritmo. Los modelos más comunes son la máquina de Turing, máquina de registro y funciones μ-recursivas. Estos modelos son tan precisos como un lenguaje máquina, careciendo de expresiones coloquiales o ambigüedad, sin embargo se mantienen independientes de cualquier computadora y de cualquier implementación.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Implementación  ===&lt;br /&gt;
&lt;br /&gt;
Muchos algoritmos son ideados para implementarse en un programa. Sin embargo, los algoritmos pueden ser implementados en otros medios, como una red neuronal, un circuito eléctrico o un aparato mecánico y eléctrico. Algunos algoritmos inclusive se diseñan especialmente para implementarse usando lápiz y papel. El algoritmo de multiplicación tradicional, el algoritmo de Euclides, la criba de Eratóstenes y muchas formas de resolver la raíz cuadrada son sólo algunos ejemplos.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Algoritmos como funciones  ==&lt;br /&gt;
&lt;br /&gt;
Esquemática de un algoritmo solucionando un problema de ciclo hamiltoniano.&amp;lt;br&amp;gt;Un algoritmo se puede concebir como una función que transforma los datos de un problema (entrada) en los datos de una solución (salida). Más aún, los datos se pueden representar a su vez como secuencias de bits, y en general, de símbolos cualesquiera. Como cada secuencia de bits representa a un número natural (véase Sistema binario), entonces los algoritmos son en esencia funciones de los números naturales en los números naturales que sí se pueden calcular. Es decir que todo algoritmo calcula una función donde cada número natural es la codificación de un problema o de una solución.&amp;lt;br&amp;gt;En ocasiones los algoritmos son susceptibles de nunca terminar, por ejemplo, cuando entran a un bucle infinito. Cuando esto ocurre, el algoritmo nunca devuelve ningún valor de salida, y podemos decir que la función queda indefinida para ese valor de entrada. Por esta razón se considera que los algoritmos son funciones parciales, es decir, no necesariamente definidas en todo su dominio de definición.&amp;lt;br&amp;gt;Cuando una función puede ser calculada por medios algorítmicos, sin importar la cantidad de memoria que ocupe o el tiempo que se tarde, se dice que dicha función es computable. No todas las funciones entre secuencias datos son computables. El problema de la parada es un ejemplo.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Análisis de algoritmos  ==&lt;br /&gt;
&lt;br /&gt;
Como medida de la eficiencia de un algoritmo, se suelen estudiar los recursos (memoria y tiempo) que consume el algoritmo. El análisis de algoritmos se ha desarrollado para obtener valores que de alguna forma indiquen (o especifiquen) la evolución del gasto de tiempo y memoria en función del tamaño de los valores de entrada.&amp;lt;br&amp;gt;El análisis y estudio de los algoritmos es una disciplina de las ciencias de la computación y, en la mayoría de los casos, su estudio es completamente abstracto sin usar ningún tipo de lenguaje de programación ni cualquier otra implementación; por eso, en ese sentido, comparte las características de las disciplinas matemáticas. Así, el análisis de los algoritmos se centra en los principios básicos del algoritmo, no en los de la implementación particular. Una forma de plasmar (o algunas veces &amp;quot;codificar&amp;quot;) un algoritmo es escribirlo en pseudocódigo o utilizar un lenguaje muy simple tal como Léxico, cuyos códigos pueden estar en el idioma del programador.&amp;lt;br&amp;gt;Algunos escritores restringen la definición de algoritmo a procedimientos que deben acabar en algún momento, mientras que otros consideran procedimientos que podrían ejecutarse eternamente sin pararse, suponiendo el caso en el que existiera algún dispositivo físico que fuera capaz de funcionar eternamente. En este último caso, la finalización con éxito del algoritmo no se podría definir como la terminación de éste con una salida satisfactoria, sino que el éxito estaría definido en función de las secuencias de salidas dadas durante un periodo de vida de la ejecución del algoritmo. Por ejemplo, un algoritmo que verifica que hay más ceros que unos en una secuencia binaria infinita debe ejecutarse siempre para que pueda devolver un valor útil. Si se implementa correctamente, el valor devuelto por el algoritmo será válido, hasta que evalúe el siguiente dígito binario. De esta forma, mientras evalúa la siguiente secuencia podrán leerse dos tipos de señales: una señal positiva (en el caso de que el número de ceros sea mayor que el de unos) y una negativa en caso contrario. Finalmente, la salida de este algoritmo se define como la devolución de valores exclusivamente positivos si hay más ceros que unos en la secuencia y, en cualquier otro caso, devolverá una mezcla de señales positivas y negativas.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Ejemplo de algoritmo&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
El problema consiste en encontrar el máximo de un conjunto de números. Para un ejemplo más complejo véase Algoritmo de Euclides.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Descripción de alto nivel&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Dado un conjunto finito C de números, se tiene el problema de encontrar el número más grande. Sin pérdida de generalidad se puede asumir que dicho conjunto no es vacío y que sus elementos están numerados como. &amp;lt;br&amp;gt;Es decir, dado un conjunto se pide encontrar m tal que para todo elemento x que pertenece al conjunto C.&amp;lt;br&amp;gt;Para encontrar el elemento máximo, se asume que el primer elemento (c0) es el máximo; luego, se recorre el conjunto y se compara cada valor con el valor del máximo número encontrado hasta ese momento. En el caso que un elemento sea mayor que el máximo, se asigna su valor al máximo. Cuando se termina de recorrer la lista, el máximo número que se ha encontrado es el máximo de todo el conjunto.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Descripción formal&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
El algoritmo puede ser escrito de una manera más formal en el siguiente pseudocódigo:&amp;lt;br&amp;gt;Algoritmo Encontrar el máximo de un conjunto&amp;lt;br&amp;gt;función max(C)&amp;lt;br&amp;gt;//C es un conjunto no vacío de números// &amp;lt;br&amp;gt;n ← | C | // | C | es el número de elementos de C// &amp;lt;br&amp;gt;m ← c0 &amp;lt;br&amp;gt;para i ← 1 hasta n hacer &amp;lt;br&amp;gt;si ci &amp;amp;gt; m entonces &amp;lt;br&amp;gt;m ← ci &amp;lt;br&amp;gt;devolver m &amp;lt;br&amp;gt;Sobre la notación:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*&amp;quot;←&amp;quot; representa una asignación: m ← x significa que la variable m toma el valor de x; &lt;br /&gt;
*&amp;quot;devolver&amp;quot; termina el algoritmo y devuelve el valor a su derecha (en este caso, el máximo de C).&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementación&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
En lenguaje C++:&amp;lt;br&amp;gt;int max(int c[], int n){&amp;lt;br&amp;gt; int i, m = c[0];&amp;lt;br&amp;gt; for (i = 1; i &amp;amp;lt; n; i++)&amp;lt;br&amp;gt; if (c[i] &amp;amp;gt; m) m = c[i];&amp;lt;br&amp;gt; return m;&amp;lt;br&amp;gt;} &lt;br /&gt;
&lt;br /&gt;
== Tipos de algoritmos según su función  ==&lt;br /&gt;
&lt;br /&gt;
*[[Algoritmo de ordenamiento]] &lt;br /&gt;
*[[Algoritmo de búsqueda]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Técnicas de diseño de algoritmos  ==&lt;br /&gt;
&lt;br /&gt;
*[[Algoritmos voraces]] (greedy): seleccionan los elementos más prometedores del conjunto de candidatos hasta encontrar una solución. En la mayoría de los casos la solución no es óptima. &lt;br /&gt;
*[[Algoritmos paralelos]]: permiten la división de un problema en subproblemas de forma que se puedan ejecutar de forma simultánea en varios procesadores. &lt;br /&gt;
*[[Algoritmos probabilísticos]]: algunos de los pasos de este tipo de algoritmos están en función de valores pseudoaleatorios. &lt;br /&gt;
*[[Algoritmos determinísticos]]: el comportamiento del algoritmo es lineal: cada paso del algoritmo tiene únicamente un paso sucesor y otro antecesor. &lt;br /&gt;
*[[Algoritmos no determinísticos]]: el comportamiento del algoritmo tiene forma de árbol y a cada paso del algoritmo puede bifurcarse a cualquier número de pasos inmediatamente posteriores, además todas las ramas se ejecutan simultáneamente. &lt;br /&gt;
*[[Divide y vencerás]]: dividen el problema en subconjuntos disjuntos obteniendo una solución de cada uno de ellos para después unirlas, logrando así la solución al problema completo. &lt;br /&gt;
*[[Metaheurísticas]]: encuentran soluciones aproximadas (no óptimas) a problemas basándose en un conocimiento anterior (a veces llamado experiencia) de los mismos. &lt;br /&gt;
*[[Programación dinámica]]: intenta resolver problemas disminuyendo su coste computacional aumentando el coste espacial. &lt;br /&gt;
*[[Ramificación y acotación]]: se basa en la construcción de las soluciones al problema mediante un árbol implícito que se recorre de forma controlada encontrando las mejores soluciones. &lt;br /&gt;
*[[Vuelta atrás (backtracking)]]: se construye el espacio de soluciones del problema en un árbol que se examina completamente, almacenando las soluciones menos costosas.&lt;br /&gt;
&lt;br /&gt;
== Bibliografía  ==&lt;br /&gt;
&lt;br /&gt;
*Fundamentos de Algoritmia, G. Brassard y P. Bratley. (ISBN 848966000) &lt;br /&gt;
*The Art of Computer Programming, Knuth, D. E. [quien fue también, el creador del TeX] &lt;br /&gt;
*Introduction to Algorithms (2nd ed), Cormen, T. H., Leiserson, C. E., Rivest, R. L. y Stein, C. &lt;br /&gt;
*Introduction to Algorithms. A Creative Approach, Mamber, U. &lt;br /&gt;
*Algorithms in C (3r ed), Sedgewick, R. (también existen versiones en C++ y Java) &lt;br /&gt;
*The Design and Analysis of Computer Algorithms, Aho, A. &lt;br /&gt;
*Método de las 6'D. Modelamiento - Algoritmo - Programación. Enfoque orientado a las estructuras lógicas (2da ed.), Juan José Flores Cueto y Carmen Bertolotti Zuñiga, 2008. &lt;br /&gt;
*Método de las 6'D. Modelamiento - Algoritmo - Programación. Enfoque orientado a los arreglos (1ra ed.), Juan José Flores Cueto y Gustavo Tataje Salas, 2009.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Fuente&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
*Wikipedia, enciclopedia libre&lt;br /&gt;
&lt;br /&gt;
[[Category:Matemáticas]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Algoritmo_de_b%C3%BAsqueda&amp;diff=56755</id>
		<title>Algoritmo de búsqueda</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Algoritmo_de_b%C3%BAsqueda&amp;diff=56755"/>
		<updated>2010-04-30T17:51:59Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}}&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Algoritmo de búsqueda &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un algoritmo de búsqueda es aquel que está diseñado para localizar un elemento concreto dentro de una estructura de datos. Consiste en solucionar un problema de existencia o no de un elemento determinado en un conjunto finito de elementos, es decir, si el elemento en cuestión pertenece o no a dicho conjunto, además de su localización dentro de éste.&amp;lt;br&amp;gt;Este problema puede reducirse a devolver la existencia de un número en un vector. &lt;br /&gt;
&lt;br /&gt;
== &amp;lt;br&amp;gt;Búsqueda secuencial  ==&lt;br /&gt;
&lt;br /&gt;
Se utiliza cuando el contenido del vector no se encuentra o no puede ser ordenado. Consiste en buscar el elemento comparándolo secuencialmente (de ahí su nombre) con cada elemento del array hasta que éste se encuentre, o hasta que se llegue al final del array. La existencia se puede asegurar desde el momento que el elemento es localizado, pero no podemos asegurar la no existencia hasta no haber analizado todos los elementos del array. A continuación se muestra el pseudocódigo del algoritmo:&amp;lt;br&amp;gt;Datos de Entrada:&amp;lt;br&amp;gt; vec: vector en el que se desea buscar el elemento&amp;lt;br&amp;gt; tam: tamaño del vector&amp;lt;br&amp;gt; dato: elemento que se quiere buscar. &lt;br /&gt;
&lt;br /&gt;
Variables&amp;lt;br&amp;gt; pos: posición actual en el array &lt;br /&gt;
&lt;br /&gt;
pos = 0&amp;lt;br&amp;gt;Mientras pos &amp;amp;lt; tam:&amp;lt;br&amp;gt; Si vec[pos]== dato devolver verdadero y/o pos, de lo contrario:&amp;lt;br&amp;gt; pos = pos + 1 &lt;br /&gt;
&lt;br /&gt;
Fin (Mientras)&amp;lt;br&amp;gt;Devolver falso &lt;br /&gt;
&lt;br /&gt;
== &amp;lt;br&amp;gt;Búsqueda binaria (dicotómica)  ==&lt;br /&gt;
&lt;br /&gt;
Se utiliza cuando el vector en el que queremos determinar la existencia o no de un elemento está ordenado, o puede estarlo, este algoritmo reduce el tiempo de búsqueda considerablemente, ya que disminuye exponencialmente con el número de iteraciones.&amp;lt;br&amp;gt;Para implementar este algoritmo se compara el elemento a buscar con un elemento cualquiera del array (normalmente el elemento central), si el valor de éste es mayor que el del elemento buscado se repite el procedimiento en la parte del array que va desde el inicio de éste hasta el elemento tomado, en caso contrario se toma la parte del array que va desde el elemento tomado hasta el final. De esta manera obtenemos intervalos cada vez más pequeños, hasta que se obtenga un intervalo indivisible, con el elemento buscado como elemento central. Si el elemento no se encuentra dentro de este último entonces se deduce que el elemento buscado no se encuentra en el arreglo.&amp;lt;br&amp;gt;A continuación se presenta el pseudocódigo del algoritmo, tomando como elemento inicial el elemento central del array.&amp;lt;br&amp;gt;Datos de Entrada:&amp;lt;br&amp;gt; vec: vector en el que se desea buscar el elemento&amp;lt;br&amp;gt; tam: tamaño del vector&amp;lt;br&amp;gt; dato: elemento que se quiere buscar. &lt;br /&gt;
&lt;br /&gt;
Variables&amp;lt;br&amp;gt; centro: elemento central del intervalo&amp;lt;br&amp;gt; inf: límite inferior del intervalo&amp;lt;br&amp;gt; sup: límite superior del intervalo &lt;br /&gt;
&lt;br /&gt;
inf = 0&amp;lt;br&amp;gt;sup = tam–1 &lt;br /&gt;
&lt;br /&gt;
Mientras inf &amp;amp;lt;= sup:&amp;lt;br&amp;gt; centro = ((sup + inf) / 2) /* división entera: se trunca la parte decimal */&amp;lt;br&amp;gt; Si vec[centro] == dato devolver verdadero y/o pos, de lo contrario:&amp;lt;br&amp;gt; Si dato &amp;amp;lt; vec[centro] entonces:&amp;lt;br&amp;gt; sup=centro–1&amp;lt;br&amp;gt; En caso contrario:&amp;lt;br&amp;gt; inf=centro+1 &lt;br /&gt;
&lt;br /&gt;
Fin (Mientras)&amp;lt;br&amp;gt;Devolver Falso &lt;br /&gt;
&lt;br /&gt;
== &amp;lt;br&amp;gt; Referencias&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
1.&amp;amp;nbsp; http://img291.imageshack.us/img291/9047/busqueda.jpg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Matriz&amp;diff=56222</id>
		<title>Matriz</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Matriz&amp;diff=56222"/>
		<updated>2010-04-29T20:05:48Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Mejorar|este artículo carece de plantilla; de espacios innecesarios; de hipervinculos; de una correcta separación entre párrafos y de la fuente}} &lt;br /&gt;
&lt;br /&gt;
Matriz (Matemática) &lt;br /&gt;
&lt;br /&gt;
En [[Matemáticas|Matemática]], una matriz es una tabla bidimensional de números consistente en cantidades abstractas con las que se pueden realizar operaciones matemáticas, como por ejemplo la suma, la multiplicación y descomposición de las mismas de varias formas, lo que también las hace un concepto clave en el campo del álgebra lineal. . Las matrices se utilizan para describir sistema de ecuaciones lineales, realizar un seguimiento de los coeficientes de una aplicación lineal y registrar los datos que dependen de varios parámetros. Las matrices se describen en el campo de la teoría de matrices. &lt;br /&gt;
&lt;br /&gt;
== Definiciones y notaciones  ==&lt;br /&gt;
&lt;br /&gt;
Una matriz es una tabla cuadrada o rectangular de datos (llamados elementos o entradas de la matriz) ordenados en filas y columnas, donde una fila es cada una de las líneas horizontales de la matriz y una columna es cada una de las líneas verticales. A una matriz con m filas y n columnas se le denomina matriz m-por-n (escrito m×n), y a m y n dimensiones de la matriz. Las dimensiones de una matriz siempre se dan con el número de filas primero y el número de columnas después. Comúnmente se dice que una matriz m-por-n tiene un orden de m × n (&amp;quot;orden&amp;quot; tiene el significado de tamaño). Dos matrices se dice que son iguales si son del mismo orden y tienen los mismos elementos. Al elemento de una matriz que se encuentra en la fila i-ésima y la columna j-ésima se le llama elemento i,j o elemento (i,j)-iésimo de la matriz. Se vuelve a poner primero las filas y después las columnas. Casi siempre, se denotan a las matrices con letras mayúsculas mientras que se utilizan las correspondientes letras en minúsculas para denotar a los elementos de las mismas. Por ejemplo, al elemento de una matriz A que se encuentra en la fila i-ésima y la columna j-ésima se le denota como ai,j o a[i,j]. Notaciones alternativas son A[i,j] o Ai,j. Además de utilizar letras mayúsculas para representar matrices, numerosos autores representan a las matrices con fuentes en negrita para distinguirlas de otros tipos de variables. Así A es una matriz, mientras que A es un escalar. Normalmente se escribe para definir una matriz A m × n con cada entrada en la matriz A[i,j] llamada aij para todo 1 ≤ i ≤ m y 1 ≤ j ≤ n. Sin embargo, la convención del inicio de los índices i y j en 1 no es universal: algunos lenguajes de programación comienzan en cero, en cuál caso se tiene 0 ≤ i ≤ m − 1 y 0 ≤ j ≤ n − 1. Una matriz con una sola columna o una sola fila se denomina a menudo vector, y se interpreta como un elemento del espacio euclídeo. Una matriz 1 × n (una fila y n columnas) se denomina vector fila, y una matriz m × 1 (una columna y m filas) se denomina vector columna. &lt;br /&gt;
&lt;br /&gt;
'''''Ejemplo''''' &lt;br /&gt;
&lt;br /&gt;
La matriz A: es una matriz 4x3. El elemento A[2,3] o a2,3 es 7. La matriz B: es una matriz 1×5, o un vector fila con 5 elementos. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Operaciones básicas  ==&lt;br /&gt;
&lt;br /&gt;
=== Suma o adición  ===&lt;br /&gt;
&lt;br /&gt;
Dadas las matrices m-por-n ,A y B, su suma A + B es la matriz m-por-n calculada sumando los elementos correspondientes (i.e. (A + B)[i, j] = A[i, j] + B[i,&amp;amp;nbsp;j] ). Es decir, sumar cada uno de los elementos homólogos de las matrices a sumar. Por ejemplo:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Propiedades  ====&lt;br /&gt;
&lt;br /&gt;
Asociativa Dadas las matrices m×n A, B y C A + (B + C) = (A + B) + C Conmutativa Dadas las matrices m×n A y B A + B = B + A Existencia de matriz cero o matriz nula A + 0 = 0 + A = A Existencia de matriz opuesta con gr-A = [-aij] A + (-A) = 0 &lt;br /&gt;
&lt;br /&gt;
=== Producto por un escalar  ===&lt;br /&gt;
&lt;br /&gt;
Dada una matriz A y un escalar c, su producto cA se calcula multiplicando el escalar por cada elemento de A (i.e. (cA)[i, j] = cA[i, j] ). Ejemplo &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Propiedades  ====&lt;br /&gt;
&lt;br /&gt;
Sean A y B matrices y c y d escalares. Clausura: Si A es matriz y c es escalar, entonces cA es matriz. Asociatividad: (cd)A = c(dA) Elemento Neutro: 1·A = A Distributividad: De escalar: c(A+B) = cA+cB De matriz: (c+d)A = cA+dA&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Producto  ===&lt;br /&gt;
&lt;br /&gt;
Diagrama esquemático que ilustra el producto de dos matrices A y B dando como resultado la matriz AB. El producto de dos matrices se puede definir sólo si el número de columnas de la matriz izquierda es el mismo que el número de filas de la matriz derecha. Si A es una matriz m×n y B es una matriz n×p, entonces su producto matricial AB es la matriz m×p (m filas, p columnas) dada por: para cada par i y j. Por ejemplo:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Propiedades  ====&lt;br /&gt;
&lt;br /&gt;
Si los elementos de la matriz pertenecen a un cuerpo, y puede definirse el producto, el producto de matrices tiene las siguientes propiedades: Propiedad asociativa: (AB)C = A(BC). Propiedad distributiva por la derecha: (A + B)C = AC + BC. Propiedad distributiva por la izquierda: C(A + B) = CA + CB. En general, el producto de matrices tiene divisores de cero: Si A.B = 0 , No necesariamente A ó B son matrices nulas El producto de matrices no verifica la propiedad de simplificación: Si A.B = A.C, No necesariamente B=C El producto de dos matrices generalmente no es conmutativo, es decir, AB ≠ BA. La división entre matrices, es decir, la operación que podría producir el cociente A / B, no se encuentra definida. Sin embargo, existe el concepto de matriz inversa, sólo aplicable a las matrices cuadradas.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Aplicaciones lineales  ===&lt;br /&gt;
&lt;br /&gt;
Las matrices pueden representar convenientemente aplicaciones lineales (también conocidas como &amp;quot;transformaciones lineales&amp;quot;) entre dos espacios vectoriales de dimensión finita. Así, si ℝn es el espacio euclídeo n-dimensional cuyos vectores se pueden representar como vectores columna (matrices n-por-1), para cada aplicación lineal f&amp;amp;nbsp;: ℝn → ℝm existe una única matriz A m por n de tal forma que para cada vector x de ℝn,,se dice que la matriz A &amp;quot;representa&amp;quot; la aplicación lineal f, o que A es la matriz coordenada de f. El producto de matrices claramente corresponde a la composición de las aplicaciones. Si la matriz k por m B representa otra aplicación lineal g&amp;amp;nbsp;: ℝm → ℝk, entonces la composición g&amp;amp;nbsp;o&amp;amp;nbsp;f se representa por BA: Esto se desprende de la mencionada propiedad asociativa del producto de matrices. Más en general, una aplicación lineal de un espacio vectorial n-dimensional en otro espacio vectorial m-dimensional (no necesariamente ℝn) se representa por una matriz m por n, a condición de que se haya elegido una base para cada uno de ellos.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Rango  ===&lt;br /&gt;
&lt;br /&gt;
El rango de una matriz A es la dimensión de la imagen de la aplicación lineal representada por A, que coincide con la dimensión de los espacios vectoriales generados por las filas o columnas de A. También puede ser definido sin referencia al álgebra lineal de la siguiente manera: el rango de una matriz m por n A es el más pequeño número k de tal manera que A puede escribirse como un producto BC donde B es una matriz m por k y C es una matriz k por n (aunque ésta no es una manera práctica de calcular el rango). Transpuesta La transpuesta de una matriz m-por-n A es la matriz n-por-m AT (algunas veces denotada por At) formada al intercambiar las filas y columnas, i.e. La transposición de matrices tiene las siguientes propiedades: Si A describe una aplicación lineal respecto a dos bases, entonces la matriz AT describe la transpuesta de una aplicación lineal respecto a las bases del espacio dual.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Matrices cuadradas y definiciones relacionadas  ==&lt;br /&gt;
&lt;br /&gt;
Una matriz cuadrada es una matriz que tiene el mismo número de filas que de columnas. El conjunto de todas las matrices cuadradas n-por-n junto a la suma y la multiplicación de matrices, es un anillo que generalmente no es conmutativo. M(n,R), el anillo de las matrices cuadradas reales, es un álgebra asociativa real unitaria. M(n,C), el anillo de las matrices cuadradas complejas, es un álgebra asociativa compleja. La matriz identidad In de orden n es la matriz n por n en la cual todos los elementos de la diagonal principal son iguales a 1 y todos los demás elementos son iguales a 0. La matriz identidad se denomina así porque satisface las ecuaciones MIn&amp;amp;nbsp;=&amp;amp;nbsp;M y InN&amp;amp;nbsp;=&amp;amp;nbsp;N para cualquier matriz M m por n y N n por k. Por ejemplo, si n = 3: La matriz identidad es el elemento unitario en el anillo de matrices cuadradas. Los elementos invertibles de este anillo se llaman matrices inversibles o matrices no singulares. Una matriz A n por n es invertible si y sólo si existe una matriz B tal que AB = In = BA. En este caso, B es la matriz inversa de A, identificada por A-1 . El conjunto de todas las matrices invertibles n por n forma un grupo (concretamente un grupo de Lie) bajo la multiplicación de matrices, el grupo lineal general. Si λ es un número y v no es un vector nulo tal que Av = λv, entonces se dice que v es un vector propio de A y que λ es su valor propio asociado. El número λ es un valor propio de A si y sólo si A−λIn no es invertible, lo que sucede si y sólo si pA(λ) = 0, donde pA(x) es el polinomio característico de A. pA(x) es un polinomio de grado n y por lo tanto, tiene n raíces complejas múltiples raíces si se cuentan de acuerdo a su multiplicidad. Cada matriz cuadrada tiene como mucho n valores propios complejos. El determinante de una matriz cuadrada A es el producto de sus n valores propios, pero también puede ser definida por la fórmula de Leibniz. Las matrices invertibles son precisamente las matrices cuyo determinante es distinto de cero. El algoritmo de eliminación gaussiana puede ser usado para calcular el determinante, el rango y la inversa de una matriz y para resolver sistema de ecuaciones. La traza de una matriz cuadrada es la suma de los elementos de la diagonal, lo que equivale a la suma de sus n valores propios.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Las matrices en la Computación  ==&lt;br /&gt;
&lt;br /&gt;
mente en la computación, por su facilidad y liviandad para manipular información. En este contexto, son la mejor forma para representar [gráficos], y son muy utilizadas en el cálculo numérico. &lt;br /&gt;
&lt;br /&gt;
Historia &lt;br /&gt;
&lt;br /&gt;
El origen de las matrices es muy antiguo. Un cuadrado mágico, 3 por 3, se registra en la literatura china hacia el 650 a. C. Es larga la historia del uso de las matrices para resolver ecuaciones lineales. Un importante texto matemático chino que proviene del año 300 a. C. a 200 a. C., Nueve capítulos sobre el Arte de las matemáticas (Jiu Zhang Suan Shu), es el primer ejemplo conocido de uso del método de matrices para resolver un sistema de ecuaciones simultáneas. En el capítulo séptimo, &amp;quot;Ni mucho ni poco&amp;quot;, el concepto de determinante apareció por primera vez, dos mil años antes de su publicación por el matemático japonéses Se japonés Seki Kōwa en 1683 y el matemático alemán Gottfried Leibniz en 1693. Los &amp;quot;cuadrados mágicos&amp;quot; eran conocidos por los matemáticos árabes, posiblemente desde comienzos del siglo VII, quienes a su vez pudieron tomarlos de los matemáticos y astrónomos de la India, junto con otros aspectos de las matemáticas combinatorias. Todo esto sugiere que la idea provino de China. Los primeros &amp;quot;cuadrados mágicos&amp;quot; de orden 5 y 6 aparecieron en Bagdad en el 983, en la Enciclopedia de la Hermandad de Pureza (Rasa'il Ihkwan al-Safa). Después del desarrollo de la teoría de determinantes por Seki Kowa y Leibniz, a finales del siglo XVII, Cramer presentó en 1750 la ahora denominada regla de Cramer. Carl Friedrich Gauss y Wilhelm Jordan desarrollaron la eliminación de Gauss-Jordan en el siglo XIX. El término &amp;quot;matriz&amp;quot; fue acuñado en 1848, por J.J. Sylvester. En 1853, Hamilton hizo algunos aportes a la teoría de matrices. Carley introdujo en 1858 la notación matricial, como forma abreviada de escribir un sistema de m ecuaciones lineales con n incógnitas.Grassmann, Frobenius y van Neumann están entre los matemáticos famosos que trabajaron sobre la teoría de matrices. Olga Taussky-Todd (1906-1995), durante la II Guerra Mundial, usó la teoría de matrices para investigar el fenómeno de aeroelasticidad llamado fluttering. Una matriz es una tabla cuadrada o rectangular de datos (llamados elementos o entradas de la matriz) ordenados en filas y columnas, donde una fila es cada una de las líneas horizontales de la matriz y una columna es cada una de las líneas verticales. A una matriz con m filas y n columnas se le denomina matriz m-por-n (escrito m×n), y a m y n dimensiones de la matriz. Las dimensiones de una matriz siempre se dan con el número de filas primero y el número de columnas después. Comúnmente se dice que una matriz m-por-n tiene un orden de m × n (&amp;quot;orden&amp;quot; tiene el significado de tamaño). Dos matrices se dice que son iguales si son del mismo orden y tienen los mismos elementos. Al elemento de una matriz que se encuentra en la fila i-ésima y la columna j-ésima se le llama elemento i,j o elemento (i,j)-iésimo de la matriz. Se vuelve a poner primero las filas y después las columnas. &lt;br /&gt;
&lt;br /&gt;
Las matrices son utilizadas ampliamente en la computación, por su facilidad y liviandad para manipular información. En este contexto, son la mejor forma para representar [gráficos], y son muy utilizadas en el cálculo numérico. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fuente&amp;lt;br&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
1.&amp;amp;nbsp; a b Swaney, Mark. History of Magic Squares.&amp;lt;br&amp;gt; 2.&amp;amp;nbsp; Shen Kangshen et al. (ed.) (1999). Nine Chapters of the Mathematical Art, Companion and Commentary. Oxford University Press. cited byOtto Bretscher (2005). Linear Algebra with Applications, 3rd ed. edición, Prentice-Hall, pp. 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Matemáticas]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Al_Juarismi&amp;diff=56212</id>
		<title>Al Juarismi</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Al_Juarismi&amp;diff=56212"/>
		<updated>2010-04-29T19:58:18Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Personaje_científico|nombre=Abu Abdallah Muḥammad ibn Mūsā al-Jwārizmī|imagen=Al juarismi|descripcion=Vivió aproximadamente entre 780 y 850.|especialidades=Fue un matemático, astrónomo y geógrafo |fecha_de_nacimiento=|lugar_de_nacimiento=|fecha_de_fallecimiento=|lugar_de_fallecimiento=}}&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Al-Juarismi &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Abu Abdallah Muḥammad ibn Mūsā al-Jwārizmī (Abu Yā'far) (أبو عبد الله محمد بن موسى الخوارزمي ابو جعفر), conocido generalmente como al-Juarismi, fue un matemático, astrónomo y geógrafo persa musulmán chií, que vivió aproximadamente entre 780 y 850. &lt;br /&gt;
&lt;br /&gt;
Poco se conoce de su biografía, a tal punto que existen discusiones no saldadas sobre su lugar de nacimiento. Algunos sostienen que nació en Bagdad. Otros, siguiendo el artículo de Gerald Toomer[1] (a su vez, basado en escritos del historiador al-Tabari) sostienen que nació en la ciudad corasmia de Jiva, en el actual Uzbekistán. Rashed[2] halla que se trata de un error de interpretación de Toomer, debido a un error de transcripción (la falta de la conectiva wa) en una copia del manuscrito de al-Tabari. No será este el último desacuerdo entre historiadores que encontraremos en las descripciones de la vida y las obras de al-Juarismi. Estudió y trabajó en Bagdad en la primera mitad del siglo IX, en la corte del califa al-Mamun. Para muchos, fue el más grande de los matemáticos de su época. &lt;br /&gt;
&lt;br /&gt;
Debemos a su nombre y al de su obra principal, &amp;quot;Hisāb al-ŷabr wa'l muqābala&amp;quot;, (حساب الجبر و المقابلة) nuestras palabras álgebra, guarismo y algoritmo. De hecho, es considerado como el padre del álgebra y como el introductor de nuestro sistema de numeración. &lt;br /&gt;
&lt;br /&gt;
Hacia 815 al-Mamun, séptimo califa Abásida, hijo de Harún al-Rashid, fundó en su capital, Bagdad, la Casa de la sabiduría (Bayt al-Hikma), una institución de investigación y traducción que algunos han comparado con la Biblioteca de Alejandría. En ella se tradujeron al árabe obras científicas y filosóficas griegas e indias. Contaba también con observatorios astronómicos. En este ambiente científico y multicultural se educó y trabajó al-Juarismi junto con otros científicos como los hermanos Banu Musa, al-Kindi y el famoso traductor Hunayn ibn Ishaq. Dos de sus obras, sus tratados de álgebra y astronomía, están dedicadas al propio califa. &lt;br /&gt;
&lt;br /&gt;
== Álgebra  ==&lt;br /&gt;
&lt;br /&gt;
En su tratado de [[Álgebra]], obra eminentemente didáctica, se pretende enseñar un álgebra aplicada a la resolución de problemas de la vida cotidiana del [[Imperio islámico]] de entonces. La traducción de Rosen de las palabras de al-Juarizmi describiendo los fines de su libro dan cuenta de que el sabio pretendía enseñar:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Traducido al [[Lengua latina|latín]] por [[Gerardo de Cremona]], se utilizó en las [[Universidad]]es [[Europa|europeas]] como libro de texto hasta el [[Siglo XVI]]. Es posible que antes de él se hubiesen resuelto [[Ecuación|ecuaciones]] concretas, pero éste es el primer tratado conocido en el que se hace un estudio exhaustivo. &lt;br /&gt;
&lt;br /&gt;
Luego de presentar los números naturales, al-Juarismi aborda la cuestión principal en la primera parte del libro: la solución de ecuaciones. Sus ecuaciones son lineales o cuadráticas y están compuestas de [[Unidad (álgebra)|unidades]], [[Raíz (matemática)|raíces]] y [[Cuadrado (aritmética)|cuadrados]]; para él, por ejemplo, una unidad era un número, una raíz era ''x'' y un cuadrado ''x²''. Aunque en los ejemplos que siguen usaremos la notación algebraica corriente en nuestros días para ayudar al lector a entender las nociones, es de destacar que al-Juarizmi no empleaba símbolos de ninguna clase, sino sólo palabras. &lt;br /&gt;
&lt;br /&gt;
Primero reduce una ecuación a alguna de seis formas normales: &lt;br /&gt;
&lt;br /&gt;
#Cuadrados iguales a raíces. &lt;br /&gt;
#Cuadrados iguales a números. &lt;br /&gt;
#Raíces iguales a números. &lt;br /&gt;
#Cuadrados y raíces iguales a números, por ejemplo x² + 10x = 39&amp;lt;br&amp;gt; &lt;br /&gt;
#Cuadrados y números iguales a raíces, por ejemplo&amp;amp;nbsp;x² + 21 = 10x&amp;lt;br&amp;gt; &lt;br /&gt;
#Raíces y números iguales a cuadrados, por ejemplo 3x + 4 = x²&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La reducción se lleva a cabo utilizando las operaciones de ''al-ŷabr'' (&amp;quot;compleción&amp;quot;, el proceso de eliminar términos negativos de la ecuación) y ''al-muqabala'' (&amp;quot;balanceo&amp;quot;, el proceso de reducir los términos positivos de la misma [[Potencia (matemática)|potencia]] cuando suceden de ambos lados de la ecuación). Luego, al-Juarismi muestra como resolver los seis tipos de ecuaciones, usando métodos de solución algebraicos y geométricos. Por ejemplo, para resolver la ecuación x² + 10x = 39, escribe: &lt;br /&gt;
&lt;br /&gt;
{{cita|... un cuadrado y diez raíces son iguales a 39 unidades. Entonces, la pregunta en este tipo de ecuación es aproximadamente así: cuál es el cuadrado que, combinado con diez de sus raíces, dará una suma total de 39. La manera de resolver este tipo de ecuación es tomar la mitad de las raíces mencionadas. Ahora, las raíces en el problema que tenemos ante nosotros son diez. Por lo tanto, tomamos 5 que multiplicadas por sí mismas dan 25, una cantidad que agregarás a 39 dando 64. Habiendo extraído la raíz cuadrada de esto, que es 8, sustraemos de allí la mitad de las raíces, 5, resultando 3. Por lo tanto el número tres representa una raíz de este cuadrado.|Álgebra&amp;lt;ref&amp;gt;Según la traducción de Rosen. ''Vid.'' Al-Khwarizmi (1831}.&amp;lt;/ref&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Sigue la prueba geométrica por compleción del cuadrado, que no expondremos aquí. Señalaremos sin embargo que las pruebas geométricas que usa al-Juarismi son objeto de controversia entre los expertos. La cuestión, que permanece sin respuesta, es si estaba familiarizado con el trabajo de [[Euclides]]. Debe recordarse, en la juventud de al-Juarismi y durante el reinado de Harun al-Rashid, [[Al-Hajjaj]] había traducido los &amp;quot;''Elementos''&amp;quot; al [[Idioma árabe|árabe]], y era uno de los compañeros de al-Juarismi en la Casa de la Sabiduría. Esto avalaría la posición de Toomer (''op.cit.''). Rashed comenta&amp;lt;ref&amp;gt;Rashed, ''op. cit.''&amp;lt;/ref&amp;gt; que &amp;quot;''el tratamiento'' [de al-Juarismi] ''fue probablemente inspirado en el reciente conocimiento de &amp;quot;[[Los Elementos]]&amp;quot;''. Pero, por su parte, Gandz&amp;lt;ref&amp;gt;Gandz (1932)&amp;lt;/ref&amp;gt; sostiene que los Elementos le eran completamente desconocidos. Aunque es inseguro que haya efectivamente conocido la obra euclidiana, es posible afirmar que fue influenciado por otras obras de geometría; véase el tratamiento de Parshall&amp;lt;ref&amp;gt;Parshall (1988)&amp;lt;/ref&amp;gt; sobre las similitudes metodológicas con el texto hebreo ''Mishnat ha Middot'', de mediados del siglo II. &lt;br /&gt;
&lt;br /&gt;
Continúa el ''Hisab al-ŷabr wa'l-muqabala'' examinando cómo las leyes de la [[Aritmética]] se extienden a sus objetos algebraicos. Por ejemplo, muestra cómo multiplicar expresiones como (a + bx)(c + dx). Rashed (''op. cit.'') encuentra sus formas de resolución extremadamente originales, pero Crossley&amp;lt;ref&amp;gt;Crossley (1980)&amp;lt;/ref&amp;gt; las considera menos significativas. Gandz considera que la paternidad del álgebra es mucho más atribuible a al-Juarismi que a [[Diofanto]].&amp;lt;ref&amp;gt;Gandz (1936)&amp;lt;/ref&amp;gt; &lt;br /&gt;
&lt;br /&gt;
La parte siguiente consiste en aplicaciones y ejemplos. Describe reglas para hallar el área de figuras geométricas como el círculo, y el volumen de [[Sólido]]s como la esfera, el cono y la pirámide. Esta sección, ciertamente, tiene mucha mayor afinidad con los textos hebreos e indios que con cualquier obra griega. La parte final del libro se ocupa de las complejas reglas islámicas de herencia, pero requiere poco del álgebra que expuso anteriormente, más allá de la resolución de ecuaciones lineales. &lt;br /&gt;
&lt;br /&gt;
== Aritmética  ==&lt;br /&gt;
&lt;br /&gt;
De su [[Aritmética]], posiblemente denominada originalmente ''Kitab al-Ŷamaa wa al-Tafriq bi Hisab al-Hind'', (كتاب الجامع و التفريق بحساب الهند), &amp;quot;libro de la suma y de la resta, según el cálculo indio&amp;quot;, sólo conservamos una versión latina del siglo XII, ''Algoritmi de numero Indorum''. Desafortunadamente, se sabe que la obra&amp;lt;ref&amp;gt;Traducida al inglés en Corssley y Henry (1990).&amp;lt;/ref&amp;gt; se aparta bastante del texto original. En esta obra se describe con detalle el sistema indio de numeración posicional en base 10 y métodos para hacer cálculos con él. Se sabe que había un método para encontrar raíces cuadradas en la versión árabe, pero no aparece en la versión latina. Posiblemente fue el primero en utilizar el cero como indicador posicional. Fue esencial para la introducción de este sistema de numeración en el mundo árabe y posteriormente en Europa. André Allard&amp;lt;ref&amp;gt;Allard (1991)&amp;lt;/ref&amp;gt; dicute algunos tratados en latín del siglo XII basados en esta obra perdida. &lt;br /&gt;
&lt;br /&gt;
== Astronomía  ==&lt;br /&gt;
&lt;br /&gt;
De su tratado sobre [[Astronomía]], ''Sindhind zij'', también se han perdido las dos versiones que escribió en árabe. Esta obra&amp;lt;ref&amp;gt;Descripta en detalle en Van Dalen (1996).&amp;lt;/ref&amp;gt; se basa en trabajos astronómicos indios ''&amp;quot;a diferencia de manuales islámicos de astronomía posteriores, que utilizaron los modelos planetarios griegos del 'Almagesto' de [[Ptolomeo]]&amp;quot;''.&amp;lt;ref&amp;gt;Sokolovskaya (1985).&amp;lt;/ref&amp;gt; El texto indio en que se basa el tratado es uno de los obsequiados a la corte de Bagdad alrededor de [[770]] por una misión diplomática de la [[India]]. En el [[Siglo X]] [[Maslama al-Mayriti|al-Maŷriti]] realizó una revisión crítica de la versión más corta, que fue traducida al latín por [[Adelardo de Bath]]; existe también una traducción latina de la versión más larga, y ambas traducciones han llegado hasta nuestro tiempo. Los temas principales cubiertos en la obra son los [[Calendario]]s; el cálculo de las posiciones verdaderas del [[Sol]], la [[Luna]] y los [[Planetas]]; tablas de [[Seno (matemáticas)|senos]] y [[Tangente]]s; astronomía esférica; tablas [[Astrología|astrológicas]]; cálculos de [[Paralaje]]s y [[Eclipse]]s; y visibilidad de la Luna. Rozenfel'd analiza un manuscrito relacionado sobre [[Trigonometría esférica]],&amp;lt;ref&amp;gt;Rozenfel'd (1990)&amp;lt;/ref&amp;gt; atribuido a al-Juarismi. &lt;br /&gt;
&lt;br /&gt;
== Geografía  ==&lt;br /&gt;
&lt;br /&gt;
En [[Geografía]], con una obra denominada ''Kitab Surat-al-Ard'', revisó y corrigió a [[Claudio Ptolomeo|Ptolomeo]] en lo referente a [[África]] y al [[Oriente]]. Lista [[Latitud]]es y [[Longitud (cartografía)|longitudes]] de 2402 sitios, y emplaza ciudades, montañas, mares, islas, regiones geográficas y ríos, como base para un mapa del mundo entonces conocido. Incluye mapas que, en conjunto, son más precisos que los de Ptolomeo. Está claro que donde hubo mayor conocimiento local disponible para al-Juarismi, como las regiones del Islam, África y el [[Lejano Oriente]], el trabajo es mucho más exacto que el de Ptolomeo, pero parece haber usado los datos de éste para [[Europa]]. Se dice que en estos mapas trabajaron a sus órdenes setenta geógrafos. &lt;br /&gt;
&lt;br /&gt;
== Otras obras  ==&lt;br /&gt;
&lt;br /&gt;
Su obra conocida se completa con una serie de obras menores sobre temas como el [[Astrolabio]], sobre el que escribió dos textos, sobre relojes solares y sobre el [[Calendario judío]]. También escribió una historia política conteniendo horóscopos de personajes prominentes. &lt;br /&gt;
&lt;br /&gt;
== Bibliografía  ==&lt;br /&gt;
&lt;br /&gt;
*{{cita libro&lt;br /&gt;
 |apellido= AA. VV.&lt;br /&gt;
 |nombre=  &lt;br /&gt;
 |título= A source book in medieval science&lt;br /&gt;
 |idioma= inglés&lt;br /&gt;
 |otros =&lt;br /&gt;
 |edición= &lt;br /&gt;
 |año= 1974&lt;br /&gt;
 |editor= E. Grant&lt;br /&gt;
 |editorial= Harvard University Press&lt;br /&gt;
 |ubicación= Cambridge, MA&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
 |apellido= al Khwarizmi&lt;br /&gt;
 |nombre= 'Abu Ja'far Muhammad ibn Musa&lt;br /&gt;
 |título= The Algebra of Mohammed ben Musa&lt;br /&gt;
 |idioma= &lt;br /&gt;
 |otros = traducción, edición y notas de Friedrich Rosen&lt;br /&gt;
 |edición= reimpreso en 1986&lt;br /&gt;
 |sined = x&lt;br /&gt;
 |año= 1831&lt;br /&gt;
 |editor= &lt;br /&gt;
 |editorial= G. Olms Verlag&lt;br /&gt;
 |ubicación= Hildesheim&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Allard&lt;br /&gt;
 |nombre= André &lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |título= La diffusion en occident des premières oeuvres latines issues de l'arithmétique perdue d'al-Khwarizmi&lt;br /&gt;
 |idioma= francés&lt;br /&gt;
 |publicación= J. Hist. Arabic Sci.&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= 9 (1991)&lt;br /&gt;
 |número= 1-2&lt;br /&gt;
 |páginas= 101-105&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
 |apellido= Crossley&lt;br /&gt;
 |nombre= John N.&lt;br /&gt;
 |título= The emergence of number&lt;br /&gt;
 |idioma= inglés&lt;br /&gt;
 |otros = &lt;br /&gt;
 |edición= 2ª&lt;br /&gt;
 |año= 1987&lt;br /&gt;
 |editor= &lt;br /&gt;
 |editorial= World Scientific Publishing&lt;br /&gt;
 |ubicación= Singapur&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Crossley&lt;br /&gt;
 |nombre= John N. &lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |coautores = Henry, A. S.&lt;br /&gt;
 |título= Thus spake al-Khwarizmi : a translation of the text of Cambridge University Library ms. Ii.vi.5&lt;br /&gt;
 |idioma= &lt;br /&gt;
 |publicación= Historia Math.&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= 17 (1990)&lt;br /&gt;
 |número= 2&lt;br /&gt;
 |páginas= 103-131&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
 |apellido= Ganz&lt;br /&gt;
 |nombre= Salomon (trad., ed. y notas)&lt;br /&gt;
 |título= The Mishnat ha Middot, the First Hebrew Geometry of about 150 C.E., and the Geometry of Muhammad ibn Musa al-Khowarizmi, the First Arabic Geometry, Representing the Arabic Version of the Mishnat ha Middot&lt;br /&gt;
 |idioma= &lt;br /&gt;
 |otros = Quellen und Studien zur Geschichte der Mathematik, Astronomie und Physik. Abteilung A: Quelle, 2. Band.&lt;br /&gt;
 |edición= &lt;br /&gt;
 |año= 1932&lt;br /&gt;
 |editor= &lt;br /&gt;
 |editorial= Julius Springer&lt;br /&gt;
 |ubicación= Berlin&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Gandz&lt;br /&gt;
 |nombre= Salomon&lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |título= The sources of al-Khwarizmi's algebra&lt;br /&gt;
 |idioma= &lt;br /&gt;
 |publicación= Osiris&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= I (1936)&lt;br /&gt;
 |número= &lt;br /&gt;
 |páginas= 235-277&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Parshall&lt;br /&gt;
 |nombre= K. A.&lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |título= The art of algebra from al-Khwarizmi to [[François Viète|Viète]] : a study in the natural selection of ideas&lt;br /&gt;
 |idioma= inglés&lt;br /&gt;
 |publicación= Hist. of Sci.&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= 26 (1988)&lt;br /&gt;
 |número= 72.2&lt;br /&gt;
 |páginas= 129-164&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Puig&lt;br /&gt;
 |nombre= Luis &lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |título= Historias de al-Khwārizmī (1ª entrega)&lt;br /&gt;
 |idioma= español&lt;br /&gt;
 |publicación= Suma&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= &lt;br /&gt;
 |número= 58 (2008)&lt;br /&gt;
 |páginas= 125-130&lt;br /&gt;
 |url= http://www.uv.es/puigl/historias58.pdf&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Puig&lt;br /&gt;
 |nombre= Luis &lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |título= Historias de al-Khwārizmī (2ª entrega): Los Libros&lt;br /&gt;
 |idioma= español&lt;br /&gt;
 |publicación= Suma&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= &lt;br /&gt;
 |número= 59 (2008)&lt;br /&gt;
 |páginas= 105-112&lt;br /&gt;
 |url= http://www.uv.es/puigl/historias59.pdf&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Puig&lt;br /&gt;
 |nombre= Luis &lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |título= Historias de al-Khwārizmī (3ª entrega). Orígenes del álgebra.&lt;br /&gt;
 |idioma= español&lt;br /&gt;
 |publicación= Suma&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= &lt;br /&gt;
 |número= 60 (2009)&lt;br /&gt;
 |páginas= 103-108&lt;br /&gt;
 |url= http://www.uv.es/puigl/historias60.pdf&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
 |apellido= Rashed&lt;br /&gt;
 |nombre= Roshdi&lt;br /&gt;
 |título= The Development of Arabic Mathematics: Between Arithmetic and Algebra&lt;br /&gt;
 |idioma= inglés&lt;br /&gt;
 |otros = trad. de A. F. W. Armstrong de la edición francesa de 1984&lt;br /&gt;
 |edición= &lt;br /&gt;
 |año= 1994&lt;br /&gt;
 |editor= &lt;br /&gt;
 |editorial= Kluwer Academic Publishers&lt;br /&gt;
 |ubicación= Dordrecht&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Rozenfel'd&lt;br /&gt;
 |nombre= Boris A. &lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |título= Trigonometría esférica en al-Khwarizmi&lt;br /&gt;
 |idioma= ruso&lt;br /&gt;
 |publicación= Istor.-Mat. Issled.&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= &lt;br /&gt;
 |número= 32-33 (1990)&lt;br /&gt;
 |páginas= 325-339&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
 |apellido= Sokolovskaya&lt;br /&gt;
 |nombre= Z. K.&lt;br /&gt;
 |título= El gran científico medieval al-Khwarizmi&lt;br /&gt;
 |capítulo= El período &amp;quot;pretelescópico&amp;quot; de la historia de los instrumentos astronómicos. al-Khwarizmi en el desarrollo de instrumentos de precisión en Cercano y Medio Oriente&lt;br /&gt;
 |idioma= ruso&lt;br /&gt;
 |otros = &lt;br /&gt;
 |año= 1985&lt;br /&gt;
 |páginas= 165-178&lt;br /&gt;
 |editorial= Fan&lt;br /&gt;
 |ubicación= Tashkent&lt;br /&gt;
}} &lt;br /&gt;
*{{cita enciclopedia&lt;br /&gt;
 |apellidos= Toomer&lt;br /&gt;
 |nombre= Gerald J.&lt;br /&gt;
 |editor= Charles C. Gillespie&lt;br /&gt;
 |enciclopedia= Dictionary of Scientific Biography&lt;br /&gt;
 |título= Al-Khwârazmî&lt;br /&gt;
 |idioma= inglés&lt;br /&gt;
 |fecha= 1970&lt;br /&gt;
 |editorial= Charles Scribner's Sons&lt;br /&gt;
 |volumen= 7&lt;br /&gt;
 |ubicación= New York&lt;br /&gt;
 |páginas= 359&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
 |apellido= Van Dalen&lt;br /&gt;
 |nombre= Benno&lt;br /&gt;
 |título= From Baghdad to Barcelona - Studies in the Islamic Exact Sciences in Honour of Prof. Juan Vernet&lt;br /&gt;
 |capítulo= Al'Khwarizmi's astronomical tables revisited : analysis of the equation of time&lt;br /&gt;
 |idioma= inglés&lt;br /&gt;
 |otros = Annuari de Filologia (Universitat de Barcelona) xix (1996) B-2&lt;br /&gt;
 |edición= &lt;br /&gt;
 |año= 1996&lt;br /&gt;
 |editor= Josep Casulleras y Julio Samsó&lt;br /&gt;
 |volumen= I&lt;br /&gt;
 |páginas= 195-252&lt;br /&gt;
 |editorial= Universitat de Barcelona - Instituto Millás Vallicrosa de Historia de la Ciencia Árabe&lt;br /&gt;
 |ubicación= Barcelona&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Matemático]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Archivo:Al_juarismi.jpeg&amp;diff=56183</id>
		<title>Archivo:Al juarismi.jpeg</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Archivo:Al_juarismi.jpeg&amp;diff=56183"/>
		<updated>2010-04-29T19:37:16Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sumario ==&lt;br /&gt;
&lt;br /&gt;
== Estado de copyright: ==&lt;br /&gt;
&lt;br /&gt;
== Fuente: ==&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Al_Juarismi&amp;diff=56180</id>
		<title>Al Juarismi</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Al_Juarismi&amp;diff=56180"/>
		<updated>2010-04-29T19:36:18Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Personaje_científico|nombre=Abu Abdallah Muḥammad ibn Mūsā al-Jwārizmī|imagen=Al juarismi|descripcion=Vivió aproximadamente entre 780 y 850.|especialidades=Fue un matemático, astrónomo y geógrafo |fecha_de_nacimiento=|lugar_de_nacimiento=|fecha_de_fallecimiento=|lugar_de_fallecimiento=}}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al-Juarismi &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abu Abdallah Muḥammad ibn Mūsā al-Jwārizmī (Abu Yā'far) (أبو عبد الله محمد بن موسى الخوارزمي ابو جعفر), conocido generalmente como al-Juarismi, fue un matemático, astrónomo y geógrafo persa musulmán chií, que vivió aproximadamente entre 780 y 850. &lt;br /&gt;
&lt;br /&gt;
Poco se conoce de su biografía, a tal punto que existen discusiones no saldadas sobre su lugar de nacimiento. Algunos sostienen que nació en Bagdad. Otros, siguiendo el artículo de Gerald Toomer[1] (a su vez, basado en escritos del historiador al-Tabari) sostienen que nació en la ciudad corasmia de Jiva, en el actual Uzbekistán. Rashed[2] halla que se trata de un error de interpretación de Toomer, debido a un error de transcripción (la falta de la conectiva wa) en una copia del manuscrito de al-Tabari. No será este el último desacuerdo entre historiadores que encontraremos en las descripciones de la vida y las obras de al-Juarismi. Estudió y trabajó en Bagdad en la primera mitad del siglo IX, en la corte del califa al-Mamun. Para muchos, fue el más grande de los matemáticos de su época. &lt;br /&gt;
&lt;br /&gt;
Debemos a su nombre y al de su obra principal, &amp;quot;Hisāb al-ŷabr wa'l muqābala&amp;quot;, (حساب الجبر و المقابلة) nuestras palabras álgebra, guarismo y algoritmo. De hecho, es considerado como el padre del álgebra y como el introductor de nuestro sistema de numeración. &lt;br /&gt;
&lt;br /&gt;
Hacia 815 al-Mamun, séptimo califa Abásida, hijo de Harún al-Rashid, fundó en su capital, Bagdad, la Casa de la sabiduría (Bayt al-Hikma), una institución de investigación y traducción que algunos han comparado con la Biblioteca de Alejandría. En ella se tradujeron al árabe obras científicas y filosóficas griegas e indias. Contaba también con observatorios astronómicos. En este ambiente científico y multicultural se educó y trabajó al-Juarismi junto con otros científicos como los hermanos Banu Musa, al-Kindi y el famoso traductor Hunayn ibn Ishaq. Dos de sus obras, sus tratados de álgebra y astronomía, están dedicadas al propio califa. &lt;br /&gt;
&lt;br /&gt;
== Álgebra  ==&lt;br /&gt;
&lt;br /&gt;
En su tratado de [[Álgebra]], obra eminentemente didáctica, se pretende enseñar un álgebra aplicada a la resolución de problemas de la vida cotidiana del [[Imperio islámico]] de entonces. La traducción de Rosen de las palabras de al-Juarizmi describiendo los fines de su libro dan cuenta de que el sabio pretendía enseñar:&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Traducido al [[Lengua latina|latín]] por [[Gerardo de Cremona]], se utilizó en las [[Universidad]]es [[Europa|europeas]] como libro de texto hasta el [[Siglo XVI]]. Es posible que antes de él se hubiesen resuelto [[Ecuación|ecuaciones]] concretas, pero éste es el primer tratado conocido en el que se hace un estudio exhaustivo. &lt;br /&gt;
&lt;br /&gt;
Luego de presentar los números naturales, al-Juarismi aborda la cuestión principal en la primera parte del libro: la solución de ecuaciones. Sus ecuaciones son lineales o cuadráticas y están compuestas de [[Unidad (álgebra)|unidades]], [[Raíz (matemática)|raíces]] y [[Cuadrado (aritmética)|cuadrados]]; para él, por ejemplo, una unidad era un número, una raíz era ''x'' y un cuadrado ''x²''. Aunque en los ejemplos que siguen usaremos la notación algebraica corriente en nuestros días para ayudar al lector a entender las nociones, es de destacar que al-Juarizmi no empleaba símbolos de ninguna clase, sino sólo palabras. &lt;br /&gt;
&lt;br /&gt;
Primero reduce una ecuación a alguna de seis formas normales: &lt;br /&gt;
&lt;br /&gt;
#Cuadrados iguales a raíces. &lt;br /&gt;
#Cuadrados iguales a números. &lt;br /&gt;
#Raíces iguales a números. &lt;br /&gt;
#Cuadrados y raíces iguales a números, por ejemplo x² + 10x = 39&amp;lt;br&amp;gt; &lt;br /&gt;
#Cuadrados y números iguales a raíces, por ejemplo&amp;amp;nbsp;x² + 21 = 10x&amp;lt;br&amp;gt; &lt;br /&gt;
#Raíces y números iguales a cuadrados, por ejemplo 3x + 4 = x²&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La reducción se lleva a cabo utilizando las operaciones de ''al-ŷabr'' (&amp;quot;compleción&amp;quot;, el proceso de eliminar términos negativos de la ecuación) y ''al-muqabala'' (&amp;quot;balanceo&amp;quot;, el proceso de reducir los términos positivos de la misma [[Potencia (matemática)|potencia]] cuando suceden de ambos lados de la ecuación). Luego, al-Juarismi muestra como resolver los seis tipos de ecuaciones, usando métodos de solución algebraicos y geométricos. Por ejemplo, para resolver la ecuación x² + 10x = 39, escribe: &lt;br /&gt;
&lt;br /&gt;
{{cita|... un cuadrado y diez raíces son iguales a 39 unidades. Entonces, la pregunta en este tipo de ecuación es aproximadamente así: cuál es el cuadrado que, combinado con diez de sus raíces, dará una suma total de 39. La manera de resolver este tipo de ecuación es tomar la mitad de las raíces mencionadas. Ahora, las raíces en el problema que tenemos ante nosotros son diez. Por lo tanto, tomamos 5 que multiplicadas por sí mismas dan 25, una cantidad que agregarás a 39 dando 64. Habiendo extraído la raíz cuadrada de esto, que es 8, sustraemos de allí la mitad de las raíces, 5, resultando 3. Por lo tanto el número tres representa una raíz de este cuadrado.|Álgebra&amp;lt;ref&amp;gt;Según la traducción de Rosen. ''Vid.'' Al-Khwarizmi (1831}.&amp;lt;/ref&amp;gt;}} &lt;br /&gt;
&lt;br /&gt;
Sigue la prueba geométrica por compleción del cuadrado, que no expondremos aquí. Señalaremos sin embargo que las pruebas geométricas que usa al-Juarismi son objeto de controversia entre los expertos. La cuestión, que permanece sin respuesta, es si estaba familiarizado con el trabajo de [[Euclides]]. Debe recordarse, en la juventud de al-Juarismi y durante el reinado de Harun al-Rashid, [[Al-Hajjaj]] había traducido los &amp;quot;''Elementos''&amp;quot; al [[Idioma árabe|árabe]], y era uno de los compañeros de al-Juarismi en la Casa de la Sabiduría. Esto avalaría la posición de Toomer (''op.cit.''). Rashed comenta&amp;lt;ref&amp;gt;Rashed, ''op. cit.''&amp;lt;/ref&amp;gt; que &amp;quot;''el tratamiento'' [de al-Juarismi] ''fue probablemente inspirado en el reciente conocimiento de &amp;quot;[[Los Elementos]]&amp;quot;''. Pero, por su parte, Gandz&amp;lt;ref&amp;gt;Gandz (1932)&amp;lt;/ref&amp;gt; sostiene que los Elementos le eran completamente desconocidos. Aunque es inseguro que haya efectivamente conocido la obra euclidiana, es posible afirmar que fue influenciado por otras obras de geometría; véase el tratamiento de Parshall&amp;lt;ref&amp;gt;Parshall (1988)&amp;lt;/ref&amp;gt; sobre las similitudes metodológicas con el texto hebreo ''Mishnat ha Middot'', de mediados del siglo II. &lt;br /&gt;
&lt;br /&gt;
Continúa el ''Hisab al-ŷabr wa'l-muqabala'' examinando cómo las leyes de la [[Aritmética]] se extienden a sus objetos algebraicos. Por ejemplo, muestra cómo multiplicar expresiones como (a + bx)(c + dx). Rashed (''op. cit.'') encuentra sus formas de resolución extremadamente originales, pero Crossley&amp;lt;ref&amp;gt;Crossley (1980)&amp;lt;/ref&amp;gt; las considera menos significativas. Gandz considera que la paternidad del álgebra es mucho más atribuible a al-Juarismi que a [[Diofanto]].&amp;lt;ref&amp;gt;Gandz (1936)&amp;lt;/ref&amp;gt; &lt;br /&gt;
&lt;br /&gt;
La parte siguiente consiste en aplicaciones y ejemplos. Describe reglas para hallar el área de figuras geométricas como el círculo, y el volumen de [[Sólido]]s como la esfera, el cono y la pirámide. Esta sección, ciertamente, tiene mucha mayor afinidad con los textos hebreos e indios que con cualquier obra griega. La parte final del libro se ocupa de las complejas reglas islámicas de herencia, pero requiere poco del álgebra que expuso anteriormente, más allá de la resolución de ecuaciones lineales. &lt;br /&gt;
&lt;br /&gt;
== Aritmética  ==&lt;br /&gt;
&lt;br /&gt;
De su [[Aritmética]], posiblemente denominada originalmente ''Kitab al-Ŷamaa wa al-Tafriq bi Hisab al-Hind'', (كتاب الجامع و التفريق بحساب الهند), &amp;quot;libro de la suma y de la resta, según el cálculo indio&amp;quot;, sólo conservamos una versión latina del siglo XII, ''Algoritmi de numero Indorum''. Desafortunadamente, se sabe que la obra&amp;lt;ref&amp;gt;Traducida al inglés en Corssley y Henry (1990).&amp;lt;/ref&amp;gt; se aparta bastante del texto original. En esta obra se describe con detalle el sistema indio de numeración posicional en base 10 y métodos para hacer cálculos con él. Se sabe que había un método para encontrar raíces cuadradas en la versión árabe, pero no aparece en la versión latina. Posiblemente fue el primero en utilizar el cero como indicador posicional. Fue esencial para la introducción de este sistema de numeración en el mundo árabe y posteriormente en Europa. André Allard&amp;lt;ref&amp;gt;Allard (1991)&amp;lt;/ref&amp;gt; dicute algunos tratados en latín del siglo XII basados en esta obra perdida. &lt;br /&gt;
&lt;br /&gt;
== Astronomía  ==&lt;br /&gt;
&lt;br /&gt;
De su tratado sobre [[Astronomía]], ''Sindhind zij'', también se han perdido las dos versiones que escribió en árabe. Esta obra&amp;lt;ref&amp;gt;Descripta en detalle en Van Dalen (1996).&amp;lt;/ref&amp;gt; se basa en trabajos astronómicos indios ''&amp;quot;a diferencia de manuales islámicos de astronomía posteriores, que utilizaron los modelos planetarios griegos del 'Almagesto' de [[Ptolomeo]]&amp;quot;''.&amp;lt;ref&amp;gt;Sokolovskaya (1985).&amp;lt;/ref&amp;gt; El texto indio en que se basa el tratado es uno de los obsequiados a la corte de Bagdad alrededor de [[770]] por una misión diplomática de la [[India]]. En el [[Siglo X]] [[Maslama al-Mayriti|al-Maŷriti]] realizó una revisión crítica de la versión más corta, que fue traducida al latín por [[Adelardo de Bath]]; existe también una traducción latina de la versión más larga, y ambas traducciones han llegado hasta nuestro tiempo. Los temas principales cubiertos en la obra son los [[Calendario]]s; el cálculo de las posiciones verdaderas del [[Sol]], la [[Luna]] y los [[Planetas]]; tablas de [[Seno (matemáticas)|senos]] y [[Tangente]]s; astronomía esférica; tablas [[Astrología|astrológicas]]; cálculos de [[Paralaje]]s y [[Eclipse]]s; y visibilidad de la Luna. Rozenfel'd analiza un manuscrito relacionado sobre [[Trigonometría esférica]],&amp;lt;ref&amp;gt;Rozenfel'd (1990)&amp;lt;/ref&amp;gt; atribuido a al-Juarismi. &lt;br /&gt;
&lt;br /&gt;
== Geografía  ==&lt;br /&gt;
&lt;br /&gt;
En [[Geografía]], con una obra denominada ''Kitab Surat-al-Ard'', revisó y corrigió a [[Claudio Ptolomeo|Ptolomeo]] en lo referente a [[África]] y al [[Oriente]]. Lista [[Latitud]]es y [[Longitud (cartografía)|longitudes]] de 2402 sitios, y emplaza ciudades, montañas, mares, islas, regiones geográficas y ríos, como base para un mapa del mundo entonces conocido. Incluye mapas que, en conjunto, son más precisos que los de Ptolomeo. Está claro que donde hubo mayor conocimiento local disponible para al-Juarismi, como las regiones del Islam, África y el [[Lejano Oriente]], el trabajo es mucho más exacto que el de Ptolomeo, pero parece haber usado los datos de éste para [[Europa]]. Se dice que en estos mapas trabajaron a sus órdenes setenta geógrafos. &lt;br /&gt;
&lt;br /&gt;
== Otras obras  ==&lt;br /&gt;
&lt;br /&gt;
Su obra conocida se completa con una serie de obras menores sobre temas como el [[Astrolabio]], sobre el que escribió dos textos, sobre relojes solares y sobre el [[Calendario judío]]. También escribió una historia política conteniendo horóscopos de personajes prominentes. &lt;br /&gt;
&lt;br /&gt;
== Bibliografía  ==&lt;br /&gt;
&lt;br /&gt;
*{{cita libro&lt;br /&gt;
 |apellido= AA. VV.&lt;br /&gt;
 |nombre=  &lt;br /&gt;
 |título= A source book in medieval science&lt;br /&gt;
 |idioma= inglés&lt;br /&gt;
 |otros =&lt;br /&gt;
 |edición= &lt;br /&gt;
 |año= 1974&lt;br /&gt;
 |editor= E. Grant&lt;br /&gt;
 |editorial= Harvard University Press&lt;br /&gt;
 |ubicación= Cambridge, MA&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
 |apellido= al Khwarizmi&lt;br /&gt;
 |nombre= 'Abu Ja'far Muhammad ibn Musa&lt;br /&gt;
 |título= The Algebra of Mohammed ben Musa&lt;br /&gt;
 |idioma= &lt;br /&gt;
 |otros = traducción, edición y notas de Friedrich Rosen&lt;br /&gt;
 |edición= reimpreso en 1986&lt;br /&gt;
 |sined = x&lt;br /&gt;
 |año= 1831&lt;br /&gt;
 |editor= &lt;br /&gt;
 |editorial= G. Olms Verlag&lt;br /&gt;
 |ubicación= Hildesheim&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Allard&lt;br /&gt;
 |nombre= André &lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |título= La diffusion en occident des premières oeuvres latines issues de l'arithmétique perdue d'al-Khwarizmi&lt;br /&gt;
 |idioma= francés&lt;br /&gt;
 |publicación= J. Hist. Arabic Sci.&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= 9 (1991)&lt;br /&gt;
 |número= 1-2&lt;br /&gt;
 |páginas= 101-105&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
 |apellido= Crossley&lt;br /&gt;
 |nombre= John N.&lt;br /&gt;
 |título= The emergence of number&lt;br /&gt;
 |idioma= inglés&lt;br /&gt;
 |otros = &lt;br /&gt;
 |edición= 2ª&lt;br /&gt;
 |año= 1987&lt;br /&gt;
 |editor= &lt;br /&gt;
 |editorial= World Scientific Publishing&lt;br /&gt;
 |ubicación= Singapur&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Crossley&lt;br /&gt;
 |nombre= John N. &lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |coautores = Henry, A. S.&lt;br /&gt;
 |título= Thus spake al-Khwarizmi : a translation of the text of Cambridge University Library ms. Ii.vi.5&lt;br /&gt;
 |idioma= &lt;br /&gt;
 |publicación= Historia Math.&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= 17 (1990)&lt;br /&gt;
 |número= 2&lt;br /&gt;
 |páginas= 103-131&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
 |apellido= Ganz&lt;br /&gt;
 |nombre= Salomon (trad., ed. y notas)&lt;br /&gt;
 |título= The Mishnat ha Middot, the First Hebrew Geometry of about 150 C.E., and the Geometry of Muhammad ibn Musa al-Khowarizmi, the First Arabic Geometry, Representing the Arabic Version of the Mishnat ha Middot&lt;br /&gt;
 |idioma= &lt;br /&gt;
 |otros = Quellen und Studien zur Geschichte der Mathematik, Astronomie und Physik. Abteilung A: Quelle, 2. Band.&lt;br /&gt;
 |edición= &lt;br /&gt;
 |año= 1932&lt;br /&gt;
 |editor= &lt;br /&gt;
 |editorial= Julius Springer&lt;br /&gt;
 |ubicación= Berlin&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Gandz&lt;br /&gt;
 |nombre= Salomon&lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |título= The sources of al-Khwarizmi's algebra&lt;br /&gt;
 |idioma= &lt;br /&gt;
 |publicación= Osiris&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= I (1936)&lt;br /&gt;
 |número= &lt;br /&gt;
 |páginas= 235-277&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Parshall&lt;br /&gt;
 |nombre= K. A.&lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |título= The art of algebra from al-Khwarizmi to [[François Viète|Viète]] : a study in the natural selection of ideas&lt;br /&gt;
 |idioma= inglés&lt;br /&gt;
 |publicación= Hist. of Sci.&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= 26 (1988)&lt;br /&gt;
 |número= 72.2&lt;br /&gt;
 |páginas= 129-164&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Puig&lt;br /&gt;
 |nombre= Luis &lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |título= Historias de al-Khwārizmī (1ª entrega)&lt;br /&gt;
 |idioma= español&lt;br /&gt;
 |publicación= Suma&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= &lt;br /&gt;
 |número= 58 (2008)&lt;br /&gt;
 |páginas= 125-130&lt;br /&gt;
 |url= http://www.uv.es/puigl/historias58.pdf&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Puig&lt;br /&gt;
 |nombre= Luis &lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |título= Historias de al-Khwārizmī (2ª entrega): Los Libros&lt;br /&gt;
 |idioma= español&lt;br /&gt;
 |publicación= Suma&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= &lt;br /&gt;
 |número= 59 (2008)&lt;br /&gt;
 |páginas= 105-112&lt;br /&gt;
 |url= http://www.uv.es/puigl/historias59.pdf&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Puig&lt;br /&gt;
 |nombre= Luis &lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |título= Historias de al-Khwārizmī (3ª entrega). Orígenes del álgebra.&lt;br /&gt;
 |idioma= español&lt;br /&gt;
 |publicación= Suma&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= &lt;br /&gt;
 |número= 60 (2009)&lt;br /&gt;
 |páginas= 103-108&lt;br /&gt;
 |url= http://www.uv.es/puigl/historias60.pdf&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
 |apellido= Rashed&lt;br /&gt;
 |nombre= Roshdi&lt;br /&gt;
 |título= The Development of Arabic Mathematics: Between Arithmetic and Algebra&lt;br /&gt;
 |idioma= inglés&lt;br /&gt;
 |otros = trad. de A. F. W. Armstrong de la edición francesa de 1984&lt;br /&gt;
 |edición= &lt;br /&gt;
 |año= 1994&lt;br /&gt;
 |editor= &lt;br /&gt;
 |editorial= Kluwer Academic Publishers&lt;br /&gt;
 |ubicación= Dordrecht&lt;br /&gt;
}} &lt;br /&gt;
*{{cita publicación&lt;br /&gt;
 |apellido= Rozenfel'd&lt;br /&gt;
 |nombre= Boris A. &lt;br /&gt;
 |enlaceautor= &lt;br /&gt;
 |título= Trigonometría esférica en al-Khwarizmi&lt;br /&gt;
 |idioma= ruso&lt;br /&gt;
 |publicación= Istor.-Mat. Issled.&lt;br /&gt;
 |editorial=&lt;br /&gt;
 |ubicación=&lt;br /&gt;
 |volumen= &lt;br /&gt;
 |número= 32-33 (1990)&lt;br /&gt;
 |páginas= 325-339&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
 |apellido= Sokolovskaya&lt;br /&gt;
 |nombre= Z. K.&lt;br /&gt;
 |título= El gran científico medieval al-Khwarizmi&lt;br /&gt;
 |capítulo= El período &amp;quot;pretelescópico&amp;quot; de la historia de los instrumentos astronómicos. al-Khwarizmi en el desarrollo de instrumentos de precisión en Cercano y Medio Oriente&lt;br /&gt;
 |idioma= ruso&lt;br /&gt;
 |otros = &lt;br /&gt;
 |año= 1985&lt;br /&gt;
 |páginas= 165-178&lt;br /&gt;
 |editorial= Fan&lt;br /&gt;
 |ubicación= Tashkent&lt;br /&gt;
}} &lt;br /&gt;
*{{cita enciclopedia&lt;br /&gt;
 |apellidos= Toomer&lt;br /&gt;
 |nombre= Gerald J.&lt;br /&gt;
 |editor= Charles C. Gillespie&lt;br /&gt;
 |enciclopedia= Dictionary of Scientific Biography&lt;br /&gt;
 |título= Al-Khwârazmî&lt;br /&gt;
 |idioma= inglés&lt;br /&gt;
 |fecha= 1970&lt;br /&gt;
 |editorial= Charles Scribner's Sons&lt;br /&gt;
 |volumen= 7&lt;br /&gt;
 |ubicación= New York&lt;br /&gt;
 |páginas= 359&lt;br /&gt;
}} &lt;br /&gt;
*{{cita libro&lt;br /&gt;
 |apellido= Van Dalen&lt;br /&gt;
 |nombre= Benno&lt;br /&gt;
 |título= From Baghdad to Barcelona - Studies in the Islamic Exact Sciences in Honour of Prof. Juan Vernet&lt;br /&gt;
 |capítulo= Al'Khwarizmi's astronomical tables revisited : analysis of the equation of time&lt;br /&gt;
 |idioma= inglés&lt;br /&gt;
 |otros = Annuari de Filologia (Universitat de Barcelona) xix (1996) B-2&lt;br /&gt;
 |edición= &lt;br /&gt;
 |año= 1996&lt;br /&gt;
 |editor= Josep Casulleras y Julio Samsó&lt;br /&gt;
 |volumen= I&lt;br /&gt;
 |páginas= 195-252&lt;br /&gt;
 |editorial= Universitat de Barcelona - Instituto Millás Vallicrosa de Historia de la Ciencia Árabe&lt;br /&gt;
 |ubicación= Barcelona&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Vuelta_atr%C3%A1s_(backtracking)&amp;diff=56155</id>
		<title>Vuelta atrás (backtracking)</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Vuelta_atr%C3%A1s_(backtracking)&amp;diff=56155"/>
		<updated>2010-04-29T19:14:28Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}} &lt;br /&gt;
&lt;br /&gt;
Vuelta Atrás &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Vuelta atrás&amp;quot;, (Backtracking) es una estrategia para encontrar soluciones a problemas que satisfacen restricciones. El término &amp;quot;backtrack&amp;quot; fue acuñado por primera vez por el matemático estadounidense D. H. Lehmer en los años 1950s. &lt;br /&gt;
&lt;br /&gt;
== Concepto  ==&lt;br /&gt;
&lt;br /&gt;
En su forma básica, la idea de backtracking se asemeja a un recorrido en profundidad dentro de un grafo dirigido. El grafo en cuestión suele ser un árbol, o por lo menos no contiene ciclos. Sea cual sea su estructura, existe sólo implícitamente. El objetivo del recorrido es encontrar soluciones para algún problema. Esto se consigue construyendo soluciones parciales a medida que progresa el recorrido; estas soluciones parciales limitan las regiones en las que se puede encontrar una solución completa. El recorrido tiene éxito si, procediendo de esta forma, se puede definir por completo una solución. En este caso el algoritmo puede bien detenerse (si lo único que se necesita es una solución del problema) o bien seguir buscando soluciones alternativas (si deseamos examinarlas todas). Por otra parte, el recorrido no tiene éxito si en alguna etapa la solución parcial construida hasta el momento no se puede completar. En tal caso, el recorrido vuelve atrás exactamente igual que en un recorrido en profundidad, eliminando sobre la marcha los elementos que se hubieran añadido en cada fase. Cuando vuelve a un nodo que tiene uno o más vecinos sin explorar, prosigue el recorrido de una solución. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
                         Algoritmo de Backtracking&lt;br /&gt;
&lt;br /&gt;
                         proc Backtracking (↕X[1 . . . i ]: TSolución, ↑ok: B)&lt;br /&gt;
                         variables L: ListaComponentes&lt;br /&gt;
                         inicio&lt;br /&gt;
                             si EsSolución (X) entonces ok   CIERTO&lt;br /&gt;
                             en otro caso&lt;br /&gt;
                                  ok   FALSO&lt;br /&gt;
                                  L=Candidatos (X)&lt;br /&gt;
                                  mientras ¬ok ^ ¬Vacía (L) hacer&lt;br /&gt;
                                  X[i + 1]   Cabeza (L); L   Resto (L)&lt;br /&gt;
                                  Backtracking (X, ok)&lt;br /&gt;
                                  finmientras&lt;br /&gt;
                             finsi&lt;br /&gt;
                         fin&lt;br /&gt;
&lt;br /&gt;
Podemos visualizar el funcionamiento de una técnica de backtracking como la exploración en profundidad de un grafo. &lt;br /&gt;
&lt;br /&gt;
Cada vértice del grafo es un posible estado de la solución del problema. Cada arco del grafo representa la transición entre dos estados de la solución (i.e., la toma de una decisión). &lt;br /&gt;
&lt;br /&gt;
Típicamente el tamaño de este grafo será inmenso, por lo que no existirá de manera explícita. En cada momento sólo tenemos en una estructura los nodos que van desde el estado inicial al estado actual. Si cada secuencia de decisiones distinta da lugar a un estado diferente, el grafo es un árbol (el árbol de estados). &lt;br /&gt;
&lt;br /&gt;
== Enfoque  ==&lt;br /&gt;
&lt;br /&gt;
Los problemas que deben satisfacer un determinado tipo de restricciones son problemas completos, donde el orden de los elementos de la solución no importa. Estos problemas consisten en un conjunto (o lista) de variables a la que a cada una se le debe asignar un valor sujeto a las restricciones del problema. La técnica va creando todas las posibles combinaciones de elementos para obtener una solución. Su principal virtud es que en la mayoría de las implementaciones se puede evitar combinaciones, estableciendo funciones de acotación (o poda) reduciendo el [[Eficiencia de los algoritmos|tiempo]] de ejecución. &lt;br /&gt;
&lt;br /&gt;
Vuelta atrás está muy relacionado con la [[Búsqueda combinatoria]]. &lt;br /&gt;
&lt;br /&gt;
== Diseño e implementación  ==&lt;br /&gt;
&lt;br /&gt;
Esencialmente, la idea es encontrar la mejor combinación posible en un momento determinado, por eso, se dice que este tipo de algoritmo es una [[Búsqueda en profundidad]]. Durante la búsqueda, si se encuentra una alternativa incorrecta, la búsqueda retrocede hasta el paso anterior y toma la siguiente alternativa. Cuando se han terminado las posibilidades, se vuelve a la elección anterior y se toma la siguiente opción (hijo [si nos referimos a un árbol]). Si no hay más alternativas la búsqueda falla. De esta manera, se crea un árbol implícito, en el que cada nodo es un estado de la solución (solución parcial en el caso de nodos interiores o solución total en el caso de los nodos hoja). &lt;br /&gt;
&lt;br /&gt;
Normalmente, se suele implementar este tipo de algoritmos como un procedimiento [[Recursividad|recursivo]]. Así, en cada llamada al procedimiento se toma una variable y se le asignan todos los valores posibles, llamando a su vez al procedimiento para cada uno de los nuevos estados. La diferencia con la [[Búsqueda en profundidad]] es que se suelen diseñar funciones de cota, de forma que no se generen algunos estados si no van a conducir a ninguna solución, o a una solución peor de la que ya se tiene. De esta forma se ahorra espacio en memoria y tiempo de ejecución. &lt;br /&gt;
&lt;br /&gt;
== Heurísticas  ==&lt;br /&gt;
&lt;br /&gt;
Algunas heurísticas son comúnmente usadas para acelerar el proceso. Como las variables se pueden procesar en cualquier orden, generalmente es más eficiente intentar ser lo más restrictivo posible con las primeras (esto es, las primeras con menores valores posibles). Este proceso poda el [[Árbol (estructura de datos)|árbol de búsqueda]] antes de que se tome la decisión y se llame a la subrutina recursiva. &lt;br /&gt;
&lt;br /&gt;
Cuando se elige qué valor se va a asignar, muchas implementaciones hacen un examen hacia delante (FC, Forward Checking), para ver qué valor restringirá el menor número posible de valores, de forma que se anticipa en a) preservar una posible solución y b) hace que la solución encontrada no tenga restricciones destacadas. &lt;br /&gt;
&lt;br /&gt;
Algunas implementaciones muy sofisticadas usan una función de cotas, que examina si es posible encontrar una solución a partir de una solución parcial. Además, se comprueba si la solución parcial que falla puede incrementar significativamente la eficiencia del algoritmo. Por el uso de estas funciones de cota, se debe ser muy minucioso en su implementación de forma que sean poco costosas computacionalmente hablando, ya que lo más normal es que se ejecuten en para cada nodo o paso del algoritmo. Cabe destacar, que las cotas eficaces se crean de forma parecida a las funciones [[Heurística]]s, esto es, relajando las restricciones para conseguir mayor eficiencia. &lt;br /&gt;
&lt;br /&gt;
Con el objetivo de mantener la solución actual con coste mínimo, los algoritmos vuelta atrás mantienen el coste de la mejor solución en una variable que va variando con cada nueva mejor solución encontrada. Así, si una solución es peor que la que se acaba de encontrar, el algoritmo no actualizará la solución. De esta forma, devolverá siempre la mejor solución que haya encontrado. &lt;br /&gt;
&lt;br /&gt;
== Ejemplos de aplicación de backtracking  ==&lt;br /&gt;
&lt;br /&gt;
SATISFABILITY &lt;br /&gt;
&lt;br /&gt;
Inicialmente A contiene la expresión booleana que constituye el problema. &lt;br /&gt;
&lt;br /&gt;
Elegir subproblema de A, p.ejemplo&amp;amp;nbsp;: (x+y+z)(x'+y)(y'+z)(z'+x)(x'+y'+z'). &lt;br /&gt;
&lt;br /&gt;
Elegir una cláusula con mínimo número de literales. &lt;br /&gt;
&lt;br /&gt;
Elegir una variable x, y, z,... dentro de la cláusula y crear 2 subproblemas reemplazando x=V y x=F. &lt;br /&gt;
&lt;br /&gt;
En el caso x=V &lt;br /&gt;
&lt;br /&gt;
        Omitir las cláusulas donde aparece x.&lt;br /&gt;
&lt;br /&gt;
        Omitir x' en las cláusulas que aparece x'.&lt;br /&gt;
&lt;br /&gt;
En el caso x=F &lt;br /&gt;
&lt;br /&gt;
        Omitir las cláusulas donde aparece x'.&lt;br /&gt;
&lt;br /&gt;
        Omitir x en las cláusulas que aparece x.&lt;br /&gt;
&lt;br /&gt;
Test &lt;br /&gt;
&lt;br /&gt;
Si no quedan cláusulas. STOP. (solución encontrada). &lt;br /&gt;
&lt;br /&gt;
Si hay una cláusula vacía. DROP. &lt;br /&gt;
&lt;br /&gt;
En otro caso añadir a A &lt;br /&gt;
&lt;br /&gt;
Nota: Observemos que si encontramos a A vacío entonces la expresión booleana no puede ser satisfecha. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; '''HAMILTON CYCLE (VIAJANTE DE COMERCIO)''' &lt;br /&gt;
&lt;br /&gt;
En este caso los subproblemas S son caminos que parten de a y llegan a b a través de un sucesión de nodos T. (b es el mismo a lo largo de todo el algoritmo). &lt;br /&gt;
&lt;br /&gt;
Inicialmente A contiene solamente el camino (a, vacío, b). &lt;br /&gt;
&lt;br /&gt;
Elegimos un subproblema S cualquiera de A (y lo borramos de A) y añadimos ramas (c, a) del grafo (las c's son las adyacentes de a) . Estos caminos extendidos son los hijos. Ahora cada c juega el rol de a. &lt;br /&gt;
&lt;br /&gt;
Examinamos c/ hijo: &lt;br /&gt;
&lt;br /&gt;
Test: &lt;br /&gt;
&lt;br /&gt;
1)Si G-T forma un camino hamiltoniano STOP (solución hallada) &lt;br /&gt;
&lt;br /&gt;
2)Si G-T tiene un nodo de grado uno (excepto a y b) o si G-T-{a, b} es disconexo entonces DROP este subproblema . &lt;br /&gt;
&lt;br /&gt;
3) Si 1) y 2) fallan add subproblema en A. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; '''EXACT COVER''' &lt;br /&gt;
&lt;br /&gt;
Dado un conjunto finito U y una familia se subconjuntos {Tj} de U definimos una matriz A donde cada fila se corresponde con un elemento ui de U y cada columna de A con un subconjunto Tj . Ponemos aij=1 si uiU pertenece a Tj y aij=0 en caso contrario. Interpretamos que xj=1 significa que elegimos Tj y 0 en caso contrario. &lt;br /&gt;
&lt;br /&gt;
Se trata de averiguar si es factible Ax=1 donde A y x son binarias y las componentes de 1 son unos. &lt;br /&gt;
&lt;br /&gt;
S0= un vector de ceros (raíz del árbol) &lt;br /&gt;
&lt;br /&gt;
Cada nodo S del árbol es una sucesión x cuyas primeras k componentes le han sido asignados un 1 o un 0 y el resto de componentes son ceros. Reemplazamos S por 2 subproblemas Si (i=1,2) poniendo xk+1 =1 y xk+1=0 respectivamente. &lt;br /&gt;
&lt;br /&gt;
Test &lt;br /&gt;
&lt;br /&gt;
if Ax=1 STOP &lt;br /&gt;
&lt;br /&gt;
if Ax&amp;amp;gt;1 DROP Si &lt;br /&gt;
&lt;br /&gt;
if Ax&amp;amp;lt;1 add Si to A &lt;br /&gt;
&lt;br /&gt;
== Ejemplos de problemas comunes resueltos usando Vuelta Atrás  ==&lt;br /&gt;
&lt;br /&gt;
'''Problema de las N Reinas''' &lt;br /&gt;
&lt;br /&gt;
Disponemos de un tablero de ajedrez de tamaño NxN, y se trata de colocar en él N reinas de manera que no se amenacen según las normas del ajedrez. &lt;br /&gt;
&lt;br /&gt;
        proc NReinas (↕[1 . . . i ]: TSolución, ↓N: N, ↑ok: B)&lt;br /&gt;
        variables j&amp;amp;nbsp;: N&lt;br /&gt;
        inicio&lt;br /&gt;
            si i=N entonces ok=CIERTO &lt;br /&gt;
            en otro caso&lt;br /&gt;
                ok=FALSO&lt;br /&gt;
                j=1&lt;br /&gt;
                mientras ¬ok ^ (j≤N) hacer&lt;br /&gt;
                    si EsFactible (R, j) entonces&lt;br /&gt;
                        R[i + 1]= j &lt;br /&gt;
                    NReinas (R, N, ok)&lt;br /&gt;
                    finsi&lt;br /&gt;
                    j=j+1&lt;br /&gt;
                finmientras&lt;br /&gt;
            finsi&lt;br /&gt;
        fin&lt;br /&gt;
&lt;br /&gt;
        func EsFactible (↓R[1 . . . i ]: TSolución, ↓j&amp;amp;nbsp;: N): B&lt;br /&gt;
        variables factible: B&lt;br /&gt;
        inicio&lt;br /&gt;
            factible=CIERTO&lt;br /&gt;
            k=1&lt;br /&gt;
                mientras factible ^ (k≤i) hacer&lt;br /&gt;
                    si (j=R[k])\/(i+1−k= |j−R[k]|) entonces&lt;br /&gt;
                    factible=FALSO&lt;br /&gt;
                    finsi&lt;br /&gt;
                    k=k+1&lt;br /&gt;
                finmientras&lt;br /&gt;
            devolver factible&lt;br /&gt;
         fin&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''Problema de la mochila 0,1''' &lt;br /&gt;
&lt;br /&gt;
Dados n elementos e1,e2,...,en con pesos p1,p2,...,pn y beneficios b1,b2,...,bn, y dada una mochila capaz de albergar hasta un máximo de peso M (capacidad de la mochila), queremos encontrar cuáles de los n elementos hemos de introducir en la mochila de forma que la suma de los beneficios de los elementos escogidos sea máxima, sujeto a la restricción de que tales elementos no pueden superar la capacidad de la mochila.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''Problema del laberinto''' &lt;br /&gt;
&lt;br /&gt;
Se tiene una matriz bidimensional de nxn casillas para representar un laberinto cuadrado. Cada casilla está marcada como visitada o no visitada. Se debe ir desde la casilla (1,1) a la (n, n) haciendo movimientos horizontales y verticales. &lt;br /&gt;
&lt;br /&gt;
*[[Problema de las parejas]] &lt;br /&gt;
*[[Formación de una palabra con n cubos]] &lt;br /&gt;
*[[Sudoku backtracking|Sudoku]] &lt;br /&gt;
*[[Problema del laberinto]] &lt;br /&gt;
*[[Problema del laberinto con límite]] &lt;br /&gt;
*[[Problema del dominó]] &lt;br /&gt;
*[[Problema de los movimientos de un caballo]] &lt;br /&gt;
*[[Problema del reparto del botín]] &lt;br /&gt;
*[[Problema de la mochila utilizando Vuelta Atrás]] &lt;br /&gt;
*[[Minimización de cableado en placa]] &lt;br /&gt;
*[[Coloreado de grafos]] &lt;br /&gt;
*[[Problema del viajante sobre grafos dirigidos]] &lt;br /&gt;
*[[Las ocho reinas]]&lt;br /&gt;
&lt;br /&gt;
== Backtracking para la enumeración  ==&lt;br /&gt;
&lt;br /&gt;
El problema de la enumeración consiste en encontrar todas las soluciones del problema, es por ello que tendremos que recorrer el árbol de estados al completo. &lt;br /&gt;
&lt;br /&gt;
       Algoritmo de Backtracking para la enumeración:&lt;br /&gt;
&lt;br /&gt;
       proc Bactracking Enum(↕X[1 . . . i ]: TSolución, ↑num: N)&lt;br /&gt;
       variables L: ListaComponentes&lt;br /&gt;
       inicio&lt;br /&gt;
             si EsSolución (X) entonces num   num+1&lt;br /&gt;
                  EscribeSolución (X)&lt;br /&gt;
             en otro caso&lt;br /&gt;
                  L   Candidatos (X) &lt;br /&gt;
                  mientras ¬Vacía (L) hacer  &lt;br /&gt;
                       X[i + 1]   Cabeza (L); L   Resto (L) &lt;br /&gt;
                       BacktrackingEnum (X, num)&lt;br /&gt;
                  finmientras&lt;br /&gt;
             finsi&lt;br /&gt;
       fin&lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
Vuelta atrás se usa en la implementación de los [[Lenguajes de programación]] tales como [[Planner|Lenguaje de programación Planner]] y [[Prolog]]. Además, se usa en los análisis sintácticos de los compiladores. Su uso en [[Inteligencia artificial]] ha sido muy importante, dando lugar a nuevos tipos de búsquedas como el [[A*|A estrella]]. &lt;br /&gt;
&lt;br /&gt;
== Branch &amp;amp;amp; Bound ( Ramificación y poda )  ==&lt;br /&gt;
&lt;br /&gt;
Este método busca una solución como en el método de backtracking, pero cada solución tiene asociado un costo y la solución que se busca es una de mínimo costo llamada óptima. Además de ramificar una solución padre (branch) en hijos se trata de eliminar de consideración aquellos hijos cuyos descendientes tienen un costo que supera al óptimo buscado acotando el costo de los descendientes del hijo (bound). La forma de acotar es un arte que depende de cada problema. La acotacion reduce el tiempo de búsqueda de la solución óptima al &amp;quot;podar&amp;quot; (pruning) los subarboles de descendientes costosos. &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Vuelta_atr%C3%A1s_(backtracking)&amp;diff=56152</id>
		<title>Vuelta atrás (backtracking)</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Vuelta_atr%C3%A1s_(backtracking)&amp;diff=56152"/>
		<updated>2010-04-29T19:12:13Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}} &lt;br /&gt;
&lt;br /&gt;
Vuelta Atrás &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Vuelta atrás&amp;quot;, (Backtracking) es una estrategia para encontrar soluciones a problemas que satisfacen restricciones. El término &amp;quot;backtrack&amp;quot; fue acuñado por primera vez por el matemático estadounidense D. H. Lehmer en los años 1950s. &lt;br /&gt;
&lt;br /&gt;
== Concepto  ==&lt;br /&gt;
&lt;br /&gt;
En su forma básica, la idea de backtracking se asemeja a un recorrido en profundidad dentro de un grafo dirigido. El grafo en cuestión suele ser un árbol, o por lo menos no contiene ciclos. Sea cual sea su estructura, existe sólo implícitamente. El objetivo del recorrido es encontrar soluciones para algún problema. Esto se consigue construyendo soluciones parciales a medida que progresa el recorrido; estas soluciones parciales limitan las regiones en las que se puede encontrar una solución completa. El recorrido tiene éxito si, procediendo de esta forma, se puede definir por completo una solución. En este caso el algoritmo puede bien detenerse (si lo único que se necesita es una solución del problema) o bien seguir buscando soluciones alternativas (si deseamos examinarlas todas). Por otra parte, el recorrido no tiene éxito si en alguna etapa la solución parcial construida hasta el momento no se puede completar. En tal caso, el recorrido vuelve atrás exactamente igual que en un recorrido en profundidad, eliminando sobre la marcha los elementos que se hubieran añadido en cada fase. Cuando vuelve a un nodo que tiene uno o más vecinos sin explorar, prosigue el recorrido de una solución. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
                         Algoritmo de Backtracking&lt;br /&gt;
&lt;br /&gt;
                         proc Backtracking (↕X[1 . . . i ]: TSolución, ↑ok: B)&lt;br /&gt;
                         variables L: ListaComponentes&lt;br /&gt;
                         inicio&lt;br /&gt;
                             si EsSolución (X) entonces ok   CIERTO&lt;br /&gt;
                             en otro caso&lt;br /&gt;
                                  ok   FALSO&lt;br /&gt;
                                  L=Candidatos (X)&lt;br /&gt;
                                  mientras ¬ok ^ ¬Vacía (L) hacer&lt;br /&gt;
                                  X[i + 1]   Cabeza (L); L   Resto (L)&lt;br /&gt;
                                  Backtracking (X, ok)&lt;br /&gt;
                                  finmientras&lt;br /&gt;
                             finsi&lt;br /&gt;
                         fin&lt;br /&gt;
&lt;br /&gt;
Podemos visualizar el funcionamiento de una técnica de backtracking como la exploración en profundidad de un grafo. &lt;br /&gt;
&lt;br /&gt;
Cada vértice del grafo es un posible estado de la solución del problema. Cada arco del grafo representa la transición entre dos estados de la solución (i.e., la toma de una decisión). &lt;br /&gt;
&lt;br /&gt;
Típicamente el tamaño de este grafo será inmenso, por lo que no existirá de manera explícita. En cada momento sólo tenemos en una estructura los nodos que van desde el estado inicial al estado actual. Si cada secuencia de decisiones distinta da lugar a un estado diferente, el grafo es un árbol (el árbol de estados). &lt;br /&gt;
&lt;br /&gt;
== Enfoque  ==&lt;br /&gt;
&lt;br /&gt;
Los problemas que deben satisfacer un determinado tipo de restricciones son problemas completos, donde el orden de los elementos de la solución no importa. Estos problemas consisten en un conjunto (o lista) de variables a la que a cada una se le debe asignar un valor sujeto a las restricciones del problema. La técnica va creando todas las posibles combinaciones de elementos para obtener una solución. Su principal virtud es que en la mayoría de las implementaciones se puede evitar combinaciones, estableciendo funciones de acotación (o poda) reduciendo el [[Eficiencia de los algoritmos|tiempo]] de ejecución. &lt;br /&gt;
&lt;br /&gt;
Vuelta atrás está muy relacionado con la [[Búsqueda combinatoria]]. &lt;br /&gt;
&lt;br /&gt;
== Diseño e implementación  ==&lt;br /&gt;
&lt;br /&gt;
Esencialmente, la idea es encontrar la mejor combinación posible en un momento determinado, por eso, se dice que este tipo de algoritmo es una [[Búsqueda en profundidad]]. Durante la búsqueda, si se encuentra una alternativa incorrecta, la búsqueda retrocede hasta el paso anterior y toma la siguiente alternativa. Cuando se han terminado las posibilidades, se vuelve a la elección anterior y se toma la siguiente opción (hijo [si nos referimos a un árbol]). Si no hay más alternativas la búsqueda falla. De esta manera, se crea un árbol implícito, en el que cada nodo es un estado de la solución (solución parcial en el caso de nodos interiores o solución total en el caso de los nodos hoja). &lt;br /&gt;
&lt;br /&gt;
Normalmente, se suele implementar este tipo de algoritmos como un procedimiento [[Recursividad|recursivo]]. Así, en cada llamada al procedimiento se toma una variable y se le asignan todos los valores posibles, llamando a su vez al procedimiento para cada uno de los nuevos estados. La diferencia con la [[Búsqueda en profundidad]] es que se suelen diseñar funciones de cota, de forma que no se generen algunos estados si no van a conducir a ninguna solución, o a una solución peor de la que ya se tiene. De esta forma se ahorra espacio en memoria y tiempo de ejecución. &lt;br /&gt;
&lt;br /&gt;
== Heurísticas  ==&lt;br /&gt;
&lt;br /&gt;
Algunas heurísticas son comúnmente usadas para acelerar el proceso. Como las variables se pueden procesar en cualquier orden, generalmente es más eficiente intentar ser lo más restrictivo posible con las primeras (esto es, las primeras con menores valores posibles). Este proceso poda el [[Árbol (estructura de datos)|árbol de búsqueda]] antes de que se tome la decisión y se llame a la subrutina recursiva. &lt;br /&gt;
&lt;br /&gt;
Cuando se elige qué valor se va a asignar, muchas implementaciones hacen un examen hacia delante (FC, Forward Checking), para ver qué valor restringirá el menor número posible de valores, de forma que se anticipa en a) preservar una posible solución y b) hace que la solución encontrada no tenga restricciones destacadas. &lt;br /&gt;
&lt;br /&gt;
Algunas implementaciones muy sofisticadas usan una función de cotas, que examina si es posible encontrar una solución a partir de una solución parcial. Además, se comprueba si la solución parcial que falla puede incrementar significativamente la eficiencia del algoritmo. Por el uso de estas funciones de cota, se debe ser muy minucioso en su implementación de forma que sean poco costosas computacionalmente hablando, ya que lo más normal es que se ejecuten en para cada nodo o paso del algoritmo. Cabe destacar, que las cotas eficaces se crean de forma parecida a las funciones [[Heurística]]s, esto es, relajando las restricciones para conseguir mayor eficiencia. &lt;br /&gt;
&lt;br /&gt;
Con el objetivo de mantener la solución actual con coste mínimo, los algoritmos vuelta atrás mantienen el coste de la mejor solución en una variable que va variando con cada nueva mejor solución encontrada. Así, si una solución es peor que la que se acaba de encontrar, el algoritmo no actualizará la solución. De esta forma, devolverá siempre la mejor solución que haya encontrado. &lt;br /&gt;
&lt;br /&gt;
== Ejemplos de aplicación de backtracking  ==&lt;br /&gt;
&lt;br /&gt;
SATISFABILITY &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Inicialmente A contiene la expresión booleana que constituye el problema. &lt;br /&gt;
&lt;br /&gt;
Elegir subproblema de A, p.ejemplo&amp;amp;nbsp;: (x+y+z)(x'+y)(y'+z)(z'+x)(x'+y'+z'). &lt;br /&gt;
&lt;br /&gt;
Elegir una cláusula con mínimo número de literales. &lt;br /&gt;
&lt;br /&gt;
Elegir una variable x, y, z,... dentro de la cláusula y crear 2 subproblemas reemplazando x=V y x=F. &lt;br /&gt;
&lt;br /&gt;
En el caso x=V &lt;br /&gt;
&lt;br /&gt;
        Omitir las cláusulas donde aparece x.&lt;br /&gt;
&lt;br /&gt;
        Omitir x' en las cláusulas que aparece x'.&lt;br /&gt;
&lt;br /&gt;
En el caso x=F &lt;br /&gt;
&lt;br /&gt;
        Omitir las cláusulas donde aparece x'.&lt;br /&gt;
&lt;br /&gt;
        Omitir x en las cláusulas que aparece x.&lt;br /&gt;
&lt;br /&gt;
Test &lt;br /&gt;
&lt;br /&gt;
Si no quedan cláusulas. STOP. (solución encontrada). &lt;br /&gt;
&lt;br /&gt;
Si hay una cláusula vacía. DROP. &lt;br /&gt;
&lt;br /&gt;
En otro caso añadir a A &lt;br /&gt;
&lt;br /&gt;
Nota: Observemos que si encontramos a A vacío entonces la expresión booleana no puede ser satisfecha. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; '''HAMILTON CYCLE (VIAJANTE DE COMERCIO)''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
En este caso los subproblemas S son caminos que parten de a y llegan a b a través de un sucesión de nodos T. (b es el mismo a lo largo de todo el algoritmo). &lt;br /&gt;
&lt;br /&gt;
Inicialmente A contiene solamente el camino (a, vacío, b). &lt;br /&gt;
&lt;br /&gt;
Elegimos un subproblema S cualquiera de A (y lo borramos de A) y añadimos ramas (c, a) del grafo (las c's son las adyacentes de a) . Estos caminos extendidos son los hijos. Ahora cada c juega el rol de a. &lt;br /&gt;
&lt;br /&gt;
Examinamos c/ hijo: &lt;br /&gt;
&lt;br /&gt;
Test: &lt;br /&gt;
&lt;br /&gt;
1)Si G-T forma un camino hamiltoniano STOP (solución hallada) &lt;br /&gt;
&lt;br /&gt;
2)Si G-T tiene un nodo de grado uno (excepto a y b) o si G-T-{a, b} es disconexo entonces DROP este subproblema . &lt;br /&gt;
&lt;br /&gt;
3) Si 1) y 2) fallan add subproblema en A. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; '''EXACT COVER''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Dado un conjunto finito U y una familia se subconjuntos {Tj} de U definimos una matriz A donde cada fila se corresponde con un elemento ui de U y cada columna de A con un subconjunto Tj . Ponemos aij=1 si uiU pertenece a Tj y aij=0 en caso contrario. Interpretamos que xj=1 significa que elegimos Tj y 0 en caso contrario. &lt;br /&gt;
&lt;br /&gt;
Se trata de averiguar si es factible Ax=1 donde A y x son binarias y las componentes de 1 son unos. &lt;br /&gt;
&lt;br /&gt;
S0= un vector de ceros (raíz del árbol) &lt;br /&gt;
&lt;br /&gt;
Cada nodo S del árbol es una sucesión x cuyas primeras k componentes le han sido asignados un 1 o un 0 y el resto de componentes son ceros. Reemplazamos S por 2 subproblemas Si (i=1,2) poniendo xk+1 =1 y xk+1=0 respectivamente. &lt;br /&gt;
&lt;br /&gt;
Test &lt;br /&gt;
&lt;br /&gt;
if Ax=1 STOP &lt;br /&gt;
&lt;br /&gt;
if Ax&amp;amp;gt;1 DROP Si &lt;br /&gt;
&lt;br /&gt;
if Ax&amp;amp;lt;1 add Si to A &lt;br /&gt;
&lt;br /&gt;
== Ejemplos de problemas comunes resueltos usando Vuelta Atrás  ==&lt;br /&gt;
&lt;br /&gt;
'''Problema de las N Reinas''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Disponemos de un tablero de ajedrez de tamaño NxN, y se trata de colocar en él N reinas de manera que no se amenacen según las normas del ajedrez. &lt;br /&gt;
&lt;br /&gt;
        proc NReinas (↕[1 . . . i ]: TSolución, ↓N: N, ↑ok: B)&lt;br /&gt;
        variables j&amp;amp;nbsp;: N&lt;br /&gt;
        inicio&lt;br /&gt;
            si i=N entonces ok=CIERTO &lt;br /&gt;
            en otro caso&lt;br /&gt;
                ok=FALSO&lt;br /&gt;
                j=1&lt;br /&gt;
                mientras ¬ok ^ (j≤N) hacer&lt;br /&gt;
                    si EsFactible (R, j) entonces&lt;br /&gt;
                        R[i + 1]= j &lt;br /&gt;
                    NReinas (R, N, ok)&lt;br /&gt;
                    finsi&lt;br /&gt;
                    j=j+1&lt;br /&gt;
                finmientras&lt;br /&gt;
            finsi&lt;br /&gt;
        fin&lt;br /&gt;
&lt;br /&gt;
        func EsFactible (↓R[1 . . . i ]: TSolución, ↓j&amp;amp;nbsp;: N): B&lt;br /&gt;
        variables factible: B&lt;br /&gt;
        inicio&lt;br /&gt;
            factible=CIERTO&lt;br /&gt;
            k=1&lt;br /&gt;
                mientras factible ^ (k≤i) hacer&lt;br /&gt;
                    si (j=R[k])\/(i+1−k= |j−R[k]|) entonces&lt;br /&gt;
                    factible=FALSO&lt;br /&gt;
                    finsi&lt;br /&gt;
                    k=k+1&lt;br /&gt;
                finmientras&lt;br /&gt;
            devolver factible&lt;br /&gt;
         fin&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''Problema de la mochila 0,1''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Dados n elementos e1,e2,...,en con pesos p1,p2,...,pn y beneficios b1,b2,...,bn, y dada una mochila capaz de albergar hasta un máximo de peso M (capacidad de la mochila), queremos encontrar cuáles de los n elementos hemos de introducir en la mochila de forma que la suma de los beneficios de los elementos escogidos sea máxima, sujeto a la restricción de que tales elementos no pueden superar la capacidad de la mochila.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''Problema del laberinto''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Se tiene una matriz bidimensional de nxn casillas para representar un laberinto cuadrado. Cada casilla está marcada como visitada o no visitada. Se debe ir desde la casilla (1,1) a la (n, n) haciendo movimientos horizontales y verticales. &lt;br /&gt;
&lt;br /&gt;
*[[Problema de las parejas]] &lt;br /&gt;
*[[Formación de una palabra con n cubos]] &lt;br /&gt;
*[[Sudoku backtracking|Sudoku]] &lt;br /&gt;
*[[Problema del laberinto]] &lt;br /&gt;
*[[Problema del laberinto con límite]] &lt;br /&gt;
*[[Problema del dominó]] &lt;br /&gt;
*[[Problema de los movimientos de un caballo]] &lt;br /&gt;
*[[Problema del reparto del botín]] &lt;br /&gt;
*[[Problema de la mochila utilizando Vuelta Atrás]] &lt;br /&gt;
*[[Minimización de cableado en placa]] &lt;br /&gt;
*[[Coloreado de grafos]] &lt;br /&gt;
*[[Problema del viajante sobre grafos dirigidos]] &lt;br /&gt;
*[[Las ocho reinas]]&lt;br /&gt;
&lt;br /&gt;
== Backtracking para la enumeración  ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
El problema de la enumeración consiste en encontrar todas las soluciones del problema, es por ello que tendremos que recorrer el árbol de estados al completo. &lt;br /&gt;
&lt;br /&gt;
       Algoritmo de Backtracking para la enumeración:&lt;br /&gt;
&lt;br /&gt;
       proc Bactracking Enum(↕X[1 . . . i ]: TSolución, ↑num: N)&lt;br /&gt;
       variables L: ListaComponentes&lt;br /&gt;
       inicio&lt;br /&gt;
             si EsSolución (X) entonces num   num+1&lt;br /&gt;
                  EscribeSolución (X)&lt;br /&gt;
             en otro caso&lt;br /&gt;
                  L   Candidatos (X) &lt;br /&gt;
                  mientras ¬Vacía (L) hacer  &lt;br /&gt;
                       X[i + 1]   Cabeza (L); L   Resto (L) &lt;br /&gt;
                       BacktrackingEnum (X, num)&lt;br /&gt;
                  finmientras&lt;br /&gt;
             finsi&lt;br /&gt;
       fin&lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
Vuelta atrás se usa en la implementación de los [[Lenguajes de programación]] tales como [[Planner|Lenguaje de programación Planner]] y [[Prolog]]. Además, se usa en los análisis sintácticos de los compiladores. Su uso en [[Inteligencia artificial]] ha sido muy importante, dando lugar a nuevos tipos de búsquedas como el [[A*|A estrella]]. &lt;br /&gt;
&lt;br /&gt;
== Branch &amp;amp;amp; Bound ( Ramificación y poda )  ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Este método busca una solución como en el método de backtracking, pero cada solución tiene asociado un costo y la solución que se busca es una de mínimo costo llamada óptima. Además de ramificar una solución padre (branch) en hijos se trata de eliminar de consideración aquellos hijos cuyos descendientes tienen un costo que supera al óptimo buscado acotando el costo de los descendientes del hijo (bound). La forma de acotar es un arte que depende de cada problema. La acotacion reduce el tiempo de búsqueda de la solución óptima al &amp;quot;podar&amp;quot; (pruning) los subarboles de descendientes costosos. &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Vuelta_atr%C3%A1s_(backtracking)&amp;diff=56151</id>
		<title>Vuelta atrás (backtracking)</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Vuelta_atr%C3%A1s_(backtracking)&amp;diff=56151"/>
		<updated>2010-04-29T19:11:06Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}} &lt;br /&gt;
&lt;br /&gt;
Vuelta Atrás &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Vuelta atrás&amp;quot;, (Backtracking) es una estrategia para encontrar soluciones a problemas que satisfacen restricciones. El término &amp;quot;backtrack&amp;quot; fue acuñado por primera vez por el matemático estadounidense D. H. Lehmer en los años 1950s. &lt;br /&gt;
&lt;br /&gt;
== Concepto  ==&lt;br /&gt;
&lt;br /&gt;
En su forma básica, la idea de backtracking se asemeja a un recorrido en profundidad dentro de un grafo dirigido. El grafo en cuestión suele ser un árbol, o por lo menos no contiene ciclos. Sea cual sea su estructura, existe sólo implícitamente. El objetivo del recorrido es encontrar soluciones para algún problema. Esto se consigue construyendo soluciones parciales a medida que progresa el recorrido; estas soluciones parciales limitan las regiones en las que se puede encontrar una solución completa. El recorrido tiene éxito si, procediendo de esta forma, se puede definir por completo una solución. En este caso el algoritmo puede bien detenerse (si lo único que se necesita es una solución del problema) o bien seguir buscando soluciones alternativas (si deseamos examinarlas todas). Por otra parte, el recorrido no tiene éxito si en alguna etapa la solución parcial construida hasta el momento no se puede completar. En tal caso, el recorrido vuelve atrás exactamente igual que en un recorrido en profundidad, eliminando sobre la marcha los elementos que se hubieran añadido en cada fase. Cuando vuelve a un nodo que tiene uno o más vecinos sin explorar, prosigue el recorrido de una solución. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
                         Algoritmo de Backtracking&lt;br /&gt;
&lt;br /&gt;
                         proc Backtracking (↕X[1 . . . i ]: TSolución, ↑ok: B)&lt;br /&gt;
                         variables L: ListaComponentes&lt;br /&gt;
                         inicio&lt;br /&gt;
                             si EsSolución (X) entonces ok   CIERTO&lt;br /&gt;
                             en otro caso&lt;br /&gt;
                                  ok   FALSO&lt;br /&gt;
                                  L=Candidatos (X)&lt;br /&gt;
                                  mientras ¬ok ^ ¬Vacía (L) hacer&lt;br /&gt;
                                  X[i + 1]   Cabeza (L); L   Resto (L)&lt;br /&gt;
                                  Backtracking (X, ok)&lt;br /&gt;
                                  finmientras&lt;br /&gt;
                             finsi&lt;br /&gt;
                         fin&lt;br /&gt;
&lt;br /&gt;
Podemos visualizar el funcionamiento de una técnica de backtracking como la exploración en profundidad de un grafo. &lt;br /&gt;
&lt;br /&gt;
Cada vértice del grafo es un posible estado de la solución del problema. Cada arco del grafo representa la transición entre dos estados de la solución (i.e., la toma de una decisión). &lt;br /&gt;
&lt;br /&gt;
Típicamente el tamaño de este grafo será inmenso, por lo que no existirá de manera explícita. En cada momento sólo tenemos en una estructura los nodos que van desde el estado inicial al estado actual. Si cada secuencia de decisiones distinta da lugar a un estado diferente, el grafo es un árbol (el árbol de estados). &lt;br /&gt;
&lt;br /&gt;
== Enfoque  ==&lt;br /&gt;
&lt;br /&gt;
Los problemas que deben satisfacer un determinado tipo de restricciones son problemas completos, donde el orden de los elementos de la solución no importa. Estos problemas consisten en un conjunto (o lista) de variables a la que a cada una se le debe asignar un valor sujeto a las restricciones del problema. La técnica va creando todas las posibles combinaciones de elementos para obtener una solución. Su principal virtud es que en la mayoría de las implementaciones se puede evitar combinaciones, estableciendo funciones de acotación (o poda) reduciendo el [[Eficiencia de los algoritmos|tiempo]] de ejecución. &lt;br /&gt;
&lt;br /&gt;
Vuelta atrás está muy relacionado con la [[Búsqueda combinatoria]]. &lt;br /&gt;
&lt;br /&gt;
== Diseño e implementación  ==&lt;br /&gt;
&lt;br /&gt;
Esencialmente, la idea es encontrar la mejor combinación posible en un momento determinado, por eso, se dice que este tipo de algoritmo es una [[Búsqueda en profundidad]]. Durante la búsqueda, si se encuentra una alternativa incorrecta, la búsqueda retrocede hasta el paso anterior y toma la siguiente alternativa. Cuando se han terminado las posibilidades, se vuelve a la elección anterior y se toma la siguiente opción (hijo [si nos referimos a un árbol]). Si no hay más alternativas la búsqueda falla. De esta manera, se crea un árbol implícito, en el que cada nodo es un estado de la solución (solución parcial en el caso de nodos interiores o solución total en el caso de los nodos hoja). &lt;br /&gt;
&lt;br /&gt;
Normalmente, se suele implementar este tipo de algoritmos como un procedimiento [[Recursividad|recursivo]]. Así, en cada llamada al procedimiento se toma una variable y se le asignan todos los valores posibles, llamando a su vez al procedimiento para cada uno de los nuevos estados. La diferencia con la [[Búsqueda en profundidad]] es que se suelen diseñar funciones de cota, de forma que no se generen algunos estados si no van a conducir a ninguna solución, o a una solución peor de la que ya se tiene. De esta forma se ahorra espacio en memoria y tiempo de ejecución. &lt;br /&gt;
&lt;br /&gt;
== Heurísticas  ==&lt;br /&gt;
&lt;br /&gt;
Algunas heurísticas son comúnmente usadas para acelerar el proceso. Como las variables se pueden procesar en cualquier orden, generalmente es más eficiente intentar ser lo más restrictivo posible con las primeras (esto es, las primeras con menores valores posibles). Este proceso poda el [[Árbol (estructura de datos)|árbol de búsqueda]] antes de que se tome la decisión y se llame a la subrutina recursiva. &lt;br /&gt;
&lt;br /&gt;
Cuando se elige qué valor se va a asignar, muchas implementaciones hacen un examen hacia delante (FC, Forward Checking), para ver qué valor restringirá el menor número posible de valores, de forma que se anticipa en a) preservar una posible solución y b) hace que la solución encontrada no tenga restricciones destacadas. &lt;br /&gt;
&lt;br /&gt;
Algunas implementaciones muy sofisticadas usan una función de cotas, que examina si es posible encontrar una solución a partir de una solución parcial. Además, se comprueba si la solución parcial que falla puede incrementar significativamente la eficiencia del algoritmo. Por el uso de estas funciones de cota, se debe ser muy minucioso en su implementación de forma que sean poco costosas computacionalmente hablando, ya que lo más normal es que se ejecuten en para cada nodo o paso del algoritmo. Cabe destacar, que las cotas eficaces se crean de forma parecida a las funciones [[Heurística]]s, esto es, relajando las restricciones para conseguir mayor eficiencia. &lt;br /&gt;
&lt;br /&gt;
Con el objetivo de mantener la solución actual con coste mínimo, los algoritmos vuelta atrás mantienen el coste de la mejor solución en una variable que va variando con cada nueva mejor solución encontrada. Así, si una solución es peor que la que se acaba de encontrar, el algoritmo no actualizará la solución. De esta forma, devolverá siempre la mejor solución que haya encontrado. &lt;br /&gt;
&lt;br /&gt;
== Ejemplos de aplicación de backtracking  ==&lt;br /&gt;
&lt;br /&gt;
SATISFABILITY &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Inicialmente A contiene la expresión booleana que constituye el problema. &lt;br /&gt;
&lt;br /&gt;
Elegir subproblema de A, p.ejemplo&amp;amp;nbsp;: (x+y+z)(x'+y)(y'+z)(z'+x)(x'+y'+z'). &lt;br /&gt;
&lt;br /&gt;
Elegir una cláusula con mínimo número de literales. &lt;br /&gt;
&lt;br /&gt;
Elegir una variable x, y, z,... dentro de la cláusula y crear 2 subproblemas reemplazando x=V y x=F. &lt;br /&gt;
&lt;br /&gt;
En el caso x=V &lt;br /&gt;
&lt;br /&gt;
        Omitir las cláusulas donde aparece x.&lt;br /&gt;
&lt;br /&gt;
        Omitir x' en las cláusulas que aparece x'.&lt;br /&gt;
&lt;br /&gt;
En el caso x=F &lt;br /&gt;
&lt;br /&gt;
        Omitir las cláusulas donde aparece x'.&lt;br /&gt;
&lt;br /&gt;
        Omitir x en las cláusulas que aparece x.&lt;br /&gt;
&lt;br /&gt;
Test &lt;br /&gt;
&lt;br /&gt;
Si no quedan cláusulas. STOP. (solución encontrada). &lt;br /&gt;
&lt;br /&gt;
Si hay una cláusula vacía. DROP. &lt;br /&gt;
&lt;br /&gt;
En otro caso añadir a A &lt;br /&gt;
&lt;br /&gt;
Nota: Observemos que si encontramos a A vacío entonces la expresión booleana no puede ser satisfecha. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; '''HAMILTON CYCLE (VIAJANTE DE COMERCIO)''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
En este caso los subproblemas S son caminos que parten de a y llegan a b a través de un sucesión de nodos T. (b es el mismo a lo largo de todo el algoritmo). &lt;br /&gt;
&lt;br /&gt;
Inicialmente A contiene solamente el camino (a, vacío, b). &lt;br /&gt;
&lt;br /&gt;
Elegimos un subproblema S cualquiera de A (y lo borramos de A) y añadimos ramas (c, a) del grafo (las c's son las adyacentes de a) . Estos caminos extendidos son los hijos. Ahora cada c juega el rol de a. &lt;br /&gt;
&lt;br /&gt;
Examinamos c/ hijo: &lt;br /&gt;
&lt;br /&gt;
Test: &lt;br /&gt;
&lt;br /&gt;
1)Si G-T forma un camino hamiltoniano STOP (solución hallada) &lt;br /&gt;
&lt;br /&gt;
2)Si G-T tiene un nodo de grado uno (excepto a y b) o si G-T-{a, b} es disconexo entonces DROP este subproblema . &lt;br /&gt;
&lt;br /&gt;
3) Si 1) y 2) fallan add subproblema en A. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; '''EXACT COVER''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Dado un conjunto finito U y una familia se subconjuntos {Tj} de U definimos una matriz A donde cada fila se corresponde con un elemento ui de U y cada columna de A con un subconjunto Tj . Ponemos aij=1 si uiU pertenece a Tj y aij=0 en caso contrario. Interpretamos que xj=1 significa que elegimos Tj y 0 en caso contrario. &lt;br /&gt;
&lt;br /&gt;
Se trata de averiguar si es factible Ax=1 donde A y x son binarias y las componentes de 1 son unos. &lt;br /&gt;
&lt;br /&gt;
S0= un vector de ceros (raíz del árbol) &lt;br /&gt;
&lt;br /&gt;
Cada nodo S del árbol es una sucesión x cuyas primeras k componentes le han sido asignados un 1 o un 0 y el resto de componentes son ceros. Reemplazamos S por 2 subproblemas Si (i=1,2) poniendo xk+1 =1 y xk+1=0 respectivamente. &lt;br /&gt;
&lt;br /&gt;
Test &lt;br /&gt;
&lt;br /&gt;
if Ax=1 STOP &lt;br /&gt;
&lt;br /&gt;
if Ax&amp;amp;gt;1 DROP Si &lt;br /&gt;
&lt;br /&gt;
if Ax&amp;amp;lt;1 add Si to A &lt;br /&gt;
&lt;br /&gt;
== Ejemplos de problemas comunes resueltos usando Vuelta Atrás  ==&lt;br /&gt;
&lt;br /&gt;
'''Problema de las N Reinas''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Disponemos de un tablero de ajedrez de tamaño NxN, y se trata de colocar en él N reinas de manera que no se amenacen según las normas del ajedrez. &lt;br /&gt;
&lt;br /&gt;
        proc NReinas (↕[1 . . . i ]: TSolución, ↓N: N, ↑ok: B)&lt;br /&gt;
        variables j&amp;amp;nbsp;: N&lt;br /&gt;
        inicio&lt;br /&gt;
            si i=N entonces ok=CIERTO &lt;br /&gt;
            en otro caso&lt;br /&gt;
                ok=FALSO&lt;br /&gt;
                j=1&lt;br /&gt;
                mientras ¬ok ^ (j≤N) hacer&lt;br /&gt;
                    si EsFactible (R, j) entonces&lt;br /&gt;
                        R[i + 1]= j &lt;br /&gt;
                    NReinas (R, N, ok)&lt;br /&gt;
                    finsi&lt;br /&gt;
                    j=j+1&lt;br /&gt;
                finmientras&lt;br /&gt;
            finsi&lt;br /&gt;
        fin&lt;br /&gt;
&lt;br /&gt;
        func EsFactible (↓R[1 . . . i ]: TSolución, ↓j&amp;amp;nbsp;: N): B&lt;br /&gt;
        variables factible: B&lt;br /&gt;
        inicio&lt;br /&gt;
            factible=CIERTO&lt;br /&gt;
            k=1&lt;br /&gt;
                mientras factible ^ (k≤i) hacer&lt;br /&gt;
                    si (j=R[k])\/(i+1−k= |j−R[k]|) entonces&lt;br /&gt;
                    factible=FALSO&lt;br /&gt;
                    finsi&lt;br /&gt;
                    k=k+1&lt;br /&gt;
                finmientras&lt;br /&gt;
            devolver factible&lt;br /&gt;
         fin&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''Problema de la mochila 0,1''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Dados n elementos e1,e2,...,en con pesos p1,p2,...,pn y beneficios b1,b2,...,bn, y dada una mochila capaz de albergar hasta un máximo de peso M (capacidad de la mochila), queremos encontrar cuáles de los n elementos hemos de introducir en la mochila de forma que la suma de los beneficios de los elementos escogidos sea máxima, sujeto a la restricción de que tales elementos no pueden superar la capacidad de la mochila.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''Problema del laberinto''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Se tiene una matriz bidimensional de nxn casillas para representar un laberinto cuadrado. Cada casilla está marcada como visitada o no visitada. Se debe ir desde la casilla (1,1) a la (n, n) haciendo movimientos horizontales y verticales. &lt;br /&gt;
&lt;br /&gt;
[[Image:Alg5.jpg]] &lt;br /&gt;
&lt;br /&gt;
*[[Problema de las parejas]] &lt;br /&gt;
*[[Formación de una palabra con n cubos]] &lt;br /&gt;
*[[Sudoku backtracking|Sudoku]] &lt;br /&gt;
*[[Problema del laberinto]] &lt;br /&gt;
*[[Problema del laberinto con límite]] &lt;br /&gt;
*[[Problema del dominó]] &lt;br /&gt;
*[[Problema de los movimientos de un caballo]] &lt;br /&gt;
*[[Problema del reparto del botín]] &lt;br /&gt;
*[[Problema de la mochila utilizando Vuelta Atrás]] &lt;br /&gt;
*[[Minimización de cableado en placa]] &lt;br /&gt;
*[[Coloreado de grafos]] &lt;br /&gt;
*[[Problema del viajante sobre grafos dirigidos]] &lt;br /&gt;
*[[Las ocho reinas]]&lt;br /&gt;
&lt;br /&gt;
== Backtracking para la enumeración  ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
El problema de la enumeración consiste en encontrar todas las soluciones del problema, es por ello que tendremos que recorrer el árbol de estados al completo. &lt;br /&gt;
&lt;br /&gt;
       Algoritmo de Backtracking para la enumeración:&lt;br /&gt;
&lt;br /&gt;
       proc Bactracking Enum(↕X[1 . . . i ]: TSolución, ↑num: N)&lt;br /&gt;
       variables L: ListaComponentes&lt;br /&gt;
       inicio&lt;br /&gt;
             si EsSolución (X) entonces num   num+1&lt;br /&gt;
                  EscribeSolución (X)&lt;br /&gt;
             en otro caso&lt;br /&gt;
                  L   Candidatos (X) &lt;br /&gt;
                  mientras ¬Vacía (L) hacer  &lt;br /&gt;
                       X[i + 1]   Cabeza (L); L   Resto (L) &lt;br /&gt;
                       BacktrackingEnum (X, num)&lt;br /&gt;
                  finmientras&lt;br /&gt;
             finsi&lt;br /&gt;
       fin&lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
Vuelta atrás se usa en la implementación de los [[Lenguajes de programación]] tales como [[Planner|Lenguaje de programación Planner]] y [[Prolog]]. Además, se usa en los análisis sintácticos de los compiladores. Su uso en [[Inteligencia artificial]] ha sido muy importante, dando lugar a nuevos tipos de búsquedas como el [[A*|A estrella]]. &lt;br /&gt;
&lt;br /&gt;
== Branch &amp;amp;amp; Bound ( Ramificación y poda )  ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Este método busca una solución como en el método de backtracking, pero cada solución tiene asociado un costo y la solución que se busca es una de mínimo costo llamada óptima. Además de ramificar una solución padre (branch) en hijos se trata de eliminar de consideración aquellos hijos cuyos descendientes tienen un costo que supera al óptimo buscado acotando el costo de los descendientes del hijo (bound). La forma de acotar es un arte que depende de cada problema. La acotacion reduce el tiempo de búsqueda de la solución óptima al &amp;quot;podar&amp;quot; (pruning) los subarboles de descendientes costosos. &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Vuelta_atr%C3%A1s_(backtracking)&amp;diff=56149</id>
		<title>Vuelta atrás (backtracking)</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Vuelta_atr%C3%A1s_(backtracking)&amp;diff=56149"/>
		<updated>2010-04-29T19:09:50Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}} &lt;br /&gt;
&lt;br /&gt;
Vuelta Atrás &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Vuelta atrás&amp;quot;, (Backtracking) es una estrategia para encontrar soluciones a problemas que satisfacen restricciones. El término &amp;quot;backtrack&amp;quot; fue acuñado por primera vez por el matemático estadounidense D. H. Lehmer en los años 1950s. &lt;br /&gt;
&lt;br /&gt;
== Concepto  ==&lt;br /&gt;
&lt;br /&gt;
En su forma básica, la idea de backtracking se asemeja a un recorrido en profundidad dentro de un grafo dirigido. El grafo en cuestión suele ser un árbol, o por lo menos no contiene ciclos. Sea cual sea su estructura, existe sólo implícitamente. El objetivo del recorrido es encontrar soluciones para algún problema. Esto se consigue construyendo soluciones parciales a medida que progresa el recorrido; estas soluciones parciales limitan las regiones en las que se puede encontrar una solución completa. El recorrido tiene éxito si, procediendo de esta forma, se puede definir por completo una solución. En este caso el algoritmo puede bien detenerse (si lo único que se necesita es una solución del problema) o bien seguir buscando soluciones alternativas (si deseamos examinarlas todas). Por otra parte, el recorrido no tiene éxito si en alguna etapa la solución parcial construida hasta el momento no se puede completar. En tal caso, el recorrido vuelve atrás exactamente igual que en un recorrido en profundidad, eliminando sobre la marcha los elementos que se hubieran añadido en cada fase. Cuando vuelve a un nodo que tiene uno o más vecinos sin explorar, prosigue el recorrido de una solución. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
                         Algoritmo de Backtracking&lt;br /&gt;
&lt;br /&gt;
                         proc Backtracking (↕X[1 . . . i ]: TSolución, ↑ok: B)&lt;br /&gt;
                         variables L: ListaComponentes&lt;br /&gt;
                         inicio&lt;br /&gt;
                             si EsSolución (X) entonces ok   CIERTO&lt;br /&gt;
                             en otro caso&lt;br /&gt;
                                  ok   FALSO&lt;br /&gt;
                                  L=Candidatos (X)&lt;br /&gt;
                                  mientras ¬ok ^ ¬Vacía (L) hacer&lt;br /&gt;
                                  X[i + 1]   Cabeza (L); L   Resto (L)&lt;br /&gt;
                                  Backtracking (X, ok)&lt;br /&gt;
                                  finmientras&lt;br /&gt;
                             finsi&lt;br /&gt;
                         fin&lt;br /&gt;
&lt;br /&gt;
Podemos visualizar el funcionamiento de una técnica de backtracking como la exploración en profundidad de un grafo. &lt;br /&gt;
&lt;br /&gt;
Cada vértice del grafo es un posible estado de la solución del problema. Cada arco del grafo representa la transición entre dos estados de la solución (i.e., la toma de una decisión). &lt;br /&gt;
&lt;br /&gt;
Típicamente el tamaño de este grafo será inmenso, por lo que no existirá de manera explícita. En cada momento sólo tenemos en una estructura los nodos que van desde el estado inicial al estado actual. Si cada secuencia de decisiones distinta da lugar a un estado diferente, el grafo es un árbol (el árbol de estados). &lt;br /&gt;
&lt;br /&gt;
== Enfoque  ==&lt;br /&gt;
&lt;br /&gt;
Los problemas que deben satisfacer un determinado tipo de restricciones son problemas completos, donde el orden de los elementos de la solución no importa. Estos problemas consisten en un conjunto (o lista) de variables a la que a cada una se le debe asignar un valor sujeto a las restricciones del problema. La técnica va creando todas las posibles combinaciones de elementos para obtener una solución. Su principal virtud es que en la mayoría de las implementaciones se puede evitar combinaciones, estableciendo funciones de acotación (o poda) reduciendo el [[Eficiencia de los algoritmos|tiempo]] de ejecución. &lt;br /&gt;
&lt;br /&gt;
Vuelta atrás está muy relacionado con la [[Búsqueda combinatoria]]. &lt;br /&gt;
&lt;br /&gt;
== Diseño e implementación  ==&lt;br /&gt;
&lt;br /&gt;
Esencialmente, la idea es encontrar la mejor combinación posible en un momento determinado, por eso, se dice que este tipo de algoritmo es una [[Búsqueda en profundidad]]. Durante la búsqueda, si se encuentra una alternativa incorrecta, la búsqueda retrocede hasta el paso anterior y toma la siguiente alternativa. Cuando se han terminado las posibilidades, se vuelve a la elección anterior y se toma la siguiente opción (hijo [si nos referimos a un árbol]). Si no hay más alternativas la búsqueda falla. De esta manera, se crea un árbol implícito, en el que cada nodo es un estado de la solución (solución parcial en el caso de nodos interiores o solución total en el caso de los nodos hoja). &lt;br /&gt;
&lt;br /&gt;
Normalmente, se suele implementar este tipo de algoritmos como un procedimiento [[Recursividad|recursivo]]. Así, en cada llamada al procedimiento se toma una variable y se le asignan todos los valores posibles, llamando a su vez al procedimiento para cada uno de los nuevos estados. La diferencia con la [[Búsqueda en profundidad]] es que se suelen diseñar funciones de cota, de forma que no se generen algunos estados si no van a conducir a ninguna solución, o a una solución peor de la que ya se tiene. De esta forma se ahorra espacio en memoria y tiempo de ejecución. &lt;br /&gt;
&lt;br /&gt;
== Heurísticas  ==&lt;br /&gt;
&lt;br /&gt;
Algunas heurísticas son comúnmente usadas para acelerar el proceso. Como las variables se pueden procesar en cualquier orden, generalmente es más eficiente intentar ser lo más restrictivo posible con las primeras (esto es, las primeras con menores valores posibles). Este proceso poda el [[Árbol (estructura de datos)|árbol de búsqueda]] antes de que se tome la decisión y se llame a la subrutina recursiva. &lt;br /&gt;
&lt;br /&gt;
Cuando se elige qué valor se va a asignar, muchas implementaciones hacen un examen hacia delante (FC, Forward Checking), para ver qué valor restringirá el menor número posible de valores, de forma que se anticipa en a) preservar una posible solución y b) hace que la solución encontrada no tenga restricciones destacadas. &lt;br /&gt;
&lt;br /&gt;
Algunas implementaciones muy sofisticadas usan una función de cotas, que examina si es posible encontrar una solución a partir de una solución parcial. Además, se comprueba si la solución parcial que falla puede incrementar significativamente la eficiencia del algoritmo. Por el uso de estas funciones de cota, se debe ser muy minucioso en su implementación de forma que sean poco costosas computacionalmente hablando, ya que lo más normal es que se ejecuten en para cada nodo o paso del algoritmo. Cabe destacar, que las cotas eficaces se crean de forma parecida a las funciones [[Heurística]]s, esto es, relajando las restricciones para conseguir mayor eficiencia. &lt;br /&gt;
&lt;br /&gt;
Con el objetivo de mantener la solución actual con coste mínimo, los algoritmos vuelta atrás mantienen el coste de la mejor solución en una variable que va variando con cada nueva mejor solución encontrada. Así, si una solución es peor que la que se acaba de encontrar, el algoritmo no actualizará la solución. De esta forma, devolverá siempre la mejor solución que haya encontrado. &lt;br /&gt;
&lt;br /&gt;
== Ejemplos de aplicación de backtracking  ==&lt;br /&gt;
&lt;br /&gt;
SATISFABILITY &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Inicialmente A contiene la expresión booleana que constituye el problema. &lt;br /&gt;
&lt;br /&gt;
Elegir subproblema de A, p.ejemplo&amp;amp;nbsp;: (x+y+z)(x'+y)(y'+z)(z'+x)(x'+y'+z'). &lt;br /&gt;
&lt;br /&gt;
Elegir una cláusula con mínimo número de literales. &lt;br /&gt;
&lt;br /&gt;
Elegir una variable x, y, z,... dentro de la cláusula y crear 2 subproblemas reemplazando x=V y x=F. &lt;br /&gt;
&lt;br /&gt;
En el caso x=V &lt;br /&gt;
&lt;br /&gt;
        Omitir las cláusulas donde aparece x.&lt;br /&gt;
&lt;br /&gt;
        Omitir x' en las cláusulas que aparece x'.&lt;br /&gt;
&lt;br /&gt;
En el caso x=F &lt;br /&gt;
&lt;br /&gt;
        Omitir las cláusulas donde aparece x'.&lt;br /&gt;
&lt;br /&gt;
        Omitir x en las cláusulas que aparece x.&lt;br /&gt;
&lt;br /&gt;
Test &lt;br /&gt;
&lt;br /&gt;
Si no quedan cláusulas. STOP. (solución encontrada). &lt;br /&gt;
&lt;br /&gt;
Si hay una cláusula vacía. DROP. &lt;br /&gt;
&lt;br /&gt;
En otro caso añadir a A &lt;br /&gt;
&lt;br /&gt;
Nota: Observemos que si encontramos a A vacío entonces la expresión booleana no puede ser satisfecha. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; '''HAMILTON CYCLE (VIAJANTE DE COMERCIO)''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
En este caso los subproblemas S son caminos que parten de a y llegan a b a través de un sucesión de nodos T. (b es el mismo a lo largo de todo el algoritmo). &lt;br /&gt;
&lt;br /&gt;
Inicialmente A contiene solamente el camino (a, vacío, b). &lt;br /&gt;
&lt;br /&gt;
Elegimos un subproblema S cualquiera de A (y lo borramos de A) y añadimos ramas (c, a) del grafo (las c's son las adyacentes de a) . Estos caminos extendidos son los hijos. Ahora cada c juega el rol de a. &lt;br /&gt;
&lt;br /&gt;
Examinamos c/ hijo: &lt;br /&gt;
&lt;br /&gt;
Test: &lt;br /&gt;
&lt;br /&gt;
1)Si G-T forma un camino hamiltoniano STOP (solución hallada) &lt;br /&gt;
&lt;br /&gt;
2)Si G-T tiene un nodo de grado uno (excepto a y b) o si G-T-{a, b} es disconexo entonces DROP este subproblema . &lt;br /&gt;
&lt;br /&gt;
3) Si 1) y 2) fallan add subproblema en A. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; '''EXACT COVER''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Dado un conjunto finito U y una familia se subconjuntos {Tj} de U definimos una matriz A donde cada fila se corresponde con un elemento ui de U y cada columna de A con un subconjunto Tj . Ponemos aij=1 si uiU pertenece a Tj y aij=0 en caso contrario. Interpretamos que xj=1 significa que elegimos Tj y 0 en caso contrario. &lt;br /&gt;
&lt;br /&gt;
Se trata de averiguar si es factible Ax=1 donde A y x son binarias y las componentes de 1 son unos. &lt;br /&gt;
&lt;br /&gt;
S0= un vector de ceros (raíz del árbol) &lt;br /&gt;
&lt;br /&gt;
Cada nodo S del árbol es una sucesión x cuyas primeras k componentes le han sido asignados un 1 o un 0 y el resto de componentes son ceros. Reemplazamos S por 2 subproblemas Si (i=1,2) poniendo xk+1 =1 y xk+1=0 respectivamente. &lt;br /&gt;
&lt;br /&gt;
Test &lt;br /&gt;
&lt;br /&gt;
if Ax=1 STOP &lt;br /&gt;
&lt;br /&gt;
if Ax&amp;amp;gt;1 DROP Si &lt;br /&gt;
&lt;br /&gt;
if Ax&amp;amp;lt;1 add Si to A &lt;br /&gt;
&lt;br /&gt;
== Ejemplos de problemas comunes resueltos usando Vuelta Atrás  ==&lt;br /&gt;
&lt;br /&gt;
'''Problema de las N Reinas''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Disponemos de un tablero de ajedrez de tamaño NxN, y se trata de colocar en él N reinas de manera que no se amenacen según las normas del ajedrez. &lt;br /&gt;
&lt;br /&gt;
        proc NReinas (↕[1 . . . i ]: TSolución, ↓N: N, ↑ok: B)&lt;br /&gt;
        variables j&amp;amp;nbsp;: N&lt;br /&gt;
        inicio&lt;br /&gt;
            si i=N entonces ok=CIERTO &lt;br /&gt;
            en otro caso&lt;br /&gt;
                ok=FALSO&lt;br /&gt;
                j=1&lt;br /&gt;
                mientras ¬ok ^ (j≤N) hacer&lt;br /&gt;
                    si EsFactible (R, j) entonces&lt;br /&gt;
                        R[i + 1]= j &lt;br /&gt;
                    NReinas (R, N, ok)&lt;br /&gt;
                    finsi&lt;br /&gt;
                    j=j+1&lt;br /&gt;
                finmientras&lt;br /&gt;
            finsi&lt;br /&gt;
        fin&lt;br /&gt;
&lt;br /&gt;
        func EsFactible (↓R[1 . . . i ]: TSolución, ↓j&amp;amp;nbsp;: N): B&lt;br /&gt;
        variables factible: B&lt;br /&gt;
        inicio&lt;br /&gt;
            factible=CIERTO&lt;br /&gt;
            k=1&lt;br /&gt;
                mientras factible ^ (k≤i) hacer&lt;br /&gt;
                    si (j=R[k])\/(i+1−k= |j−R[k]|) entonces&lt;br /&gt;
                    factible=FALSO&lt;br /&gt;
                    finsi&lt;br /&gt;
                    k=k+1&lt;br /&gt;
                finmientras&lt;br /&gt;
            devolver factible&lt;br /&gt;
         fin&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''Problema de la mochila 0,1''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Dados n elementos e1,e2,...,en con pesos p1,p2,...,pn y beneficios b1,b2,...,bn, y dada una mochila capaz de albergar hasta un máximo de peso M (capacidad de la mochila), queremos encontrar cuáles de los n elementos hemos de introducir en la mochila de forma que la suma de los beneficios de los elementos escogidos sea máxima, sujeto a la restricción de que tales elementos no pueden superar la capacidad de la mochila.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Problema del laberinto''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Se tiene una matriz bidimensional de nxn casillas para representar un laberinto cuadrado. Cada casilla está marcada como visitada o no visitada. Se debe ir desde la casilla (1,1) a la (n, n) haciendo movimientos horizontales y verticales. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; [[Image:Alg5.jpg]]&lt;br /&gt;
&lt;br /&gt;
*[[Problema de las parejas]] &lt;br /&gt;
*[[Formación de una palabra con n cubos]] &lt;br /&gt;
*[[Sudoku backtracking|Sudoku]] &lt;br /&gt;
*[[Problema del laberinto]] &lt;br /&gt;
*[[Problema del laberinto con límite]] &lt;br /&gt;
*[[Problema del dominó]] &lt;br /&gt;
*[[Problema de los movimientos de un caballo]] &lt;br /&gt;
*[[Problema del reparto del botín]] &lt;br /&gt;
*[[Problema de la mochila utilizando Vuelta Atrás]] &lt;br /&gt;
*[[Minimización de cableado en placa]] &lt;br /&gt;
*[[Coloreado de grafos]] &lt;br /&gt;
*[[Problema del viajante sobre grafos dirigidos]] &lt;br /&gt;
*[[Las ocho reinas]]&lt;br /&gt;
&lt;br /&gt;
== Backtracking para la enumeración  ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
El problema de la enumeración consiste en encontrar todas las soluciones del problema, es por ello que tendremos que recorrer el árbol de estados al completo. &lt;br /&gt;
&lt;br /&gt;
       Algoritmo de Backtracking para la enumeración:&lt;br /&gt;
&lt;br /&gt;
       proc Bactracking Enum(↕X[1 . . . i ]: TSolución, ↑num: N)&lt;br /&gt;
       variables L: ListaComponentes&lt;br /&gt;
       inicio&lt;br /&gt;
             si EsSolución (X) entonces num   num+1&lt;br /&gt;
                  EscribeSolución (X)&lt;br /&gt;
             en otro caso&lt;br /&gt;
                  L   Candidatos (X) &lt;br /&gt;
                  mientras ¬Vacía (L) hacer  &lt;br /&gt;
                       X[i + 1]   Cabeza (L); L   Resto (L) &lt;br /&gt;
                       BacktrackingEnum (X, num)&lt;br /&gt;
                  finmientras&lt;br /&gt;
             finsi&lt;br /&gt;
       fin&lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
Vuelta atrás se usa en la implementación de los [[Lenguajes de programación]] tales como [[Planner|Lenguaje de programación Planner]] y [[Prolog]]. Además, se usa en los análisis sintácticos de los compiladores. Su uso en [[Inteligencia artificial]] ha sido muy importante, dando lugar a nuevos tipos de búsquedas como el [[A*|A estrella]]. &lt;br /&gt;
&lt;br /&gt;
== Branch &amp;amp;amp; Bound ( Ramificación y poda )  ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Este método busca una solución como en el método de backtracking, pero cada solución tiene asociado un costo y la solución que se busca es una de mínimo costo llamada óptima. Además de ramificar una solución padre (branch) en hijos se trata de eliminar de consideración aquellos hijos cuyos descendientes tienen un costo que supera al óptimo buscado acotando el costo de los descendientes del hijo (bound). La forma de acotar es un arte que depende de cada problema. La acotacion reduce el tiempo de búsqueda de la solución óptima al &amp;quot;podar&amp;quot; (pruning) los subarboles de descendientes costosos. &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
	<entry>
		<id>https://www.ecured.cu/index.php?title=Vuelta_atr%C3%A1s_(backtracking)&amp;diff=56146</id>
		<title>Vuelta atrás (backtracking)</title>
		<link rel="alternate" type="text/html" href="https://www.ecured.cu/index.php?title=Vuelta_atr%C3%A1s_(backtracking)&amp;diff=56146"/>
		<updated>2010-04-29T19:08:10Z</updated>

		<summary type="html">&lt;p&gt;Asanto uci: Página creada con '{{Referencia}}   Vuelta Atrás   &amp;quot;Vuelta atrás&amp;quot;, (Backtracking) es una estrategia para encontrar soluciones a problemas que satisfacen restricciones. El término &amp;quot;backtrack&amp;quot; fu…'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Referencia}} &lt;br /&gt;
&lt;br /&gt;
Vuelta Atrás &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Vuelta atrás&amp;quot;, (Backtracking) es una estrategia para encontrar soluciones a problemas que satisfacen restricciones. El término &amp;quot;backtrack&amp;quot; fue acuñado por primera vez por el matemático estadounidense D. H. Lehmer en los años 1950s. &lt;br /&gt;
&lt;br /&gt;
== Concepto  ==&lt;br /&gt;
&lt;br /&gt;
En su forma básica, la idea de backtracking se asemeja a un recorrido en profundidad dentro de un grafo dirigido. El grafo en cuestión suele ser un árbol, o por lo menos no contiene ciclos. Sea cual sea su estructura, existe sólo implícitamente. El objetivo del recorrido es encontrar soluciones para algún problema. Esto se consigue construyendo soluciones parciales a medida que progresa el recorrido; estas soluciones parciales limitan las regiones en las que se puede encontrar una solución completa. El recorrido tiene éxito si, procediendo de esta forma, se puede definir por completo una solución. En este caso el algoritmo puede bien detenerse (si lo único que se necesita es una solución del problema) o bien seguir buscando soluciones alternativas (si deseamos examinarlas todas). Por otra parte, el recorrido no tiene éxito si en alguna etapa la solución parcial construida hasta el momento no se puede completar. En tal caso, el recorrido vuelve atrás exactamente igual que en un recorrido en profundidad, eliminando sobre la marcha los elementos que se hubieran añadido en cada fase. Cuando vuelve a un nodo que tiene uno o más vecinos sin explorar, prosigue el recorrido de una solución. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
                         Algoritmo de Backtracking&lt;br /&gt;
&lt;br /&gt;
                         proc Backtracking (↕X[1 . . . i ]: TSolución, ↑ok: B)&lt;br /&gt;
                         variables L: ListaComponentes&lt;br /&gt;
                         inicio&lt;br /&gt;
                             si EsSolución (X) entonces ok   CIERTO&lt;br /&gt;
                             en otro caso&lt;br /&gt;
                                  ok   FALSO&lt;br /&gt;
                                  L=Candidatos (X)&lt;br /&gt;
                                  mientras ¬ok ^ ¬Vacía (L) hacer&lt;br /&gt;
                                  X[i + 1]   Cabeza (L); L   Resto (L)&lt;br /&gt;
                                  Backtracking (X, ok)&lt;br /&gt;
                                  finmientras&lt;br /&gt;
                             finsi&lt;br /&gt;
                         fin&lt;br /&gt;
&lt;br /&gt;
Podemos visualizar el funcionamiento de una técnica de backtracking como la exploración en profundidad de un grafo. &lt;br /&gt;
&lt;br /&gt;
Cada vértice del grafo es un posible estado de la solución del problema. Cada arco del grafo representa la transición entre dos estados de la solución (i.e., la toma de una decisión). &lt;br /&gt;
&lt;br /&gt;
Típicamente el tamaño de este grafo será inmenso, por lo que no existirá de manera explícita. En cada momento sólo tenemos en una estructura los nodos que van desde el estado inicial al estado actual. Si cada secuencia de decisiones distinta da lugar a un estado diferente, el grafo es un árbol (el árbol de estados). &lt;br /&gt;
&lt;br /&gt;
== Enfoque  ==&lt;br /&gt;
&lt;br /&gt;
Los problemas que deben satisfacer un determinado tipo de restricciones son problemas completos, donde el orden de los elementos de la solución no importa. Estos problemas consisten en un conjunto (o lista) de variables a la que a cada una se le debe asignar un valor sujeto a las restricciones del problema. La técnica va creando todas las posibles combinaciones de elementos para obtener una solución. Su principal virtud es que en la mayoría de las implementaciones se puede evitar combinaciones, estableciendo funciones de acotación (o poda) reduciendo el [[Eficiencia de los algoritmos|tiempo]] de ejecución. &lt;br /&gt;
&lt;br /&gt;
Vuelta atrás está muy relacionado con la [[Búsqueda combinatoria]]. &lt;br /&gt;
&lt;br /&gt;
== Diseño e implementación  ==&lt;br /&gt;
&lt;br /&gt;
Esencialmente, la idea es encontrar la mejor combinación posible en un momento determinado, por eso, se dice que este tipo de algoritmo es una [[Búsqueda en profundidad]]. Durante la búsqueda, si se encuentra una alternativa incorrecta, la búsqueda retrocede hasta el paso anterior y toma la siguiente alternativa. Cuando se han terminado las posibilidades, se vuelve a la elección anterior y se toma la siguiente opción (hijo [si nos referimos a un árbol]). Si no hay más alternativas la búsqueda falla. De esta manera, se crea un árbol implícito, en el que cada nodo es un estado de la solución (solución parcial en el caso de nodos interiores o solución total en el caso de los nodos hoja). &lt;br /&gt;
&lt;br /&gt;
Normalmente, se suele implementar este tipo de algoritmos como un procedimiento [[Recursividad|recursivo]]. Así, en cada llamada al procedimiento se toma una variable y se le asignan todos los valores posibles, llamando a su vez al procedimiento para cada uno de los nuevos estados. La diferencia con la [[Búsqueda en profundidad]] es que se suelen diseñar funciones de cota, de forma que no se generen algunos estados si no van a conducir a ninguna solución, o a una solución peor de la que ya se tiene. De esta forma se ahorra espacio en memoria y tiempo de ejecución. &lt;br /&gt;
&lt;br /&gt;
== Heurísticas  ==&lt;br /&gt;
&lt;br /&gt;
Algunas heurísticas son comúnmente usadas para acelerar el proceso. Como las variables se pueden procesar en cualquier orden, generalmente es más eficiente intentar ser lo más restrictivo posible con las primeras (esto es, las primeras con menores valores posibles). Este proceso poda el [[Árbol (estructura de datos)|árbol de búsqueda]] antes de que se tome la decisión y se llame a la subrutina recursiva. &lt;br /&gt;
&lt;br /&gt;
Cuando se elige qué valor se va a asignar, muchas implementaciones hacen un examen hacia delante (FC, Forward Checking), para ver qué valor restringirá el menor número posible de valores, de forma que se anticipa en a) preservar una posible solución y b) hace que la solución encontrada no tenga restricciones destacadas. &lt;br /&gt;
&lt;br /&gt;
Algunas implementaciones muy sofisticadas usan una función de cotas, que examina si es posible encontrar una solución a partir de una solución parcial. Además, se comprueba si la solución parcial que falla puede incrementar significativamente la eficiencia del algoritmo. Por el uso de estas funciones de cota, se debe ser muy minucioso en su implementación de forma que sean poco costosas computacionalmente hablando, ya que lo más normal es que se ejecuten en para cada nodo o paso del algoritmo. Cabe destacar, que las cotas eficaces se crean de forma parecida a las funciones [[Heurística]]s, esto es, relajando las restricciones para conseguir mayor eficiencia. &lt;br /&gt;
&lt;br /&gt;
Con el objetivo de mantener la solución actual con coste mínimo, los algoritmos vuelta atrás mantienen el coste de la mejor solución en una variable que va variando con cada nueva mejor solución encontrada. Así, si una solución es peor que la que se acaba de encontrar, el algoritmo no actualizará la solución. De esta forma, devolverá siempre la mejor solución que haya encontrado. &lt;br /&gt;
&lt;br /&gt;
== Ejemplos de aplicación de backtracking  ==&lt;br /&gt;
&lt;br /&gt;
SATISFABILITY &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Inicialmente A contiene la expresión booleana que constituye el problema. &lt;br /&gt;
&lt;br /&gt;
Elegir subproblema de A, p.ejemplo&amp;amp;nbsp;: (x+y+z)(x'+y)(y'+z)(z'+x)(x'+y'+z'). &lt;br /&gt;
&lt;br /&gt;
Elegir una cláusula con mínimo número de literales. &lt;br /&gt;
&lt;br /&gt;
Elegir una variable x, y, z,... dentro de la cláusula y crear 2 subproblemas reemplazando x=V y x=F. &lt;br /&gt;
&lt;br /&gt;
En el caso x=V &lt;br /&gt;
&lt;br /&gt;
        Omitir las cláusulas donde aparece x.&lt;br /&gt;
&lt;br /&gt;
        Omitir x' en las cláusulas que aparece x'.&lt;br /&gt;
&lt;br /&gt;
En el caso x=F &lt;br /&gt;
&lt;br /&gt;
        Omitir las cláusulas donde aparece x'.&lt;br /&gt;
&lt;br /&gt;
        Omitir x en las cláusulas que aparece x.&lt;br /&gt;
&lt;br /&gt;
Test &lt;br /&gt;
&lt;br /&gt;
Si no quedan cláusulas. STOP. (solución encontrada). &lt;br /&gt;
&lt;br /&gt;
Si hay una cláusula vacía. DROP. &lt;br /&gt;
&lt;br /&gt;
En otro caso añadir a A &lt;br /&gt;
&lt;br /&gt;
Nota: Observemos que si encontramos a A vacío entonces la expresión booleana no puede ser satisfecha. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; '''HAMILTON CYCLE (VIAJANTE DE COMERCIO)''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
En este caso los subproblemas S son caminos que parten de a y llegan a b a través de un sucesión de nodos T. (b es el mismo a lo largo de todo el algoritmo). &lt;br /&gt;
&lt;br /&gt;
Inicialmente A contiene solamente el camino (a, vacío, b). &lt;br /&gt;
&lt;br /&gt;
Elegimos un subproblema S cualquiera de A (y lo borramos de A) y añadimos ramas (c, a) del grafo (las c's son las adyacentes de a) . Estos caminos extendidos son los hijos. Ahora cada c juega el rol de a. &lt;br /&gt;
&lt;br /&gt;
Examinamos c/ hijo: &lt;br /&gt;
&lt;br /&gt;
Test: &lt;br /&gt;
&lt;br /&gt;
1)Si G-T forma un camino hamiltoniano STOP (solución hallada) &lt;br /&gt;
&lt;br /&gt;
2)Si G-T tiene un nodo de grado uno (excepto a y b) o si G-T-{a, b} es disconexo entonces DROP este subproblema . &lt;br /&gt;
&lt;br /&gt;
3) Si 1) y 2) fallan add subproblema en A. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; '''EXACT COVER''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Dado un conjunto finito U y una familia se subconjuntos {Tj} de U definimos una matriz A donde cada fila se corresponde con un elemento ui de U y cada columna de A con un subconjunto Tj . Ponemos aij=1 si uiU pertenece a Tj y aij=0 en caso contrario. Interpretamos que xj=1 significa que elegimos Tj y 0 en caso contrario. &lt;br /&gt;
&lt;br /&gt;
Se trata de averiguar si es factible Ax=1 donde A y x son binarias y las componentes de 1 son unos. &lt;br /&gt;
&lt;br /&gt;
S0= un vector de ceros (raíz del árbol) &lt;br /&gt;
&lt;br /&gt;
Cada nodo S del árbol es una sucesión x cuyas primeras k componentes le han sido asignados un 1 o un 0 y el resto de componentes son ceros. Reemplazamos S por 2 subproblemas Si (i=1,2) poniendo xk+1 =1 y xk+1=0 respectivamente. &lt;br /&gt;
&lt;br /&gt;
Test &lt;br /&gt;
&lt;br /&gt;
if Ax=1 STOP &lt;br /&gt;
&lt;br /&gt;
if Ax&amp;amp;gt;1 DROP Si &lt;br /&gt;
&lt;br /&gt;
if Ax&amp;amp;lt;1 add Si to A &lt;br /&gt;
&lt;br /&gt;
== Ejemplos de problemas comunes resueltos usando Vuelta Atrás  ==&lt;br /&gt;
&lt;br /&gt;
'''Problema de las N Reinas''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Disponemos de un tablero de ajedrez de tamaño NxN, y se trata de colocar en él N reinas de manera que no se amenacen según las normas del ajedrez. &lt;br /&gt;
&lt;br /&gt;
        proc NReinas (↕[1 . . . i ]: TSolución, ↓N: N, ↑ok: B)&lt;br /&gt;
        variables j&amp;amp;nbsp;: N&lt;br /&gt;
        inicio&lt;br /&gt;
            si i=N entonces ok=CIERTO &lt;br /&gt;
            en otro caso&lt;br /&gt;
                ok=FALSO&lt;br /&gt;
                j=1&lt;br /&gt;
                mientras ¬ok ^ (j≤N) hacer&lt;br /&gt;
                    si EsFactible (R, j) entonces&lt;br /&gt;
                        R[i + 1]= j &lt;br /&gt;
                    NReinas (R, N, ok)&lt;br /&gt;
                    finsi&lt;br /&gt;
                    j=j+1&lt;br /&gt;
                finmientras&lt;br /&gt;
            finsi&lt;br /&gt;
        fin&lt;br /&gt;
&lt;br /&gt;
        func EsFactible (↓R[1 . . . i ]: TSolución, ↓j&amp;amp;nbsp;: N): B&lt;br /&gt;
        variables factible: B&lt;br /&gt;
        inicio&lt;br /&gt;
            factible=CIERTO&lt;br /&gt;
            k=1&lt;br /&gt;
                mientras factible ^ (k≤i) hacer&lt;br /&gt;
                    si (j=R[k])\/(i+1−k= |j−R[k]|) entonces&lt;br /&gt;
                    factible=FALSO&lt;br /&gt;
                    finsi&lt;br /&gt;
                    k=k+1&lt;br /&gt;
                finmientras&lt;br /&gt;
            devolver factible&lt;br /&gt;
         fin&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Problema de la mochila 0,1''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Dados n elementos e1,e2,...,en con pesos p1,p2,...,pn y beneficios b1,b2,...,bn, y dada una mochila capaz de albergar hasta un máximo de peso M (capacidad de la mochila), queremos encontrar cuáles de los n elementos hemos de introducir en la mochila de forma que la suma de los beneficios de los elementos escogidos sea máxima, sujeto a la restricción de que tales elementos no pueden superar la capacidad de la mochila. &lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; [[Image:Alg1.jpg]]&amp;lt;br&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; [[Image:Alg2.jpg]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Problema del laberinto''' &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Se tiene una matriz bidimensional de nxn casillas para representar un laberinto cuadrado. Cada casilla está marcada como visitada o no visitada. Se debe ir desde la casilla (1,1) a la (n, n) haciendo movimientos horizontales y verticales. &lt;br /&gt;
&lt;br /&gt;
             [[Image:Alg4.jpg]]&lt;br /&gt;
           [[Image:Alg5.jpg]]&lt;br /&gt;
&lt;br /&gt;
*[[Problema de las parejas]] &lt;br /&gt;
*[[Formación de una palabra con n cubos]] &lt;br /&gt;
*[[Sudoku backtracking|Sudoku]] &lt;br /&gt;
*[[Problema del laberinto]] &lt;br /&gt;
*[[Problema del laberinto con límite]] &lt;br /&gt;
*[[Problema del dominó]] &lt;br /&gt;
*[[Problema de los movimientos de un caballo]] &lt;br /&gt;
*[[Problema del reparto del botín]] &lt;br /&gt;
*[[Problema de la mochila utilizando Vuelta Atrás]] &lt;br /&gt;
*[[Minimización de cableado en placa]] &lt;br /&gt;
*[[Coloreado de grafos]] &lt;br /&gt;
*[[Problema del viajante sobre grafos dirigidos]] &lt;br /&gt;
*[[Las ocho reinas]]&lt;br /&gt;
&lt;br /&gt;
== Backtracking para la enumeración  ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
El problema de la enumeración consiste en encontrar todas las soluciones del problema, es por ello que tendremos que recorrer el árbol de estados al completo. &lt;br /&gt;
&lt;br /&gt;
       Algoritmo de Backtracking para la enumeración:&lt;br /&gt;
&lt;br /&gt;
       proc Bactracking Enum(↕X[1 . . . i ]: TSolución, ↑num: N)&lt;br /&gt;
       variables L: ListaComponentes&lt;br /&gt;
       inicio&lt;br /&gt;
             si EsSolución (X) entonces num   num+1&lt;br /&gt;
                  EscribeSolución (X)&lt;br /&gt;
             en otro caso&lt;br /&gt;
                  L   Candidatos (X) &lt;br /&gt;
                  mientras ¬Vacía (L) hacer  &lt;br /&gt;
                       X[i + 1]   Cabeza (L); L   Resto (L) &lt;br /&gt;
                       BacktrackingEnum (X, num)&lt;br /&gt;
                  finmientras&lt;br /&gt;
             finsi&lt;br /&gt;
       fin&lt;br /&gt;
&lt;br /&gt;
== Aplicaciones  ==&lt;br /&gt;
&lt;br /&gt;
Vuelta atrás se usa en la implementación de los [[Lenguajes de programación]] tales como [[Planner|Lenguaje de programación Planner]] y [[Prolog]]. Además, se usa en los análisis sintácticos de los compiladores. Su uso en [[Inteligencia artificial]] ha sido muy importante, dando lugar a nuevos tipos de búsquedas como el [[A*|A estrella]]. &lt;br /&gt;
&lt;br /&gt;
== Branch &amp;amp;amp; Bound ( Ramificación y poda )  ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Este método busca una solución como en el método de backtracking, pero cada solución tiene asociado un costo y la solución que se busca es una de mínimo costo llamada óptima. Además de ramificar una solución padre (branch) en hijos se trata de eliminar de consideración aquellos hijos cuyos descendientes tienen un costo que supera al óptimo buscado acotando el costo de los descendientes del hijo (bound). La forma de acotar es un arte que depende de cada problema. La acotacion reduce el tiempo de búsqueda de la solución óptima al &amp;quot;podar&amp;quot; (pruning) los subarboles de descendientes costosos. &lt;br /&gt;
&lt;br /&gt;
[[Category:Algoritmos]]&lt;/div&gt;</summary>
		<author><name>Asanto uci</name></author>
		
	</entry>
</feed>