En aritmética y programación informática , el algoritmo euclidiano extendido es una extensión del algoritmo euclidiano y calcula, además del máximo común divisor (mcd) de los enteros a y b , también los coeficientes de la identidad de Bézout , que son enteros x e y tales que; generalmente se denota como.
Este es un algoritmo certificador , porque el mcd es el único número que puede satisfacer simultáneamente esta ecuación y dividir las entradas. [ 1 ] Permite calcular también, casi sin costo adicional, los cocientes de a y b por su máximo común divisor.
El algoritmo euclidiano extendido también hace referencia a un algoritmo muy similar para calcular el máximo común divisor de un polinomio y los coeficientes de la identidad de Bézout de dos polinomios univariados .
El algoritmo euclidiano extendido resulta especialmente útil cuando a y b son coprimos . En este caso, x es el inverso multiplicativo modular de a módulo b , e y es el inverso multiplicativo modular de b módulo a . De forma similar, el algoritmo euclidiano extendido polinomial permite calcular el inverso multiplicativo en extensiones de cuerpos algebraicos y, en particular, en cuerpos finitos de orden no primo. Por consiguiente, ambos algoritmos euclidianos extendidos se utilizan ampliamente en criptografía . En concreto, el cálculo del inverso multiplicativo modular es un paso esencial en la derivación de pares de claves en el método de cifrado de clave pública RSA .
Descripción
El algoritmo euclidiano estándar procede mediante una sucesión de divisiones euclidianas cuyos cocientes no se utilizan. Solo se conservan los restos . Para el algoritmo extendido, se utilizan los cocientes sucesivos. Más precisamente, el algoritmo euclidiano estándar con a y b como entrada, consiste en calcular una secuenciade cocientes y una secuenciade restos tales que
La principal propiedad de la división euclidiana es que las desigualdades de la derecha definen de forma únicaydey
El cálculo se detiene cuando se alcanza un resto.que es cero; el máximo común divisor es entonces el último resto distinto de cero.
El algoritmo euclidiano extendido procede de manera similar, pero agrega otras dos secuencias, como sigue:
El cálculo también se detiene cuandoy da
- es el máximo común divisor de la entraday
- Los coeficientes de Bézout sonyeso es
- Los cocientes de a y b por su máximo común divisor vienen dados pory(el letreroes opuesto a).
Además, si a y b son ambos positivos y, entonces
paradóndedenota la parte entera de x , es decir, el mayor entero que no es mayor que x .
Esto implica que el par de coeficientes de Bézout proporcionado por el algoritmo euclidiano extendido es el par mínimo de coeficientes de Bézout, al ser el único par que satisface ambas desigualdades anteriores.
También significa que si a y b se ajustan a un tipo de datos entero sin signo , un programa informático puede calcular los coeficientes de Bézout en el tipo entero con signo correspondiente sin desbordamiento de enteros .
Ejemplos
La siguiente tabla muestra cómo procede el algoritmo euclidiano extendido con las entradas 240 y 46. El máximo común divisor es la última entrada no nula, 2, en la columna "resto". El cálculo se detiene en la fila 6, porque el resto en ella es 0. Los coeficientes de Bézout aparecen en las dos últimas columnas de la penúltima fila. De hecho, es fácil verificar que −9 × 240 + 47 × 46 = 2. Finalmente, las dos últimas entradas 23 y −120 de la última fila son, salvo el signo, los cocientes de las entradas 46 y 240 por el máximo común divisor 2 .
El siguiente ejemplo utiliza una notación más compacta. El máximo común divisor deyse puede calcular de esta manera:
dóndeen el primer paso significa quevecesse agrega a(el mcd no cambia al sumar un múltiplo de un número a otro).

