Articulo de referencia

Algoritmo euclidiano extendido

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 en...

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 queaincógnita+by=mcd(a,b){\displaystyle ax+by=\gcd(a,b)}; generalmente se denota comoxgcd(a,b){\displaystyle \operatorname {xgcd} (a,b)}.

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 secuenciaq1,,qk{\displaystyle q_{1},\ldots ,q_{k}}de cocientes y una secuenciar0,,rk+1{\displaystyle r_{0},\ldots ,r_{k+1}}de restos tales que

r0=ar1=bri+1=ri1qiriy0ri+1<|ri|(esto define qi){\displaystyle {\begin{aligned}r_{0}&=a\\r_{1}&=b\\&\,\,\,\vdots \\r_{i+1}&=r_{i-1}-q_{i}r_{i}\quad {\text{y}}\quad 0\leq r_{i+1}<|r_{i}|\quad {\text{(esto define }}q_{i})\\&\,\,\,\vdots \end{aligned}}}

La principal propiedad de la división euclidiana es que las desigualdades de la derecha definen de forma únicaqi{\displaystyle q_{i}}yri+1{\displaystyle r_{i+1}}deri1{\displaystyle r_{i-1}}yri.{\displaystyle r_{i}.}

El cálculo se detiene cuando se alcanza un resto.rk+1{\displaystyle r_{k+1}}que es cero; el máximo común divisor es entonces el último resto distinto de cero.rk.{\displaystyle r_{k}.}

El algoritmo euclidiano extendido procede de manera similar, pero agrega otras dos secuencias, como sigue:

r0=ar1=bs0=1s1=0t0=0t1=1ri+1=ri1qiri0ri+1<|ri|(esto define qi)si+1=si1qisiti+1=ti1qiti{\displaystyle {\begin{aligned}r_{0}&=a&r_{1}&=b\\s_{0}&=1&s_{1}&=0\\t_{0}&=0&t_{1}&=1\\&\,\,\,\vdots &&\,\,\,\vdots \\r_{i+1}&=r_{i-1}-q_{i}r_{i}&{\text{y }}0&\leq r_{i+1}<|r_{i}|&{\text{(esto define }}q_{i}{\text{)}}\\s_{i+1}&=s_{i-1}-q_{i}s_{i}\\t_{i+1}&=t_{i-1}-q_{i}t_{i}\\&\,\,\,\vdots \end{aligned}}}

El cálculo también se detiene cuandork+1=0{\displaystyle r_{k+1}=0}y da

  • rk{\displaystyle r_{k}}es el máximo común divisor de la entradaa=r0{\displaystyle a=r_{0}}yb=r1.{\displaystyle b=r_{1}.}
  • Los coeficientes de Bézout sonsk{\displaystyle s_{k}}ytk,{\displaystyle t_{k},}eso esmcd(a,b)=rk=ask+btk{\displaystyle \gcd(a,b)=r_{k}=as_{k}+bt_{k}}
  • Los cocientes de a y b por su máximo común divisor vienen dados porsk+1=±bmcd(a,b){\displaystyle s_{k+1}=\pm {\frac {b}{\gcd(a,b)}}}ytk+1=amcd(a,b){\displaystyle t_{k+1}=\mp {\frac {a}{\gcd(a,b)}}}(el letrero{\displaystyle \mp }es opuesto a±{\displaystyle \pm }).

Además, si a y b son ambos positivos ymcd(a,b)min(a,b){\displaystyle \gcd(a,b)\neq \min(a,b)}, entonces

|si|b2mcd(a,b)y|ti|a2mcd(a,b){\displaystyle |s_{i}|\leq \left\lfloor {\frac {b}{2\gcd(a,b)}}\right\rfloor \quad {\text{y}}\quad |t_{i}|\leq \left\lfloor {\frac {a}{2\gcd(a,b)}}\right\rfloor }

para0ik,{\displaystyle 0\leq i\leq k,}dóndeincógnita{\displaystyle \lfloor x\rfloor }denota 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 dea=68{\displaystyle a=68}yb=30{\displaystyle b=30}se puede calcular de esta manera:

