Você está na página 1de 2

Laboratrio 2: algoritmo euclidiano estendido e fatorao

Objetivo: implementao do algoritmo euclidiano estendido.


1. Comearemos revisando o funcionamento do algoritmo euclidiano estendido.
Sejam a e b dois inteiros positivos aos quais desejamos aplicar o algoritmo euclidiano
estendido para obter o mximo divisor comum d entre a e b e inteiros e tais
que d = a + b. A ideia calcular, na i-sima etapa, no apenas o resto ri e o
quociente qi , mas tambm inteiros xi e yi tais que ri = axi + byi . Se o resto nulo
ocorrer na (n + 1)-sima diviso, ento o mximo divisor comum entre a e b ser o
resto anterior, isto rn . Mas,
rn = axn + byn ,

(1)

de modo que podemos tomar = xn e = yn . Portanto, a sada deste algoritmo


ser a lista [d, xn , yn ]. Como vimos na sala de aula, os inteiros xi e yi podem ser
calculados a partir de recorrncias bastante simples. No caso de xi temos que:
x1 = 1,

x0 = 0 e

xi = xi2 qi xi1 para i 1.

e a recorrncia para yi obtida de maneira anloga. Note, entretanto, que no


necessrio calcular yn a partir da recorrncia porque, como conhecemos rn e
xn , ento podemos calcular yn a partir de (1). Antes de passar implementao,
vejamos um exemplo.
2. Se a = 40320 e b = 29687 ento, tabelando os valores de xi , obtemos:
Restos

Quocientes

Restos

Quocientes

40320

427

14

29687

77

67

10633

42

349

8421
2212

2
1

2
3

35
7

1
1

416
765

1785

11

Portanto, o mximo divisor comum 7 e = 765. Logo,


40320 765 + 29687 = 7 de modo que = 1039.
3. No toa que este algoritmo conhecido como euclidiano estendido: tomando
por base o algoritmo euclidiano j implementado, teremos apenas que estendlo acrescentando algumas linhas adicionais ao cdigo para que possa calcular xi .
No livro, na aula e na descrio acima, a notao usada para os valores de x na
inicializao foram x1 e x0 . Como o Python no aceita x1 como varivel,
escreveremos x1 e x2. As alteraes que precisam ser feitas ao algoritmo euclidiano
implementado no laboratrio 2 so as seguintes.
1

Na declarao da funo:
mudar o nome para mdcEstendido;
mudar o tipo da sada para mdc, alfa e beta;
Antes do lao while:
inicializar x1 e x2;
declarar uma nova varivel xtemp com tipo inteiro.
Dentro do lao while:
calcular o quociente da diviso do resto anterior pelo seguinte;
depois do clculo do quociente fazer xtemp = x1-q*x2;
ao final do lao, x1 deve guardar o valor contido em x2 no lao anterior e
x2 deve conter xtemp;
Depois do lao while:
calcular y a partir de a, b, R1 e x1;
retornar R1, x1, y (return R1,x1,y).
Objetivo: implementar o algoritmo de fatorao ingnuo para fatorao de inteiros.
1. Implemente o algoritmo de fatorao ingnuo com uma funo ingenuo, cuja a
entrada um inteiro positivo n e a sada o menor fator de n maior que 1.
2. Implemente um algoritmo de fatorao completo cuja a entrada um inteiro
positivo n e a sada so todos os fatores primos. Exemplo: se n = 350, ento sada
vai ser uma lista com 2, 5, 5, 7 porque 350 = 2 52 7.
Entrega: Um arquivo do qual constem seu cdigo com TODAS as funes
comentadas acima deve ser enviado para o endereo criptografia2016@gmail.com
. Este arquivo deve ser salvo com o nome "Lab3-DRE-NOMEDOALUNO"
no formato .py utilizado pelo Python. Se o trabalho de um laboratrio
foi feito por dois aluno(a)s, o nome de apenas um(a) dele(a)s deve constar do nome do arquivo. Contudo, as primeiras linhas do arquivo devem
conter o nome e DRE de todos que fizeram o trabalho, mesmo no caso
em que o trabalho tenha sido feito individualmente. Lembre-se que no
sero aceitos grupos com mais de dois alunos.

Você também pode gostar