Aplicando las sumas de múltiplos indicadas en verde de forma análoga a las ecuaciones, comenzando conyconduce aSegún los cálculos adyacentes (la tabla correspondiente del extremo derecho utiliza operaciones de fila).
Prueba
Desde, la secuenciaes una secuencia estrictamente decreciente de enteros no negativos, paraPor lo tanto, debe detenerse con algunosEsto demuestra que el algoritmo se detiene, eventualmente.
De la ecuaciónresulta que. Como consecuencia,Hasta este punto, la demostración es la misma que la del algoritmo euclidiano clásico.
Las relaciones de recurrencia, para,
puede probarse por inducción. De hecho, parase reducen a
Suponiendo que estén satisfechos por alguna razón, las ecuaciones paraseguir del cálculo
En particular, la ecuaciónmuestra queyson coprimos .
Multiplicandopor, implica que
Por lo tanto,, de donde se deduce quedivide. Como consecuencia, hay un número enterode tal manera que. Dividiendo porla relacióndaPor eso,yson enteros coprimos que son los cocientes deypor un factor común, que es, por lo tanto, su máximo común divisor o su opuesto .
Para probar la última afirmación, supongamos queyson ambos positivos y. Entonces,y siSe puede observar que las secuencias s y t para ( a , b ) bajo el EEA son, salvo los 0 y 1 iniciales, las secuencias t y s para ( b , a ). Las definiciones muestran entonces que el caso ( a , b ) se reduce al caso ( b , a ). Por lo tanto, supongamos quesin pérdida de generalidad .
Se puede observar quees 1 y(que existe por) es un número entero negativo. A partir de entonces, elalternan en signo y aumentan estrictamente en magnitud, lo cual se deduce inductivamente de las definiciones y del hecho de quepara, el casose sostiene porqueLo mismo ocurre con eldespués de los primeros períodos, por la misma razón. Además, es fácil ver que(cuando a y b son ambos positivos y). Por lo tanto, al notar que, obtenemos
Esto, acompañado del hecho de queson mayores o iguales en valor absoluto que cualquier anteriororespectivamente completaron la prueba.
Algoritmo euclidiano extendido polinomial
Para polinomios univariados con coeficientes en un cuerpo , todo funciona de manera similar: división euclidiana, identidad de Bézout y algoritmo euclidiano extendido. La primera diferencia es que, en la división euclidiana y el algoritmo, la desigualdaddebe ser reemplazado por una desigualdad en los gradosPor lo demás, todo lo anterior en este artículo permanece igual, simplemente sustituyendo los números enteros por polinomios.
Una segunda diferencia radica en la cota del tamaño de los coeficientes de Bézout proporcionada por el algoritmo euclidiano extendido, que es más preciso en el caso polinomial, lo que lleva al siguiente teorema.
Si a y b son dos polinomios distintos de cero, entonces el algoritmo euclidiano extendido produce el par único de polinomios ( s , t ) tal que
y
Una tercera diferencia radica en que, en el caso polinómico, el máximo común divisor se define únicamente hasta la multiplicación por una constante distinta de cero. Existen varias maneras de definir de forma inequívoca un máximo común divisor.
En matemáticas, es común requerir que el máximo común divisor sea un polinomio mónico . Para obtener esto, basta con dividir cada elemento de la salida por el coeficiente principal deEsto permite que, si a y b son coprimos, se obtenga 1 en el lado derecho de la desigualdad de Bézout. De lo contrario, se puede obtener cualquier constante distinta de cero. En álgebra computacional , los polinomios suelen tener coeficientes enteros, y esta forma de normalizar el máximo común divisor introduce demasiadas fracciones para resultar práctica.
La segunda forma de normalizar el máximo común divisor en el caso de polinomios con coeficientes enteros es dividir cada salida por el contenido depara obtener un máximo común divisor primitivo . Si los polinomios de entrada son coprimos, esta normalización también proporciona un máximo común divisor igual a 1. La desventaja de este método es que se deben calcular y simplificar muchas fracciones durante el proceso.
Un tercer enfoque consiste en extender el algoritmo de secuencias de pseudorestos subresultantes de una manera similar a la extensión del algoritmo euclidiano al algoritmo euclidiano extendido. Esto permite que, al comenzar con polinomios con coeficientes enteros, todos los polinomios que se calculan tengan coeficientes enteros. Además, cada resto calculadoes un polinomio subresultante . En particular, si los polinomios de entrada son coprimos, entonces la identidad de Bézout se convierte en
dóndedenota la resultante de a y b . En esta forma de la identidad de Bézout, la fórmula no tiene denominador. Si se divide todo por la resultante, se obtiene la identidad de Bézout clásica, con un denominador común explícito para los números racionales que aparecen en ella.
Pseudocódigo
Para implementar el algoritmo descrito anteriormente, cabe destacar que en cada paso solo se necesitan los dos últimos valores de las variables indexadas. Por lo tanto, para ahorrar memoria, cada variable indexada debe reemplazarse por tan solo dos variables.
Para simplificar, el siguiente algoritmo (y los demás algoritmos de este artículo) utiliza asignaciones paralelas . En un lenguaje de programación que no tenga esta característica, las asignaciones paralelas deben simularse con una variable auxiliar. Por ejemplo, la primera,
(old_r, r) := (r, old_r - cociente × r)
es equivalente a
prov := r; r := old_r - cociente × prov; old_r := prov;
y de forma similar para las demás asignaciones paralelas. Esto da como resultado el siguiente código:
función extended_gcd(a, b) (old_r, r) := (a, b) (old_s, s) := (1, 0) (old_t, t) := (0, 1) mientras r ≠ 0 hacer cociente := old_r div r (old_r, r) := (r, old_r − cociente × r) (old_s, s) := (s, old_s − cociente × s) (old_t, t) := (t, old_t − cociente × t) Salida "Coeficientes de Bézout:", (old_s, old_t) Salida "Máximo común divisor:", old_r Salida "Cocientes por el mcd:", (t, s)
Los cocientes de a y b por su máximo común divisor, que se muestran en la salida, pueden tener un signo incorrecto. Esto se corrige fácilmente al final del cálculo, pero no se ha hecho aquí para simplificar el código. Del mismo modo, si a o b es cero y el otro es negativo, el máximo común divisor que se muestra es negativo y se deben cambiar todos los signos de la salida.
Finalmente, observe que en la identidad de Bézout,, uno puede resolverlodado. Por lo tanto, una optimización del algoritmo anterior consiste en calcular solo elsecuencia (que produce el coeficiente de Bézout)), y luego calcularal final:
función extended_gcd(a, b) s := 0; old_s := 1 r := b; old_r := a mientras r ≠ 0 hacer cociente := old_r div r (old_r, r) := (r, old_r − cociente × r) (old_s, s) := (s, old_s − cociente × s) Si b ≠ 0, entonces bezout_t := (old_r − old_s × a) div b; de lo contrario bezout_t := 0 Salida "Coeficientes de Bézout:", (old_s, bezout_t) Salida "Máximo común divisor:", old_r
Sin embargo, en muchos casos esto no es realmente una optimización: mientras que el algoritmo anterior no es susceptible al desbordamiento cuando se usa con enteros de máquina (es decir, enteros con un límite superior fijo de dígitos), la multiplicación de old_s × a en el cálculo de bezout_t puede desbordarse, lo que limita esta optimización a entradas que se pueden representar en menos de la mitad del tamaño máximo. Cuando se usan enteros de tamaño ilimitado, el tiempo necesario para la multiplicación y la división crece cuadráticamente con el tamaño de los enteros. Esto implica que la "optimización" reemplaza una secuencia de multiplicaciones/divisiones de enteros pequeños por una sola multiplicación/división, que requiere más tiempo de cálculo que las operaciones que reemplaza, tomadas en conjunto.
Simplificación de fracciones
Una fracción a / b está en forma simplificada canónica si a y b son coprimos y b es positivo. Esta forma simplificada canónica se puede obtener reemplazando las tres líneas de salida del pseudocódigo anterior por
Si s = 0, entonces imprime "División por cero". Si s < 0, entonces s := − s ; t := − t ( para evitar denominadores negativos ). Si s = 1 , entonces imprime − t ( para evitar denominadores iguales a 1). Imprime − t / s .
La demostración de este algoritmo se basa en el hecho de que s y t son dos enteros coprimos tales que cuando + bt = 0 , y por lo tantoPara obtener la forma simplificada canónica, basta con mover el signo menos para tener un denominador positivo.
Si b divide a de forma exacta, el algoritmo ejecuta solo una iteración y obtenemos s = 1 al final del algoritmo. Este es el único caso en el que el resultado es un número entero.
Cálculo de inversos multiplicativos en estructuras modulares
El algoritmo euclidiano extendido es la herramienta esencial para calcular inversos multiplicativos en estructuras modulares, típicamente los enteros modulares y las extensiones de cuerpos algebraicos . Un ejemplo notable de este último caso son los cuerpos finitos de orden no primo.
Enteros modulares
Si n es un entero positivo, el anillo Z / n Z puede identificarse con el conjunto {0, 1, ..., n -1} de los restos de la división euclidiana por n , la suma y la multiplicación que consisten en tomar el resto dividido por n del resultado de la suma y la multiplicación de enteros. Un elemento a de Z / n Z tiene un inverso multiplicativo (es decir, es una unidad ) si es coprimo con n . En particular, si n es primo , a tiene un inverso multiplicativo si no es cero (módulo n ). Por lo tanto , Z / n Z es un cuerpo si y solo si n es primo.
La identidad de Bézout afirma que a y n son coprimos si y solo si existen enteros s y t tales que
Reduciendo esta identidad módulo n se obtiene
Así , t , o, más exactamente, el resto de la división de t por n , es el inverso multiplicativo de a módulo n .
Para adaptar el algoritmo euclidiano extendido a este problema, cabe señalar que el coeficiente de Bézout de n no es necesario y, por lo tanto, no es preciso calcularlo. Además, para obtener un resultado positivo y menor que n , se puede utilizar el hecho de que el entero t proporcionado por el algoritmo satisface | t | < n . Es decir, si t < 0 , se debe sumar n al final (un ejemplo se puede encontrar en el artículo « Inverso multiplicativo modular »). Esto da como resultado el pseudocódigo , en el que la entrada n es un entero mayor que 1.
función inversa(a, n) t := 0; newt := 1 r := n; nuevor := a mientras que newr ≠ 0 hacer cociente := r div newr (t, newt) := (newt, t − cociente × newt) (r, nuevor) := (nuevor, r − cociente × nuevor) Si r > 1, entonces devuelve "a no es invertible". Si t < 0, entonces t := t + n devolver t
Extensiones de cuerpos algebraicos simples
El algoritmo euclidiano extendido es también la herramienta principal para calcular inversos multiplicativos en extensiones de cuerpos algebraicos simples . Un caso importante, ampliamente utilizado en criptografía y teoría de códigos , es el de cuerpos finitos de orden no primo. De hecho, si p es un número primo y q = p d , el cuerpo de orden q es una extensión algebraica simple del cuerpo primo de p elementos, generada por una raíz de un polinomio irreducible de grado d .
Una extensión algebraica simple L de un cuerpo K , generada por la raíz de un polinomio irreducible p de grado d, puede identificarse con el anillo cociente.y sus elementos están en correspondencia biyectiva con los polinomios de grado menor que d . La suma en L es la suma de polinomios. La multiplicación en L es el resto de la división euclidiana por p del producto de polinomios. Por lo tanto, para completar la aritmética en L , solo queda definir cómo calcular los inversos multiplicativos. Esto se realiza mediante el algoritmo euclidiano extendido.
El algoritmo es muy similar al proporcionado anteriormente para calcular el inverso multiplicativo modular. Hay dos diferencias principales: primero, la penúltima línea no es necesaria, porque el coeficiente de Bézout que se proporciona siempre tiene un grado menor que d . Segundo, el máximo común divisor que se proporciona, cuando los polinomios de entrada son coprimos, puede ser cualquier elemento no nulo de K ; este coeficiente de Bézout (un polinomio generalmente de grado positivo) tiene que multiplicarse por el inverso de este elemento de K. En el pseudocódigo que sigue, p es un polinomio de grado mayor que uno, y a es un polinomio.
función inversa(a, p) t := 0; newt := 1 r := p; newr := a mientras que newr ≠ 0 hacer cociente := r div newr (r, nuevor) := (nuevor, r − cociente × nuevor) (t, newt) := (newt, t − cociente × newt) Si degree(r) > 0 , entonces devuelve "O bien p no es irreducible o bien a es un múltiplo de p". devolver (1/r) × t
Ejemplo
Por ejemplo, si el polinomio utilizado para definir el cuerpo finito GF(2 8 ) es p = x 8 + x 4 + x 3 + x + 1 , y a = x 6 + x 4 + x + 1 es el elemento cuyo inverso se desea, entonces al ejecutar el algoritmo se obtiene el cálculo descrito en la siguiente tabla. Recordemos que en cuerpos de orden 2 n , se tiene − z = z y z + z = 0 para cada elemento z en el cuerpo). Dado que 1 es el único elemento no nulo de GF(2), el ajuste en la última línea del pseudocódigo no es necesario.
Por lo tanto, el inverso es x 7 + x 6 + x 3 + x , como se puede confirmar multiplicando los dos elementos y tomando el resto por p del resultado.
El caso de más de dos números
Se puede abordar el caso de más de dos números de forma iterativa. Primero demostramos quePara probar esto, dejemosPor definición de mcdes un divisor dey. De este modopara algunos. Similarmentees un divisor deentoncespara algunos. Dejar. Mediante nuestra construcción de,pero desdees el mayor divisores una unidad . Y dado queEl resultado está demostrado.
Entonces si entonces hayyde tal manera quepor lo que la ecuación final será
Entonces, para aplicarlo a n números, usamos la inducción.
con las ecuaciones que se derivan directamente.
Véase también
Referencias
- ↑ McConnell, Ross; Mehlhorn, Kurt; Näher, Stefan; Schweitzer, Pascal. "Certifying Algorithms" (PDF) . Consultado el 29 de septiembre de 2024 .
- Knuth, Donald . El arte de la programación informática . Addison-Wesley.Volumen 2, Capítulo 4.
- Thomas H. Cormen , Charles E. Leiserson , Ronald L. Rivest y Clifford Stein . Introducción a los algoritmos , segunda edición. MIT Press y McGraw-Hill, 2001. ISBN 0-262-03293-7Páginas 859 – 861 de la sección 31.2: Máximo común divisor.
Enlaces externos
- Fuente de la forma del algoritmo utilizado para determinar el inverso multiplicativo en GF(2^8)
- Algoritmos de teoría de números
- Euclides