gramo=gramodod(68,30)(2)=gramodod(8,30)(3){\displaystyle g=\mathrm {gcd} {\underset {\color {Green}\scriptstyle \;\;^{\uparrow }\!\!-\!-\!(-2)}{(68,30)}}=\mathrm {gcd} {\underset {\color {Green}\scriptstyle \!(-3)\!-\!\!-\!^{\uparrow }\;\;}{(8,30)}}}=gramodod(8,6)(1)=gramodod(2,6)(3)=gramodod(2,0)=2,{\displaystyle =\mathrm {gcd} {\underset {\color {Green}\scriptstyle \;^{\uparrow }\!\!-\!\!-\!(-1)\!\!}{(8,\,6)}}=\mathrm {gcd} {\underset {\color {Green}\scriptstyle \!\!(-3)\!-\!\!-\!^{\uparrow }\;}{(2,\,6)}}=\mathrm {gcd} (2,0)=2,}

dónde(2){\displaystyle \color {Green}\scriptstyle \,^{\uparrow }\!\!-\!-\!(-2)}en el primer paso significa que2{\displaystyle -2}veces30{\displaystyle 30}se agrega a68{\displaystyle 68}(el mcd no cambia al sumar un múltiplo de un número a otro).

Algoritmo euclidiano extendido para 𝑔 = mcd(68,30)
Algoritmo euclidiano extendido para 𝑔 = mcd(68,30)

Aplicando las sumas de múltiplos indicadas en verde de forma análoga a las ecuaciones, comenzando cona=1a+0b{\displaystyle a=1a+0b}yb=0a+1b,{\displaystyle b=0a+1b,}conduce agramo=4a9b,{\displaystyle g=4a-9b,}Según los cálculos adyacentes (la tabla correspondiente del extremo derecho utiliza operaciones de fila).

Prueba

Desde0ri+1<|ri|{\displaystyle 0\leq r_{i+1}<|r_{i}|}, la secuenciari{\displaystyle r_{i}}es una secuencia estrictamente decreciente de enteros no negativos, parai2{\displaystyle i\geq 2}Por lo tanto, debe detenerse con algunosrk+1=0{\displaystyle r_{k+1}=0}Esto demuestra que el algoritmo se detiene, eventualmente.

De la ecuaciónri+1=ri1riqi{\displaystyle r_{i+1}=r_{i-1}-r_{i}q_{i}}resulta quemcd(ri1,ri)=mcd(ri,ri+1){\displaystyle \gcd(r_{i-1},r_{i})=\gcd(r_{i},r_{i+1})}. Como consecuencia,mcd(a,b)=mcd(r0,r1)=mcd(rk,rk+1)=mcd(rk,0)=rk{\displaystyle \gcd(a,b)=\gcd(r_{0},r_{1})=\gcd(r_{k},r_{k+1})=\gcd(r_{k},0)=r_{k}}Hasta este punto, la demostración es la misma que la del algoritmo euclidiano clásico.

Las relaciones de recurrencia, parai0{\displaystyle i\geq 0},

