Pós-graduação em Ciência da Computação – UFU Disciplina – Análise de Algoritmos Profa. Sandra de Amo Exercícios – AULAS 4 e 5 Temas: Congruência, representação de números Exercício 1: Sejam x, y, x’, y’ ϵ Z tais que x ≡ x’ mod n e y ≡ y’ mod n. Mostre que: a) x + y ≡ x’ + y’ mod n b) x.y ≡ x’.y’ mod n Exercício 2: Se a ≡ b mod N e M divide N então a ≡ b mod M Exercício 3: A soma de 3 números binários de 1 dígito tem no máximo 3 digitos. De fato, o maior número binário de 1 dígito é 1, e 1 + 1 + 1 = 3 cuja representação binária é 11 (2 dígitos). O mesmo acontece com a soma de 3 números decimais de 1 dígito: o maior número decimal de 1 dígito é 9, e 9 + 9 + 9 = 27 que é um número de 2 dígitos. Mostrar que em qualquer base b ≥ 2, a soma de 3 números de 1 dígito tem no máximo 2 dígitos. Exercício 4: Seja N um número inteiro natural, k2(N) = tamanho da representação binária de N e k10(N) = tamanho da representação decimal de N. Mostre que k2(N) ≤ 4.k10(N). Exemplo: se N = 1024, k2(1024) = 11 e 4. k10(1024) = 4.4 = 16. Logo k2(1024) ≤4.k10(1024). Temas: Números Primos e noções de teoria dos números. Exercicio 5: Considere o seguinte algoritmo que calcula o quociente e o resto da divisão de dois números x e y: Divide(x,y) Input: dois números x, y de n bits, onde y ≥ 1 Output: O quociente q e o resto r da divisão de x por y 1. 2. 3. 4. 5. 6. If x = 0: return (q,r) = (0,0); (q,r) = divide(chão(x/2),y); q = 2.q, r = 2.r; If x é impar: r = r+1; If r ≥ y: r = r-y , q = q+1; return (q,r) Exercicio 6: Considere o seguinte algoritmo que calcula a exponencial xy mod n Function modexp(x,y,N) Input : dois números inteiros x, N de n bits e y um número inteiro Output: xy mod N 1. 2. 3. 4. If y = 0: return 1 z = modexp(x, chão(y/2),N) if y é par return z2 mod N else return x. z2 mod N Execute o algoritmo modexp passo a passo para calcular 1325 mod 15. Atenção: • Nos passos intermediários, trabalhe com os números mod 15. Por exemplo 132 = 4 mod 15; 133 = 13.4 = 7 mod 15, etc. • Para calcular x mod n utilize o algoritmo divide(x,n): (q,r) = divide(x,n). O número r é x mod n. Exercicio 7. Considere o algoritmo probabilistico de Monte Carlo para determinar se um número n é primo em k tentativas: Primok(n) 1. For i = 1, ..., k 2. Escolhe a, 2 ≤ a ≤ n-1 3. M = modexp(a,n-1,n); 4. Se M ≠ 1 retorna ‘não’ 5. Retorna ‘sim’ a) Se n é primo, qual a probabilidade da resposta de Primok(n) ser correta ? b) Se n é um número de Carmichael, qual a probabilidade da resposta de Primok(n) ser correta ? c) Se n não é primo nem de Carmichael, qual a probabilidade da resposta de Primok(n)ser correta ? (Sugestão: esta probabilidade é igual a 1 – P, onde P é a probabilidade da resposta de Primok(n) ser errada. Calcule P) d) Implemente Primo100(n) e aplique-o para testar a primalidade dos seguintes números: • • • • • • • • • 98717 104297 101701 102073 104727 93943 1105 1729 29341 Os 3 primeiros números são realmente primos. Qual a resposta do algoritmo ? Os 3 números seguintes não são primos. Qual a resposta do algoritmo ? Os 3 últimos números são de Carmichael. Qua a resposta do algoritmo ? Exercicio 8. Mostre que se d divide a e d divide b e d = ax + by para inteiros x, y então necessariamente d = mdc(a,b). Exercício 9. O algoritmo estendido de Euclides para calcular o mdc entre dois números inteiros a, b é o seguinte algoritmo recursivo: Extended-Euclid(a,b) Input: dois inteiros a, b maiores ou iguais a 0 Output: 3 números (d,x,y) tais que d=ax + by e d = mdc(a,b) 1. If b = 0 return (1,0,a) 2. (x’,y’,d) = Extended-Euclid(b, a mod b) 3. return (y’, x’ – chão(a/b).y’, d) a) Aplique o algoritmo estendido de Euclides para calcular mdc(25,11). b) Aplique o algoritmo estendido de Euclides para calcular o inverso de 13 mod 25. Exercício 10. a) Se p é primo, p divide a.b e p não divide a então p divide b b) Se p é primo e p divide a.b então p divide a ou p divide b. Sugestão para (a) qual o mdc(a,p) ? Qual o mdc(pb, ab) ? Utilizar o exercicio 3 que permite escrever o mdc de 2 números como combinação linear destes números. Exercício 11. Seja p um número primo. a) Mostre que todo número x, 1 ≤ x < p é inversível mod p (Sugestão: utilize o teorema de Fermat ou o algoritmo estendido de Euclides – faça das duas maneiras !). Qual o inverso de 15 mod 31 ? b) Existem números x, 1 ≤ x < p, tais que seu inverso é ele próprio ? Quais são estes números ? c) Considere o Teorema de Wilson: p é primo se e somente se (p-1)! ≡ -1 mod p. Assim, diferentemente do Teorema de Fermat, o Teorema de Wilson dá uma condição necessária e suficiente para que um número seja primo. Você acha que poderíamos utilizar este teorema para um teste de primalidade ?