cco 101 processamento de dados - rcosta62br.unifei.edu.br · envolvendo números inteiros são...
TRANSCRIPT
CIC 111Análise e Projeto de Análise e Projeto de
Algoritmos IIAlgoritmos II
Universidade Federal de Itajubá
Prof. Roberto Affonso da Costa Junior
AULA 21AULA 21
– Number theory• Primes and factors• Modular arithmetic• Solving equations• Other results
Number TheoryNumber Theory
A teoria dos números é um ramo da matemática que estuda números inteiros. A teoria dos números é um campo fascinante, porque muitas questões envolvendo números inteiros são muito difíceis de resolver, mesmo que pareçam simples à primeira vista.
Como exemplo, considere a seguinte equação:
x ³+ y3+ z ³=33
Number TheoryNumber Theory
É fácil encontrar três números reais x, y e z que satisfaçam a equação. Por exemplo, podemos escolher
No entanto, é um problema aberto na teoria dos números se existem três inteiros x, y e z que satisfizessem a equação.Neste aula, vamos nos concentrar em conceitos básicos e algoritmos na teoria dos números. A partir de agora, vamos supor que todos os números são inteiros, se não for indicado o contrário.
x=3,y= 3
√3 ,z= 3
√3
Primes and factorsPrimes and factors
Um número a é chamado de fator ou divisor de um número b se a divide b. Se a é um fator de b, escrevemos a | b, e de outra forma nós escrevemos a - b. Por exemplo, os fatores de 24 são 1, 2, 3, 4, 6, 8, 12 e 24.Um número n > 1 é um primo se seus únicos fatores positivos forem 1 e n. Por exemplo, 7, 19 e 41 são primos, mas 35 não é primo, porque 5 * 7 = 35. Para cada número n > 1, existe uma única fatorização
n= p1α1 p2
α2⋯ pnαn ,
Primes and factorsPrimes and factors
onde p1, p
2, … , p
k são primos distintos e α
1, α
2, … , α
k
são números positivos.Por exemplo, a fatoração de 84 é
O número de fatores de um número n é
84=2²∗3¹∗7¹
τ (n)=∏i=1
k
(αi+1)
Primes and factorsPrimes and factors
porque para cada primo pi, existem (α
i + 1) maneiras
de escolher quantas vezes aparece no fator. Por exemplo, o número de fatores de 84 é τ(84) = 3 * 2 * 2 = 12. Os fatores são 1, 2, 3, 4, 6, 7, 12, 14, 21, 28, 42 e 84.
A soma dos fatores de n é
σ (n)=∏i=1
k
(1+ p i+⋯+ piα i)=∏
i=1
k
(p iα i+1
−1
pi−1) ,
Primes and factorsPrimes and factors
onde a última fórmula é baseada na fórmula de progressão geométrica. Por exemplo, a soma dos fatores de 84 é
O produto dos fatores de n é
σ (n)=(23
−12−1 )∗(
32−1
3−1 )∗(72
−17−1 )=7∗4∗8=224.
μ (n)=nτ (n)
2 ,
Primes and factorsPrimes and factors
porque podemos formar τ(n)/2 pares dos fatores, cada um com o produto n. Por exemplo, os fatores de 84 produzem os pares 1 * 84, 2 * 42, 3 * 28, etc., e o produto dos fatores é μ(84) = 846 = 351298031616.
Um número n é chamado de número perfeito se n = σ(n) – n, isto é, n é igual à soma de seus fatores entre 1 e n – 1. Por exemplo, 28 é um número perfeito, porque 28 = 1 + 2 + 4 + 7 + 14.
Number of primesNumber of primes
É fácil mostrar que existe um número infinito de primos. Se o número de primos fosse finito, poderíamos construir um conjunto P = {p
1, p
2, … ,
pn} que conteria todos os primos. Por exemplo, p
1 = 2,
p2 = 3, p
3 = 5 e assim por diante. No entanto, usando
P, poderíamos formar um novo primo
que é maior que todos os elementos em P. Isto é uma contradição, e o número de primos tem que ser infinito.
p1∗p2∗⋯∗pn+1
Density of primesDensity of primes
A densidade de primos significa quantas vezes há primos entre os números. Seja π(n) o número de primos entre 1 e n. Por exemplo, π(10) = 4, porque existem 4 primos entre 1 e 10: 2, 3, 5 e 7.É possível mostrar que
o que significa que os primos são bastante frequentes. Por exemplo, o número de primos entre 1 e 106 é π(106) = 78498 e 106 / ln 106 ≈ 72382.
π (n)≈n
ln (n)
ConjecturesConjectures
Existem muitas conjecturas envolvendo primos. A maioria das pessoas pensa que as conjecturas são verdadeiras, mas ninguém foi capaz de prová-las. Por exemplo, as seguintes conjecturas são famosas:
Conjectura de Goldbach: Cada inteiro igual a n > 2 pode ser representado como uma soma n = a + b, de modo que tanto a quanto b sejam primos.Conjectura privilegiada dos gêmeos: Existe um número infinito de pares da forma {p, p + 2}, em que p e p + 2 são primos.Conjectura de Legendre: Há sempre um primo entre os números n2 e (n + 1)2, onde n é qualquer inteiro positivo.
Basic algorithmsBasic algorithms
Se um número n não é primo, ele pode ser representado como um produto a * b, onde a ≤ ou b ≤ , então certamente tem um fator entre 2 e
. Usando essa observação, podemos testar se um número é primo e encontrar a fatoração primária de um número p no tempo O(n).
A seguinte função prime verifica se o número dado n é primo. A função tenta dividir n por todos os números entre 2 e , e se nenhum deles divide n, então n é primo.
√n√n
√n
⌊√n⌋⌊√n⌋
⌊√n⌋
Basic algorithmsBasic algorithms
A seguinte função factor constroem um vetor que contém a fatoração de n. A função divide n por seus fatores primos e os adiciona ao vetor. O processo termina quando o número restante n não tem fatores entre 2 e . Se n > 1, é primo e o último fator.
bool prime(int n) { if (n < 2) return false; for (int x = 2; x*x <= n; x++) { if (n%x == 0) return false; } return true;}
⌊√n⌋
Basic algorithmsBasic algorithms
Observe que cada fator primo aparece no vetor quantas vezes ele divide o número. Por exemplo, 24 = 23 * 3, então o resultado da função é [2, 2, 2, 3].
vector<int> factors(int n) { vector<int> f; for (int x = 2; x*x <= n; x++) { while (n%x == 0) { f.push_back(x); n /= x; } } if (n > 1) f.push_back(n); return f;}
Sieve of EratosthenesSieve of Eratosthenes
A peneira de Eratóstenes é um algoritmo de pré-processamento que constrói um vetor usando a verificação eficientemente de um determinado número entre 2 … n se é primo e, se não for, encontra um fator primo do número.
O algoritmo constrói uma peneira de vetor cujas posições 2, 3, … , n são usados. A peneira de valor [k] = 0 significa que k é primo, e a peneira de valor [k] ≠ 0 significa que k não é primo e um de seus fatores primos é peneira [k].
Sieve of EratosthenesSieve of Eratosthenes
O algoritmo percorre os números 2 … n, um por um. Sempre que um novo x é encontrado, o algoritmo registra que os múltiplos de x (2x, 3x, 4x, …). Não são primos, porque o número x os divide.
Por exemplo, se n = 20, o vetor é o seguinte:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
0 0 2 0 3 0 2 3 5 0 3 0 7 5 2 0 3 0 5
Sieve of EratosthenesSieve of Eratosthenes
O código a seguir implementa a peneira de Eratóstenes. O código assume que cada elemento da peneira é inicialmente zero.
for (int x = 2; x <= n; x++) { if (sieve[x]) continue; for (int u = 2*x; u <= n; u += x) { sieve[u] = x; }}
Sieve of EratosthenesSieve of Eratosthenes
O loop interno do algoritmo é executado n / x vezes para cada valor de x. Assim, um limite superior para o tempo de execução do algoritmo é a soma harmônica
De fato, o algoritmo é mais eficiente, porque o loop interno só será executado se o número x for primo. Pode ser mostrado que o tempo de execução do algoritmo é apenas O(n log log n), uma complexidade muito próxima de O(n).
∑x=2
nnx=n2+n3 +n4 +⋯+
nn=O (n log(n)).
Euclid’s algorithmEuclid’s algorithm
O maior divisor comum dos números a e b, mdc(a, b), é o maior número que divide tanto a como b e o mínimo múltiplo comum de a e b, mmc(a, b), é o menor número que é divisível por ambos a e b. Por exemplo, mdc(24, 36) = 12 e mmc(24, 36) = 72.
O maior divisor comum e o menor múltiplo comum são conectados da seguinte maneira:
mmc (a ,b)=a∗b
mdc (a ,b)
Euclid’s algorithmEuclid’s algorithm
O algoritmo de Euclides fornece uma maneira eficiente de encontrar o maior divisor comum de dois números. O algoritmo é baseado na seguinte fórmula:
Por exemplo,
mdc(a ,b)={ a b=0mdc (b ,amod b) b≠0
mdc (24,36)=mdc(36,24)=mdc(24,12)=mdc(12,0)=12
Euclid’s algorithmEuclid’s algorithm
O algoritmo pode ser implementado da seguinte forma:
Pode ser demonstrado que o algoritmo de Euclides funciona no tempo O(log n), onde n = min(a, b). O pior caso para o algoritmo é o caso quando a e b são números consecutivos de Fibonacci. Por exemplo,
mdc(13,8)=mdc(8,5)=mdc(5,3)
mdc(3,2)=mdc(2,1)=mdc (1,0)=1
int mdc(int a, int b) { if (b == 0) return a; return mdc(b, a%b);}
Euler’s totient functionEuler’s totient function
Os números a e b são coprimos se mdc(a, b) = 1. A função de Euler φ(n) fornece o número de números de coprimo para n entre 1 e n. Por exemplo, φ(12) = 4, porque 1, 5, 7 e 11 são coprimo para 12.
O valor de φ(n) pode ser calculado a partir da fatoração de n usando a fórmula
Por exemplo, φ(12) = 21 * (2 – 1) * 30 * (3 – 1) = 4. Note que φ(n) = n - 1 se n é primo.
φ(n)=∏i=1
k
piαi−1
( pi−1)
Modular arithmeticModular arithmetic
Na aritmética modular, o conjunto de números é limitado de modo que apenas os números 0, 1, 2, … , m – 1 são usados, onde m é uma constante. Cada número x é representado pelo número x mod m: o resto da divisão de x por m. Por exemplo, se m = 17, então 75 é representado por 75 mod 17 = 7.
Modular arithmeticModular arithmeticMuitas vezes podemos pegar os resíduos antes de fazer cálculos. Em particular, as seguintes fórmulas contêm:
(x+ y )mod m=(x mod m+ y mod m)mod m(x−y )mod m=(x mod m− ymod m)mod m(x∗y )mod m=(x mod m∗y mod m)mod m
(xn)mod m=( xmod m)nmod m
Modular exponentiationModular exponentiationMuitas vezes há necessidade de calcular eficientemente o valor de xn mod m. Isso pode ser feito no tempo O(log n) usando a seguinte recursão:
É importante que, no caso de um n par, o valor de xn/2 seja calculado apenas uma vez. Isso garante que a complexidade de tempo do algoritmo seja O(log n), porque n é sempre dividido pela metade quando está igual.
xn={1 n=0
xn2∗x
n2 n é par
xn−1∗x n é impar
Modular exponentiationModular exponentiationA função a seguir calcula o valor de xn mod m:
int modpow(int x, int n, int m) { if (n == 0) return 1%m; int u = modpow(x, n/2, m); u = (u*u)%m; if (n%2 == 1) u = (u*x)%m; return u;}
Fermat’s theorem and Fermat’s theorem and Euler’s theoremEuler’s theorem
O teorema de Fermat afirma que
quando m é primo e x e m são coprimo. Isso também produz
Mais geralmente, o teorema de Euler afirma que
quando x e m são coprimo. O teorema de Fermat segue o teorema de Euler, porque se m é primo, então φ(m) = m - 1.
xm−1mod m=1
xkmod m=xk mod (m−1)mod m.
xφ(m)mod m=1
Modular inverseModular inverseO inverso de x mod m é um número x-1 tal que
Por exemplo, se x = 6 e m = 17, então x–1 = 3, porque 6 * 3 mod 17 = 1.
Usando inversos modulares, podemos dividir números módulo m, porque divisão x corresponde à multiplicação por x-1. Por exemplo, para avaliar o valor de 36/6 mod 17, podemos usar a fórmula 2 * 3 mod 17, porque 36 mod 17 = 2 e 6-1 mod 17 = 3.
xx−1mod m=1
Modular inverseModular inverseNo entanto, um inverso modular nem sempre existe. Por exemplo, se x = 2 e m = 4, a equação
não pode ser resolvido, porque todos os múltiplos de 2 são par e o resto nunca pode ser 1 quando m = 4. Acontece que o valor de x-1 mod m pode ser calculado exatamente quando x e m são coprimo.
Se existe um inverso modular, ele pode ser calculado usando a fórmula
xx−1mod m=1
x−1=xφ (m)−1
Modular inverseModular inverseSe m é primo, a fórmula se torna
Por exemplo,
Essa fórmula nos permite calcular eficientemente as inversões modulares usando o algoritmo de exponenciação modular. A fórmula pode ser derivada usando o teorema de Euler. Primeiro, o inverso modular deve satisfazer a seguinte equação:
6−1mod 17=617−2mod 17=3
x−1=xm−2 .
xx−1mod m=1.
Modular inverseModular inversePor outro lado, de acordo com o teorema de Euler,
então os números x-1 e xφ(m) - 1 são iguais.
xφ(m)mod m=xxφ (m )−1mod m=1,
Computer arithmeticComputer arithmeticNa programação, inteiros sem sinais são representados no módulo 2k, onde k é o número de bits do tipo de dados. Uma consequência comum disso é que um número que se torna muito grande.Por exemplo, em C++, números do tipo unsigned int são representados pelo módulo 232. O código a seguir declara uma variável int sem sinal cujo valor é 123456789. Depois disso, o valor será multiplicado por ele mesmo e o resultado é 1234567892 mod 232 = 2537071545.
unsigned int x = 123456789;cout << x*x << "\n"; // 2537071545
Solving equationsSolving equationsNa matemática, uma equação diofantina é uma equação polinomial que permite a duas ou mais variáveis assumirem apenas valores inteiros. Uma equação linear diofantina é uma equação entre duas somas de monômios de grau zero ou um.
Diophantine equationsDiophantine equationsUma equação diofantina é uma equação da forma
onde a, b e c são constantes e os valores de x e y devem ser encontrados. Cada número na equação tem que ser um inteiro. Por exemplo, uma solução para a equação 5 x + 2 y = 11 é x = 3 e y = - 2.
ax+by=c ,
Diophantine equationsDiophantine equationsPodemos resolver eficientemente uma equação diofantina usando o algoritmo de Euclides. Acontece que podemos estender o algoritmo de Euclides para que ele encontre os números x e y que satisfazem a seguinte equação:
Uma equação diofantina pode ser resolvida se c é divisível pelo mdc(a, b) e, caso contrário, não pode ser resolvido.
ax+by=mdc (a ,b) ,
Diophantine equationsDiophantine equationsComo exemplo, vamos encontrar números x e y que satisfaçam a seguinte equação:
A equação pode ser resolvida, porque mdc(39, 15) = 3 e 3|12. Quando o algoritmo de Euclides calcula o maior divisor comum de 39 e 15, produz a seguinte sequência de chamadas de função:
mdc (39,15)=mdc(15,9)=mdc (9,6)
mdc(6,3)=mdc(3,0)=3
39 x+15 y=12,
Diophantine equationsDiophantine equationsIsso corresponde às seguintes equações:
Usando essas equações, podemos derivar
39∗2+15∗(−5)=3
39−2∗15=915−1∗9=69−1∗6=3
Diophantine equationsDiophantine equationse multiplicando isso por 4, o resultado é
Portanto, uma solução para a equação é x = 8 e y = - 20.
39∗8+15∗(−20)=12
Diophantine equationsDiophantine equationsUma solução para uma equação diofantina não é única, porque podemos formar um número infinito de soluções se soubermos uma solução. Se um par (x, y) é uma solução, então também todos os pares
são soluções, onde k é qualquer inteiro.
(x+ k∗bmdc (a ,b)
, y−k∗a
mdc (a ,b))
Chinese remainder theoremChinese remainder theoremO teorema de resto chinês resolve um grupo de equações da forma
onde todos os pares de m1, m
2, … , m
n são coprimo.
Seja x−1m o inverso de x módulo m, e
x=a1mod m1
x=a2mod m2
⋮x=anmod mn
X k=m1∗m2∗⋯∗mn
mk
Chinese remainder theoremChinese remainder theoremUsando esta notação, uma solução para as equações é
Nesta solução, para cada k = 1, 2, …, n,
Porque
x=a1 X 1 X 1−1m1
+a2 X 2 X 2−1m2
+⋯+an X n X n−1mn
ak X k X k−1mkmod mk=ak ,
X k X k−1mkmod mk=1,
Chinese remainder theoremChinese remainder theoremComo todos os outros termos da soma são divisíveis por m
k, eles não têm efeito sobre o restante, e x mod
mk = a
k.
Por exemplo, uma solução para
Nesta solução, para cada k = 1, 2, …, n,
x=3mod 5x=4mod 7x=2mod 3
3∗21∗1+4∗15∗1+2∗35∗2=263
Chinese remainder theoremChinese remainder theoremDepois de encontrarmos uma solução x, podemos criar um número infinito de outras soluções, porque todos os números da forma
são soluções.
x+m1∗m2∗⋯∗mn
Other resultsOther resultsO teorema de Lagrange afirma que cada inteiro positivo pode ser representado como uma soma de quatro quadrados, ou seja, a2 + b2 + c2 + d2. Por exemplo, o número 123 pode ser representado como a soma 82 + 52 + 52 + 32.
Zeckendorf’s theoremZeckendorf’s theoremO teorema de Zeckendorf afirma que todo inteiro positivo tem uma representação única como uma soma de números de Fibonacci, de modo que nenhum número é igual ou consecutivo a um número de Fibonacci. Por exemplo, o número 74 pode ser representado como a soma 55 + 13 + 5 + 1.
Pythagorean triplesPythagorean triplesUm triplo pitagórico é um triplo (a, b, c) que satisfaz o teorema de Pitágoras a2 + b2 = c2, o que significa que existe um triângulo retângulo com comprimentos laterais a, b e c. Por exemplo, (3, 4, 5) é um triplo pitagórico.
Se (a, b, c) é um triplo pitagórico, todos os triplos da forma (ka, kb, kc) são também triplos pitagóricos onde k > 1. Um triplo pitagórico é primitivo se a, b e c são coprimos, e todos triplos pitagóricos podem ser construídos a partir de triplos primitivos usando um multiplicador k.
Pythagorean triplesPythagorean triplesA fórmula de Euclides pode ser usada para produzir todos os triplos pitagóricos primitivos. Cada um desses triplo é da forma
Onde 0 < m < n, n e m são coprimos e pelo menos um entre n e m é par. Por exemplo, quando m = 1 e n = 2, a fórmula produz o menor triplo pitagórico
(n ²−m ²,2nm ,n ²+m ²) ,
(2²−1²,2∗2∗1,2²+1²)=(3,4,5)
Wilson’s theoremWilson’s theoremTeorema de Wilson afirma que um número n é primo exatamente quando
Por exemplo, o número 11 é primo, porque
e o número 12 não é primo, porque
Assim, o teorema de Wilson pode ser usado para descobrir se um número é primo. No entanto, na prática, o teorema não pode ser aplicado a grandes valores de n, porque é difícil calcular valores de (n - 1)! quando n é grande.
(n−1)!mod n=n−1.
10! mod 11=10,
11 ! mod 12=0≠11
Sites visitarSites visitar