O Algoritmo de Euclides estendido é uma extensão do algoritmo de Euclides, que, além de calcular o máximo divisor comum (MDC) entre fornece os coeficientes tais que
O algoritmo é utilizado, em especial, para o cálculo de inverso modular. Se e são coprimos, então é o inverso modular de módulo e é o inverso modular de módulo Essa propriedade é amplamente utilizada no estudo em Criptografia, mais especificamente, no processo de quebra de chaves privadas do método de encriptação RSA.
Entendendo o algoritmo
O Algoritmo de Euclides nos fornece a seguinte propriedade: na k-ésima iteração, vale que
em que é uma divisão inteira.
O algoritmo acaba quando definindo o resto atual como o máximo divisor comum:
Para estender o algoritmo, queremos também manter a seguinte propriedade:
dessa forma, quando o algoritmo acabar, teremos valores e que satisfazem o teorema de Bézout.
Para isso, assuma que nós temos esses valores para a iteração e para a iteração anterior, ou seja, assuma que já temos os valores que satisfazem as duas igualdades a seguir:
e
então, para o próximo resto, teremos
Ou seja, se a igualdade de Bézout vale para a iteração atual do algoritmo e para a iteração anterior, então, ela vale para a próxima e os valores de Bézout são
e
Perceba que os valores de Bézout também estão sendo totalmente definidos pelos valores das duas últimas iterações do algoritmo.
Dessa forma, para estender o Algoritmo de Euclides original, só precisamos guardar os valores referentes à essas duas sequências ( e ) além da que o original já guarda (a sequência ) e definir valores para que tenhamos igualdades válidas para e para (já que cada sequência é definida em termos de duas iterações anteriores).
No entanto, definir esses valores é fácil: podemos tomar
o que torna válida a igualdade para (ou seja, ) e
o que torna válida a igualdade para (ou seja, )
Um exemplo
Para encontrar o MDC(120,23) usando o Algoritmo de Euclides, vamos efetuando divisões da seguinte forma:
/********************************************** Recebe dois inteiros não negativos a e b* e devolve um vetor cuja primeira posição* é o mdc(a,b), a segunda posição é o valor u* e a terceira o valor v tais que* a*u + b*v = mdc(a,b)**********************************************/functioneuclides(a,b){varr=a;varr1=b;varu=1;varv=0;varu1=0;varv1=1;// variáveis auxiliares para efetuar trocasvarrs,us,vs,q;while(r1!=0){q=parseInt(r/r1);// pega apenas a parte inteirars=r;us=u;vs=v;r=r1;u=u1;v=v1;r1=rs-q*r1;u1=us-q*u;v1=vs-q*v1;}return[r,u,v];// tais que a*u + b*v = r et r = pgcd (a, b)}
Referências
Coutinho, Severino Collier (2005). Números inteiros e criptografia RSA. Rio de Janeiro: IMPA. 226 páginas. ISBN 8524401249
Knuth, D. E. The art of computer programming. Seminumerical algorithms (em inglês). 2 3 ed. [S.l.]: Addilson-Wesley Publishing Company. ISBN 9780201896848