{ri=asi+bti(1)i=siti+1tisi+1{\displaystyle {\begin{cases}r_{i}&=as_{i}+bt_{i}\\(-1)^{i}&=s_{i}t_{i+1}-t_{i}s_{i+1}\end{cases}}}

puede probarse por inducción. De hecho, parai=0{\displaystyle i=0}se reducen a

{r0=a=as0+bt01=(1)0=1100=s0t1t0s1{\displaystyle {\begin{cases}r_{0}&=a=as_{0}+bt_{0}\\1&=(-1)^{0}=1\cdot 1-0\cdot 0=s_{0}t_{1}-t_{0}s_{1}\end{cases}}}

Suponiendo que estén satisfechos por alguna razóni{\displaystyle i}, las ecuaciones parai+1{\displaystyle i+1}seguir del cálculo

{ri+1=ri1riqi=(asi1+bti1)(asi+bti)qi=(asi1asiqi)+(bti1btiqi)=asi+1+bti+1(1)i+1=(siti+1tisi+1)=si+1(tiqi+1ti+1)ti+1(siqi+1si+1)=si+1ti+2ti+1si+2{\displaystyle {\begin{cases}r_{i+1}&=r_{i-1}-r_{i}q_{i}=(as_{i-1}+bt_{i-1})-(as_{i}+bt_{i})q_{i}=(as_{i-1}-as_{i}q_{i})+(bt_{i-1}-bt_{i}q_{i})=as_{i+1}+bt_{i+1}\\(-1)^{i+1}&=-(s_{i}t_{i+1}-t_{i}s_{i+1})=s_{i+1}(t_{i}-q_{i+1}t_{i+1})-t_{i+1}(s_{i}-q_{i+1}s_{i+1})=s_{i+1}t_{i+2}-t_{i+1}s_{i+2}\end{cases}}}

En particular, la ecuaciónsiti+1tisi+1=(1)i{\displaystyle s_{i}t_{i+1}-t_{i}s_{i+1}=(-1)^{i}}muestra quesk+1{\displaystyle s_{k+1}}ytk+1{\displaystyle t_{k+1}}son coprimos .

Multiplicando0=rk+1=ask+1+btk+1{\displaystyle 0=r_{k+1}=as_{k+1}+bt_{k+1}}porsk{\displaystyle s_{k}}, implica que

0=ask+1sk+btk+1sk=ask+1sk+b((1)k+tksk+1){\displaystyle 0=as_{k+1}s_{k}+bt_{k+1}s_{k}=as_{k+1}s_{k}+b((-1)^{k}+t_{k}s_{k+1})}

Por lo tanto,b=(1)k+1(tkask)sk+1{\displaystyle b=(-1)^{k+1}(t_{k}-as_{k})s_{k+1}}, de donde se deduce quesk+1{\displaystyle s_{k+1}}divideb{\displaystyle b}. Como consecuencia, hay un número enterod{\displaystyle d}de tal manera queb=dsk+1{\displaystyle b=ds_{k+1}}. Dividiendo porsk+1{\displaystyle s_{k+1}}la relaciónask+1+btk+1=0{\displaystyle as_{k+1}+bt_{k+1}=0}daa=dtk+1.{\displaystyle a=-dt_{k+1}.}Por eso,sk+1{\displaystyle s_{k+1}}ytk+1{\displaystyle -t_{k+1}}son enteros coprimos que son los cocientes dea{\displaystyle a}yb{\displaystyle b}por 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 quea{\displaystyle a}yb{\displaystyle b}son ambos positivos ymcd(a,b)min(a,b){\displaystyle \gcd(a,b)\neq \min(a,b)}. Entonces,ab{\displaystyle a\neq b}y sia<b{\displaystyle a<b}Se 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 quea>b{\displaystyle a>b}sin pérdida de generalidad .

Se puede observar ques2{\displaystyle s_{2}}es 1 ys3{\displaystyle s_{3}}(que existe pormcd(a,b)min(a,b){\displaystyle \gcd(a,b)\neq \min(a,b)}) es un número entero negativo. A partir de entonces, elsi{\displaystyle s_{i}}alternan en signo y aumentan estrictamente en magnitud, lo cual se deduce inductivamente de las definiciones y del hecho de queqi1{\displaystyle q_{i}\geq 1}para1ik{\displaystyle 1\leq i\leq k}, el casoi=1{\displaystyle i=1}se sostiene porquea>b{\displaystyle a>b}Lo mismo ocurre con elti{\displaystyle t_{i}}después de los primeros períodos, por la misma razón. Además, es fácil ver queqk2{\displaystyle q_{k}\geq 2}(cuando a y b son ambos positivos ymcd(a,b)min(a,b){\displaystyle \gcd(a,b)\neq \min(a,b)}). Por lo tanto, al notar que|sk+1|=|sk1|+qk|sk|{\displaystyle |s_{k+1}|=|s_{k-1}|+q_{k}|s_{k}|}, obtenemos |sk+1|=|bmcd(a,b)|2|sk|y|tk+1|=|amcd(a,b)|2|tk|.{\displaystyle |s_{k+1}|=\left|{\frac {b}{\gcd(a,b)}}\right|\geq 2|s_{k}|\qquad {\text{and}}\qquad |t_{k+1}|=\left|{\frac {a}{\gcd(a,b)}}\right|\geq 2|t_{k}|.}

Esto, acompañado del hecho de quesk,tk{\displaystyle s_{k},t_{k}}son mayores o iguales en valor absoluto que cualquier anteriorsi{\displaystyle s_{i}}oti{\displaystyle t_{i}}respectivamente 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 desigualdad0ri+1<|ri|{\displaystyle 0\leq r_{i+1}<|r_{i}|}debe ser reemplazado por una desigualdad en los gradosgradosri+1<gradosri.{\displaystyle \deg r_{i+1}<\deg r_{i}.}Por 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

as+bt=mcd(a,b){\displaystyle as+bt=\gcd(a,b)}

y

gradoss<gradosbgrados(mcd(a,b)),gradost<gradosagrados(mcd(a,b)).{\displaystyle \deg s<\deg b-\deg(\gcd(a,b)),\quad \deg t<\deg a-\deg(\gcd(a,b)).}

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 derk.{\displaystyle r_{k}.}Esto 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 derk,{\displaystyle r_{k},}para 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 calculadori{\displaystyle r_{i}}es un polinomio subresultante . En particular, si los polinomios de entrada son coprimos, entonces la identidad de Bézout se convierte en

as+bt=Res(a,b),{\displaystyle as+bt=\operatorname {Res} (a,b),}

dóndeRes(a,b){\displaystyle \operatorname {Res} (a,b)}denota 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,aincógnita+by=mcd(a,b){\displaystyle ax+by=\gcd(a,b)}, uno puede resolverloy{\displaystyle y}dadoa,b,incógnita,mcd(a,b){\displaystyle a,b,x,\gcd(a,b)}. Por lo tanto, una optimización del algoritmo anterior consiste en calcular solo elsk{\displaystyle s_{k}}secuencia (que produce el coeficiente de Bézout)incógnita{\displaystyle x}), y luego calculary{\displaystyle y}al 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 tantoab=ts{\displaystyle {\frac {a}{b}}=-{\frac {t}{s}}}Para 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

nortes+at=1{\displaystyle ns+at=1}

Reduciendo esta identidad módulo n se obtiene

at1modnorte.{\displaystyle at\equiv 1\mod n.}

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.K[incógnita]/pag,{\displaystyle K[X]/\langle p\rangle ,}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 quemcd(a,b,do)=mcd(mcd(a,b),do){\displaystyle \gcd(a,b,c)=\gcd(\gcd(a,b),c)}Para probar esto, dejemosd=mcd(a,b,do){\displaystyle d=\gcd(a,b,c)}Por definición de mcdd{\displaystyle d}es un divisor dea{\displaystyle a}yb{\displaystyle b}. De este modomcd(a,b)=kd{\displaystyle \gcd(a,b)=kd}para algunosk{\displaystyle k}. Similarmented{\displaystyle d}es un divisor dedo{\displaystyle c}entoncesdo=jd{\displaystyle c=jd}para algunosj{\displaystyle j}. Dejar=mcd(k,j){\displaystyle u=\gcd(k,j)}. Mediante nuestra construcción de{\displaystyle u},d|a,b,do{\displaystyle ud|a,b,c}pero desded{\displaystyle d}es el mayor divisor{\displaystyle u}es una unidad . Y dado qued=mcd(mcd(a,b),do){\displaystyle ud=\gcd(\gcd(a,b),c)}El resultado está demostrado.

Entonces sinortea+metrob=mcd(a,b){\displaystyle na+mb=\gcd(a,b)} entonces hayincógnita{\displaystyle x}yy{\displaystyle y}de tal manera queincógnitamcd(a,b)+ydo=mcd(a,b,do){\displaystyle x\gcd(a,b)+yc=\gcd(a,b,c)}por lo que la ecuación final será

incógnita(nortea+metrob)+ydo=(incógnitanorte)a+(incógnitametro)b+ydo=mcd(a,b,do).{\displaystyle x(na+mb)+yc=(xn)a+(xm)b+yc=\gcd(a,b,c).\,}

Entonces, para aplicarlo a n números, usamos la inducción.

mcd(a1,a2,,anorte)=mcd(a1,mcd(a2,mcd(a3,,mcd(anorte1,anorte))),),{\displaystyle \gcd(a_{1},a_{2},\dots ,a_{n})=\gcd(a_{1},\,\gcd(a_{2},\,\gcd(a_{3},\dots ,\gcd(a_{n-1}\,,a_{n}))),\dots ),}

con las ecuaciones que se derivan directamente.

Véase también

Referencias

  1. McConnell, Ross; Mehlhorn, Kurt; Näher, Stefan; Schweitzer, Pascal. "Certifying Algorithms" (PDF) . Consultado el 29 de septiembre de 2024 .
  • Fuente de la forma del algoritmo utilizado para determinar el inverso multiplicativo en GF(2^8)
Obtenido de " https://en.wikipedia.org/w/index.php?title=Extended_Euclidean_algorithm&oldid=1350359909 "