Universidade Federal do Espírito Santo – CCA UFES Universidade Federal do Espírito Santo Centro de Ciências Agrárias – CCA UFES Departamento de Computação Teoria dos Números Tópicos Especiais em Programação Site: http://jeiks.net E-mail: [email protected] Universidade Federal do Espírito Santo – CCA UFES Teoria dos Números ● Sumário – Números Primos; – Divisibilidade; – Aritmética Modular; – Congruência; – Bibliotecas que podem ser utilizadas; – Problemas. 2 Universidade Federal do Espírito Santo – CCA UFES Números Primos ● Definição: – ● ● Se p é um número primo, então p = a · b para inteiros a ≤ b, onde a=1 e b=p. Os primeiros números primos são: – ● ● É um inteiro p > 1 que somente é divisível por 1 e por ele mesmo. 2, 3, 5, 7, 11, 13, 17, 19, 23, and 27. Números primos são importantes por serem fundamentais em teoremas da aritmética. Apesar de existirem números muito grandes, todos os inteiros podem ser expressados de somente um maneira: como o produto de números primos. – Exemplos: 105 é expressado como 3 × 5 × 7; 32 é expressado como 2×2×2×2×2. 3 Universidade Federal do Espírito Santo – CCA UFES Números Primos ● ● ● ● Este conjunto que números que ao ser multiplicado provê n é denominado fatoração de n. A ordem dos números da fatoração não importa, mas a quantidade de vezes que cada um é multiplicado sim. Um número primo p é um fator de x se ele aparecer na fatoração de x. Qualquer número que não é primordial é dito composto. 4 Universidade Federal do Espírito Santo – CCA UFES Encontrando primos ● A maneira mais fácil de testar se um número x é primo é utilizar divisão repetitiva: – ● ● Deve-se começar do menor divisor possível até chegar ao número x. Como 2 é o único primo par, após testar a divisão por ele, basta testar a divisão pelos demais fatores ímpares. Além disso, podemos dizer que n é primo se ele não tiver fatores primos abaixo de √n. Por que? Todo número primo é tem raiz irracional. Então, provamos por contradição... 5 Universidade Federal do Espírito Santo – CCA UFES Se √ p é racional, então: a √ p=b <− não pode ser reduzido a2 ⇒ p= 2 b a=f 1 · f 2 ·...· f n ⇒ a2=f 21 · f 22 ·...· f 2n (então p é um fator de a) ⇒ a é múltiplo de p ⇒ a=kp(sendo k constante) ⇒ b 2 p=(kp)2 ⇔ b2 p=k 2 · p2 ⇔ b2 =k 2 · p Assim, vemos que b também é múltiplo de p Tínhamos determinado que a e b são primos e não tem fator comum, exceto 1 Mas conseguimos determinar que a é múltiplo de p e que b é múltiplo de b Então, eles possuem o fator em comum p e podem ser divididos por p a Isso vai contra a afirmação inicial de que não poderia ser reduzido b 6 Universidade Federal do Espírito Santo – CCA UFES Encontrando primos ● ● ● O matemático grego Euclides provou que os números primos eram infinitos. E Eratóstenes criou um método para descobrir os primos em uma sequência de números naturais de 1 até n. Seu algoritmo se baseia em uma “peneira”: ele testa se um número é primo. – Se for, elimina todos os seus múltiplos. Vamos ver um exemplo... 7 Universidade Federal do Espírito Santo – CCA UFES Primos menores que 50 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 Como o menor primo é 2, iniciamos por ele e removemos todos seus múltiplos. Após isso, vamos para o próximo número primo e continuamos apagando os múltiplos dele. (próximos primos: 3, 5 e 7). Então, PARAMOS. Mas por que paramos em 7? Qualquer outro número primo dessa sequência deve ser: 11 * “primo menor” E todos os múltiplos de “primos menores” já foram removidos. Assim, basta efetuar o cálculo com os números primos anteriores a √n = √50 = 7 02 11 03 13 05 07 17 23 31 41 19 29 37 43 47 8 Universidade Federal do Espírito Santo – CCA UFES Fatoração Fatoração de de nn fatoracao(long n) { while ((n % 2) == 0) { cout << 2 << endl; n = n / 2; } long i = 3; while ( i <= (sqrt(n)+1) ) { if ((n % i) == 0) { cout << i << endl; n = n / i; } else i = i + 2; } if (n > 1) cout << n << endl; } Teste Testecom comn=2.147.483.647 n=2.147.483.647 Para Paramelhorar melhoraraa performance, performance,pode-se pode-semover mover oosqrt sqrtpara parafora forado dolaço laçoeesó só fazê-lo fazê-loquando quandooovalor valorde deii modificar. modificar. 9 Universidade Federal do Espírito Santo – CCA UFES Divisibilidade ● Dizemos que “b divide a” ⇔ b|a, se a = b.k ● Equivalentemente, dizemos que b é um divisor de a; ou a é múltiplo de b; se b|a ● O menor divisor natural de qualquer inteiro, exceto zero, é 1. ● Como encontrar todos os divisores de um número? – Podemos utilizar a fatoração de primos, – Mas cuidado: 12, por exemplo, possui os fatores 2, 2, 3. Mas possui como divisores 1, 2, 3, 4, 6, 12. 10 Universidade Federal do Espírito Santo – CCA UFES Máximo Divisor Comum – MDC ● ● ● Se os números são primos, seu maior fator em comum será 1. Uma forma de fazer o MDC: – Realizar a fatoração de primos dos dois números e – Depois realizar a multiplicação de todos os fatores em comum. – Porém, tem custo computacional alto. Outra forma é utilizando o algoritmo de Euclides. 11 Universidade Federal do Espírito Santo – CCA UFES Algoritmo de Euclides ● O algoritmo de Euclides tem duas observações: 1. Se b|a, então o mdc(a, b) = b (pois se b|a, então a = b*k) 2. Se a = bt + r, então mdc(a, b) = mdc(b, r) Pela definição: mdc(a, b) = mdc(bt + r, b) Assim, se a e b não são primos, eles possuem uma medida em comum, divisível por t, sobrando resto r. b.t r a Exemplo (a=34.398 e b=2.132): mdc(34.398, 2.132) = mdc(34.398 mod 2.132, 2.132) = mdc(286, 2.132) mdc(2.132, 286) = mdc(2.132 mod 286, 286) = mdc(130, 286) mdc(286, 130) = mdc(286 mod 130, 130) = mdc(26, 130) mdc(130, 26) = mdc(130 % 26, 26) = mdc(0, 26) 12 Universidade Federal do Espírito Santo – CCA UFES Algoritmo de Euclides ● O algoritmo de Euclides também pode nos fornecer os inteiros x e y que: a.x + b.y = mdc(a, b) Útil para resolver congruências lineares. a. x+b. y=mdc (a , b) ⌊⌋ a mdc (a , b)=mdc (b , a'), onde a'=a−b b a a−b =a mod b b ⌊⌋ ( ⌊ ⌋) a . y '=mdc(a ,b) b Trocando por recursividade, chegamos em: a.1+0. 0=mdc (a , 0) b . x ' + a−b 13 /* Universidade Federal do Espírito Santo – CCA UFES Encontra o mdc(p,q) e os valores de x,y onde p*x + q*y = mdc(p,q) */ long mdc(long p, long q, long &x, long &y) { long x1,y1; /* coeficientes anteriores */ long g; /* valor de mdc(p,q) */ if (q > p) return(mdc(q,p,y,x)); if (q == 0) { x = 1; y = 0; return(p); } g = mdc(q, p%q, x1, y1); x = y1; y = (x1 floor(p/q)*y1); return(g); } 14 Universidade Federal do Espírito Santo – CCA UFES Mínimo Múltiplo Comum – MMC ● Outra função útil é o MMC: – O menor inteiro que pode ser dividido por um par de inteiros. mmc(24, 36) = 72 ● O MMC serve para trabalhar com periodicidade: – Quando será o próximo ano (após 2000) que a eleição presidencial (ocorre a cada 4 anos) coincidirá com o censo (ocorre a cada 10 anos)? R: Como o mmc(4, 10) = 20, então 2000+20 = 2020 ● Para obter o mmc, basta fazer: a.b mmc (a ,b)= mdc (a , b) 15 Universidade Federal do Espírito Santo – CCA UFES Aritmética Modular ● Muitas das vezes, nós não precisamos da resposta completa. – Por exemplo, suponha que seu aniversário esse ano seja em uma quarta-feira. Qual é o dia da semana que ele será no ano que vem? Tudo que você precisa saber é o resto da divisão entre 365 (ou 366 para ano bissexto) por 7 dias da semana e somar ao dia da semana atual: 4 para quarta-feira. ● A chave para uma computação mais eficiente é a Aritmética Modular. É claro que, em princípio, temos que efetuar a conta para obter o resto. Mas para inteiros e operações aritméticas com números grandes, às vezes podemos trabalhar comente com o valor de resto. 16 Universidade Federal do Espírito Santo – CCA UFES Aritmética Modular ● Aritmética modular (ou aritmética do relógio) – Sistema de aritmética para inteiros, onde os números "voltam pra trás" quando atingem um certo valor, o módulo. – O resultado da operação é o resto dentre o valor e seu módulo. 17 Universidade Federal do Espírito Santo – CCA UFES Aritmética Modular ● A chave para entender a Aritmética Modular, é entender seus conceitos básicos: – Adição; – Subtração; e – Multiplicação. 18 Universidade Federal do Espírito Santo – CCA UFES Aritmética Modular ● Adição – Quanto dá (x+y) mod n? Isso pode ser simplificado em: ( (x mod n) + (y mod n) ) mod n Para evitar a soma com números muito grandes. ● Exemplo/Exercício: Quantos centavos eu terei se ganhar R$ 123,45 do meu pai e R$ 94,67 da minha mãe? 19 Universidade Federal do Espírito Santo – CCA UFES Aritmética Modular ● Subtração – ● A subtração nada mais é do que a adição com números negativos. Exemplo: – Quantos centavos eu terei se gastar R$ 52,53? Obs.: No exercício anterior, você tinha R$ 218,12 – Então: (12 mod 100) – (53 mod 100) = - 41 mod 100 = 59 20 Universidade Federal do Espírito Santo – CCA UFES Aritmética Modular ● Multiplicação – Uma vez que a multiplicação é simplesmente uma adição repetida: x.y mod n = (x mod n).(y mod n) mod n ● Exemplo: – Quantos centavos eu terei se ganhar R$ 17,28 por hora em 2143 horas? (1728 x 2143) mod 100 = (1728 mod 100).(2143 mod 100) mod 100 = 4 mod 100 21 Universidade Federal do Espírito Santo – CCA UFES Aritmética Modular ● Exponenciação – Da mesma forma, é somente multiplicação repetida: xy mod n = (x mod n)y mod n ● Exercício: – ● Qual é o último dígito de 2100? Divisão – Será discutida daqui a pouco... 22 Universidade Federal do Espírito Santo – CCA UFES Congruência ● ● A Congruência é uma notação alternativa para representar uma aritmética modular. Se a mob n = b, então temos: a ≡ b (mod n) Significa que a é congruente a b módulo n. ● Se a mod n = b, então n é divisor de (a – b) ● Vamos ver um exemplo... 23 Universidade Federal do Espírito Santo – CCA UFES De: <http://khanacademy.org> ● ● A congruência expressa quais números pertencem a mesma “fatia”, chamada de classe de equivalência. No exemplo acima, temos na mesma “fatia”: 1, 6, 11, 16, 21, 26 ● Então, temos: 1 ≡ 1(mod 5), 6 ≡ 1(mod 5), 11 ≡ 1(mod 5), 16 ≡ 1(mod 5), .... 24 Universidade Federal do Espírito Santo – CCA UFES Congruência ● Quais inteiros x satisfazem x ≡ 3(mod 9)? Isso representa: x mod 9 = 3 e 9 | (x – 3) Conjunto de soluções: x = 9y + 3, onde y ∈ {0, 1, 2, ...} a. Quanto é 2x ≡ 3(mod 9)? Iniciemos pensando: 2x mod 9 = 3 Qual o primeiro número após 9 que gerará resto 3? Ele é múltiplo de 2? Como generalizar essa fórmula? b. Quanto é 2x ≡ 3(mod 4)? 25 Universidade Federal do Espírito Santo – CCA UFES Congruência ● Operação de Adição e Subtração: Suponha que a ≡ b(mod n) e c ≡ d(mod n). Então, a + c ≡ b + d(mod n) – Exemplo: 4x ≡ 7(mod 9) e 3x ≡ 3(mod 9) Então: 4x – 3x ≡ 7 - 3(mod 9) → x ≡ 4(mod 9) ● A congruência a ≡ b(mod n) é falsa se b não for divisor do mdc(a,n). 26 Universidade Federal do Espírito Santo – CCA UFES Congruência ● Operação de Multiplicação: Suponha que a ≡ b(mod n) e c ≡ d(mod n). Então, a.c ≡ b.d(mod n) ● Operação de Divisão: Não pode-se cancelar fatores comuns em congruências. Ou seja, 6 . 2 ≡ 6 . 1 (mod 3) ⇒ 2 ≢ 1 (mod 3) Sendo a/b = a.b-1. Poderemos computar a/b (mod n) se encontramos a inversa b-1 na qual bb-1 ≡ ab-1 (mod n). Mas nem sempre será possível encontrar a inversa de b. – Mas podemos simplificar sem problemas quando: de: para: a.d ≡ b.d(mod n.d) a ≡ b(mod n). 27 Universidade Federal do Espírito Santo – CCA UFES Congruência ● Resolvendo Congruências Lineares – Uma Congruência linear é uma equação a.x ≡ b(mod n) ● – Portanto, resolvê-la significa encontrar os valores de x que a satisfazem. – Nem todas as congruências possuem soluções. a.x ≡ 1(mod n) tem solução se e somente se o multiplicador e o módulo são primos. Assim: mdc(a, n) = 1 ● Utilizando o algoritmo de Euclides para encontrar a inversa, Temos que solucionar: a.x' + n.y' = mdc(a,n) = 1 Então: ax ≡ 1(mod n) → ax ≡ a.x' + n.y' (mod n) Então, a inversa é o valor encontrado de x'. 28 Universidade Federal do Espírito Santo – CCA UFES Resolvendo Congruências Lineares ● Há três casos que dependem da relação entre a,b e n: – mdc(a,b,n) > 1: pode-se dividir os três termos pelo divisor para obter uma congruência equivalente. – mdc(a, n) não divide b: a congruência não tem solução. – mdc(a, n) = 1: há somente uma solução (mod n). 29 Universidade Federal do Espírito Santo – CCA UFES Equações diofantinas ● ● Equação Diofantina – Equação polinomial que permite a duas ou mais variáveis assumirem apenas valores inteiros. – Equação entre duas somas de monômios de grau zero ou um. Sendo x, y e z desconhecidos e o restante valores constantes: → ax + ny = b: é equivalente a solução de ax ≡ b (mod n) → xn + yn = zn: para n=2, existem infinitas soluções. Para n>2, não há soluções positivas. 30 Universidade Federal do Espírito Santo – CCA UFES Bibliotecas ● Java: Classe BigInteger (java.math.BigInteger). ● Funções de interesse para esse tópico: – Máximo Divisor Comum (Greatest Common Divisor): ● – BigInteger gcd(BigInteger val) retorna o BigInteger cujo valor é o MMC de abs(this) e abs(val). Exponenciação Modular (Modular Exponentiation): ● BigInteger modPow(BigInteger exp, BigInteger m) retorna o BigInteger cujo valor é this exp mod m. – Modular Inversa (Modular Inverse): ● BigInteger modInverse(BigInteger m) retorna o BigInteger cujo valor é this -1 (mod m). – Primality Testing: ● public boolean isProbablePrime(int certainty) utiliza um teste de primalidade aleatório para retornar verdadeiro se este BigInterger provavelmente é primo e falso se ele não é. 31 Universidade Federal do Espírito Santo – CCA UFES Problemas ● ● ● Fáceis: – Light, More Light. – Euclid Problem. – Summation of Four Primes. Intermediários: – Carmichael Numbers. – Factovisors. Difíceis: – Marbles. 32