Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Teoria de nu´meros e criptografia RSA Elaine Gouveˆa Pimentel 1o Semestre - 2006 (U´ltima Modificac¸a˜o: 4 de Maio de 2006) 1 Bibliografia e refereˆncias Livro texto: S.C. Coutinho Nu´meros inteiros e criptografia RSA IMPA/SBM, 2000. Outras refereˆncias: • Rosen, K. H., Elementary number theory and its applications, Addison- Wesley,1984. • Koblitz, N. A course in number theory and criptography, Graduate Texts in Mathematics 97, Springer-Verlag, 1987. Ao longo do curso, sera˜o indicadas leituras complementares. Qualquer du´vida ou comenta´rio, escrever para: elaine@mat.ufmg.br 2 Introduc¸a˜o O objetivo desse curso e´ estudar o me´todo de criptografia de chaves pu´blicas conhecido como RSA. Para entender como este me´todo funciona, e´ necessa´rio o estudo de alguns conceitos de uma a´rea da matema´tica chamada Teoria de nu´meros. E, e´ claro, espera-se desenvolver, ao longo do curso, o racioc´ınio lo´gico matema´tico dos alunos, introduzindo me´todos de prova de teoremas como induc¸a˜o matema´tica e demonstrac¸a˜o por absurdo. Deve ficar bem claro que este e´ um curso de matema´tica para cientistas da computac¸a˜o. Isto e´, o rigor nunca sera´ deixado de lado mas a atenc¸a˜o estara´ sempre voltada para a aplicac¸a˜o principal proposta: criptografia RSA. 1 2.1 Criptografia • Criptografia: estuda os me´todos para codificar uma mensagem de modo que so´ seu destinata´rio leg´ıtimo consiga interpreta´-la. • Primo´rdios: Cesar (translac¸a˜o do alfabeto). • Criptoana´lise: arte de decifrar co´digos secretos. • Decodificar x Decifrar (quebrar). • Substituir letras por s´ımbolos - contagem de frequeˆncia: – vogais sa˜o mais frequentes; – letra mais frequente: A; – monoss´ılabo de uma letra = vogal; – consoantes mais frequentes: S e M Me´todo de contagem de frequeˆncia de caracteres pode ser usado para decifrar inscric¸o˜es antigas. • O surgimento dos computadores torna esse me´todo de cifragem completa- mente inseguro (decifragem polinomial). • Internet e criptografia: seguranc¸a, assinatura. • Chave pu´blica: saber codificar na˜o implica saber decodificar! 2.2 Criptografia RSA • RSA: Rivest, Shamir, Adleman (M.I.T.) 1978. • Codificac¸a˜o: basta conhecer o produto de dois primos (n = pq). n e´ chamado chave pu´blica. • Decodificac¸a˜o: precisamos conhecer p e q (chave de decodificac¸a˜o). • Decifrar RSA = fatorac¸a˜o de n. Se n possui 150 algarismos ou mais, fatora´-lo levaria milhares de anos. • Obs: E´ dif´ıcil determinar os fatores primos de um nu´mero composto, mas e´ poss´ıvel verificar se um nu´mero e´ primo ou composto sem tentar fatora´-lo. • Teoria de nu´meros: parte da matema´tica que estuda nu´meros inteiros. 2 2.3 Computac¸a˜o alge´brica • Chave pu´blica do RSA: multiplica-se dois primos muito grandes. • Pascal, C: na˜o permitem lidar com nu´meros dessa magnitude. • Computac¸a˜o alge´brica: trata do ca´lculo exato com inteiros, frac¸o˜es, etc. Exemplo: Mathematica, Maple. • Inteiro de tamanho indeterminado: de tamanho flex´ıvel, grandes o sufi- ciente. Restric¸o˜es: tamanho da memo´ria, estruturas de dados (vetores de tamanhos pre´-fixados). • Inteiros = listas! Algarismos = elemento da lista; operac¸o˜es de soma e multiplicac¸a˜o: usuais, como com la´pis e papel. Divisa˜o e´ mais compli- cado... 3 Algoritmo da divisa˜o de Euclides 3.1 Algoritmos • Algoritmo = processo de ca´lculo baseado em regras formais. • Especificac¸a˜o de um algoritmo: entrada + instruc¸o˜es + sa´ıda. • Perguntas: – ao executarmos um conjunto de instruc¸o˜es, sempre chegaremos a um resultado? (ponto fixo) – o resultado obtido e´ sempre o desejado? (semaˆntica) 3.2 Algoritmo da divisa˜o • Objetivo: encontrar o quociente q e o resto r (sa´ıda) da divisa˜o entre dois inteiros positivos a e b (entrada): a = bq + r 0 ≤ r < b. • Algoritmo da divisa˜o: Etapa 1: q = 0; r = a Etapa 2: Se r < b, pare. Nesse caso, o quociente e´ q e o resto r. Etapa 3: Se r ≥ b, fac¸a r := r − b, q := q + 1 e volte a` Etapa 2. • Observac¸o˜es: 3 1. O algoritmo sempre para: sequeˆncia decrescente de nu´meros inteiros positivos. 2. O resultado da aplicac¸a˜o do algoritmo corresponde a`s especificac¸o˜es da sa´ıda (trivialmente). 3. O algoritmo e´ extremamente ineficiente, em especial se a >> b. 3.3 Teorema da Divisa˜o Teorema 1 (Teorema de divisa˜o) Sejam a e b inteiros positivos. Existem nu´meros inteiros q e r tais que a = bq + r 0 ≤ r < b Ale´m disso, q e r sa˜o u´nicos. Prova . Unicidade - Sejam q, q′, r, r′ tais que a = bq + r 0 ≤ r < b (1) a = bq′ + r′ 0 ≤ r′ < b (2) Subtraindo-se (1) de (2), obtemos: r − r′ = b(q′ − q) Ora, mas 0 ≤ r, r′ < b e portanto 0 ≤ r − r′ < b. Ou seja, 0 ≤ b(q′ − q) < b Como b > 0, temos 0 ≤ q − q′ < 1 ou seja, q − q′ = 0→ q = q′ e r = r′. 3.4 Algoritmo Euclideano • Objetivo: Calcular o mdc entre dois nu´meros inteiros. • Definic¸a˜o: o ma´ximo divisor comum entre a e b e´ o nu´mero d tal que: – d|a (ou d e´ divisor de a) – d|b – se d′ e´ divisor de a e b, enta˜o d′|d (em outras palavras, d e´ o ma´ximo divisor de a e b. 4 • Escrevemos d = mdc(a, b). Se mdc(a, b) = 1, dizemos que a e b sa˜o primos entre si . • Algoritmo Euclideano: Dados dois nu´meros inteiros positivos a e b tais que a ≥ b, divide-se a por b, encontrando resto r1. Se r1 6= 0, dividimos b por r1, obtendo resto r2. Se r2 6= 0, dividimos r1 por r2 e assim por diante. O u´ltimo resto diferente de zero dessa sequeˆncia de diviso˜es e´ o mdc(a, b). • Exemplo: 1234 54 46 8 6 2 46 8 6 2 0 Ou seja, mdc(1234, 54) = 2. • Perguntas: 1. Por que o u´ltimo resto na˜o nulo e´ o mdc? 2. Por que o algoritmo para? • Respostas: a = bq1 + r1 e 0 ≤ r1 < b b = r1q2 + r2 e 0 ≤ r2 < r1 r1 = r2q3 + r3 e 0 ≤ r3 < r2 r2 = r3q4 + r4 e 0 ≤ r4 < r3 ... ... – Segunda pergunta: observe que b > r1 > r2 > . . . ≥ 0 Como essa sequeˆncia e´ finita, o algoritmo sempre para. Mais ainda, o nu´mero de diviso˜es efetuadas e´ no ma´ximo b (por que?). – Primeira pergunta: demonstrac¸a˜o do algoritmo euclideano 3.5 Demonstrac¸a˜o do algoritmo euclideano Lema 2 Sejam a e b nu´meros inteiros positivos. Se existem inteiros g e s tais que a = bg + s, enta˜o mdc(a, b) = mdc(b, s). Prova . Sejam d1 = mdc(a, b) e d2 = mdc(b, s). 5 Afirmamos que d1 ≤ d2. De fato, d1 e´ o ma´ximo divisor de a e b. Logo d1 divide a e b e portanto existem inteiros positivos u e v tais que: a = d1u eb = d1v Substituindo a e b na equac¸a˜o a = bg + s obtemos s = d1u− d1v = d1(u− vg). Ou seja, d1 divide s. Como d1 tambe´m divide b, d1 e´ um divisor comum de b e s. Mas d2 e´ o maior divisor de b e s e portanto (por definic¸a˜o) d1 ≤ d2 como quer´ıamos. Seguindo um argumento semelhante, podemos provar o inverso, ou seja, d2 ≤ d1. Em outras palavras, d1 = d2 Teorema 3 Dados a e b inteiros positivos, o u´ltimo resto diferente de zero da sequeˆncia de diviso˜es dada pelo algoritmo euclideano para a e b e´ o ma´ximo divisor comum entre a e b. Prova . Aplicando o algoritmo a a e b, temos: a = bq1 + r1 e 0 ≤ r1 < b b = r1q2 + r2 e 0 ≤ r2 < r1 r1 = r2q3 + r3 e 0 ≤ r3 < r2 r2 = r3q4 + r4 e 0 ≤ r4 < r3 ... ... rn−2 = rn−1qn e rn = 0 Da u´ltima linha, temos que rn−1 divide rn−2 e portantomdc(rn−1, rn−2) = rn−1. Aplicando sucessivamente o lema 2, temos que mdc(a, b) = rn−1. 3.6 Algoritmo euclideano estendido O resultado que mais vamos usar durante o curso sobre mdc e´ o seguinte: Teorema 4 Sejam a e b inteiros positivos e seja d o ma´ximo divisor comum entre a e b. Esxistem inteiros α e β tais que α.a+ β.b = d. Para demonstrac¸a˜o desse teorema, veja o livro texto, pag 29-31. Vamos ilustrar a demonstrac¸a˜o atrave´s de um exemplo nume´rico: 6 Exemplo 1 Sejam a = 1234 e b = 54. Temos que: 1234 = 54.22 + 46 ou seja, 46 = 1234− 54.22 Seguindo pelo algoritmo de euclides, 54 = 46.1 + 8 ou seja, 8 = 54− 46.1 Agora, observe que sabemos calcular 46 em func¸a˜o de 1234 e 54. Enta˜o, substi- tuindo: 8 = 54−46.1 = 54−(1234−54.22).1 = 54(1+22.1)+1234.(−1) = 54.(23)+1234.(−1) Continuando, 46 = 8.5 + 6 → 6 = 46− 8.5 = (1234− 54.22)− (54.(23) + 1234.(−1)).5 = 1234.(6) + 54.(−22− (23).5) = 1234.(6) + 54.(−137) 8 = 6.1 + 2 → 2 = 8− 6 = (54.(23) + 1234.(−1))− (1234.(6) + 54.(−137)) = 1234(−1− 6) + 54(23 + 137) = 1234(−7) + 54(160) Logo, α = −7 e β = 160 uma vez que mdc(1234, 54) = 2. Observe que o teorema na˜o diz que os valores de α e β sa˜o u´nicos. Na verdade, existe uma infinidade de nu´meros que satisfazem a equac¸a˜o αa+ βb = d. Pergunta: para que serve calcular α e β? Resposta: • unicidade de fatorac¸a˜o de um inteiro; • RSA depende de um me´todo eficiente de ca´lculo de α e β. 3.7 Exerc´ıcios propostos Na˜o deixem de fazer os seguintes exerc´ıcios do cap´ıtulo 1: 1(1), 4, 5, 7, 8, 9. 7 4 Fatorac¸a˜o u´nica 4.1 Teorema da fatorac¸a˜o u´nica Dizemos que um nu´mero inteiro positivo p e´ primo se p 6= 1 e os u´nicos divisores de p sa˜o p e 1. Se um nu´mero inteiro positivo (diferente de 1) na˜o e´ primo, enta˜o ele e´ chamado de composto . Teorema 5 (Teorema da fatorac¸a˜o u´nica) Dado um inteiro positivo n ≥ 2 podemos sempre escreveˆ-lo, de maneira u´nica, na forma: n = pe11 . . . . .p ek k onde 1 < p1 < p2 < . . . < pk sa˜o nu´meros primos e e1, . . . , ek sa˜o inteiros positivos (multiplicidades). 4.2 Existeˆncia da fatorac¸a˜o Algoritmo ingeˆnuo: Dado n ≥ 2 inteiro positivo, tente dividir n por cada um dos inteiros de 2 a n− 1. Se algum desses inteiros (digamos k) dividir n, enta˜o achamos um fator de n. Perguntas: 1. k e´ primo ou composto? 2. Quando se deve parar a busca? Em n− 1? Respostas: 1. k e´ primo. De fato, suponhamos k composto. Logo, k = a.b com 1 < a, b < k. Como k divide n, existe (por definic¸a˜o) c inteiro tal que n = k.c. Logo, n = a.b.c ou seja, a e b sa˜o fatores de n menores que k, o que contraria a hipo´tese da minimalidade de k. Logo, k e´ primo. 2. Na verdade, podemos parar o algoritmo em √ n. De fato, n = k.c ou c = n k . Como k e´ o menor fator de n, k ≤ c. Logo, k ≤ n k ou seja, k2 ≤ n→ k ≤ √n. Podemos utilizar o algoritmo acima para achar todos os fatores primos de n. Aplicando o algoritmo uma vez, encontramos o fator q1. Enta˜o, aplicamos o 8 algoritmo ao nu´mero n q1 , determinando q2, o segundo fator primo de n. Para determinar o terceiro fator primo q3, aplicamos o algoritmo ao nu´mero n q1.q2 e assim por diante, ate´ chegarmos em n q1.q2.....qs−1 = qs, com qs primo. Observe que q1 ≤ q2 ≤ . . . ≤ qs−1 ≤ qs e n > n q1 > n q1.q2 > . . . > n q1.q2. . . . .qs > 0, ou seja, o algoritmo sempre termina. Exemplo 2 n = 450 = 2.3.3.5.5 4.3 Eficieˆncia do algoritmo ingeˆnuo de fatorac¸a˜o O algoritmo e´ simples mas muito ineficiente! Exemplo 3 Seja n um nu´mero primo com 100 ou mais algarismos. Logo, n ≥ 10100 e portanto √n ≥ 1050. Logo temos que executar pelo menos 1050 loops para determinar que n e´ primo. Suponhamos que o nosso computador execute 1010 diviso˜es por segundo. Logo levaremos 10 50 1010 = 10 40 segundos, ou seja, 1031 anos na frente da tela do computador aguardando... Observe que o tempo estimado de existeˆncia do universo e´ 1011 anos! O algoritmo e´ bom para nu´meros pequenos. E´ importante ressaltar que na˜o existe (atualmente) algoritmo de fatorac¸a˜o eficiente para todos os inteiros . Disso depende a seguranc¸a do RSA! Na˜o se sabe, entretanto, se tal algoritmo na˜o existe mesmo ou se na˜o fomos espertos o suficiente para inventa´-lo... 4.4 Fatorac¸a˜o por Fermat • Eficiente quando n tem um fator primo na˜o muito menor que √n. • Ide´ia: tentar achar nu´meros inteiros positivos x e y tais que n = x2 − y2. • Caso mais fa´cil: n = r2 (x = r e y = 0). • Se y > 0, enta˜o x = √ n+ y2 > √ n Notac¸a˜o: escrevemos [r] como a parte inteira do nu´mero real r. Algoritmo de Fermat: Etapa 1: Fac¸a x = [ √ n]; se n = x2, pare. 9 Etapa 2: Incremente x de uma unidade e calcule y = √ x2 − n. Etapa 3: Repita a etapa 2 ate´ encontrar um valor inteiro para y, ou ate´ que x = n+12 . No primeiro caso, n tem fatores x+ y e x− y; no segundo, n e´ primo. Exemplo 4 Seja n = 1342127. Temos que x = 1158. Mas x2 = 11582 = 1340964 < 1342127 Logo, passamos a incrementar x ate´ que √ x2 − n seja inteiro ou x = n+12 , que nesse caso vale 671064: x √ x2 − n 1159 33, 97 1160 58, 93 1161 76, 11 1162 90, 09 1163 102, 18 1164 113 Logo, x = 1164 e y = 113. Os fatores procurados sa˜o x+y = 1277 e x−y = 1051. Faremos aqui apenas a demonstrac¸a˜o de que, se n e´ primo, enta˜o o u´nico valor poss´ıvel para x e´ x = n+12 . Relembrando, x e y sa˜o inteiros positivos tais que n = x2 − y2. Ou seja, n = (x− y)(x+ y) Como estamos supondo n primo, temos que x− y = 1 e x+ y = n. Logo, x = 1 + n 2 e y = n− 1 2 como quer´ıamos. Veja a demonstrac¸a˜o completa do algoritmo no livro texto, pa´ginas 41 a 43. Observac¸a˜o: Esse algoritmo diz algo importante sobre o RSA. Se escolhermos p e q muito pro´ximos, enta˜o n = p.q e´ facilmente fatora´vel pelo algoritmo de Fermat. 4.5 Propriedade fundamental dos primos Lema 6 Sejam a, b, c inteiros positivos e suponhamos que a e b sa˜o primos entre si. Enta˜o: 1. Se b divide o produto a.c enta˜o b divide c. 10 2. Se a e b dividem c enta˜o o produto a.b divide c. Prova mdc(a, b) = 1. Pelo Algoritmo euclideano estendido, existem α e β tais que α.a+ β.b = 1 Enta˜o, α.a.c+ β.b.c = c Como b divide a.c pela hipo´tese (1) e como b divide β.b.c, enta˜o b divide c. Para provar a segunda afirmativa, se a divide c, podemos escrever c = at para algum inteiro t. Mas b tambe´m divide c. Como mdc(a, b) = 1, pela afirmac¸a˜o (1), b divide t. Logo, t = b.k para algum inteiro k e portanto, c = a.t = a.b.k Podemos usar o lema acima para provar se seguinte propriedade: Propriedade fundamental dos primos Seja p um primo e a e b inteiros positivos. Se p divide o produto a.b, enta˜o p divide a ou p divide b. A demonstrac¸a˜o fica como exerc´ıcio (fac¸am!). 4.6 Unicidade A prova de unicidade da fatorac¸a˜o de nu´meros primos decorre facilmente da propriedade fundamental dos primos. A demonstrac¸a˜o se da´ por absurdo. Seja n o menor inteiro positivo que admite duas fatorac¸o˜es distintas. Podemos escrever: n = pe11 . . . . .p ek k = q r1 1 . . . . .q rs s onde p1 < p2 < . . . < pk e q1 < q2 < . . . < qs sa˜o primos e e1, . . . , ek, r1, . . . , rs sa˜o inteiros positivos. Como p1 divide n, pela propriedade fundamental dos primos p1 deve dividir um dos fatores do produto da direita. Mas um primo so´ pode dividir outro se forem iguais. Enta˜o p1 = qj para algum j entre 1 e s. Logo, n = pe11 . . . . .p ek k = q r1 1 . . . . .q rj j . . . . .q rs s = qr11 . . . . .p rj 1 . . . . .q rs s Podemos enta˜o cancelar p1 que aparece em ambos os lados da equac¸a˜o, obtendo m = pe1−11 . . . . .p ek k = q r1 1 . . . . .p rj−1 1 . . . . .q rs s onde m e´ um nu´mero menor que n que apresenta duas fatorac¸o˜es distintas. ABSURDO pois isso contraria a minimalidade de n. 11 4.7 Exerc´ıcios propostos 1. Prove a propriedade fundamental dos primos. 2. Demonstre que, se p e´ um nu´mero primo, enta˜o √ p e´ um nu´mero irracional. 3. Livro texto: 2, 4, 5, 8, 11, 12. 5 Nu´meros primos Ate´ agora: • propriedades ba´sicas dos nu´meros inteiros; • dois algoritmos fundamentais; Nessa sec¸a˜o, discutiremos me´todos ingeˆnuos para encontrar primos. 5.1 Fo´rmulas Polinomiais Considere o polinoˆmio: f(x) = an.x n + an−1.x n−1 + . . .+ a1.x+ a0 onde an, an−1, . . . , a1, a0 sa˜o nu´meros inteiros e que satisfaz a condic¸a˜o: f(m) e´ primo, para todo inteiro positivo m Exemplo 5 Seja f(x) = x2 + 1 Logo, x f(x) 1 2 2 5 3 10 4 17 5 26 6 37 7 50 8 65 9 82 2 5 • x ı´mpar → f(x) par; • f(8) = 65 composto... 12 A pergunta que surge enta˜o e´: isso e´ fruto do azar? Teorema 7 Dado um polinoˆmio f(x) com coeficientes inteiros, existe uma in- finidade de inteiros positivos m tais que f(m) e´ composto. Prova . Vamos Provar o teorema apenas no caso em que o polinoˆmio tem grau 2. Ou seja, consideraremos f do tipo: f(x) = a.x2 + b.x+ c Podemos supor a > 0. Suponhamos que exista m tal que f(m) = p onde p e´ primo. Calculando f(m+ hp): f(m+ hp) = a(m+ hp)2 + b(m+ hp) + c = (am2 + bm+ c) + p(2amh+ aph2 + bh) = p(1 + 2amh+ aph2 + bh) Ou seja, se 1+2amh+aph2+bh e´ composto enta˜o f(m+hp) tambe´m e´ composto. Mas isso e´ verdade sempre que 1 + 2amh+ aph2 + bh > 1 ou seja, se 2amh+ aph2 + bh = h.(2am+ aph+ b) > 0 Como podemos sempre tomar h positivo, temos: 2am+ aph+ b > 0→ h > −b− 2am a.p Existe uma infinidade de nu´meros dessa forma. Logo, se existe inteiro m tal que f(m) e´ primo, enta˜o existe uma infinidade de tais nu´meros. Conclusa˜o: na˜o existe uma fo´rmula polinomial (em uma varia´vel) para primos . 5.2 Fo´rmulas exponenciais: nu´meros de Mersenne • Nu´meros de Mersenne sa˜o aqueles da forma: M(n) = 2n − 1 onde n e´ um inteiro na˜o negativo. • Nu´meros perfeitos sa˜o aqueles iguais a` metade da soma de seus divi- sores. Ex: 6 = 12/2 e 12 = 1 + 2 + 3 + 6 13 • Nenhum primo e´ perfeito. • Resultado: 2n−1.(2n − 1) e´ perfeito se 2n − 1 e´ primo. • Outro resultado: Todo nu´mero perfeito par possui a forma acima. Ex: 6 = 22−1(22 − 1) • O que na˜o se sabe: se existem nu´meros perfeitos ı´mpares. • Pergunta: Quais sa˜o os nu´meros de Mersenne primos? Exemplos: quando n = 2, 3, 5, 7, 13, 17, 19, 31, 61.... Observe que os expoentes sa˜o todos pri- mos, mas nem todos primos fazem parte dessa lista. Por exemplo, M(11) = 2047 = 23.89 5.3 Fo´rmulas exponenciais: nu´meros de Fermat • Nu´meros de Fermat sa˜o aqueles da forma: F (n) = 22 n + 1 onde n e´ um inteiro na˜o negativo. • Exemplos de nu´meros de Fermat primos: n = 0, 1, 2, 3, 4. F (5) = 18446744073709551617 e´ composto! • Poucos primos de Fermat sa˜o conhecidos.Ate´ hoje, na˜o se descobriu nen- hum F (n) primo com n ≥ 5. 5.4 Fo´rmulas fatoriais Seja p um primo positivo. Construiremos uma func¸a˜o semelhante ao fatorial, so´ que apenas os primos sa˜o multiplicados. Vamos chama´-la de p#. Ou seja, p# e´ o produto de todos os primos menores ou iguais a p. Ex: 5# = 2.3.5 = 30 Observe que se p e q sa˜o primos sucessivos, enta˜o p# = q#.p Estaremos interessados nos nu´meros da forma p# + 1. Embora p# + 1 nem sempre seja primo (Ex. 13# + 1 = 30031 = 59.509), podemos mostrar que na˜o tem nenhum fator primo menor ou igual a p. Desta forma, temos um algoritmo para calcular primo. Pergunta: qual e´ o problema de tal algoritmo? Observac¸a˜o final: p# + 1 quase nunca e´ primo! 14 5.5 Infinidade de primos Teorema 8 Existem uma infinidade de primos Prova . Digamos que exista uma quantidade finita de primos: {p1, p2, . . . , pk} Podemos supor que esses primos esta˜o ordenados, de modo que pk e´ o maior deles. Considere o nu´mero p#k +1. Como vimos, esse nu´mero possui fator primo maior que pk. ABSURDO! 5.6 Crivo de Erato´stenes O crivo de Erato´stenes e´ o mais antigo dos me´todos para encontrar primos. Etapa 1: Listamos os nu´meros ı´mpares de 3 a n. Etapa 2: Procure o primeiro nu´mero k da lista. Risque os demais nu´meros da lista, de k em k. Etapa 3: Repita a etapa 2 ate´ chegar em n. Observac¸o˜es: 1. Podemos parar em √ n... 2. Podemos comec¸ara riscar a partir de k2... 5.7 Crivo de Erato´stenes revisado Etapa 1: Crie um vetor v de n−12 posic¸o˜es, preenchidas com o valor 1; fac¸a P = 3. Etapa 2: Se P 2 > n, escreva os nu´meros 2j + 1 para os quais a j-e´sima entrada de v e´ 1 e pare; Etapa 3: Se a posic¸a˜o (P−1)2 de v esta´ preenchida com 0 incremente P de 2 e volte a` Etapa 2. Etapa 4: Atribua o valor P 2 a uma nova varia´vel T ; substitua por zero o valor da posic¸a˜o (T−1)2 e incremente T de 2P ; repita ate´ que T > n; incremente P de 2 e volte a` Etapa 2. 15 5.8 Exerc´ıcios propostos 1. Entenda e implemente o algoritmo da pag 65 do livro texto. 2. Livro texto: 1, 3 a 7, 8 e 10. 6 Aritme´tica modular Aritme´tica modular = aritme´tica dos fenoˆmenos c´ıclicos. Exemplos: Horas, dias do meˆs, letras do alfabeto, etc. 6.1 Relac¸o˜es de equivaleˆncia Seja X um conjunto e ∼ uma relac¸a˜o entre elementos de X . Dizemos que ∼ e´ uma relac¸a˜o de equivaleˆncia se, para todos x, y, z ∈ X : Reflexiva x ∼ x. Sime´trica Se x ∼ y enta˜o y ∼ x. Transitiva Se x ∼ y e y ∼ z enta˜o x ∼ z. Exemplos: • < nos inteiros na˜o satisfaz reflexividade; • ≤ nos inteiros satisfaz reflexividade, mas na˜o satisfaz simetria; • 6= e´ reflexiva, sime´trica mas na˜o transitiva; • relac¸a˜o de equivaleˆncia: = nos nu´meros inteiros. Relac¸o˜es de equivaleˆncia: sa˜o usadas para classificar os elementos de um con- junto em subconjuntos com propriedades semelhantes. As subdiviso˜es de um conjunto produzidas por uma relac¸a˜o de equivaleˆncia sa˜o conhecidas como classes de equivaleˆncia. Formalmente, seja X um conjunto e ∼ uma r.e. definida em X . Se x ∈ X enta˜o a classe de equivaleˆncia de x e´ o conjunto de elementos de X que sa˜o equivalentes a x por ∼. Denotamos: x = {y ∈ X : y ∼ x}. Propriedades: • Qualquer elemento de uma classe de equivaleˆncia e´ um representante de toda a classe. 16 • X e´ a unia˜o de todas as classes de equivaleˆncia. • Duas classes de equivaleˆncia distintas na˜o podem ter um elemento em comum. O conjunto das classes de equivaleˆncia de ∼ em X e´ chamado de conjunto quociente de X por ∼. Observe que os elementos do conjunto quociente sa˜o subconjuntos de X . Isto e´, o conjunto quociente na˜o e´ um subcojunto de X , mas um subconjunto das partes de X . 6.2 Inteiros mo´dulo n Vamos construir uma relac¸a˜o de equivaleˆncia no conjunto dos inteiros. Digamos que, pulando de n em n, todos os inteiros sa˜o equivalentes. Ou melhor: dois inteiros cuja diferenc¸a e´ um mu´ltiplo de n sa˜o equivalentes. Formalmente, dize- mos que dois inteiros a e b sa˜o congruentes mo´dulo n se a− b e´ mu´ltiplo de n. Escrevemos: a ≡ b (mod n) Exemplos: 10 ≡ 0 (mod 5) 23 ≡ 1 (mod 11) Observac¸a˜o: Congrueˆncia mo´dulo n e´ uma relac¸a˜o de equivaleˆncia: • a ≡ a (mod n) (trivialmente) • Se a ≡ b (mod n), enta˜o a − b e´ mu´ltiplo de n. Mas b − a = −(a − b); logo, b− a tambe´m e´ mu´ltiplo de n. Portanto b ≡ a (mod n). • Transitividade: exerc´ıcio. Chamamos de Zn o conjunto de inteiros mo´dulo n. Ou seja, se a ∈ Z, enta˜o a = {a+ kn | k ∈ Z} Em particular, 0 e´ o conjunto dos mu´ltiplos de n. Voltemos agora ao algoritmo da divisa˜o de Euclides. Vimos que, dados a e n inteiros positivos, a > n, existem inteiros q e r tais que a = n.q + r o ≤ r ≤ n− 1 Ou seja, a− r ≡ 0 (mod n) e portanto a ≡ r (mod n). Em outras palavras, Zn = {0, 1, . . . , n− 1} . 17 6.3 Artime´tica modular Sejam a e b classes de Zn. Enta˜o, a+ b = a+ b Exemplo: 5 + 4 ≡ 9 ≡ 1 (mod 8) Logo, 5 + 4 = 9 = 1 A diferenc¸a entre duas classes e´ definida de maneira ana´loga. A fo´rmula para a multiplicac¸a˜o das classes a e b de Zn e´: a.b = a.b Propriedades da adic¸a˜o: A1 (a+ b) + c = a+ (b+ c). A2 a+ b = b+ a. A3 a+ 0 = a. A4 a+−a = 0. Propriedades da multiplicac¸a˜o: M1 (a.b).c = a.(b.c). M2 a.b = b.a. M3 a.1 = a. AM a.(b+ c) = a.b+ a.c. Exemplo: em Z6, 2.3 = 6 = 0!!! 6.4 Crite´rios de divisibilidade • Divisibilidade por 3: 3|a se a soma de todos os algarismos de a e´ divis´ıvel por 3. Prova Seja a = an.an−1. . . . .a1.a0 = an.10 n + an−1.10 n−1 + . . .+ a1.10 + a0 18 Como 10 ≡ 1 (mod 3), a ≡ an + an−1 + . . .+ a1 + a0 (mod 3) Logo, a ≡ 0 (mod 3) se e somente se an + an−1 + . . .+ a1 + a0 ≡ 0 (mod 3) Observe que podemos usar o mesmo argumento para provar que um nu´mero inteiro e´ divis´ıvel por 9 se a soma de seus algarismos e´ divis´ıvel por 9 (10 ≡ 1 (mod 9)). • Divisibilidade por 11: 11|a se a soma alternada de todos os algaris- mos de a e´ divis´ıvel por 11. Prova Observe que 10 ≡ −1 (mod 11). Portanto, 10k ≡ (−1)k (mod 11) e´ igual a 1 ou -1 dependendo da paridade de k. Logo, a ≡ (−1)n.an + (−1n−1).an−1 + . . .+ a2 − a1 + a0 (mod 11) 6.5 Poteˆncias A aplicac¸a˜o mais importante de congrueˆncias no nosso curso e´ no ca´lculo de resto da divisa˜o de uma poteˆncia por um nu´mero qualquer. Vamos ilustrar como isso e´ feito na pra´tica atrave´s de um exemplo. Suponhamos que o objetivo seja calcular 3515 (mod 20) Em primeiro lugar, escrevemos o expoente 15 na base 2: 15 = 23 + 22 + 2 + 1 Logo, 3515 = 352 3+22+2+1 = 35.352.352 2 .352 3 = 35.(35)2.(352)2.((352)2)2 Como 35 ≡ 15 (mod 20), 152 ≡ 5 (mod 20) e 52 ≡ 5 (mod 20), temos: 3515 = 35.352.352 2 .352 3 ≡ 15.(15)2.(352)2.((352)2)2 (mod 20) ≡ 15.5.(5)2.((352)2)2 (mod 20) ≡ 15.5.5.(5)2 (mod 20) ≡ 15.5.5.5 (mod 20) ≡ 15.5 (mod 20) ≡ 15 (mod 20) 19 6.6 Equac¸o˜es diofantinas Uma equac¸a˜o diofantina e´ uma equac¸a˜o em va´rias inco´gnitas com co- eficientes inteiros. Por exemplo, xn + yn = zn. Estaremos interessados em encontrar as soluc¸o˜es inteiras dessas equac¸o˜es. E´ claro que tais equac¸o˜es podem ter infinitas soluc¸e˜s. Por exemplo, x+ y = 2. Ou nenhuma, como no caso da equac¸a˜o x3 − 117y3 = 5 E´ muito fa´cil ver que isso e´ verdade atrave´s da reduc¸a˜o mo´dulo 9. De fato, como 117 e´ divis´ıvel por 9, x3 − 117y3 ≡ x3 ≡ 5 (mod 9) Logo, se a equac¸a˜o acima tivesse soluc¸a˜o, dever´ıamos ter x3 ≡ 5 (mod 9). Mas: classes mo´dulo 9: 0 1 2 3 4 5 6 7 8 cubos mo´dulo 9: 0 1 8 0 1 8 0 1 8 Ou seja, x3 ≡ 5 (mod 9) na˜o tem soluc¸a˜o. 6.7 Divisa˜o modular Teorema 9 (Teorema da inversa˜o) A classe a tem inverso em Zn se e so- mente se a e n sa˜o primos entre si. Prova (⇒) Suponha que a tem inverso. Enta˜o existe b tal que a.b ≡ 1 (mod n) Logo, a.b+ k.n = 1 e portanto mdc(a, n) = 1. (⇐) Suponha mdc(a, n) = 1. Logo existem α e β tais que: α.a+ β.n = 1 Ou seja, α.a ≡ 1 (mod n) e portanto a tem inverso em Zn. O conjunto dos elementos de Zn que teˆm inverso e´ muito importante. Vamos denota´-lo por U(n). Em outras palavras, U(n) = {a ∈ Z(n)|mdc(a, n) = 1} 20 No caso de n = p ser primo, U(p) = Z(n) \ {0} Uma propriedade importante de U(n) e´ que esse conjunto e´ fechado com relac¸a˜o a` multiplicac¸a˜o . Em outras palavras, o produto de dois elementos de U(n) e´ um elemento de U(n). Em particular, podemos dividir a por b em Z(n) somente se b ∈ U(n); nesse caso, b−1 tambe´m pertencera´ a U(n) e a b ≡ a.b−1 (mod n). Podemos utilizar o que aprendemos para resolver congrueˆncias lineares em Z(n). Uma congrueˆncia linear e´ uma equac¸a˜o do tipo: a.x ≡ b (mod n) onde a, b ∈ Z. A soluc¸a˜o dessa equac¸a˜o e´: x ≡ α.b (mod n) onde α e´ o inverso de a mo´dulo n. Conclusa˜o: Se mdc(a, n) = 1 enta˜o a congrueˆncia linear a.x ≡ b (mod n) tem uma e so´ uma soluc¸a˜o em Zn. 6.8 Exerc´ıcios propostos 4, 5, 6(b), 7, 10 e 11 7 Primeira Prova de A´lgebra A Questa˜o 1 - a) Calcule d = mdc(252, 198). b) Encontre dois nu´meros inteiros a e b tais que: a.252 + b.198 = d (1) Resoluc¸a˜o: 252=198+54 54=252-198 198=3.54+36 36=198-3.54 =198-3.(252-198) =-3.252+4.198 54=36+18 18=54-36 =252-198-(-3.252+4.198) =4.252+(-5).198 Deste modo, mdc(252, 198) = 18 e a = 4, b = −5 21 Questa˜o 2 - Verifique se as proposic¸o˜es abaixo sa˜o verdadeiras ou falsas. Deˆ uma demonstrac¸a˜o (= justificativa clara e bem escrita) ou um contra-exemplo para justificar a sua conclusa˜o. (a) Se p e´ um nu´mero primo, enta˜o √ p e´ um nu´mero irracional. (b) Se um nu´mero inteiro A se escreve em base 8 na forma anan−1...a1a0, com 0 ≤ ai ≤ 7, enta˜o 2|A se e somente se a0 = 0. (c) Se p > 3 e´ um nu´mero primo e p ≡ a( (mod 3)), enta˜o mdc(a, 3) = 1. (d) Todo nu´mero inteiro representa´vel com treˆs algarismos iguais na base 10 e´ divis´ıvel por 37. (e) Se x e y sa˜o inteiros ı´mpares, enta˜o x2 + y2 = p2 para algum primo p. Resoluc¸a˜o: a) V- Suponha que existam a, b ∈ ℵ tais que √p = a b . Podemos supor mdc(a, b) = 1. Logo, p.b2 = a2 e portanto p|a2. Pela propriedade fundamental dos primos, p|a. Logo, existe c ∈ ℵ tal que a = pc. p.b2 = p2.c2 =⇒ b2 = p.c2 =⇒ p|b2 =⇒ p|b Mas isso e´ um absurdo uma vez que estamos supondo mdc(a, b) = 1. b) F - Seja A = anan−1 . . . a1a0 um nu´mero na base 8. Enta˜o 2|A se e somente se A ≡ 0 (mod 2). Observe que A = an.8 n + . . .+ a1.8 + a0 ≡ a0 (mod 2) ou seja, 2|A se e somente se 2|a0. Deste modo, 2|A se e somente se a0 ∈ {0, 2, 4, 6}. c) V - Se p ≡ a (mod 3), enta˜o o resto da divisa˜o de p e a por 3 e´ o mesmo. Como p e´ primo, p > 3, temos que p ≡ 1 (mod 3) ou p ≡ 2 (mod 3) Logo, a ≡ 1 (mod 3) ou a ≡ 2 (mod 3), ou seja, a = 3n+ k, com k = 1, 2 Pelo algoritmo euclideano, mdc(a, 3) = mdc(k, 3) = 1 para k = 1, 2. 22 d) V - Seja n = aaa = a(111). Como 111 = 3.37, aaa ≡ a(111) ≡ 0 (mod 37) e) F - Se x e y sa˜o ı´mpares, enta˜o existem n e m tais que x = 2n+ 1, y = 2m+ 1 Logo, x2 + y2 = 4n2 + 4n+ 1 + 4m2 + 4m+ 1 = 2(2n2 + 2n+ 2m2 + 2m+ 1) = 2k onde k e´ um nu´mero ı´mpar. Logo na˜o existe p ∈ ℵ tal que x2 + y2 = p2 Observe que p na˜o precisa ser primo: vale para qualquer nu´mero natural. Questa˜o 3 - Resolva um (e apenas um) dos exerc´ıcios abaixo: (a) Seja p um nu´mero primo. Mostre que um inteiro positivo a e´ o seu pro´prio inverso mo´dulo p (ou seja, a2 ≡ 1 (mod p)) se e somente se a ≡ 1 (mod p) ou a ≡ −1 (mod p). (b) Calcule 1235 (mod 23). Resoluc¸a˜o: a) (=⇒) Suponhamos a2 ≡ 1 (mod p). Logo, (a2 − 1) ≡ 0 (mod p) =⇒ p|(a+ 1)(a− 1) Pela propriedade fundamental dos primos, p|(a+ 1) ou p|(a− 1). Logo, a ≡ 1 (mod p) ou a ≡ −1 (mod p) (⇐=) Trivial! b) Observe que 35 = 25 + 2 + 1. Logo, 1235 ≡ 1225 .122.12 ≡ 2.6.12 ≡ 2.3 ≡ 6 (mod 23) 23 8 Induc¸a˜o e Fermat 8.1 Induc¸a˜o finita Seja P (n) uma proposic¸a˜o que afirma que uma determinada propriedade vale para cada nu´mero natural n. Por exemplo: • Se p e´ um nu´mero primo, enta˜o np−n e´ divis´ıvel por p para todo natural n. • A soma de 1 ate´ n e´ n(n+1)2 Para provar P (n), em geral usamos o princ´ıpio da induc¸a˜o finita : Princ´ıpio da induc¸a˜o finita Para que uma proposic¸a˜o P (n) seja verdadeira para todo n natural, basta que: 1. P (1) seja verdadeira. 2. Se P (k) for verdadeira para algum nu´mero natural k, enta˜o P (k + 1) tambe´m e´ verdadeira. 8.2 Pequeno teorema de Fermat Lema 10 Seja p um nu´mero primo e a, b inteiros. Enta˜o, (a+ b)p ≡ ap + bp (mod p) Prova Veja livro texto, pag 94. Teorema 11 (Teorema de Fermat) Seja p um nu´mero primo e a um nu´mero inteiro. Enta˜o ap ≡ a (mod p). Prova • Se n = 1, enta˜o 1p ≡ 1 (mod p) trivialmente. • Suponhamos que np ≡ n (mod p) para algum n inteiro positivo. Usando o lema anterior, (n+ 1)p ≡ np + 1p ≡ np + 1 (mod p) Como pela hipo´tese de induc¸a˜o temos np ≡ n (mod p), (n+ 1)p ≡ np + 1 ≡ n+ 1 (mod p) Como quer´ıamos demonstrar. 24 Caso geral: veja pag 95 do livro texto. Teorema 12 (Teorema de Fermat II) Seja p um nu´mero primo e a um in- teiro que na˜o e´ divis´ıvel por p. Enta˜o, ap−1 ≡ 1 (mod p). Prova Como mdc(a, p) = 1, existe a′ tal que aa′ ≡ 1 (mod p) Multiplicando ambos os membros de ap ≡ a (mod p). por a′, obtemos: a′.a.ap−1 ≡ a′.a (mod p). Logo, ap−1 ≡ 1 (mod p). Podemos simplificar algumas contas usando o Teorema de Fermat. De fato, sejam p primo, a inteiro tal que mdc(a, p) = 1 e k um nu´mero inteiro tal que k ≥ p− 1. Dividindo k por p− 1, k = (p− 1).q + r 0 ≤ r < (p− 1) Logo, ak ≡ a(p−1).q+r ≡ (ap−1)q.ar (mod p). Mas (ap−1) ≡ 1 (mod p) e portanto ak ≡ ar (mod p). 8.3 Exerc´ıcios propostos 1, 3, 46, 7, 8, 12 9 Pseudoprimos Nesta sec¸a˜o, veremos com usar o pequeno teorema de Fermat para identificar que um nu´mero e´ composto sem fatora´-lo . 25 9.1 Pseudoprimos De acordo com o teorema de Fermat, se p e´ primo e a e´ um inteiro qualquer, enta˜o ap ≡ a (mod p). Desta forma, e´ claro que, se n e´ um nu´mero composto, enta˜o existe um inteiro b tal que bn\ ≡ b (mod n) (usaremos o s´ımbolo \ ≡ para significar na˜o equivalente). Observe que, na pra´tica, so´ precisamos considerar os inteiros b no intervalo 1 < b < n− 1 (por que?). Desta forma, temos um me´todo para determinar se um nu´mero e´ composto sem termos que fatora´-lo: Teste Se n, b sa˜o nu´meros inteiros, n > 0 e 1 < b < n − 1, tais que bn−1\ ≡ 1 (mod n), enta˜o n e´ composto. A pergunta que surge enta˜o e´: o teste acima e´ um procedimento de decisa˜o? Isto e´, o fato de na˜o encontrarmos tal b significa que n e´ primo? Resposta: Observe que, se n e´ composto, enta˜o existe p primo, 1 < p < n− 1 tal que p|n. Logo, mdc(p, n) = p 6= 1 e portanto p na˜o e´ invers´ıvel mo´dulo n. Desta forma, pn−1\ ≡ 1 (mod n). E´ claro que esse na˜o e´ um me´todo eficiente para testar primalidade uma vez que e´ um me´todo de exausta˜o. Outra pergunta interessante que surge e´ a seguinte: sera´ que, se um nu´mero ı´mpar n que satisfac¸a: bn−1 ≡ 1 (mod n) para algum 1 < b < n−1 e´ primo? Infelizmente, a resposta e´ na˜o. Por exemplo, 2340 ≡ 1 (mod 341) mas 341 = 11.31 na˜o e´ primo! Esses “falsos primos” sa˜o conhecidos como pseudoprimos. Ou seja, um pseudoprimo n para a base b e´ um nu´mero inteiro positivo ı´mpar e composto tal que bn−1 ≡ 1 (mod n) Apesar de a`s vezes dar errado, esse teste (chamado de teste de Leibniz) e´ muito u´til. Tambee´m e´ poss´ıvel melhorar o resultado do teste se testarmos para duas bases. Exemplo 6 Existem 50.847.534 primos entre 1 e 109; existem apenas 5597 pseudoprimos na base 2 e 1272 pseudoprimos para as bases 2 e 3. 9.2 Nu´meros de Carmichael Como vimos anteriormente, na˜o existem nu´meros que sejam pseudoprimos para todas as bases. Entretanto, pode ocorrer que um nu´mero composto n seja pseudoprimo para todas as bases b tais que mdc(b, n) = 1. Dizemos que um nu´mero composto ı´mpar e´ um nu´mero de Carmichael se bn ≡ b (mod n). 26 Os nu´meros de Carmichael possuem duas propriedades muito interessantes, dadas pelo teorema baixo: Teorema 13 (Teorema de Korselt:) Um inteiro positivo ı´mpar n e´ um nu´mero de Carmichael se, e somente se, cada fator primo p de n satisfaz as seguintes condic¸o˜es: 1. p2 na˜o divide n; 2. p− 1 divide n− 1. Prova (=⇒) Seja p um fator primo de n. Enta˜o, bn ≡ b (mod p) De fato, se b e´ divis´ıvel por p enta˜o ambos os membros da equivaleˆncia sa˜o congruentes a zero. Se na˜o, pelo teorema de Fermat temos: bp−1 ≡ 1 (mod p) Pela condic¸a˜o (2) do teorema, n− 1 = (p− 1).q para algum q. Logo, bn ≡ (bp−1)q.b ≡ b (mod p) Por (1), temos que n = p1 . . . pk com p1 < p2 < . . . < pk. Como os primos sa˜o distintos, bn − b e´ divis´ıvel pelo produto p1.p2. . . . .pk = n. Em outras palavras, bn ≡ b (mod n) e portanto n e´ um nu´mero de Carmichael. (⇐=) Seja n um nu´mero de Carmichael e suponhamos que exista p primo tal que p2|n. Escolha b = p. Enta˜o: pn − p = p(pn−1 − 1) Mas p na˜o divide pn−1 − 1, logo p2 na˜o pode dividir pn − p. Portanto, n na˜o pode dividir pn − p. Em outras palavras, p ≡ p (mod n). Absurdo. O restante da demonstrac¸a˜o depende do teorema da raiz primitiva, que so´ sera´ vista no cap´ıtulo 10... Observac¸o˜es: • Para verificar que um nu´mero e´ de Carmichael usando o teorema acima necessitamos fatora´-lo... • Muitos nu´meros de Carmichael possuem fatores primos pequenos! • Existem infinitos nu´meros de Carmichael. • Entre 1 e 109 existem 50.847.534 primos e 646 nu´meros de Carmichael. 27 9.3 Teste de Miller Teorema de Fermat: detecta nu´meros compostos com uma certa eficieˆncia, mas na˜o e´ um bom teste de primalidade. Teste de Miller: Calcula-se a sequeˆncia de poteˆncias mo´dulo n: bq, b2q, . . . , b2 kq onde n− 1 = 2kq. O fato e´ que, se n e´ primo, enta˜o: b2 kq ≡ bn−1 ≡ 1 (mod n) Digamos que j e´ o menor expoente tal que b2 jq ≡ 1 (mod n). Se j ≥ 1 podemos escrever b2 jq − 1 = (b2j−1q − 1)(b2j−1q + 1) Se n e´ primo e divide b2 jq−1, enta˜o n deve dividir (b2j−1q+1) pela minimalidade de j. Logo, b2 j−1q − 1 ≡ −1 (mod n) Ou seja, uma das poteˆncias bq, b2q, . . . , b2 kq deve ser congruente a −1 mo´dulo n. Se j = 0, enta˜o temos apenas que bq ≡ 1 (mod n). Se nada disso acontecer, enta˜o n deve ser composto. Teste de Miller. Etapa 1 Divida n− 1 por 2 ate´ encontrar q ı´mpar e k tais que n− 1 = 2kq. Etapa 2 Fac¸a i = 0 e r = resto de bq por n. Etapa 3 Se i = 0 e r = 1 ou i ≥ 0 e r = n− 1: teste inconclusivo. Etapa 4 Fac¸a i = i+ 1 e r = r2 onde r2 e´ o resto da divisa˜o de r 2 por n. Etapa 5 Se i < k volte a` etapa 3; sena˜o: n e´ composto. Exemplo 7 Tome o nu´mero de Carmichael 561. Temos que 560 = 24.35. Calculando as sequeˆncias de restos mo´dulo 561 das poteˆncias de 2: expoentes 35 2.35 22.35 23.35 restos 263 166 67 1 28 Logo 561 tem que ser composto. Se um nu´mero composto n tem resultado inconclusivo para o teste de Miller com respeito a uma base b, dizemos que n e´ um pseudoprimo forte para a base b. Observe que pseudoprimo forte −→ pseudoprimo. Existem 1282 pseudoprimos fortes entre 1 e 109. 9.4 Primalidade e computac¸a˜o alge´brica E´ importante ressaltar que o teste de Miller e´ muito usado na pra´tica. O que se faz para ter maior garantia do resultado e´ fazer o teste para diversas bases. E´ assim com o Maple, ScratchPad - IBM, Axiom 1.1 - IBM. Vale a observac¸a˜o: dado um nu´mero finito qualquer de bases, existem infinitos nu´meros de Carmichael que sa˜o pseudoprimos fortes para todas essas bases. 9.5 Exerc´ıcios propostos 2, 5, 7, 8, 10 10 Teorema de Euler O pequeno teorema de Fermat nos diz como trabalhar com certas congrueˆncias envolvendo expoentes quando o mo´dulo e´ primo. Nessa sec¸a˜o, veremos como lidar com congrueˆncias mo´dulo um nu´mero composto. 10.1 Func¸a˜o de Euler Definic¸a˜o. Seja n um inteiro positivo. A func¸a˜o de Euler φ(n) e´ definida como o nu´mero de inteiros positivos na˜o excedendo n que sa˜o relativamente primos com n. A tabela abaixo apresenta os valores de φ(n) para 1 ≤ n ≤ 12. n 1 2 3 4 5 6 7 8 9 10 11 12 φ(n) 1 1 2 2 4 2 6 4 6 4 10 4 Na sec¸a˜o de aritme´tica modular, estudamos o conjunto U(n), o conjunto dos elementos de Zscrn que teˆm inverso. Vimos que U(n) = {a ∈ Zn : mdc(a, n) = 1} 29 Desta forma, φ(n) nada mais e´ do que o nu´mero de elementos de U(n). Vamos ver como calcular φ(n). Comec¸amos com alguns casos especiais. Seja p um nu´mero primo. Enta˜o todos os inteiros positivos menores que p sa˜o primos com p. Logo φ(p) = p− 1 Tambe´m e´ fa´cil calcular φ(pk). Observe que mdc(a, pk) = 1 se e somente se p na˜o divide a. Enta˜o basta contar os inteiros menores que pk que na˜o sa˜o divis´ıveis por p. Se 0 ≤ a < pk e´ divis´ıvel por p, enta˜o a = p.b onde 0 ≤ b < pk − 1 Portanto ha´ pk−1 inteiros positivos menores que pk que sa˜o divis´ıveis por p. Logo ha´ pk − pk−1 que na˜o sa˜o divis´ıveis por p. Ou seja, φ(pk) = pk−1(p− 1) Para obtermos a fo´rmula geral, e´ necessa´rio provar o seguinte resultado: Teorema. Se m,n sa˜o inteiros positivos tais que mdc(m,n) = 1, enta˜o φ(mn) = φ(m).φ(n) A demonstrac¸a˜o desse teorema e´ trabalhosa (mas na˜o dif´ıcil) e portanto na˜o faremos aqui. Exemplo 8 φ(100) = φ(22).φ(52) = (2.1).(5.4) = 40 Pelo teorema acima temos que, se n = pe11 . . . . .p ek k , enta˜o, φ(n) = pe1−11 . . . . .p ek−1 k (p1 − 1). . . . .(pk − 1) 10.2 Teorema de Euler Vai ser necessa´rio, para decodificac¸a˜o de mensagens, saber calcular a func¸a˜o de Euler. Tambe´m vamos ter que aplicar o teorema de Euler. O teorema de Euler e´ uma generalizac¸a˜o do teorema de Fermat para o caso em que o mo´dulo na˜o e´ primo: Teorema de Euler. Se n e´ um inteiro positivo e a e´ um inteiro tal que mdc(a, n) = 1, enta˜o aφ(n) ≡ 1 (mod n) Antes de provar esse teorema, vamos apresentar um exemplo. 30 Exemplo 9 Temos que U(8) = {1, 3, 5, 7} e portanto φ(8) = 4. Observe que, se a, b, c ∈ U(8), enta˜o a.b ∈ U(8) e, se c 6= b, enta˜o a.b\ ≡ a.c (por que?) Para ver como isso funciona, tome a = 3. Enta˜o, 3.1 ≡ 3 (mod 8) 3.3 ≡ 1 (mod 8) 3.5 ≡ 7 (mod 8) 3.7 ≡ 5 (mod 8) Logo, (3.1).(3.3).(3.5).(3.7) ≡ 1.3.5.7 (mod 8) e portanto, 34.1.3.5.7 ≡ 1.3.5.7 (mod 8) Como mdc(1.3.5.7, 8) = 1, podemos cortar o termo comum dos dois lados da equivaleˆncia: 34 ≡ 1 (mod 8) Teorema 14 (Teorema de Euler) Se n e´ um inteiro positivo e a um inteiro tal que mdc(n, a) = 1, enta˜o aφ(n) ≡ 1 (mod n) Prova Escrevendo U(n) = {b1, . . . , bφ(n)}, temos que: (a.b1). . . . .(a.bφ(n)) ≡ b1. . . . .bφ(n) (mod n) Logo, aφ(n).b1. . . . .bφ(n) ≡ b1. . . . .bφ(n) (mod n) Como mdc(b1. . . . .bφ(n), n) = 1, podemos cortar o termo comum dos dois lados e portanto, aφ(n) ≡ 1 (mod n) 10.3 Exerc´ıcios propostos Cap´ıtulo 8: 4, 6, 8, 9, 10, 18 31 10.4 Tabela Hashing Uma universidade deseja estocar um arquivo para cada um de seus estudantes no seu computador. O nu´mero identificador, ou chave para cada arquivo e´ o nu´mero do CPF do estudante. O CPF e´ um inteiro de 11 d´ıgitos, portanto e´ praticamente imposs´ıvel reservar uma posic¸a˜o de memo´ria para cada CPF poss´ıvel. Deve-se encontrar um me´todo sistema´tico para arranjar esses arquivos na memo´ria, usando um nu´mero razoa´vel de posic¸o˜es de memo´ria. De outra forma, ficaria imposs´ıvel acessar os arquivos... Um desses me´todos e´ utilizando a tabela hashing , baseada em func¸o˜es hashing . Existem va´rias propostas para func¸o˜es hashing. Vamos discutir (brevemente) o tipo mais utilizado. Seja k a chave do arquivo a ser estocado e seja n um inteiro positivo. Definimos a func¸a˜o hashing h(k) por h(k) ≡ k (mod n) onde 0 ≤ h(k) < n. E´ claro que devemos escolher um n adequado de modo que os arquivos fiquem distribu´ıdos de uma maneira razoa´vel entre as n posic¸o˜es poss´ıveis de memo´ria. Por exemplo, n na˜o deve ser uma poteˆncia de 10 (10r) simplesmente porque o valor da func¸a˜o h seria os r u´ltimos d´ıgitos da chave. Outro exemplo de uma escolha ruim e´ quando n|10m ± a onde a e m sa˜o pe- quenos. Por exemplo, se n = 111|(103 − 1) = 999 enta˜o 103 ≡ 1 (mod n) e portanto os nu´meros: 64121284868 e 64184821268 va˜o para a mesma posic¸a˜o de memo´ria. Para evitar esses problemas, n deve ser um nu´mero primo pro´ximo do nu´mero de posic¸o˜es dispon´ıveis. Por exemplo, se existem 5000 posic¸o˜es de memo´ria para o armazenamento de 2000 arquivos de estudantes, podemos escolher n = 4969. Claro que, mesmo assim, coliso˜es podem ocorrer. Existem va´rias heur´ısticas para tratamento de coliso˜es. O me´todo mais usado e´ o de escolher uma posic¸a˜o livre. Existem va´rias maneiras de fazer isso e as mais complicadas sa˜o as mais eficientes. Eu poderia passar o dia falando sobre elas, mas vou citar apenas uma, a mais simples. Consiste em tomar: hj(k) ≡ h(k) + j (mod n) Desta forma, a chave k e´ alocada na posic¸a˜o mais pro´xima poss´ıvel de h(k). A eficieˆncia desse me´todo e´ realmente baixa, pois tende a haver um engarrafa- mento. Na pra´tica, o mais fa´cil e´ “atachar” uma lista a cada posic¸a˜o de memo´ria. Dessa forma, procede-se por busca sequencial. 32 11 Criptografia RSA 11.1 Pre´-codificac¸a˜o Em primeiro lugar, devemos converter a mensagem em uma sequeˆncia de nu´meros. Essa primeira etapa e´ chamada de pre´-codificac¸a˜o. Ha´ va´rias maneiras de se fazer isso. Aqui vamos supor que o texto na˜o conte´m acentuac¸a˜o, pontuac¸a˜o, nu´meros etc, apenas as letras A a Z (maiu´sculas). Tambe´m vamos adicionar espac¸os em branco entre palavras, que sera´ substitu´ıdo pelo nu´mero 99. A letra A sera´ convertida no nu´mero 10, B sera´ 11 e assim por diante, ate´ o Z corre- spondendo ao nu´mero 35. Observe que cada letra corresponde a um nu´mero com exatamente dois algarismos. Isso evita ambiguidades. A chave pu´blica e´ um nu´mero n = p.q, onde p e q sa˜o primos. Antes de comec¸ar devemos, enta˜o escolher esses nu´meros. O u´ltimo passo da pre´-codificac¸a˜o e´ quebrar a mensagem em blocos. Esses blocos devem ser nu´meros menores que n. A maneira de escolher os blocos na˜o e´ u´nica, mas e´ importante evitar duas situac¸o˜es: • Nenhum bloco deve comec¸ar com o nu´mero 0 (problemas na decodi- ficac¸a˜o). • Os blocos na˜o devem corresponder a nenhuma unidade lingu´ıstica (palavra, letra, etc). Assim a decodificac¸a˜o por contagem de frequeˆncia fica im- poss´ıvel. 11.2 Codificando e decodificando Para codificar a mensagem precisamos de n = p.q e de um inteiro positivo e que seja invers´ıvel mo´dulo φ(n). Em outras palavras, mdc(e, φ(n)) = mdc(e, (p− 1).(q − 1)) = 1 Chamaremos o par (n, e) a chave de codificac¸a˜o do sistema RSA. Codificaremos cada bloco de mensagem separadamente e a mensagem codificada sera´ a sequeˆncia de blocos codificados. Importante: Os blocos ja´ codificados na˜o podera˜o ser reunidos de modo a formar um longo nu´mero. Isso tornaria a decodificac¸a˜o imposs´ıvel! Vamos agora mostrar como codificar cada bloco b. Chamaremos o bloco codifi- cado de C(b). Em primeiro lugar, lembre-se que b e´ menor que n. Enta˜o: C(b) ≡ be (mod n) Onde 0 ≤ C(b) < n. 33 Exemplo 10 Considere a frase Paraty e´ linda . Convertendo em nu´meros, 2510271029349914992118231310 Agora devemos escolher n. Vamos comec¸ar com um nu´mero pequeno, por ex- emplo n = 11.13 = 143 Podemos enta˜o quebrar a mensagem acima em blocos, que devem ter valor menor que 143: 25− 102− 7− 102− 93− 49− 91− 49− 92− 118− 23− 13− 10 Enta˜o temos que φ(143) = 10.12 = 120 e portanto e deve ser um nu´mero que na˜o divide 120. O menor valor poss´ıvel e´ 7. Logo, C(25) ≡ 257 ≡ 2522 .252.25 (mod 143) ≡ 2522 .53.25 (mod 143) ≡ 532.53.25 (mod 143) ≡ 92.53.25 (mod 143) ≡ 14.25 (mod 143) ≡ 64 (mod 143) Procedendo dessa maneira com todos os blocos, obtemos a seguinte mensagem cifrada: 64− 119− 6− 119− 102− 36− 130− 36− 27− 79− 23− 117− 10 Vejamos agora como proceder para decodificar um bloco de mensagem codifi- cada. A informac¸a˜o que precisamos para decodificar esta´ contida no par (n, d), onde d e´ o inverso de e mo´dulo φ(n). Chamaremos (n, d) de chave de de- codificac¸a˜o e de D(c) o resultado do processo de decodificac¸a˜o. D(c) e´ dado por: D(c) ≡ cd (mod n) onde 0 ≤ D(c) < n. Observe que e´ muito fa´cil calcular d, desde que φ(n) e e sejam conhecidos: basta aplicar o algoritmo euclideano estendido. Entretanto, se na˜o conhecemos p e q e´ praticamente imposs´ıvel calcular d. Voltando ao nosso exemplo, temos que n = 143 e e = 7. Para calcular d, usamos o algoritmo euclideano estendido: 120 = 7.17 + 1 =⇒ 1 = 120 + (−17).7 Logo o inverso de 7 mo´dulo 120 e´ −17. Como d deve ser usado como um expoente, precisamos que d seja positivo. Logo tomamos d = 120− 117 = 103. 34 11.3 Funciona? A pergunta o´bvia que surge agora e´: D(C(b)) = b? Ou seja, decodificando um bloco de mensagem codificada, encontramos um bloco da mensagem original? Porque sena˜o todo nosso esforc¸o foi sem sentido... Vamos mostrar nessa sec¸a˜o que a resposta para a pergunta acima e´ sim . Consideremos enta˜o n = p.q. Vamos provar que DC(b) ≡ b (mod n) E por que na˜o a igualdade? Observe que DC(b) e b sa˜o menores que n − 1. Por isso escolhemos b menor que n e mantivemos os blocos separados depois da codificac¸a˜o! Por definic¸a˜o, temos que DC(b) ≡ (be)d ≡ be.d (mod n) Mas d e´ o inverso de e mo´dulo φ(n). Logo existe inteiro k tal que ed = 1+kφ(n). Logo, bed ≡ b1+kφ(n) ≡ (bφ(n))k.b (mod n) Se mdc(b, n) = 1, enta˜o podemos usar o teorema de Euler: bed ≡ (bφ(n))k.b ≡ b (mod n) Se b e n na˜o sa˜o primos entre si, obderve que n = p.q, p e q primos distintos. Logo, bed ≡ b1+kφ(n) ≡ (b(p−1))k.(q−1).b (mod p) Semdc(b, p) = 1, enta˜o podemos usar o teorema de Fermat (bp−1 ≡ 1 (mod p)). Se na˜o, temos que p|b e portanto bed ≡ b ≡ 0 (mod p) Logo, bed ≡ b (mod p) qualquer que seja b. Fazemos o mesmo para o primo q, obtendo: bed ≡ b (mod q) Portanto, bed ≡ b (mod p.q) como quer´ıamos. 35 11.4 Porque o RSA e´ seguro Como ja´ vimos, o par de codificac¸a˜o (n, e) e´ conhecido e acess´ıvel a qualquer usua´rio. O RSA so´ e´ seguro se for dif´ıcil calcular d quando apenas esse par e´ conhecido. Observe que so´ sabemos calcular d se soubermos o valor de φ(n), cujo ca´lculo depende da fatorac¸a˜o de n. A pergunta que surge enta˜o e´: sera´ que na˜o existe outro processo para calcular d e φ(n)? Por exemplo, o que aconteceria se algue´m inventasse um me´todo para calcular φ(n) a partir de n e e? A resposta e´ que ter´ıamos, enta˜o, um algoritmo ra´pido de fatorac¸a˜o. Observe que φ(n) = (p− 1).(q − 1) = pq − (p+ q) + 1 = n− (p+ q) + 1 Logo, (p+ q) = n− φ(n) + 1 e´ conhecido. Contudo, (p+ q)2 − 4n = (p2 + q2 + 2pq)− 4pq = (p− q)2 Logo, p− q = √ (p+ q)2 − 4n que tambe´m e´ conhecido. Ou seja, conhecemos p+q e p−q. Portanto conhecemos p e q e fatoramos n! Deste modo, conhecer φ(n) sem fatorar n significa que, na verdade, sabemos fatorar n! Outro jeito de quebrar o RSA seria achar um algoritmo que calcule d diretamente a partir de n e e. Como ed ≡ 1 (mod φ(n)), isto implica que conhecemos um mu´ltiplo de φ(n). Isso tambe´m e´ suficiente para fatorar n (prova complicada). A u´ltima alternativa seria achar b a partir da forma reduzida de be mo´dulo n sem achar d. Bom, ningue´m conseguiu fazer isso ate´ agora... Acredita-se que quebrar o RSA e fatorar n sejam problemas equivalentes, apesar disso na˜o ter sido demonstrado. 11.5 Escolhendo primos Suponha que desejamos implementar o RSA de chave pu´blica (n, e), de modo que n seja um inteiro com aproximadamente r algarismos. Para construir n, escolha um primo p entre 4r10 e 45r 100 algarismos e, em seguida, escolha q pro´ximo de 10r p . O tamanho da chave recomendado atualmente para uso pessoal e´ de 768 bits. Isso significa que n tera´ aproximadamente 231 algarismos. Para construir tal nu´mero precisamos de dois primos de, digamos, 104 e 127 algarismos respectivamente. Outra coisa a ser observada e´ que os nu´meros p−1, q−1, p+1, p−1 na˜o tenham fatores primos pequenos, pois sena˜o seria fa´cil fatorar n. Para encontrar p e q, seguiremos a seguinte estrate´gia: 1. Tome um nu´mero s ı´mpar. 36 2. Verifique se n e´ divis´ıvel por um primo menor que 5.000. 3. Aplique o teste de Miller a s usando como base os 10 primeiros primos. Encontrar tais primos pode ser um processo trabalhoso. Por exemplo, se x e´ um nu´mero da ordem de 10127, no intervalo entre x e x + 104 existem aproxi- madamente 34 primos dentre 560 nu´meros que passam a etapa (1) da estrate´gia acima... 11.6 Assinaturas Apenas codificar mensagens na˜o basta, em geral, pois o sistema e´ de chave pu´blica. Ou seja, qualquer pessoa pode codificar uma mensagem usando uma chave alheia. Por exemplo, um haker poderia facilmente mandar instruc¸o˜es ao banco para que o seu saldo banca´rio fosse transferido para uma outra conta. Por isso, o banco precisa de uma garantia de que a mensagem teve origem em um usua´rio autorizado. Ou seja, a mensagem tem que ser assinada . Vamos chamar de Cm e Dm as func¸o˜es de codificac¸a˜o e decodificac¸a˜o do Ma´rio e de Ca e Da as func¸o˜es de codificac¸a˜o e decodificac¸a˜o do Allan. Seja b um bloco de mensagem que o Ma´rio deseja mandar para o Allan. Para mandar uma mensagem assinada, ao inve´s de Ca(b), o Ma´rio envia Ca(Dm(b)) Ou seja, primeiro ele “decodifica” a mensagem como so´ ele pode fazer, depois ele codifica o resultado, como so´ o Allan pode ler. Para ler a mensagem, primeiro o Allan aplica Da e depois Cm. Observe que Cm e´ pu´blico. Se a mensagem fizer sentido, e´ certo que a origem foi mesmo o Ma´rio! Mas cuidado ! Esse sistema pode ser usado para quebrar o RSA, como em 1995 por um consultor em assuntos de seguranc¸a de computadores... 11.7 Exerc´ıcios propostos Cap´ıtulo 11: 1, 2, 3, 4, 6. 12 1o trabalho pra´tico O trabalho tem como objetivo a criac¸a˜o de dois nu´meros primos grandes (entre 20 e 30 bits). Para isso: • Gere dois nu´meros ı´mpares m e k da magnetude acima, de modo que na˜o sejam muito pro´ximos um do outro. 37 • Verifique se m, k sa˜o divis´ıveis por um primo menor que 5.000. • Aplique o teste de Miller a m, k usando como base os 10 primeiros primos (se voceˆ quiser ter uma certeza maior sobre o resultado, fac¸ø teste para mais primos). Depois calcule n = m.k e aplique os algoritmos da fatorac¸a˜o e de Fermat a n para ver se sua chave pu´blica e´ facilmente quebrada. O trabalho devera´ ser entregue no dia 06/08/2002 (sem falta!) e devera´ constar de: • Parte escrita de no ma´ximo duas pa´ginas digitadas. Essa parte de- vera´ conter os resultados do trabalho juntamente com a ana´lise desses resultados (em especial, se foi fa´cil quebrar a sua chave ou na˜o). • Co´digo impresso comentado . Evitem C++, por favor! • Disquete com o executa´vel do programa. Este tambe´m pode ser enviado por e-mail. Lembrem-se que eu posso rodar apenas programas em Delphi (4.0) ou qualquer outra linguagem que rode nas estacoes do DCC. Enta˜o evitem artif´ıcios gra´ficos sofisticados... 13 Ra´ızes primitivas 13.1 Teste de Lucas Para determinar se n e´ primo, podemos verificar se φ(n) = n − 1. Ou seja, se mdc(a, n) = 1 para todo a menor que n. Isso so´ e´ poss´ıvel se n e´ ı´mpar. Logo precisamos encontrar um jeito de calcular φ(n) sem fatorar n. Mas ja´ vimos que isso e´ imposs´ıvel... Teorema da raiz primitiva. Se p e´ um primo, existe b ∈ Zn tal que bp−1 ≡ 1 (mod p) mas br\ ≡ 1 (mod p) se r < p− 1. Em geral, chamaremos de ordem do elemento b em Zn o nu´mero k tal que bk ≡ 1 (mod n) e br\ ≡ 1 (mod n) se r < k. Observe que se n e´ primo e 1 < b < n, enta˜o a ordem de b e´ p− 1. 38 Teorema de Lagrange. A ordem de b tem que dividir a ordem de U(n), que e´ igual a φ(n). Logo, dado n ı´mpar, se existe b tal que bn−1 ≡ 1 (mod n) e bt\ ≡ 1 (mod n) se t < n− 1 enta˜o n e´ primo pois ter´ıamos n− 1 ≤ φ(n) ≤ n− 1. De acordo com o teorema da raiz primitiva, se n e´ primo, tal b sempre existe. Encontra´-lo e´ uma questa˜o de sorte... Para aplicar isso a` primalidade, precisamos encontrar uma maneira eficiente de mostrar que a ordem de um elemento de U(n) e´ exatamente n− 1. Teste de Lucas. Sejam n ´ impar e 1 ≤ b ≤ n− 1. Se bn−1 ≡ 1 (mod n) e b n−1 p \ ≡ 1 (mod n) para cada fator primo de n− 1, enta˜o n e´ primo. Demonstrac¸a˜o: Veja o livro texto pag 168. Continua... Aguardem! 14 Sistemas de congrueˆncias O objetivo dessa sec¸a˜o e´ estudar a soluc¸a˜o de sistemas de equac¸o˜es lineares. A aplicac¸a˜o para criptografia e´ o desenvolvimento de um me´todo para partilhar senhas. 14.1 Equac¸o˜es lineares Ja´ estudamos o caso de uma equac¸a˜o linear ax ≡ b (mod n) Se a possui um inverso α em Zn, enta˜o multiplicando ambos os lados da equac¸a˜o acima por α: α(ax) ≡ αb (mod n) x ≡ αb (mod n) Em particular, se n e´ primo e a\ ≡ 0 (mod n), enta˜o a equac¸a˜o acima sempre tem soluc¸a˜o. 39 Se a na˜o tem inverso em Zn, enta˜o mdc(a, n) = d 6= 1. Logo, a equac¸a˜o: ax− ny = b so´ tem soluc¸a˜o quando b e´ divis´ıvel por d. Suponhamos enta˜o que d divide b. Escreveremos a = da′, b = db′ e n = dn′. Cancelando os d’s, chegamos a` seguinte equac¸a˜o: a′x− n′y = b′ Ou seja, a′x ≡ b′ (mod n′) Observe que agora mdc(a′, n′) = 1, e essa equac¸a˜o sempre tem soluc¸a˜o. Exemplo 11 Seja 6x ≡ 4 (mod 8). Dividindo pelo mdc(6, 8) = 2, obtemos 3x ≡ 2 (mod 4) Logo a soluc¸a˜o procurada e´: x ≡ 2 (mod 4) Mas observe que o mo´dulo mudou de 8 para 4... Para consertar isso, vamos escrever a expressa˜o acima em uma expressa˜o de inteiros: x = 2 + 4k Duas possibilidades: • k e´ par. Nesse caso, x ≡ 2 (mod 8) e 2 e´ uma soluc¸a˜o. • k e´ ı´mpar (k = 2m+1). Nesse caso, x ≡ 6 (mod 8) e 6 e´ outra soluc¸a˜o. Ou seja, uma equac¸a˜o linear possui mais de uma soluc¸a˜o. 14.2 Um exemplo astronoˆmico Treˆs sate´lites passara˜o sobre o Rio essa noite. O primeiro a` uma hora , o segundo a`s 4 horas e o terceiro a`s 8 horas da manha˜. O primeiro leva 13 horas para completar uma volta em torno da terra, o segundo 15 horas e o terceiro 19 horas. Determine quantas horas decorrera˜o, a` partir de meia noite, ate´ que os treˆs sate´lites passem ao mesmo tempo sobre o Rio. Montagem matema´tica: seja x e´ o nu´mero de horas, contadas a partir da meia noite de hoje, quando os treˆs sate´lites passara˜o juntos sobre o Rio. Enta˜o: x ≡ 1 (mod 13) x ≡ 4 (mod 15) x ≡ 8 (mod 19) 40 Podemos re-escrever a primeira equac¸a˜o cmo x = 1 + 13t, Substituindo a primeira equac¸a˜o na segunda, obtemos: t ≡ 6 (mod 15) Logo x = 79 + 195u. Substituindo essa equac¸a˜o na terceira: u ≡ 1 (mod 19) Logo, x = 79 + 195u = 274 + 3705v Logo os sate´lites passara˜o juntos pela primeira vez 274 horas depois da meia noite de hoje. 14.3 Algoritmo chineˆs do resto Observe que, para resolver o problema dos sate´lites, resolvemos as duas primeiras equac¸o˜es, obtendo x = 79+195u. Isso corresponde a uma nova equac¸a˜o, x ≡ 79 (mod 195). Em geral, a soluc¸a˜o de um sistema de muitas equac¸o˜es e´ obtida atrave´s da soluc¸a˜o de va´rios sistemas de duas equac¸o˜es. Desta forma, vamos analisar apenas o algoritmo correspondente a´ soluc¸a˜o de um sistema de duas equac¸o˜es. Considere enta˜o o sistema x ≡ a (mod m) x ≡ b (mod n) Podemos re-escrever a primeira equac¸a˜o na forma: x = a+my Substituindo x na segunda equac¸a˜o, obtemos: my ≡ (b− a) (mod n) Sabemos que essa equac¸a˜o tem soluc¸a˜o se e somente se o mdc(n,m) divide b−a. Vamos assumir que mdc(n,m) = 1. Seja enta˜o α o inverso de m mo´dulo n. Enta˜o: y ≡ α(b− a) (mod n) y = α(b− a) + nz x = a+mα(b− a) +mnz x = a(1−mα) +mαb+mnz x = aβn+mαb+mnz Observe que essa soluc¸a˜o e´ u´nica. Temos enta˜o o seguinte teorema: 41 Teorema Chineˆs do resto. Sejam n1, . . . , nk inteiros positivos, dois a dois primos entre si. Enta˜o o sistema x ≡ a1 (mod n1) ... x ≡ ak (mod nk) sempre tem uma soluc¸a˜o u´nica em Zn1...nk . 14.4 Mo´dulos na˜o co-primos Analisaremos esse caso atrave´s de um exemplo. Considere o sistema: x ≡ 3 (mod 12) x ≡ 19 (mod 8) Da primeira equac¸a˜o, obtemos x = 3 + 12y. Substituindo isso na segunda equac¸a˜o, temos 12y ≡ 16 (mod 8). Dividindo essa equac¸a˜o por 4, obtemos 3y ≡ 4 (mod 2). Logo, x ≡ 3 (mod 24) Observe que 24 e´ o mmc entre 8 e 12... 14.5 Partilha de senhas Suponha que que desejemos partilhar uma senha s entre n pessoas, de modo que a cada pessoa seja dado um elemento (uma parte) da senha. Esse elemento e´ tal que e´ escolhido de um conjunto S de n pares de inteiros positivos de modo que, para um inteiro positivo k ≤ n previamente escolhido temos: 1. qualquer subconjunto de S com k elementos permite determinar s facil- mente; 2. e´ muito dif´ıcil determinar s conhecendo menos de k elementos de S. Comec¸amos escolhendo um conjunto L de n inteiros positivos, dois a dois primos entre si. Seja N o produto dos k menores nu´meros de L e M o produto dos k − 1 maiores nu´meros de L. Dizemos que esse conjunto tem limiar k se N > s >M Observe que essa condic¸a˜o implica que o produto de k ou mais elementos de L e´ sempre maior que N e o produto de menos de k elementos e´ sempre menor queM. O conjunto S sera´ formado pelos pares da forma (m, sm) onde m ∈ L e sm e´ a forma reduzida de s mo´dulo m. Observe que limiar k ≥ 1 implica s > m para qualquer m ∈ L. Logo sm < s para qualquer m ∈ L. 42 Suponhamos que sejan conhecidos, em um dado momento, t elementos, ≥ k. Denotaremos esses pares por (m1, s1), . . . , (mt, st). Vamos resolver o sistema de congrueˆncias: x ≡ s1 (mod m1) x ≡ s2 (mod m2) . . . x ≡ st (mod mt) obtendo x0 como soluc¸a˜o. Pelo teorema chineˆs do resto, x0 ≡ s (mod m1. . . . .mt) Por que? Sabemos que, como t ≥ k, m1. . . . .mt ≥ N > s Pelo teorema chineˆs do resto, o sistema acima tem uma u´nica soluc¸a˜o menor que m1. . . . .mt. Mas s tambe´m e´ soluc¸a˜o do sistema e s < m1. . . . .mt. Logo s = x0. Observac¸o˜es: 1. E´ poss´ıvel escolher os mo´dulos de modo que fique praticamente imposs´ıvel encontrar s atrave´s de uma busca. 2. E´ sempre poss´ıvel escolher um conjunto L que satisfac¸a todas as condic¸o˜es. Exemplo 12 Digamos que em um banco ha´ 5 funciona´rios e pelo menos 2 teˆm que estar presentes para que o cofre seja aberto. Logo o conjunto L deve ter 5 elementos, e seu limiar deve ser 2. Uma escolha poss´ıvel escolhendo apenas primos pequenos e´ L = {11, 13, 17, 19, 23} O valor de s pode ser escolhido como sendo qualquer inteiro no intervalo que vai de 23 a 143. Digamos s = 30. Enta˜o: S = {(11, 19), (13, 17), (17, 13), (19, 11), (23, 7)} Se os funciona´rios que possuem as senhas (17, 13) e (23, 7) esta˜o no banco, para obter a senha e´ preciso resolver o sistema x ≡ 13 (mod 17) x ≡ 7 (mod 23) A soluc¸a˜o e´ x = 30 + 391k... 14.6 Exerc´ıcios propostos 1,2,4 43 15 Lo´gica e cieˆncia da computac¸a˜o 15.1 Motivac¸a˜o Lo´gica em cieˆncia da computac¸a˜o: • Primeira abordagem computac¸a˜o-como-modelo: computac¸o˜es sa˜o estru- turas matema´ticas contendo nodos, estados e transic¸o˜es e a lo´gica constro´i afirmativas sobre essas estruturas. • Segunda abordagem computac¸a˜o-como-deduc¸a˜o: estados sa˜o descritos atrave´s de um conjunto de proposic¸o˜es e mudanc¸as nos estados sa˜o modelados por mudanc¸as nas proposic¸o˜es dentro de uma derivac¸a˜o (ou seja, por passos na construc¸a˜o de uma prova) A primeira abordagem tem sido amplamente estudada e faz uso de to´picos da matema´tica como teoria de conjuntos, teoria das categorias, a´lgebras, etc. para modelar computac¸o˜es. Em geral, as estruturas matema´ticas utilizadas sa˜o complexas porque devem lidar com o conceito de infinitude. A segunda abordagem, apesar de lidar com estruturas mais simples (que rara- mente fazem refereˆncia ao infinito) e de estar mais intimamente ligada a` com- putac¸a˜o, tem merecido pouca ou nenhuma atenc¸a˜o nos u´ltimos tempos. Apenas apo´s recentes pesquisas na a´rea de teoria de provas e programac¸a˜o lo´gica observou-se um crescimento do estudo nessa a´rea de pesquisa. Lo´gicas expressivas como lo´gica linear (e Forum - linguagem de programac¸a˜o baseada em lo´gica linear) passaram a ser utilizadas para modelar estados, transic¸o˜es de estado e algumas primitivas de concorreˆncia. 15.2 Lo´gica Cla´ssica • A verdade de uma afirmativa e´ absoluta e independe da quaisquer pensa- mento, entendimento ou ac¸a˜o. • Afirmativas sa˜o verdadeiras ou falsas, onde falso e´ a mesma coisa que na˜o verdadeiro. • Isso e´ conhecido com princ´ıpio do meio exclu´ıdo: p∨⌉p. 15.3 Lo´gica Intuicionista • Em p∨⌉p nenhuma informac¸a˜o e´ dada sobre qual realmente vale: 44 Existem dois nu´meros irracionais x e y tais que xy e´ racional. Existem sete 7s consecutivos na representac¸a˜o decimal do nu´mero π. • Afirmativas so´ sa˜o va´lidas perante a existeˆncia de uma prova ou construc¸a˜o da afirmativa. • Essa lo´gica e´ de especial interesse porque suas fo´rmulas esta˜o em corre- spondeˆncia 1 a 1 com tipos em λ-calculus, base das linguagens de pro- gramac¸a˜o funcionais: Lisp, ML, Haskell. • Ainda, lo´gica intuicionista e´ uma lo´gica de recursos infinitos (mas na˜o de concluso˜es infinitas). 15.4 Lo´gica linear • Lo´gica linear e´ uma lo´gica de recursos conscientes. • No caso de transic¸a˜o de estados: maior tem valor 1 −◦ maior tem valor 2 • E´ claro que a proposic¸a˜o { maior tem valor 1} deve deixar de ser va´lida no estado 2, enquanto que a proposic¸a˜o { maior tem valor 2}, que na˜o era va´lida no estado 1, passa a valer no estado 2. • Esse tipo de comportamento na˜o pode ser descrito em lo´gicas cla´ssica ou intuicionista, apenas em lo´gica linear. 15.5 Linguagens lo´gicas de programac¸a˜o - Prolog • Uma definic¸a˜o comum das cla´usulas de Horn e´ dada de acordo com a seguinte grama´tica: G ::= A|G ∧G D ::= A|G ⊃ A|∀xD • Ou seja, fo´rmulas gol sa˜o conjunc¸o˜es de fo´rmulas atoˆmicas e cla´usulas de programas sa˜o da forma: ∀x1 . . . ∀xm[A1 ∧ . . . ∧An ⊃ A0] • Observe que, como implicac¸a˜o e quantificac¸a˜o universal na˜o esta˜o pre- sentes no gol, todas as hipo´teses e termos necessa´rios para completar a prova devem estar presentes desde o in´ıcio do programa: assinaturas e programas sa˜o globais. • Ou seja, nada de mecanismos para modularizac¸a˜o ou construtores de da- dos! 45 15.6 Linguagens lo´gicas de programac¸a˜o - λ-Prolog • As fo´rmulas de primeira ordem de Harrop estendem as cla´usulas de Horn, uma vez que admitem implicac¸o˜es e quantificadores universais no gol: G ::= A|G ∧G|P ⊃ G|∀xG D ::= A|G ⊃ A|∀xD • Deste modo, o programa pode crescer ao longo da prova (modularizac¸a˜o) e novas constantes podem ser adicionadas ao programa (abstract datatypes) • Desvantagem: recursos ilimitados para construc¸a˜o de provas. 15.7 Linguagens lo´gicas de programac¸a˜o - Forum • Lo´gica linear na˜o e´ uma linguagem abstrata de programac¸a˜o. • Forum e´ uma linguagem lo´gica de programac¸a˜o baseada em lo´gica linear. Σ:Ψ;∆ −→ Γ;Υ possui uma prova em Forum se e somente se !Ψ,∆ ⊢ Γ, ?Υ. • Ale´m de modularizac¸a˜o e abstrac¸a˜o de dados tambe´m permite encap- sulac¸a˜o de estado, concorreˆncia e primitivas de comunicac¸a˜o e sincronizac¸a˜o. • Cla´usulas em Forum possuem a forma: ∀y¯(G1 →֒ · · · →֒ Gm →֒ G0), (m ≥ 0) onde G0, . . . , Gm sa˜o fo´rmulas arbitra´rias em Forum e →֒ denota −◦ ou ⊃. 16 A´lgebra e cieˆncia da computac¸a˜o A principal aplicac¸a˜o de matema´tica em cieˆncia da computac¸a˜o e´ na definic¸a˜o de semaˆntica formal em linguagens de programac¸a˜o. “Semaˆntica” e´ geralmente definida como o estudo da relac¸a˜o entre palavras e sentenc¸as de uma linguagem (escrita ou falada) e os seus significados. E´ uma a´rea que tem recebido, atrave´s dos tempos, muita atenc¸a˜o em lingu¨´ıstica e filosofia, que estudam o significado de sentenc¸as na linguagem natural. Uma segunda a´rea de estudo de semaˆntica se concentra no significado de sentenc¸as em linguagens formais de lo´gica matema´tica, originalmente projetada para servir como “fundac¸a˜o” da matema´tica. Esta sec¸a˜o visa discutir, brevemente, to´picos de uma terceira a´rea da semaˆntica: aquela que tem por objetivo desenvolver te´cnicas para expressar a semaˆntica de linguagens utilizadas para programac¸a˜o de computadores. Estaremos especialmente interessados no uso de estruturas matema´ticas tais como grupos, domı´nios e teoria de categorias na descric¸a˜o de semaˆntica de linguagens imperativas (como o Pascal) e funcionais (como ML, Haskell). 46 17 Semaˆntica Tradicionalmente, linguagens de computadores teˆm sido baseadas em uma sequ¨eˆncia de comandos, determinados por sentenc¸as imperativas. Em linguagem natural, tais sentenc¸as sa˜o aquelas que podem ser encontradas em um livro de receitas: Bata a clara do ovo ate´ ficar dura. (1) Em contraste, sentenc¸as de lo´gica matema´tica visam estabelecer verdades abso- lutas: Quando batida, a clara do ovo fica dura. (2) Muitas pesquisas em me´todos para analisar programas em uma certa linguagem procuram formalizar a relac¸a˜o entre os dois exemplos citados acima. Afinal de contas, a sentenc¸a lo´gica (2) garante que uma pessoa que execute o que manda a sentenc¸a imperativa (1) vai ter sucesso em terminar a tarefa de mudar a consisteˆncia da clara do ovo. Desta forma, uma maneira de descrever comandos (que sa˜o sentenc¸as impera- tivas) de uma linguagem de programac¸a˜o e´ estabelecendo uma relac¸a˜o entre o estado do computador antes e depois da execuc¸a˜o do comando (como descrito por sentenc¸as lo´gicas). Essa interpretac¸a˜o relacional de fragmentos de programa pode ser formalizada atrave´s da semaˆntica denotacional. Vejamos um exemplo da semaˆntica do comando if. Escreveremos C[·] para de- notac¸a˜o de um comando e E [·] para denotac¸a˜o de uma expressa˜o. Enta˜o temos: C[if E then C1 else C2] = E [E]λv.isBool v → (v → C[C1], C[C2]) Da mesma forma, podemos escrever a semaˆntica do comando while como: C[while E do C] = E [E]λv.isBool v → (v → C[C], C[while E do C]) ou, mais simplesmente, podemos escrever: C[while E do C] = C[C]; C[while E do C]) Antes de falarmos um pouco sobre esse tipo de semaˆntica, vamos responder a` uma pergunta fundamental: qual e´ o objetivo de se estudar semaˆntica de linguagens de programac¸a˜o? Bem, quando essa a´rea surgiu, o objetivo era prover uma descric¸a˜o suficientemente precisa para tornar poss´ıvel aos implementadores construir um compilador para a linguagem em questa˜o. Hoje em dia, a eˆnfase esta´ em: 1. fornecer uma descric¸a˜o precisa para os programadores, tornando poss´ıvel que estes fac¸am afirmativas rigorosas sobre o comportamento de progra- mas por eles escritos; 47 2. fornecer ferramentas para os designers de linguagens de programac¸a˜o, para que possam sugerir linguagens melhores, confia´veis e com descric¸o˜es for- mais simples. Ou seja, a grande vantagem e´ que desenvolve-se um me´todo matema´tico (e por- tanto formal) que garante corretude tanto de programas quanto da linguagens desenvolvidas. 18 Semaˆntica Denotacional E´ a semaˆntica que mapeia construtores sinta´ticos de programas em valores ab- stratos (nu´meros, func¸o˜es, etc) que eles denotam. Esses “mapeamentos” sa˜o usualmente definidos recursivamente (como no cado do while acima). E´ claro que alguns cuidados devem ser tomados quando trabalhamos com func¸o˜es re- cursivas. Em especial, para “modelar” o espac¸o de todas as func¸o˜es recursi- vas precisar´ıamos de um conjunto X que contivesse todo o espac¸o de func¸o˜es X −→ X. Por questo˜es de cardinalidade, sabemos que isso e´ imposs´ıvel. Para lidar com essa dificuldade, foi proposto, em 1969, um modelo para func¸o˜es re- cursivas X −→ X restritas a func¸o˜es cont´ınuas em X (de acordo com uma certa topologia). Esse modelo, chamado de teoria de domı´nio, e´ utilizado para descrever a semaˆntica denotacional do λ-calculus, base de linguagens de programac¸a˜o funcionais. E, utilizando o λ-calculus, podemos facilmente descrever a semaˆntica denotacional de linguagens como o Algol60, base do Pascal. Outro tipo de semaˆntica que tem sido muito estudada e´ a semaˆntica catego´rica. As ide´ias ba´sicas desse to´pico (muito em moda atualmente) sa˜o elegantes e de fa´cil entendimento para um aluno da graduac¸a˜o com alguma maturidade na a´rea de A´lgebra. 19 Segundo trabalho pra´tico O segundo trabalho pra´tico consiste em implementar o algoritmo RSA. Deve ser apresentado o seguinte: 1. A chave pu´blica (n) criada no TP1, juntamente com o nu´mero e tal que mdc(e, φ(n)) = 1. 2. Algoritmo para encontrar d, o inverso de e mo´dulo φ(n). 3. Algoritmos de codificac¸a˜o (incluindo o de partic¸a˜o da mensagem em blo- cos) e decodificac¸a˜o. 48 4. Teste em um texto de, no mı´nimo, 20 linhas. O texto, os blocos e o texto cifrado devera˜o estar contidos no trabalho. Como sempre, e´ necessa´rio um pequeno texto introduto´rio de no ma´ximo duas pa´ginas. Dessa vez na˜o vou cobrar os executa´veis... 49