CCO 101 PROCESSAMENTO DE DADOS - rcosta62br.unifei.edu.br · envolvendo números inteiros são...

Post on 01-Dec-2018

216 views 0 download

Transcript of CCO 101 PROCESSAMENTO DE DADOS - rcosta62br.unifei.edu.br · envolvendo números inteiros são...

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