Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
INE5403
FUNDAMENTOS DE
M ATEMÁTICA DISCRETA
PARA A COMPUTAÇÃO
PROF. MAURO ROISENBERG
UFSC - CTC - INE
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 1/25
2 - NÚMEROS I NTEIROS
2.1) Divisão nos Inteiros
2.2) Números Primos e MDCs
2.3) Inteiros e Algoritmos
2.4) Aplicações de Teoria dos Números
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 2/25
I NTRODUÇÃO
Existem várias classes de problemas que aparecem na MatemáticaDiscreta:
dada uma seqüência de inteiros, ache o maior;
dado um conjunto liste todos os seus subconjuntos;
dado um conjunto de inteiros, coloque-os em ordem crescente;
dada uma rede de comunicação, ache o menor caminho entredois vértices.
Quando apresentado a estes problemas, a primeira coisa a fazer éconstruir um modelo que traduza o problema em um contextomatemático.
Achar o modelo matemático adequado é apenas parte da solução.Para completar a solução é necessário um método que solucionará oproblema geral utilizando o modelo.
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 3/25
I NTRODUÇÃO
O método consiste em procedimento com uma seqüência de passosque levam até a resposta desejada. Tal seqüência de passos échamada de um algoritmo .
Definição: Um algoritmo é um conjunto finito de instruções precisaspara realizar um cálculo ou solucionar um problema.
O termo algoritmo muitas vezes é utilizado para designarprocedimentos para realizar operações aritméticas usando arepresentação decimal dos inteiros.
Estes algoritmos, adaptados para serem utilizados com arepresentação binária, são a base para a aritméticacomputacional.
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 4/25
REPRESENTAÇÃO DOS I NTEIROS
No nosso dia-a-dia utilizamos na notação decimal para expressarnúmeros inteiros. Por exemplo, 965 é utilizado para denotar9.102 + 6.10 + 5.
Podemos utilizar outras bases, além da decimal.
Computadores normalmente utilizam notação binária (base 2)para realizar operações aritméticas.
De fato, podemos utilizar qualquer inteiro positivo maior que 1
como base quando expressamos inteiros, como mostrado peloseguinte teorema:
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 5/25
EXPANSÃO DE n NA BASE b
Teorema 1: Seja b um inteiro positivo maior que 1. Então se n é uminteiro positivo, ele pode ser expresso de maneira única na forma
n = akbk + ak−1bk−1 + · · · + a1b
1 + a0
onde k é um inteiro não negativo, a0, a1, · · · , ak são inteiros nãonegativos menores que b, e ak 6= 0.
A expansão de n na base b (nome do Teorema 1) é denotada por(akak−1 · · · a1a0)b.
Por exemplo, (245)8 representa 2.82 + 4.8 + 5 = 165.
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 6/25
EXPANSÕES BINÁRIAS
Na notação binária, cada dígito pode ser 0 ou 1. Em outras palavras,a expansão binária de um inteiro é uma “cadeia” (string) de bits.
Expansões binárias são utilizadas por computadores pararepresentar e realizar a aritmética com inteiros.
Exemplo 1: Qual a expansão decimal de um inteiro que possui(101011111)2 como sua expansão binária?
(101011111)2 =
1.28 + 0.27 + 1.26 + 0.25 + 1.24 + 1.23 + 1.22 + 1.21 + 1.20 = 351
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 7/25
EXPANSÕES HEXADECIMAIS
16 dígitos diferentes são necessários para esta expansão. Os dígitoshexadecimais utilizados são: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D,E e F ,onde as letras A até F representam os dígitos correspondentes aosnúmeros 10 a 15 (na notação decimal).
Exemplo 2: Qual a expansão decimal de um inteiro que possui(2AE0B)16 como sua expansão hexadecimal?
(2AE0B)16 = 2.164 +10.163 +14.162 +0.161 +11.160 = (175627)10
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 8/25
CONVERSÃO DE BASE
Como construir a expansão de um inteiro n na base b.
Primeiro, divida n por b para obter um quociente e um resto, ouseja:n = bq0 + a0 , com 0 ≤ a0 < b.
O resto, a0, é o dígito mais a direita na expansão de n na base b.A seguir divida q0 por b para obter:q0 = bq1 + a1 , com 0 ≤ a1 < b.
a1 é o segundo dígito da direita na expansão de n na base b.Continue este processo, dividindo sucessivamente os quocientespor b. Este processo termina quando se obtém um quocienteigual a zero.
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 9/25
CONVERSÃO DE BASE
Exemplo 3: Ache a expansão octal (base 8) de (12345)10.
Primeiro, divida 12345 por 8 para obter12345 = 8.1543 + 1
Sucessivamente divida os quocientes por 81543 = 8.192 + 7
192 = 8.24 + 0
24 = 8.3 + 0
3 = 8.0 + 3
Assim a expansão de 12345 na base 8 é dada pelos restosobtidos:(12345)10 = (30071)8.
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 10/25
ALGORITMO PARA CONVERSÃO DE BASE
O pseudo-código a seguir acha a expansão (ak−1 · · · a1a0)b de uminteiro n na base b.
Algoritmo 1: Construindo Expansões Base b
procedure base b expansion(n:positive integer)
q := n
k := 0
while q 6= 0
begin
ak := q mod b
q := bq/bc
k := k + 1
end {the base b expansion of n is (ak−1 · · · a1a0)b}
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 11/25
ALGORITMOS PARA OPERAÇÕES COM I NTEIROS
Os algoritmos para realizar operações com inteiros usando suasrepresentações em expansões binárias são extremamenteimportantes em aritmética computacional.
Descreveremos algoritmos para adição e multiplicação de doisinteiros expressos como expansões binárias.
Analisaremos a complexidade computacional destes algoritmos emtermos do número de operações de bits necessárias para suaexecução.
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 12/25
ALGORITMO PARA SOMA DE I NTEIROS
Sejam dois números a e b cujas expansões binárias são:a = (an−1an−2 · · · a1a0)2, b = (bn−1bn−2 · · · b1b0)2,de tal forma que a e b possuem n bits (bits 0 podem ser colocados no início de umadas expansões se necessário).
Para somar a e b, primeiramente some seus dígitos mais a direita:a0 + b0 = c0.2 + s0,onde s0 é o bit mais a direita na expansão binária de a + b e c0 é o "vai um" (carry ),que pode ser 0 ou 1.
A seguir some o próximo par de bits e o carry,a1 + b1 + c0 = c1.2 + s1,onde s1 é o próximo bit na expansão binária de a + b, e c1 é o carry.
Continue este processo, somando os bits correspondentes nas duas expansõesbinárias e o carry.
Este processo produz a expansão binária da soma dea + b = (snsn−1sn−2 · · · s1s0)2.
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 13/25
ALGORITMO PARA SOMA DE I NTEIROS
Exemplo 4: Some a = (1110)2 e b = (1011)2.
a0 + b0 = 0 + 1 = 0.2 + 1.De forma que c0 = 0 e s0 = 1. Continuando o algoritmo:
a1 + b1 + c0 = 1 + 1 + 0 = 1.2 + 0.De forma que c1 = 1 e s1 = 0. Continuando o algoritmo:
a2 + b2 + c1 = 1 + 0 + 1 = 1.2 + 0.De forma que c2 = 1 e s2 = 0. Continuando o algoritmo:
a3 + b3 + c2 = 1 + 1 + 1 = 1.2 + 1.De forma que c3 = 1 e s3 = 1. O que significa que s4 = c3 = 1.
Assim, s = a + b = (11001)2.
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 14/25
ALGORITMO PARA SOMA DE I NTEIROS
O pseudo-código a seguir acha a expansão binária (snsn−1 · · · s1s0)2
da soma da expansão binária de dois inteiros a e b.Algoritmo 2: Soma de Inteiros
procedure add(a,b:positive integer)
{the binary expansions of a and b are (an−1an−2 · · · a1a0)2
and (bn−1bn−2 · · · b1b0)2 respectively
c := 0
for j = 0 to n − 1
begin
d := b(aj + bj + c)/2c
sj := aj + bj + c − 2d
c := d
end
sn := c
{the binary expansion of the sum is (snsn−1 · · · s0)2 }
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 15/25
ANÁLISE DO ALGORITMO
Quantas adições de bits são necessárias no Algoritmo 2 para somardois inteiros com n bits (ou menos) na sua representação binária?
Dois inteiros são somados através da adição sucessiva de paresde bits, e de um carry, quando ele ocorre.
Assim, o número total de adições de bits realizadas é menor ouno máximo igual a três vezes o número de bits da expressão.
Podemos então dizer que o número de adições de bits realizadaspelo Algoritmo 2 para somar dois inteiros de n−bits éproporcional a n (O(n)).
Isto significa que, se somar dois inteiros de n bits leva um tempot, então a soma de dois inteiros de 2n bits leva um tempo 2t.
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 16/25
ALGORITMO PARA M ULTIPLICAÇÃO DE I NTEIRO
Consideremos agora a multiplicação de dois inteiros a e b de n bits.
Usando a propriedade distributiva, vemos que:
ab = a(b020 + b12
1 + · · · + bn−12n−1) =
a(b020) + a(b12
1) + · · · + a(bn−12n−1).
Note que: abj = a se bj = 1 e abj = 0 se bj = 0
Além disso, cada vez que multiplicamos um termo por 2, “rotamos” asua expansão binária um bit para a esquerda e colocamos um 0 naposição mais a direita da expansão binária.
Obtemos então (abj)2j “rotando” a expansão binária de (abj) j
vezes para a esquerda, acrescentando j 0′s na direita da expansão.
Finalmente, obtemos ab somando os n inteirosabj2
j , j = 0, 1, 2, · · · , n − 1
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 17/25
ALGORITMO PARA M ULTIPLICAÇÃO DE I NTEIRO
O pseudo-código a seguir acha a expansão binária (snsn−1 · · · s1s0)2
da multiplicação da expansão binária de dois inteiros a e b.Algoritmo 3: Multiplicação de Inteiros
procedure multiply(a,b:positive integer)
{the binary expansions of a and b are (an−1an−2 · · · a1a0)2 and (bn−1bn−2 · · · b1b0)2
c := 0
for j = 0 to n − 1
begin
if bj = 1 then cj := a “rotado” j vezes
else cj := 0
end
{ c0, c1, · · · , cn−1 são os produtos parciais
p := 0
for j = 0 to n − 1
p := add(p, cj)
{p é o valor de ab }
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 18/25
ALGORITMO PARA M ULTIPLICAÇÃO DE I NTEIRO
Exemplo 5: Multiplique a = (110)2 e b = (101)2.
ab0.20 = (110)2.1.2
0 = (110)2.
ab1.21 = (110)2.0.2
1 = (0000)2.e
ab2.22 = (110)2.1.2
2 = (11000)2.Basta agora somar (00110)2 + (00000)2 + (11000)2, usando oalgoritmo da soma:
ab = (11110)2.
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 19/25
ANÁLISE DO ALGORITMO
Quantas adições e “rotações” de bits são necessárias no Algoritmo 3para multiplicar dois inteiros?
Como o Algoritmo 3 processa o produto de a e b somando os produtos parciaisc0, c1, c2, · · · , cn−1. E como para obter cada cj são necessárias j “rotações”,então são necessárias no máximo:0 + 1 + 2 + · · · + n − 1 “rotações”.
Assim, o número de “rotações” é proporcional (ou da mesma ordem de grandeza)que n2 (O(n2)).
Para somar os produtos parciais cj requerem a soma de um inteiro de n-bits, uminteiro de n + 1-bits , · · · , e um inteiro de (2n)-bits,
Sabemos que cada uma destas operações requer um número proporcional a n
de operações de bits,
Conseqüentemente, o número de operações de bits necessárias para multiplicardois números é da ordem de grandeza de n2 (O(n2)).
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 20/25
ALGORITMO PARA DIVISÃO DE I NTEIROS
O pseudo-código a seguir calcula o quociente e o resto da divisão deum inteiro a por um inteiro positivo d.
Algoritmo 4: Divisão de Inteiros (div e mod )
procedure division(a: integer, d:positive integer)
q := 0
r := |a|
while r ≥ d
begin
r := r − d
q := q + 1
end
if a < 0 and r > 0 then
begin
r := d − r
q := −(q + 1)
end
{ q = a div d é o quociente, r = a mod d é o restoProf. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 21/25
EXPONENCIAÇÃO M ODULAR
Em criptografia, é importante muitas vezes calcular de formaeficiente bn mod m, onde b, n e m são números inteiros grandes.
Geralmente é impraticável calcular bn e então achar o seu restoquando dividido por m, pois bn será um número muito grande.
Em vez disso, podemos usar um algoritmo que utiliza a expansãobinária do expoente n = (ak−1 · · · a1a0)2.
O algoritmo acha sucessivamente b mod m, b2 mod m, b4 mod m,· · ·, b2
k−1
mod m e se vale da seguinte propriedade:c = (a.b)( mod m)
c = (a( mod m)).(b( mod m))( mod m)
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 22/25
ALGORITMO PARA EXPONENCIAÇÃO M ODULAR
Algoritmo 5: Exponenciação Modular
procedure modular exponentiation(b: integer, n = (ak−1ak−2 · · · a1a0)2,
m:positive integer)
x := 1
power := b mod m
for i := 0 to k − 1
begin
if ai = 1 then x := (x.power) mod m
power := (power.power) mod m
end
{ x vale bn mod m }
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 23/25
ALGORITMO PARA EXPONENCIAÇÃO M ODULAR
Exemplo 6: Use o Algoritmo 5 para calcular 2644 mod 645.
Inicialmente fazemos x = 1 e power = 2 mod 645 = 2.
A expansão binária de 644 = (1010000100)2.
O algoritmo calcula 22j
mod 645 para j = 1, 2, · · · , 9
sucessivamente elevando ao quadrado e reduzindo modulo 645.
Se aj = 1 (onde aj é o bit na j−ésima posição da expansão
binária de 644), ele multiplica o valor atual de x por 22j
mod 645e reduz o resultado módulo 645.
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 24/25
ALGORITMO PARA EXPONENCIAÇÃO M ODULAR
Exemplo 6
i = 0 : Como a0 = 0, temos x = 1 e power = 22 = 4 mod 645 = 4;
i = 1 : Como a1 = 0, temos x = 1 e power = 42 = 16 mod 645 = 16;
i = 2 : Como a2 = 1, temos x = (1.16) mod 645 = 16 e
power = 162 = 256 mod 645 = 256;
i = 3 : Como a3 = 0, temos x = 16 e power = 2562 = 65536 mod 645 = 391;
i = 4 : Como a4 = 0, temos x = 16 e power = 3912 = 152881 mod 645 = 16;
i = 5 : Como a5 = 0, temos x = 16 e power = 162 = 256 mod 645 = 256;
i = 6 : Como a6 = 0, temos x = 16 e power = 2562 = 65536 mod 645 = 391;
i = 7 : Como a7 = 1, temos x = (16.391) mod 645 = 451 e
power = 3912 = 152881 mod 645 = 16;
i = 8 : Como a8 = 0, temos x = 451 e power = 162 = 256 mod 645 = 256;
i = 9 : Como a9 = 1, temos x = (451.256) mod 645 = 1.
Prof. Mauro Roisenberg - UFSC/CTC/INE/2008 – p. 25/25