Baixe o app para aproveitar ainda mais
Prévia do material em texto
MATEMÁTICA COMPUTACIONAL AULA 6 Prof. Luis Gonzaga de Paulo 2 CONVERSA INICIAL O uso da matemática na solução de problemas computacionais requer o conhecimento de diversos tipos de operações, fórmulas, teoremas e métodos de cálculos desenvolvidos ao longo da história da civilização. Alguns desses conhecimentos são milenares, e foram aperfeiçoados com o passar do tempo, derivando-se em outros ou servindo de base para novas formas de solução. Nesta aula, vamos abordar alguns temas da teoria dos números, que são cruciais para o desenvolvimento de soluções computacionais com o uso da matemática em áreas como a Criptografia, robótica, automação, inteligência artificial, entre tantas outras. O aprendizado desses conteúdos é fundamental, e depende muito da prática, da exercitação, o que poderá ser feito com o apoio dos cadernos de exercícios e das aulas práticas. Boa aula! TEMA 1 – ARITMÉTICA MODULAR Seja um número n inteiro e positivo, que faz parte de um conjunto {0,...,n- 1}, o qual representamos como ℤn. Podemos considerar que dois inteiros desse conjunto, x e y, são os mesmos se x e y diferem por um múltiplo de n, o que escrevemos assim: x = y (mod n) E dizemos que x e y são congruentes módulo n. Quando o mod n está claramente definido pelo contexto, então pode ser omitido. Todo inteiro x é congruente para determinados y em ℤn. Quando somamos ou subtraímos múltiplos de n de um inteiro x para determinar y ∈ ℤn, então dizemos que estamos reduzindo x módulo n e y é o resto (ou residual). Podemos ter escolhido diferentes conjuntos para ℤn, por exemplo, podemos adicionar n para cada elemento, mas o nosso padrão será (0, ..., n – 1}. Os elementos desta representação em particular são denominados restos (ou resíduos) menores. Exemplos: 38 = 3 (mod 5), pois 38 = 7 x 5 + 3 -3 = 11 (mod 14), pois -3 = (-1) x 14 +11 3 A aritmética com elementos de ℤn é a mais natural possível. Dados dois elementos x e y ∈ ℤn podemos realizar somas, subtrações e multiplicações e o resultado será congruente com um elemento de ℤn., como nos exemplos a seguir: 6 + 7 = 1 (mod 12) 3 x 20 = 10 (mod 50) 12 – 14 = 16 (mod 18) Essas operações se comportam de maneira semelhante às operações corriqueiras com inteiros. Entretanto não há nenhuma noção de grandeza ou proporção. Por exemplo, 0 < 4 (mod 8) é algo que não faz sentido, uma vez que basta somar 4 aos dois lados da expressão e encontramos 4 < 0 (mod 8). Os inteiros regulares são vistos como se estivessem em uma linha numérica, na qual os números inteiros à esquerda são menores que inteiros à direita. Inteiros módulo n, no entanto, são vistos como se estivessem em um círculo: ao trabalhar com o módulo 12, pense nos números do mostrador de um relógio. A divisão, porém, é um caso à parte, posto que está fora dessa constatação. Se y divide x como inteiro, poderíamos supor que podemos usar a definição típica. Vejamos então: temos que 10 = 4 (mod 6). Se dividirmos ambos os lados da equação por 2, teremos uma equação incorreta: 5 = 2 (mod 6). Assim, temos que mudar o significado da divisão. Intuitivamente, a divisão deve "desfazer multiplicação", isto é, dividir x por y significa encontrar um número z, de tal modo que y vezes z resulta em x. O problema é que existem diferentes candidatos para z em ℤn para ambos - 5 e 2 - que resultam em módulo 4, quando são multiplicados por 2. Então qual resposta devemos escolher para “4/2”, 5 ou 2? Com os números reais, embora sempre haja duas raízes quadradas de um real positivo, ainda podemos definir o símbolo da raiz quadrada, porque estipulamos que ele se refere à raiz quadrada positiva. Porém sem uma noção de grandeza, não podemos afirmar "escolha a menor resposta". Existem maneiras de escolher uma resposta única, por exemplo, podemos escolher a menor resposta ao considerar o mínimo de resto como um inteiro, mas a divisão se comportará de maneira estranha. 4 Por isso, precisamos de unicidade, isto é, x dividido por y módulo n só é definido quando existe um z ∈ ℤn único, tal que x = yz. Podemos obter uma condição em y da seguinte maneira: Suponha z1y = z2y (mod n). Então, por definição, isso significa que, para alguns k, temos y (z1 − z2) = kn. Seja d o MDC - máximo divisor comum de n e y. Então n / d divide z1 − z2, uma vez que não pode dividir y, portanto, temos: z1y = z2y (mod n) se e somente se: z1y = z2 (mod n/d) Verificamos que um único z existe se e somente se é possível encontrar um w ∈ ℤn tal que yw = 1 (mod n). Se esse w existe, ele deve ser único: suponhamos que yw’ é também 1. Então multiplicando ambos os lados de yw = yw’ temos wyw = wyw’, o que implica que w = w’ uma vez que yw = 1. Quando isso ocorre, nós denominamos este único w o inverso de y, expresso por y-1. Mas o que podemos questionar é: como sabemos que y-1 existe? E, nesse caso, como podemos encontrá-lo? Uma vez que existam apenas n elementos em ℤn podemos multiplicar cada elemento por y e verificar se resulta em 1. Caso esse resultado não seja obtido, concluímos que y não tem um inverso. De certa forma, a aritmética modular é mais fácil do que a aritmética com inteiros, posto que existem apenas muitos elementos finitos. Então, para encontrar uma solução de um problema, podemos sempre tentar todas as possibilidades. Agora temos uma boa definição para divisão: x dividido por y é x multiplicado por y-1, se o inverso de y existe. Caso contrário a resposta é indefinida. Para evitar confusão com a divisão de números inteiros, é comum evitar o uso da barra “/” como símbolo de divisão na aritmética modular: para expressar a divisão de x por y escreve-se xy-1. Como exemplo, temos a seguinte equação: 2 x 3 + 4(5-1) = 2 (mod 6) TEMA 2 – ALGORITMO DE EUCLIDES O algoritmo de Euclides é uma forma eficiente e simples para encontrar o MDC para dois inteiros diferentes de zero, sem exigir a fatoração. É um dos mais 5 antigos algoritmos conhecidos, e faz parte dos livros VII e X da obra Elementos do filósofo e matemático grego Euclides, escritos por volta de 300 a.C. Este algoritmo tem vasta aplicação nas mais diversas áreas, e é usado em grande parte de importantes aplicações, sendo um elemento-chave do método de criptografia de chave pública usado no comércio eletrônico, o algoritmo RSA. O ponto central desse algoritmo é a constatação de que um MDC – Máximo Divisor Comum pode ser calculado de forma recursiva. O resto da divisão na primeira entrada é usado no passo seguinte, até que o resto seja zero. Formulando essa definição temos: mdc (x, y) = mdc (y, r) Onde r é o resto da divisão de x por y. Como podemos ver, denotamos o máximo divisor comum de x e y como sendo mdc (x, y) ou, às vezes, somente como (x, y). E se mdc (x, y) = 1 dizemos que x e y são coprimos ou relativamente primos. Mas como encontramos o resultado de mdc (x, y)? A resposta óbvia é: relacionamos todos os divisores de x, y e identificamos o maior divisor que eles têm em comum. No entanto, isso requer que x, y sejam fatorados, e ainda não sabemos como fazer isso de forma eficiente e rápida. Porém, para refinar essa pergunta, podemos considerar que, dados três inteiros a, b, c, podemos definir c no formato c = ax + by para os inteiros x e y? Pode haver mais de uma solução? Podemos encontrar todas? Antes de responder isso, vamos responder a uma pergunta aparentemente não relacionada: Como encontramos o máximo divisor comum (mdc) de dois inteiros a, b? Curiosamente algumas observações simples levaram à forma superior do algoritmo de Euclides, ou algoritmo euclidiano. Primeiro, se d divide x e d divide y então d divide também a soma de x e y. De modo semelhante, divide também a diferença entre eles, (x – y), considerando que x é o maior dos dois números. E isso significa que diminuímos o tamanho do problema inicial. Agora só precisamoscalcular mdc (x, x – y), e o processo pode repetir-se até zerar o resto, e obter o resultado. Podemos, então, calcular o mdc (x, y) usando a divisão e o resto, como aprendemos no primário. Vamos ao exemplo: calcular o mdc (27, 33): 1. Primeiro dividimos o maior número pelo menor: 33 = 1 x 27 + 6; 6 2. Então temos que mdc (27, 33) = mdc (27, 6); 3. Repetimos o processo: 27 = 4 x 6 + 3; 4. Então temos que mdc (27, 6) = mdc (6, 3); 5. E, finalmente, 6 = 2 x 3 + 0 6. Como 6 é um múltiplo de 3, então temos que mdc (6, 3) = 3, e por conseguinte, mdc (27, 6) = 3; Esse algoritmo não requer a fatoração dos números, e é bastante rápido. Obtemos uma redução brutal de etapas necessárias verificando que, se dividirmos x por y para encontrar x = yq + r, e r > y /2, então no próximo passo obtemos r’ ≤ y / 2. Desse modo, em um ambiente computacional, a cada dois passos os números diminuem em pelo menos um bit de tamanho! As equações que estudamos permitem calcular mais do que o mdc de dois números. Nós podemos usar essas equações para encontrar os inteiros m e n que façam correta a equação: 3 = 33m + 27n Primeiro reorganizamos as equações para que os restos fiquem em evidência: 6 = 33 – 1 x 27 3 = 27 - 4 x 6 A partir da última equação substituímos os valores com base na anterior, como segue: 3 = 27 - 4 x (33 – 1 x 27) (-4) x 33 + 5 x 27) E chegamos, então, a m =-4 e n=5. Se houvessem mais equações, repetiríamos o processo até usarmos todas elas para encontrar m e n. De um modo em geral, dados dois inteiros a e b, seja d = mdc (a, b). Então podemos encontrar inteiros m e n tais que d = ma + nb usando o algoritmo euclidiano estendido. Agora podemos responder à questão colocada lá no início, isto é, dado inteiros a, b, c encontrar todos os inteiros x, y tais que: c = ax + by 7 Seja d = mdc (a, b). Desde que ax + by seja múltiplo de d para quaisquer inteiros (x, y), existem soluções apenas quando d divide c. Então digamos que c = kd. Usando o algoritmo euclidiano estendido podemos encontrar m, n tal que d = ma + nb, e então teremos a solução x = km, y = kn. Supondo que x’ e y’ seja outra solução, então c=xa+yb = x′a+y′b Reorganizando essa equação, teremos: (x’ – x) a = (y – y’) b Uma vez que d é o mdc, então b/d não divide a. Porém deve dividir a expressão do lado direito, já que o b consta dela. Então (x’ – x) é um múltiplo de b/d, ou seja: (x’ – x) = tb / d para algum inteiro t. Resolvendo a expressão (y’ – y) dado que (y’ – y) = ta / d Logo, x’ = x + tb / d e y’ = y – ta / d para um inteiro qualquer t. Se substituímos t por qualquer inteiro, x’ e y’ continuam satisfazer a equação c=x’a + y’b Deste modo, concluímos que existem muitas – na verdade, infinitas – soluções, que são dadas por x = km + tb / d e, y = kn + ta / d para todos os inteiros t. Posteriormente, com frequência desejaremos resolver 1 = xp + yq para inteiros coprimos p e q. Neste caso, as equações acima se tornam x = m + tq 8 e y = n + tp TEMA 3 – LOGARITMOS DISCRETOS Vamos imaginar que tenhamos que calcular 35 módulo 7. Uma forma de fazer isso é calcularmos 35 = 243 e então calcular 243 mod 7 = 5. Um modo mais prático decorre de observarmos que 34 = (32)2. Já que 32 = 9, e 9 mod 7 = 2, e temos 34 mod 7 = 4 = 22 e, finalmente: 35 mod 7 = (34 x 3) mod 7 = (4 x 3) mod 7 = 5 Essa forma é a mais fácil, pois os valores usados são menores, e usa a potenciação ou elevação repetida, o que nos permite calcular ak mod n usando apenas multiplicações modulares tais como O (log k). Nós podemos usar essa mesma forma ao exponenciar números inteiros, mas as multiplicações não são multiplicações modulares, e cada multiplicação demora pelo menos o dobro do tempo da multiplicação anterior. Analisemos os módulos 7 de sucessivas potências de 3: 31 mod 7 = 3 32 mod 7 = 2 33 mod 7 = 6 34 mod 7 = 4 35 mod 7 = 5 36 mod 7 = 1 Observe que o resultado do módulo de cada potência de 3 é exatamente o resultado do módulo 7 da potência anterior multiplicado por 3. E observamos que, após essa sequência, os resultados se repetem de forma cíclica: 37 mod 7 = 3 38 mod 7 = 2 39 mod 7 = 6 310 mod 7 = 4 311 mod 7 = 5 312 mod 7 = 1 e assim sucessivamente. Apesar de observarmos isso, olhando rapidamente a sequência 3,2,6,4,5,1 não reflete nenhuma ordem aparente ou tampouco uma estrutura parece não ter ordem ou estrutura alguma. De qualquer modo, embora haja outras coincidências nessa sequência – como por exemplo: se somarmos os resultados à cada três elementos, o resultado será 7 – pouca coisa podemos 9 considerar a respeito dessa sequência, o que nos leva ao problema do logaritmo discreto. 3.1 O problema do logaritmo discreto Seja p um número primo, e g, h dois elementos de ℤ𝐩𝐩∗ (ou seja, números inteiros menores que p). Suponhamos que saibamos que gx = h (mod p). Então, qual é o valor de x? Por exemplo, vamos avaliar uma ocorrência do problema do log discreto: calcular o valor de x de tal modo que 3x = 6 (mod 7). A resposta é: x = 3. Falando de forma específica, qualquer x = 3 (mod 6) vale como resposta. Vamos lembrar que, quando encontramos a inversão modular pela primeira vez, percebemos que poderíamos tentar cada elemento para encontrar um inverso. Porém isso é muito demorado para ser usado na prática. O mesmo vale para os logaritmos discretos: nós podemos tentar todas as potências possíveis até encontrá-las, mas isso é impraticável. O algoritmo de Euclides nos fornece uma maneira mais efetiva de computar inversos, porém não conhecemos nenhum algoritmo rápido para encontrar os logaritmos discretos. Os melhores algoritmos conhecidos para calcular logaritmos discretos são muito mais rápidos do que tentar todos os elementos, mas mesmo assim não são equivalentes ao tempo do cálculo polinomial. Esse conceito de logaritmos discretos é de fundamental importância, na atualidade, para os mecanismos de chave pública e assinatura digital. O entendimento desse conceito e de sua aplicação no contexto computacional passa pelos conhecimentos básicos da teoria dos números que estamos apresentando. Em função desse entendimento, dizemos que dois números são relativamente primos se não tiverem fatores primos em comum, isto é, se seu máximo divisor comum for 1. Veremos, a seguir, que a função de Euler, Φ (n), expressa o número de inteiros positivos menores que n que são relativamente primos com n. E devido a questões técnicas definimos que: Φ(1) = 1 Vejamos os seguintes exemplos: 10 Φ (89) = 88 O que significa que os inteiros de 1 a 88 são relativamente primos de 89, uma vez que 89 é primo. Φ (45) = 40 Uma vez que 1,2,4,6,7,8,10,11,12,13,14,16,17,18,19,...,40 são os inteiros positivos menores que 45 que são relativamente primos de 45. As tabelas que expressam os valores desta função são vastas na bibliografia, e por meio delas podemos verificar que, se p é primo, então Φ (p) = p-1 Também temos que, se p≠q São números primos, então Φ (pq) = Φ (p) Φ(q)=(p-1)(q-1) Essa expressão reflete o Teorema de Euler, assunto de nosso próximo tema! TEMA 4 – TEOREMAS DE EULER E FERMAT Como já dissemos, o problema do logaritmo discreto pode ser complexo, porém temos a nosso favor alguns pontos sobre a potência de uma unidade a ∈ ℤ𝒏𝒏∗ . Primeiramente, ak = 1 para algum valor de k: uma vez que existem diversas unidades, em quantidade finita, é possível que devamos ter ax = ay para algum x < y eventualmente, e uma vez que existe um a − 1 podemos encontrar a x – y = 1. Consideremos a ∈ ℤ𝒏𝒏∗ . O menor inteiro positivo x para o qual ax = 1 (mod n) é chamado a ordem de a. A sequência a, a2, ... repete-se até atingir ax = 1. Como nesse caso ax + k = ak, e temos ak = 1 precisamente quando k é um múltiplo de x. Por exemplo: As potências de 3 (mod 7) são 3,2,6,4,5,1 então a ordem de 3(mod 7) é 6. Os teoremas apresentados a seguir reduzem drasticamente o conjunto dos valores possíveis para a ordem de uma unidade. 11 4.1 Pequeno Teorema de Fermat O pequeno teorema de Fermat afirma que dado um número primo p então ap = a (mod p) para qualquer a ∈ ℤ𝒑𝒑 . Uma forma na qual este teorema é geralmente expresso é ap − 1 = 1 (mod p) desde que a não seja zero. Para provar esse teorema, primeiro mostramos uma identidade – por vezes denominada “o sonho de calouro”: para um dado número primo p temos: (x + y) p = xp + yp (mod p) Isto é imediato a partir da expansão binomial, porque p divide cada termo, exceto por dois termos, ou seja, (x + y)p = xp + yp + p (...) = xp + yp (mod p) Por indução temos: (x1 + ... + xn) p = 𝒙𝒙𝟏𝟏 𝒑𝒑+ ... + 𝒙𝒙𝒏𝒏 𝒑𝒑 Assim, se declaramos a = 1 + ... + 1a = 1 + ... + 1 (ou seja, a números 1s), temos então que: ap = (1 + ... + 1) p = 1p + ... + 1p = 1 + ... + 1 = a.n Esse pequeno teorema de Fermat oferece outra maneira de computar inversos. Para a ∈ ℤ𝒑𝒑′∗ , a – 1 pode ser calculado como ap − 2, uma vez que temos a.ap − 2 = 1 pelo teorema. Então, em resumo, o pequeno teorema de Fermat afirma que se p é um número primo, então para qualquer inteiro a, o número ap - a é um inteiro múltiplo de p. Em notação aritmética modular escrevemos deste modo: ap ≡ a (mod p) Como exemplo e prova podemos demonstrar que, se a = 2 e p = 7, então 27 = 128 e 128 - 2 = 126 = 7 × 18, portanto 126 é um múltiplo inteiro de 7. Se a não é divisível por p, o pequeno teorema de Fermat equivale à afirmação de que ap - - 1 é um inteiro múltiplo de p, ou seja: ap-1 ≡ 1 (mod p) 12 Para provar isso, vejamos: se a = 2 e p = 7, então 26 = 64 e 64 - 1 = 63 = 7 × 9, sendo, portanto, um múltiplo de 7. 4.2 Teorema de Euler O Teorema de Euler é, de certa forma, um modo genérico do pequeno teorema de Fermat, que vimos antes. O modo formal de expressar o teorema de Euler é o seguinte: se a ∈ ℤ𝒏𝒏∗ então aϕ (n) = 1 (mod n). Isso reduz o pequeno teorema de Fermat quando n é primo. Para comprovar, podemos considerar o seguinte: seja m = ϕ (n), e identificadas as unidades u1, ..., um. Consideremos, então, a sequência au1, ..., aum (ou seja, apenas multiplicamos cada unidade por a). Se aui = auj, então a multiplicação por a − 1 (que existe, uma vez que a é uma unidade) resulta em ui = uj, e, portanto, os membros da sequência são distintos. Além disso, sabemos que os produtos das unidades também devem ser unidades, e, portanto, au1, ..., aum deve ser u1,..., um em alguma ordem. Multiplicando todas as unidades juntas temos: au1 ... aum = u1 ... um Reorganizando os produtos: aϕ (n) = am = (u1 ... um) (u1 ... um) −1 = 1 Da mesma forma, o Teorema de Euler também oferece uma maneira alternativa de calcular os inversos. Para todo a ∈ ℤ𝒏𝒏∗ , o valor de a − 1 pode ser calculado como aϕ (n) −1. É um modo bastante eficiente, já que podemos usar a repetição de quadrados, porém o algoritmo de Euclides é ainda mais rápido (qual seria o motivo?) E não requer que tenhamos que calcular ϕ (n). Estes teoremas não nos dizem a ordem de uma dada unidade a ∈ ℤ𝒏𝒏∗ , entretanto a diminuem significativamente: façamos x ser a ordem de a. Se sabemos que ay = 1 pelo algoritmo de Euclides, podemos encontrar m, n tal que d = mx + ny onde d = mdc (x, y). Então ad = amx + ny = (ax) m (ay) n = 1 13 assim, como d ≤ x, devemos ter d = x (já que x é o menor inteiro positivo para o qual ax = 1) e, consequentemente, x deve ser um divisor de y. Assim, pelo Teorema de Euler, a ordem de a divide ϕ (n). Podemos finalizar lembrando que esses teoremas são casos especiais do Teorema de Lagrange (da teoria dos grupos), ressaltando que tanto Fermat como Euler morreram muito antes da teoria do grupo ser desenvolvida. 4.3 Teorema de Euler e o problema do logaritmo discreto Uma vez que já fomos apresentados ao Teorema de Euler, vamos retomar o problema do logaritmo discreto. Se t e n são números relativamente primos, então: tΦ(n) = 1 ( mod n) Vamos considerar a seguinte equação: tx = 1 ( mod n) Se t e n são relativamente primos, já sabemos que, x = ϕ (n) é solução da equação. O menor valor positivo de x, solução da equação, é chamado de ordem de t (mod n) ou extensão do período gerado por t. Para entendermos melhor esse conceito, vejamos o exemplo a seguir: 71 = 7 ( mod 19) 72 = 11 ( mod 19) 73 = 1 ( mod 19) 74 = 7 ( mod 19) 75 = 11 ( mod 19) 76 = 1 ( mod 19) 77 = 7 ( mod 19) Observamos que o resultado expressa uma sequência periódica, cujo período é 3, ou seja, neste caso x = 3 é o gerador. Consideremos, agora, o primo n = 13 e a seguinte tabela: Tabela 1 - Inteiros positivos mod 13 diferentes de zero t1 t2 t3 t4 t7 t6 t7 t8 t9 t10 t11 t12 1 1 1 1 1 1 1 1 1 1 1 1 2 4 8 3 6 12 11 9 5 10 7 1 14 3 9 1 3 9 1 3 9 1 3 9 1 4 3 12 9 10 1 4 3 12 9 10 1 5 12 8 1 5 12 8 1 5 12 8 1 6 10 8 9 2 12 7 3 5 4 11 1 7 10 5 9 2 1 7 10 5 9 2 1 8 12 5 1 8 12 5 1 8 12 5 1 9 3 1 9 3 1 9 3 1 9 3 1 10 9 12 3 4 1 10 9 12 3 4 1 11 4 5 3 7 12 2 9 8 10 6 1 12 1 12 1 12 1 12 1 12 1 12 1 Analisando essa tabela, podemos notar que determinados valores de t geram, por meio das potências, o conjunto dos valores inteiros positivos de mod 13 diferentes de zero. Denominamos a cada um desses inteiros de raiz primitiva do mod 13. Nesse caso, esses números são 2,4,6,10,11. Notamos, também, que, se t é primitiva de n, então: t, t2,t3,...,tΦ(n) São relativamente primos de n. Em particular, se n = p, então: t, t2,t3,...,tp-1 São relativamente primos de p. A Teoria dos Números nos revela que os inteiros que têm raízes primitivos são 2,4, e os da forma pk e 2pk, onde p é um número primo maior que 2 e k é um inteiro positivo. A questão do logaritmo discreto para números primos desperta um interesse especial no âmbito da criptografia. Consideremos um número p primo e t uma raiz primitiva de p. As potências de t de 1 até p - 1 apresentam os valores de 1 até p - 1 exatamente uma vez, tomados pelo módulo p. Por intermédio da aritmética modular, sabemos que dado um inteiro b, b= s mod p, para 0 ≤ s ≤ p -1 Assim, seguimos considerando que, para um inteiro b e t uma raiz primitiva de p, existirá um expoente i com 1 ≤ i ≤ p -1, tal que b = ti mod p Então nós podemos definir o número i como sendo o logaritmo discreto de b na base t mod p, o que denotamos por d logt,p b = i 15 Podemos apresentar outras notações para este conceito, e verificamos na Tabela 1 já apresentada, que também podemos escrever: d log11,13 25 = 6 ou d log2,13 14 = 12 4.4 Cálculo do logaritmo discreto O cálculo do logaritmo discreto consiste em solucionar o seguinte problema: "Dados três números primos, b, t e p, encontrar x de modo que b = tx mod p". A grande dificuldade para resolver essa equação para um número primo p muito grande, com muitos dígitos, mesmo com um algoritmo considerado rápido, é da ordem de: exp[(ln p)1/3(ln (ln p)2/3] Isso torna inviável o tratamento computacional para a busca de um resultado, mesmo fazendo uso de um ambiente computacional potente. É por isso que todo o sistema criptográfico na atualidade é baseado em um problema matemático de difícil solução computacional, em um tempo satisfatório. 4.5 Multiplicação e Ordem Seja x a ordem de a ∈ ℤ𝒏𝒏∗ e y a ordem de b ∈ ℤ𝒏𝒏∗ . Então qual é a ordem do produto ab? Para responder a essa questão, suponhamos que (ab) k = 1. Elevando ambos os lados da equação à x temos então que bkx = 1kbkx = (ax) kbkx = (ab) kx = 1 Como b tem ordem y, concluímos que y | kx. Agora suponhamos que x, y sejam coprimos. Então devemos ter y | k. De modo semelhante temos x | k, e, portanto, k deve ser um múltiplo de xy. Por outro lado, temos (ab) xy = 1 e, exatamente por isso, a ordem de ab é precisamente xy: Ou seja, “para os elementos com ordens de coprimos,a ordem de seu produto é igual ao produto de suas ordens”. Expondo de forma mais genérica, seja d = mdc (x, y). Então x | ky e y | kx implica que k deve ser um múltiplo de (x / d) (y / d). Se z é o mmc de x e y, 16 o qual podemos calcular por z = xy / d, então (ab) z = 1. Desse modo, tudo o que podemos dizer até esse momento é que a ordem de ab é um múltiplo de xy / d2 e divide xy / d. 4.6 O problema do RSA1 Suponha que nos sejam dados os números inteiros positivos e, N e ae (mod N) para alguma unidade a. Como podemos recuperar a? Uma estratégia é: encontrar um inteiro d tal que ade = a (mod N). Pelo que vimos no Teorema de Euler, d irá satisfazer esta equação se de = kϕ (N) + 1 para algum k. Expondo isso de outra forma, nós podemos calcular: d = e − 1 (mod ϕ (N)) e então calcular (ae) d para recuperarmos o valor de a. Porém, até o momento, não sabemos como calcular ϕ (N) a partir de N sem fatorar N, e ainda não temos uma forma de fatorar grandes números primos com eficiência. A segurança e a confiabilidade do algoritmo RSA residem nessa dificuldade. TEMA 5 – TESTES DE FERMAT E MILLER-RABIN O uso de números primos grandes é essencial para alguns algoritmos de criptografia. Porém um dos complicadores do uso desses números é exatamente a identificação deles. Por definição, um número primo é aquele divisível apenas por 1 e por ele mesmo. Imaginemos um inteiro qualquer n: como podemos afirmar que n é primo? Vamos assumir que n seja ímpar, já que o único caso de número par e primo é o do número 2. A forma mais corriqueira de verificar se n é primo seria procurar os fatores de n, entretanto, como já sabemos, ainda não conhecemos nenhum algoritmo de fatoração eficiente para essa operação. 5.1 O teste de Fermat Conhecemos como teste de Fermat ou teorema de Fermat o seguinte enunciado: se o número n é primo, então para qualquer a temos que an-1 = 1 (mod n). Na prática é isso o que sugere o teste de Fermat para identificar um 1 RSA é um sistema criptográfico de chave pública pioneiro, desenvolvido por Ron Rivest, Adi Shamir e Leonard Adleman (de cujos sobrenomes vem o acrônimo RSA) no qual a chave de criptografia é pública, e a chave de descriptografia é privada. A segurança do algoritmo é baseada na grande dificuldade de fatorar números primos de valor elevado. 17 número primo: escolhemos um número aleatório a tal que a ∈ {1, ..., n − 1} e verificamos se an-1 = 1 (mod n). Se não, então deve ser um número composto, isto é, não é primo. Entretanto podemos ainda obter essa igualdade mesmo quando n não é primo. Se considerarmos, por exemplo, que n = 561, isto é, 3 × 11 × 17. Pelo teorema chinês do resto, temos que: ℤ561 = ℤ 3 × ℤ 11 × ℤ 17 Desse modo podemos verificar que, para cada a ∈ ℤ𝟓𝟓𝟓𝟓𝟏𝟏∗ Correspondem alguns números (x, y, z) ∈ ℤ𝟑𝟑∗ x ℤ𝟏𝟏𝟏𝟏∗ x ℤ𝟏𝟏𝟏𝟏∗ Pelo teorema de Fermat temos que x2 = 1, y10 = 1 e z16 = 1 Como tanto 2, como 10 e 16 são divisores de 560, isso significa que (x, y, z)560 = (1,1,1), ou, de outro modo, podemos afirmar que a560 = 1 para qualquer a ∈ ℤ𝟓𝟓𝟓𝟓𝟏𝟏∗ Ou seja, não importa o a que escolhermos, pois 561 sempre passará no teste de Fermat, apesar de ser composto, desde que a seja coprimo de n. Os números para os quais essa situação ocorre são denominados números Carmichael ou pseudoprimos, e há uma infinidade desses números. Se a não é coprimo de n então este teste de Fermat falha, mas então podemos facilmente obter um fator de n calculando o mdc (a, n). 5.2 O teste de Miller-Rabin Um modo melhor para fazer esse cálculo é lembrar que n é primo se e somente se as soluções de x2 = 1 (mod n) são somente x = ± 1. Assim, se validarmos n pelo teste de Fermat, isto é, an−1 = 1, então também verificamos a (n − 1) / 2 = ± 1, uma vez que a (n − 1) / 2 é uma raiz quadrada de 1. Porém os números como o terceiro número de Carmichael (1729) invalidam mesmo este teste mais 18 avançado. Entretanto, e se nós o repetirmos? Ou seja, enquanto for possível, continuaremos reduzindo o expoente pela metade até alcançarmos um número qualquer além de 1. Se o resultado for qualquer outro número que não −1, então n deve ser composto, ou seja, não é primo. Expressando de maneira formal, seja 2s a maior potência de 2 que divide n − 1, isto é, n − 1 = 2sq para algum número ímpar q. Desse modo, cada membro da sequência 𝑎𝑎𝑛𝑛−1 = 𝑎𝑎2𝑠𝑠𝑞𝑞, 𝑎𝑎2𝑠𝑠𝑞𝑞, ... 𝑎𝑎𝑞𝑞 é uma raiz quadrada do membro anterior. Então, se n é primo, esta sequência começará com 1 e cada membro será 1, ou o primeiro membro da sequência diferente de 1 é -1. O teste de Miller-Rabin trata, então, de escolhermos um número a ∈ ℤ n. Se a sequência apresentada anteriormente não começa com 1, ou o primeiro membro da sequência que não é 1 também não é -1, então n não é primo. Acontece, porém, que, para qualquer número composto n, incluindo os já citados números de Carmichael, a probabilidade de n passar no teste de Miller-Rabin é de, no máximo, ¼, sendo que na média essa probabilidade é bem menor. Portanto, a probabilidade de n passar no teste após sucessivas execuções diminui exponencialmente. Se n não passar no teste de Miller-Rabin com uma sequência começando com 1, então temos uma raiz quadrada não trivial de 1 módulo n, e poderemos fatorar n de modo eficiente. Desse modo, os números de Carmichael serão sempre fáceis de fatorar. Quando o teste de Miller-Rabin é executado em números da forma pq onde p, q são grandes números primos grandes, o teste falha quase sempre, pois a sequência não começa com 1. Esse é o motivo pelo qual o algoritmo de criptografia RSA não pode ser quebrado dessa maneira. A implementação do teste de Miller-Rabin é feita, na prática, da seguinte forma: 1. Dado n, encontramos s de modo que n − 1 = 2sq para algum q ímpar. 2. Escolhemos um valor aleatório para a de tal modo que a ∈ {1, ..., n − 1} 3. Se aq = 1, então n passa no teste, e finalizamos o teste. 19 4. Para toda iteração i = 0, ..., s − 1 verificamos se 𝑎𝑎2𝑖𝑖𝑞𝑞 = −1. Caso seja, n passa no teste, e finalizamos o teste. 5. Caso contrário, n é um número composto, e, portanto, não é primo. Também é importante realizarmos alguns testes de divisão por pequenos números primos antes de executar o teste de Miller-Rabin. Essencialmente esses testes são testes de composição, uma vez que não provam que o número testado é primo, porém provam que este número é composto (ou seja, não é primo). Existem algoritmos determinísticos de tempo polinomial para verificar se o número é primo, tais como o AKS - Agrawal, Kayal e Saxena, embora estes, no momento, sejam impraticáveis do ponto de vista computacional. FINALIZANDO Os temas que estudamos nesta aula fazem parte da Teoria dos Números, um ramo da Matemática essencial para a modelagem de problemas – e das soluções desses problemas, especialmente em áreas como a Criptografia e a Criptologia, a robótica e a automação, e a inteligência artificial, entre tantas outras, como já dissemos no início. O domínio desse conteúdo é essencial para a pesquisa e o desenvolvimento de soluções computacionais embasadas na modelagem matemática, e mais além disso, para efetuar a comprovação da efetividade dessas soluções sem a necessidade de se construir programas ou sistemas, provando matematicamente sua viabilidade. Essa possibilidade é de grande valor, uma vez que representa grande racionalização no uso de recursos e do tempo, abre a perspectiva de discussão da solução em uma linguagem universal – a matemática – e reduz as especulações e o grau de incerteza inerente às atividades de projeto e desenvolvimento em geral. A contribuição dessa nossa aula é um incentivo a você, aluno(a), a caminhar na direção do estabelecimento de um modelo de trabalho em pesquisa e desenvolvimento tão escasso quanto caro, em nossa civilização,porém que já se comprovou, através dos séculos, ser capaz de diferenciar as nações e os povos que primaram por utilizarem-no e, assim, destacarem-se na história. 20 REFERÊNCIAS BONAFINI, F. C. Matemática e estatística. São Paulo: Pearson Education do Brasil, 2014. GERSTING, J. L. Fundamentos matemáticos para a ciência da computação: um tratamento moderno de matemática discreta. Rio de Janeiro: LTC, 2015. HUNTER, D. J. Fundamentos da matemática discreta. Rio de Janeiro: LTC, 2011. LEITE, A. E.; CASTANHEIRA, N. P. Teoria dos Números e Teoria dos Conjuntos. Curitiba: InterSaberes, 2014. LYNN, B. Teoria dos Números – Notas. Stanford University. Disponível em: <https://crypto.stanford.edu/pbc/notes/numbertheory/>. Acesso em: 30 jul. 2019. MACEDO, L. R. D.; CASTANHEIRA, N. P.; ROCHA, A. Tópicos de Matemática Aplicada. Curitiba: InterSaberes, 2013. SHOUP, V. A Primer on Algebra and Number Theory for Computer Scientists. Courant Institute, New York University, 2002. Disponível em: <https://cs.nyu.edu/courses/fall02/G22.3033-010/notes.pdf>. Acesso em: 30 jun. 2019. STEIN, C.; DRYSDALE, R. L.; BOGART, K. Matemática discreta para ciência da computação. São Paulo: Pearson Education do Brasil, 2013. VIEIRA, M. J. Introdução aos Fundamentos da Computação – Linguagens e Máquinas. São Paulo: Pioneira Thomson Learning, 2005. WALPOLE, R. E.; MYERS, R. H.; MYERS, S. L.; YE, K. Probabilidade & Estatística para engenharia e ciências. 8. Ed. São Paulo: Pearson Prentice Hall, 2009. Conversa inicial TEMA 1 – ARITMÉTICA MODULAR TEMA 2 – ALGORITMO DE EUCLIDES TEMA 3 – LOGARITMOS DISCRETOS 3.1 O problema do logaritmo discreto TEMA 4 – TEOREMAS DE EULER E FERMAT 4.1 Pequeno Teorema de Fermat 4.2 Teorema de Euler 4.3 Teorema de Euler e o problema do logaritmo discreto 4.4 Cálculo do logaritmo discreto 4.5 Multiplicação e Ordem 4.6 O problema do RSA0F TEMA 5 – TESTES DE FERMAT E MILLER-RABIN 5.1 O teste de Fermat 5.2 O teste de Miller-Rabin FINALIZANDO REFERÊNCIAS
Compartilhar