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
Download

TEP_Slides-08