Números Inteiros Algoritmo da Divisão e suas Aplicações Diferentemente dos números reais (R), o conjunto dos inteiros (Z) não é fechado para a divisão. Esse não-fechamento faz com que a divisão entre inteiros seja um tanto esquisita. Na verdade, essa esquisitice é útil em uma grande variedade de interessantes aplicações práticas. A divisão de inteiros será vista nesta aula na forma de um teorema chamado de algoritmo da divisão. Depois, veremos aplicações teóricas e práticas desse teorema. 1. Algoritmo da Divisão O teorema conhecido como Algoritmo da Divisão (apesar de não ser um algoritmo), informalmente, diz que: ao dividir um inteiro n (dividendo) por um inteiro positivo d (divisor), obtemos dois resultados: o quociente q e o resto positivo r O que o lema faz é explicar a relação algébrica entre essas quatro variáveis (n, d, q e r), como veremos a seguir 1. Teorema Algoritmo da Divisão : Se n é um número inteiro e d é um número inteiro positivo Então, existem dois números inteiros únicos q e r tais que i. n = d. q + r ii. e 0 r < d (Dizemos que q e r são o resultado da divisão de n por d, sendo o q chamado de quociente da divisão e o r, chamado de resto). 1 Observe que, na forma como apresentamos este teorema, o divisor d não pode ser zero e também não pode ser negativo. Trabalharemos assim nesta disciplina, mas a última exigência pode ser relaxada. 1
Demonstração direta: A demonstração deste teorema se baseia na aplicação do axioma chamado de princípio da boa ordem. Provamos as partes (i) e (ii) em sequência. Sejam n e d dois inteiros quaisquer, onde d > 0. Agora, considere o conjunto abaixo construído a partir de n e d: C = { n k.d onde k é um inteiro qualquer e n k.d 0 } = {..., n 3d, n 2d, n d, n, n+d, n+2d, n+3d,... } Primeiramente, podemos afirmar que C é não-vazio, independente de n ou d. (Pois, adotando k=0 ou k=n, teremos, para um deles, que n kd 0). Assim, o princípio garante que C tem um elemento mínimo. Vamos chamar este mínimo de r. (Este mínimo corresponde exatamente ao resto que queremos). A- lém disso, pela definição de C, temos r = n qd, para algum valor inteiro q. Este inteiro q é o único que pode gerar r, por conta da equação linear envolvida. (Este q corresponde ao quociente que queremos). Rearrumando esta equação provamos uma parte do teorema: (i) n = qd + r, para certos q e r inteiros Agora, vamos provar a segunda parte. Já sabemos que r 0 (porque isso é verdade para todo elemento de C). Agora, vamos argumentar que r < d, por redução ao absurdo: Assumindo que r d. Vamos provar que, neste caso, existe um elemento de C menor do que r, que seria uma contradição. (Observe que vamos definir um certo r de modo compatível com a regra que define os elementos de C, mas usando k = q + 1). Seja r definido assim: r = n (q+1)d. Desenvolvendo, obtemos r = n qd d. Usando a definição de r, provamos que r = r d. Rearrumando a hipótese r d, obtemos r d 0. Usando a equação anterior, obtemos r 0. Logo r pertence a C. Além disso, como d é positivo, r d é menor que r. Logo r < r. Isso contradiz a escolha de r como mínimo de C. Com isso, provamos a segunda (e última) parte do teorema: (ii) 0 r < d (Provado). Observe que o teorema mostra como, a partir de um par (n, d) se define de forma única o par (q, r). É como se ele apresentasse a divisão como uma operação entre inteiros que 2
retorna dois resultados. Para se referir somente a um dos resultados da divisão por vez, vamos definir essas duas operações: n div d retorna o quociente inteiro (o q do teorema acima) n mod d retorna o resto inteiro positivo (o r to teorema acima) Com base nessas operações, podemos redefinir a equação do teorema como: n = d. (n div d) + (n mod d) Exemplos (todos com d=3): A divisão de n = 7 por d = 3 dá q = 2 e r = 1 o pois 7 = 3.2 + 1 e 0 r < 3 A divisão de n = 27 por d = 3 dá q = 9 e r = 0 o pois 27 = 3.9 + 0 e 0 r < 3 A divisão de n = 1 por d = 3 dá q = 0 e r = 1 o pois 1 = 3.0 + 1 e 0 r < 3 A divisão de n = 7 por d = 3 dá q = 3 e r = 2 o pois 7 = 3.( 3) + 2 e 0 r < 3 Veja que o algoritmo de divisão exige que o resto seja sempre não-negativo. Por isso, quando o dividendo é negativo (como no último exemplo), o quociente não é aquele que estamos acostumados a usar na divisão de inteiros ele é uma unidade a menos. Por exemplo, na divisão que tipicamente usamos, 7 dividido por 3 daria quociente 2 com resto 1. Porém, no quarto exemplo, o quociente (q) ficou com uma unidade a menos (e o resto você pode calcular a partir de n, d e q). Estejam atentos a este detalhe! A seguir, veremos uma aplicação interessante do teorema algoritmo na divisão (que não é um algoritmo!), para provar a corretude de um algoritmo genuíno. 3
2. Algoritmo de Euclides O algoritmo de Euclides para calcular o mdc de dois números recebe seu nome de um importante matemático da Grécia antiga. Antes de apresentarmos o algoritmo propriamente dito, vamos mostrar e provar o teorema que está por trás deste algoritmo: Teorema: Se a e b são naturais e b 0, então mdc(a,b) = mdc(b, a mod b). Demonstração: Segue um esboço da idéia: Para simplificar a notação, seja r = a mod b. Como r corresponde ao resto da divisão de a por b, pelo algoritmo da divisão podemos escrever: a = b.q + r (para algum q inteiro). Logo, temos a equação I abaixo: r = a q.b Agora, a idéia central da demonstração consiste em provar que: o Todo divisor comum de a e b é divisor de b e de r. Ou seja, você prova que se x a e x b, então x b e x r. o E que todo divisor comum de b e r é também divisor de a e de b. Ou seja, você prova que se x b e x r, então x a e x b. Provando essas duas partes (tente fazer sozinho!), você garante que o par (a,b) tem os mesmos divisores comuns que o par (b,r). Logo, o máximo dos divisores comuns de (a,b) é o mesmo máximo dos divisores comuns de (b,r)! Assim, estará provado o teorema. O teorema acima nos permite reduzir o cálculo do mdc(a, b) ao cálculo do mdc entre dois valores (em geral) menores: mdc(b, a mod b). Podemos repetir essa redução sucessivamente até não ser mais possível. Essa é a idéia simples por trás do algoritmo de Euclides. Exemplificamos a seguir. Exemplo: Calcular mdc(414, 662): Esse mdc pode ser calculado assim: mdc(414, 662) = mdc(662, 414 mod 662) 4
Que equivale a calcular sucessivamente: = mdc(662, 414) = mdc(414, 662 mod 414) = mdc(414, 248)= mdc(248, 414 mod 248) = mdc(248, 166) = mdc(166, 248 mod 166) = mdc(166, 82)= mdc(82, 166 mod 82) = mdc(82, 2) = mdc(2, 82 mod 2) = mdc(2, 0) Como todo inteiro é divisor de 0, maior divisor comum entre 2 e 0 é o próprio 2: = 2 De modo geral, temos: para todo a inteiro positivo, mdc(a,0) = a. Essa é a informação que faltava para completarmos um algoritmos para calcular o mdc o algoritmo de Euclides. A seguir, damos uma implementação recursiva dele em Python. (Fica como exercício fazer uma implementação iterativa). def mdc(a, b): if (b == 0): return a else: return mdc(b, a % b) O algoritmo de Euclides é mais eficiente (mais rápido) computacionalmente e mais fácil de implementar do que a idéia que vimos na aula passada, baseada na fatoração de a e b em fatores primos. Agora que já sabemos calcular o mdc eficientemente, como poderíamos calcular o mmc eficientemente? Para isso, veja o último teorema da aula passada! 5
3. Aritmética Modular Observe que, pelo lema da divisão, o resto da divisão de um número qualquer por um valor m só pode dar m valores distintos: de 0 a m-1. Assim, obviamente, dois números inteiros diferentes, quando divididos por um mesmo m, podem dar um mesmo resto. A aritmética modular surge da idéia de relacionar os números que dão o mesmo resto ao serem divididos por um dado valor m. Esta relação é chamada de relação de congruência módulo m e sua definição é dada abaixo (porém sem mencionar resto da divisão): Usamos a notação a b (mod m) sse tivermos que 2 m > 0 e m (a b). Dizemos que a é congruente a b, módulo m, neste caso Não provaremos, mas a definição dada acima equivale à seguinte definição, que mostra claramente a ligação com o resto da divisão: a b (mod m) sse a mod m = b mod m No entanto, a definição original é, geralmente, a que deixa as demonstrações dos teoremas mais simples. Antes de provar teoremas, vamos exemplificar casos da relação dada. Exemplos: 3 0 (mod 3), pois 3 (3-0) (ou porque 3 mod 3 = 0 mod 3 = 0) 2 5 (mod 3), pois 3 (2-5) (ou porque 2 mod 3 = 5 mod 3 = 2) 29 8 (mod 3), pois 3 (29-8)... 11 1 (mod 2) 8 0 (mod 2) A seguir, damos alguns resultados (teoremas) bastante simples: a 0 (mod 2) é verdade sse a é par (a é múltiplo de 2) a 1 (mod 2) é verdade sse a é ímpar 2 A condição de que m > 0 pode ser relaxada, mas vamos trabalhar assim nesta disciplina. 6
a 0 (mod 3) é verdade sse a é múltiplo de 3 a 0 (mod 4) é verdade sse a é múltiplo de 4 3.1 Propriedades As relações de congruência têm várias propriedades análogas às propriedades da relação de igualdade (entre números inteiros). Seguem algumas dessas propriedades, válidas para todos a, b e c inteiros e para todo m inteiro positivo: o a a (mod m) [Reflexiva] o Se a b (mod m), então b a (mod m) [Simétrica] o Se a b (mod m) e b c (mod m), então a c (mod m) [Transitiva] o Se a b (mod m), então a+c b+c (mod m) o Se a b (mod m), então ac bc (mod m) Todas estas propriedades podem ser provadas a partir da definição da relação. Como exemplo, vamos provar a penúltima propriedade dada. Exemplo: Provar o seguinte teorema (para todos a, b e c Z e m Z + ): Se a b (mod m), então a+c b+c (mod m) Prova direta. Sejam a, b e c inteiros quaisquer. Vamos, ainda, assumir que a b (mod m). Usando a definição da relação de congruência módulo m, temos que: m (a-b) Agora, pela definição da relação divide, isso nos leva a: k. m = a - b (para algum k inteiro) Desenvolvendo a equação, temos: a = b + k. m Calculando a+c com a equação acima, temos: a + c = b + k.m + c (a+c) = (b+c) + k.m (a+c) (b+c) = k.m Pela definição da relação divide temos que: m ((a+c) (b+c)) Assim, pela definição da relação de congruência modulo m, concluímos que: (a+c) (b+c) (mod m) (Provado). 7
3.2 Outras Propriedades Diferentemente da igualdade, o cancelamento de um inteiro c nem sempre é possível nas relações de congruência. Ou seja, a afirmação a seguir é falsa: Se ac bc (mod m), então a b (mod m) Um contra-exemplo para a afirmação acima é a=4, b=3, c=2 e m=2. Pois temos que 4.2 3.2 (mod 2), porém não é verdade que 4 3 (mod 2). A regra de cancelamento correta para a relação de congruência é dada abaixo. Na lista de exercícios, há uma questão que pede para você prová-la. Se ac bc (mod m) e mdc(c,m)=1, então a b (mod m) Outras propriedades que se aplicam às relações de congruência não têm análogas na igualdade. Seguem algumas: a a mod m (mod m) a.c (a mod m).(c mod m) (mod m) a+c (a mod m)+(c mod m) (mod m) Juntas, as propriedades apresentadas nos garantem que podemos fazer substituições usando relações de congruência (tal como fazemos na igualdade), desde que seja em expressões envolvendo apenas adição e multiplicação. Veja o próximo exemplo. Exemplo: Provar que Se a x+y (mod 2), então a 2 x 2 +y 2 (mod 2). Prova direta. Hipótese: a x+y (mod 2) Objetivo: a 2 x 2 +y 2 (mod 2) Vamos começar desenvolvendo uma relação de congruência módulo 2 para a 2 (vamos omitir o mod 2, para deixar mais limpo): a 2 a.a Usando a hipótese, podemos substituir o valor de a por (x+y). (x+y).(x+y) 8
x 2 + 2xy + y 2 Porém, no módulo 2, temos 2 0, logo: x 2 + 0.xy + y 2 x 2 + y 2 (Provado). Um uso interessante da aritmética modular consiste em transformar uma equação a = b em uma relação de congruência a b (mod m) para um m de sua escolha. Isso pode ajudar a simplificar algumas demonstrações matemáticas, como no exemplo a seguir. Exemplo: Prove que se a soma de n números inteiros dá par, então existe uma quantidade par de números ímpares nesta soma. Esboço gera (se der, veremos em sala...), assumindo que há x números inteiros e y números ímpares. Escrever essa soma, agrupando os x pares e os y ímpares, e igualando tudo a 2k, para algum k inteiro. Tirar o módulo de tudo, o que zera todo o grupo dos pares, e torna 1 cada número ímpar (cuja soma dá y). Isso tudo, é congruente a 2k que é congruente a 0. Assim, ficamos com y congruente a 0. A aritmética modular é uma área bastante rica da Matemática. Além disso, ela tem ligação com alguns algoritmos importantes da Computação, em especial o algoritmo RSA, que é um dos mais importantes usados para manter de segurança de dados que trafegam na internet. Veja um pouco mais sobre essas aplicações no material extra. Veja mais de teoria e aplicações no livro do Rosen. 4. Representação de Inteiros em Diferentes Bases (Extra) Como você deve saber, no dia-a-dia, usamos uma representação dos números chamada de representação decimal, pois usamos dez símbolos (0,1,2,...,9) para representar qualquer número inteiro. Nesta notação, a posição do dígito interfere na grandeza que ele representa. Por exemplo, em um número como 74.942, cada dígito representa o seguinte: o o dígito 7 representa 70.000 (ou 7x10 4 ) 9
o o primeiro 4 representa 4.000 (ou 4x10 3 ) o o 9 representa 900 (ou 9x10 2 ) o o segundo 4 representa 40 (ou 4x10 1 ) o o 2 representa, de fato, 2 unidades (ou 2x10 0 ) Em outras palavras, 74.942 pode ser expresso como a seguinte soma de potências de 10: 7.10 4 + 4.10 3 + 9.10 2 + 4.10 1 + 2.10 0 Por outro lado, os computadores usam, internamente, uma representação binária dos números, apenas com os símbolos 0 e 1. (Um detalhe é que a linguagem de programação faz automaticamente a conversão para a base decimal antes de exibir). Analogamente ao que acontece na base decimal, o valor representado por cada dígito binário depende da sua posição na representação do número. Assim um número binário como 1001011 representa a seguinte soma de potências de 2: 1.2 6 + 0.2 5 + 0.2 4 + 1.2 3 + 0.2 2 + 1.2 1 + 1.2 0 (em decimal, este seria o número 75) Generalizando os princípios usados nas duas representações citadas, será que com uma base inteira positiva b qualquer podemos representar todos os números nela? O teorema a seguir esclarece esta questão. Teorema: Considere b (a base) como um número inteiro maior que 1. Então, se n for um inteiro positivo, ele pode ser expresso como uma única soma da forma: n = D k.b k + D k-1.b k-1 + D k-2.b k-2 +... + D 1.b 1 + D 0 onde: para cada (dígito) D i (onde i é um índice de 0 a k), temos: 0 D i < b e (para o dígito mais à esquerda) temos: D k 0 Em outra palavra, o teorema diz que todo número inteiro positivo n pode ser representado em uma base b qualquer maior que 1. No caso, a representação na base b do número é simplesmente a seqüência dos valores D i (ou de certos símbolos que representem esses valores). No caso geral, para bases diferentes de 10, podemos usar a seguinte notação deixando explícita a base b adotada: 10
n = (D k D k-1 D k-2... D 1 D 0 ) b Exemplos: (4253) 7 = 4.7 3 + 2.7 2 + 5.7 1 + 3.7 0 = 1372 + 98 + 35 + 3 = 1508 (1021) 4 = 1.4 3 + 0.4 2 + 2.4 1 + 1.4 0 = 64 + 0 + 8 + 1 = 73 (1021) 3 = 1.3 3 + 0.3 2 + 2.3 1 + 1.3 0 = 27 + 0 + 6 + 1 = 34 Demonstração: A demonstração do teorema usa o algoritmo da divisão, mas não vamos dá-la em detalhes. A idéia geral da prova consiste em considerar a divisão de n por b, depois pegar o quociente e dividir por b, depois pegar o novo quociente e dividir por b, e assim sucessivamente, até que dê um quociente 0. Os restos dessas divisões sucessivas, na ordem inversa (do último para o primeiro) formarão exatamente os valores D i (ou seja, os dígitos da representação na base b). A demonstração do teorema nos permite deduzir um método (um algoritmo) para converter um número n qualquer para uma base b qualquer: Dividir n por b, guardar o resto. Depois, tomar o quociente da divisão anterior e dividir por b novamente, guardando o novo resto. Repetir essas divisões por b sucessivamente guardando os restos. Parar quando o quociente der 0. Retornar os valores na ordem invertida. Desafio: Tente implementar este algoritmo! Uma sugestão: guarde os restos da divisão em uma lista e a inverta no final. Esta será a representação do número na base b. A partir da representação em uma base b qualquer, podemos definir algoritmos para realizar adição e multiplicação similares aos algoritmos que aprendemos no ensino básico para a base 10: Somar dígito a dígito da direita para a esquerda Se a soma dos dígitos ultrapassar o limite da base, você transporta o excesso para a soma do próximo digito (o chamado vai o um ) 11
Por exemplo, se usarmos a representação na base binária, ao somar cada dígito, funciona assim: 0+0 dá 0 e não transporta nada 0+1 ou 1+0 dá 1 e não transporta nada 1+1 dá 0 e transporta 1 Desafio: Tente implementar (em qualquer linguagem, mas recomendo Python) a soma de dois números quaisquer em uma base b qualquer! Já não há condenação para quem está em Cristo Jesus. (Romanos 8:1) 12