You are on page 1of 11

Anlise dos Algoritmos para as Funes Aritmticas Bsicas e Modulares

Reslley Gabriel Oliveira Silva Faculdade de Computao Universidade Federal de Uberlndia (UFU) Uberlndia MG Brasil
reslleygabriel@gmail.com

Abstract. The algorithms for the basic and modular arithmetic functions play a fundamental role in many computer applications, such as cryptography. The study of their complexities and various forms of implementation is critical for the correct choice of approach to be adopted. In this paper we present the basic algorithms for these tasks and their corresponding complexities, in terms of the number of bits of the inputs. Resumo. Os algoritmos das funes aritmticas bsicas e modulares desempenham um papel fundamental em diversas aplicaes computacionais, como por exemplo a criptografia. O estudo de suas complexidades e diversas formas de implementao de suma importncia para a correta escolha da abordagem a ser adotada. Neste trabalho apresentamos os algoritmos bsicos para essas tarefas e explicitamos suas complexidades em funo do nmero de bits das entradas.

1. Introduo
A teoria dos nmeros uma das reas mais antigas da matemtica, porm continua sendo fonte de inmeras pesquisas. Tem como foco o estudo do conjunto dos inteiros e suas propriedades, bem como as operaes e conceitos que atualmente so utilizadas em cincia da computao [Rosen 2012] e [Scheinerman 2012]. As operaes aritmticas bsicas e modulares so fundamentais para inmeras aplicaes computacionais, tais como os sistemas de criptografia. A eficincia das operaes executadas influenciam diretamente na velocidade de tais aplicaes, impactando no consumo de tempo [Rezai e Keshavarzi 2011]. Neste trabalho sero apresentados os conceitos, algoritmos e complexidades, em funo do nmero de bits, das operaes aritmticas bsicas e modulares. Ser dado um enfoque maior na anlise da operao de exponenciao, pois ela essencial para as aplicaes criptogrficas que suportam a maioria das transaes eletrnicas atuais. As prximas sees esto organizadas da seguinte maneira: a seo 2 apresenta os algoritmos para adio, multiplicao e diviso, a seo 3 introduz o conceito de aritmtica modular e apresenta os algoritmos de exponenciao e mximo divisor comum, alm das verses para adio, multiplicao e diviso modulares. Por fim, na seo 4 exibida uma breve discusso sobre os algoritmos mencionados neste trabalho.

2. Aritmtica Bsica
Aritmtica o estudo das operaes bsicas como adio, subtrao, multiplicao e diviso no contexto dos inteiros e racionais [Scheinerman 2012]. Nesta seo trataremos dos algoritmos para adio, multiplicao e diviso no escopo dos inteiros, explicitando suas principais caractersticas, complexidade e exemplos.

2.1. Adio A operao de adio uma das mais bsicas e assim como algumas outras j est implementada no hardware e arquitetura dos computadores. Uma anlise mais cuidadosa de seu funcionamento e de sua complexidade revela a utilizao de uma propriedade fundamental: o A soma de quaisquer trs nmeros de um dgito tem comprimento de no mximo dois dgitos. Essa propriedade funciona no apenas para nmeros da base decimal mas tambm para qualquer base maior ou igual a 2. Utilizando esse fato possvel derivar um algoritmo para soma de dois nmeros: 1. Alinhe os nmeros pela direita 2. Percorra da direita para a esquerda somando cada dois dgitos 3. Caso haja excesso carregue-o para a prxima soma Observe o exemplo da Figura 1.

Figura 1. Exemplo de adio em binrio.

Podemos observar na Figura 1 a propriedade na prtica, estamos somando a cada passo dois nmeros de um dgito, porm pode haver a gerao de um excesso que ento passado para a prxima soma. Pela propriedade sabemos que a soma dos trs nmeros de um dgito pode ter no mximo dois dgitos, sendo que um deles ser o excesso. Supondo que os dois nmeros a serem somados possuam bits de comprimento, ao final da adio obtemos um nmero com no mximo + bits e cada bit computado em tempo constante. O tempo de execuo total para o algoritmo de adio , portanto da forma . + , ou seja, ().

2.2. Multiplicao Quando se trata da multiplicao a ideia tambm simples, sendo que o algoritmo clssico para multiplicar dois nmeros e baseia-se em: 1. Criar uma srie de somas intermedirias, cada uma sendo o produto de por um nico dgito de 2. Deslocar os valores para a esquerda e ento som-los A Figura 2 contm um exemplo desse procedimento, com a multiplicao binria de 11 x 13.

Figura 2. Exemplo de multiplicao em binrio.

Um ponto chave nesse procedimento perceber que deslocar para a esquerda o mesmo que multiplicar pela base, que nesse caso 2, e que essa operao tem custo constante. Se e tem bits, ento h linhas intermedirias (uma para cada bit de ), com comprimentos de at bits (levando o deslocamento em conta). Somando dois nmeros por vez realizamos operaes e cada operao de soma tem complexidade () como j foi demonstrado. A Figura 3 mostra essa relao.

Figura 3. Quantidade de somas intermedirias.

Desta forma a operao de multiplicao quadrtica no tamanho das entradas, ou seja, ().

2.3. Diviso Sabe-se pelo algoritmo da diviso de Euclides que, dividir um inteiro por outro inteiro significa encontrar o quociente e o resto , onde = . + e < . Um algoritmo recursivo para este propsito mostrado na Figura 4.

Figura 4. Algoritmo recursivo para diviso.

A ideia do algoritmo da Figura 4 deslocar para a direita at que o mesmo seja 0, e depois construir os valores de e , baseado no comportamento recursivo, analisando os valores de e de a cada recurso. A Figura 5 mostra a execuo do algoritmo para = e = , em binrio.

Figura 5. Exemplo para o algoritmo recursivo de diviso.

Pode-se observar pelo algoritmo e pelo exemplo que para reduzir o valor de para 0 por meio de deslocamentos para direita (no cdigo isso feito por meio da diviso por 2) so necessrias operaes, e a cada recurso so executadas operaes de soma (()), logo o algoritmo apresenta complexidade final ().

3. Aritmtica Modular
Com sucessivas adies e multiplicaes nmeros podem ficar muito grandes e aplicaes como teste de primalidade e criptografia lidam com nmeros significantemente maiores dos que os limites de palavra dos computadores (32 ou 64 bits).

A aritmtica modular um sistema para lidar com inteiros de um intervalo restrito {0,1,2, n = . . . , 1} de tal modo que quando um nmero est fora do conjunto h maneiras de traz-lo de volta, utilizando o conceito de congruncia mdulo . A Figura 6 mostra a relao de congruncia mdulo .

Figura 6. Congruncia mdulo .

Desta forma possvel dividir os inteiros em classes de equivalncia mdulo em que qualquer membro de uma classe pode ser substitudo por qualquer outro da mesma classe, sendo que as operaes de adio e multiplicao continuam bem definidas [Dasgupta, Papadimitriou e Vazirani 2006]. Nesta seo as operaes de adio, multiplicao, diviso e exponenciao modulares e o algoritmo de Euclides para o mximo divisor comum sero apresentadas.

3.1. Adio Para adicionarmos dois nmeros mdulo a ideia bsica proceder com a operao de adio bsica e caso necessrio reduzir o resultado mdulo para traz-lo de volta ao conjunto. Mais detalhadamente: 1. e esto ambos no intervalo de a , sua soma est entre e ( ) 2. Se a soma excede subtramos meramente para traz-la de volta ao intervalo A computao total, portanto, consiste em uma adio (()) e, possivelmente, uma subtrao (()) de nmeros que nunca excedem . O tempo de execuo linear no tamanho da representao desses nmeros, ou seja, (), onde n = .

3.2. Multiplicao A multiplicao segue a mesma ideia da adio, utiliza-se a operao de multiplicao bsica e se necessrio reduzimos a resposta mdulo . Mais detalhadamente: 1. e esto no intervalo de a , logo seu produto est entre e ( ) 2. O produto tem no mximo bits de comprimento em sua representao, pois ( ) = ( ) = 3. Para reduzir a resposta mdulo computamos o resto dividindo-o por usando o algoritmo para diviso. A execuo do algoritmo de multiplicao utiliza, portanto, a operao de multiplicao bsica (()) e possivelmente a operao de diviso bsica (()), logo o tempo de execuo final tambm ().

3.3. Exponenciao A operao de exponenciao modular essencial para muitas aplicaes de teste de primalidade e sistemas de criptografia. Dentre os algoritmos criptogrficos existentes atualmente, os mais utilizados e seguros so os algoritmos que utilizam chave pblica, sendo o RSA um dos mais difundidos. O RSA utiliza enormes nmeros primos (1200 bits ou mais), sendo o controle e o processamento desses dados uma tarefa muito lenta, principalmente para chaves muito grandes [Bissoli 2007]. Para acelerar o processo criptogrfico necessrio algoritmos computacionais especficos para esse fim, no qual importantssimo encontrar de forma eficiente, onde , e so inteiros grandes [Cormen et al. 2009] e [Rosen 2012]. No algoritmo para exponencial modular deseja-se evitar que os resultados intermedirios sejam muito grandes, desta forma pode-se pensar na seguinte ideia: 1. Calcular multiplicando por durante vezes 2. Aplicar a operao de mdulo a cada multiplicao, impedindo que os valores cresam exageradamente A Figura 7 mostra o comportamento desse algoritmo.

Figura 7. Multiplicao sucessiva por mdulo .

Mas h um problema, precisamos realizar multiplicaes, logo esse algoritmo exponencial pois a representao de pode possuir centenas bits. Para contornar esse problema pode-se adotar uma ideia melhor, que consiste em: 1. 2. 3. 4. Encontrar a representao binria de = [ , , , ] Calcular as potncias elevando ao quadrado , , , , Computar o produto = . . . . Aplicar a operao de mdulo a cada multiplicao, impedindo que os valores cresam exageradamente

A Figura 8 mostra o comportamento desta nova abordagem.

Figura 8. Multiplicao por sucessiva elevao de ao quadrado mdulo .

Nota-se que pode ser 0 ou 1, esto basta multiplicarmos um subconjunto apropriado dessas potncias, aquelas correspondentes aos 1 da representao binria de [Clark 2003]. Cada multiplicao tem complexidade () e neste caso so necessrias somente multiplicaes

Um exemplo de aplicao deste algoritmo para calcular 315 10: Primeiro passo: 15 = 23 + 22 + 2 + 1 = [1, 1, 1, 1]2 Segundo passo: 31 = 3 3 ( 10) 32 = 3 . 3 = 9 9 ( 10) 2 32 = 9 . 9 = 81 1 ( 10) 3 32 1 . 1 1 1 ( 10) Terceiro passo: 315 = 32 . 32 . 32 . 31 = 1 . 1 . 9 . 3 = 27 7 ( 10) Usando essa ideia possvel derivar um algoritmo polinomial utilizando a regra mostrada pela Figura 9.
3 2

Figura 9. Regra para exponenciao.

A regra da Figura 9 auto evidente e o algoritmo recursivo para exponenciao gerado a partir dela mostrado na Figura10.

Figura 10. Algoritmo para exponenciao.

Considerando o tamanho em bits de , e o algoritmo da Figura 10 para aps no mximo chamadas recursivas (pois cada operao de diviso por 2 em desloca um bit para a direita, at chegar a zero) e em cada chamada realizada uma multiplicao (( )), logo o tempo de execuo total de ( ).

3.4. Algoritmo de Euclides para o Mximo Divisor Comum O mximo divisor comum () entre dois nmeros e (diferentes de zero) o maior inteiro que divide ambos, formalmente: (, ) = { | | } O smbolo | neste caso significa divide. O algoritmo mais simples e intuitivo para encontrar o entre dois nmeros seria listar todos os divisores comuns e depois escolher o maior [Scheinerman 2012], mais detalhadamente: 1. Para cada inteiro positivo (de 1 at o menor entre e ) verificar se | | , e caso seja verdadeiro inserir o nmero em uma lista 2. Escolher o maior nmero na lista final. Esse ser o (, ) Esse algoritmo terrivelmente lento, pois precisa fazer inmeras divises. Existe uma maneira mais inteligente de se calcular o entre dois nmeros, o algoritmo de Euclides. O algoritmo de Euclides utiliza a seguinte regra: , , (, ) = (, ) Para provar a corretude desta regra suficiente mostrar a regra ligeiramente mais simples: (, ) = (, ), da qual a regra de Euclides pode ser derivada subtraindo-se de sucessivas vezes. Devemos mostrar que o conjunto de divisores comuns entre e igual ao conjunto de divisores comuns entre e , desta forma o (que o maior dos divisores comuns) tambm ser igual [Stein 2008]. Formalmente: () | | ento | ( ) () | | ( ) ento | Para provar () basta percebermos que se | ento existe algum inteiro tal que = . , da mesma forma se | ento existe um inteiro tal que = . , logo = . . = ( ). e portanto | ( ). A prova de () se faz de maneira similar. Essa regra permite a gerao de um algoritmo recursivo para clculo do , a Figura 11 mostra esse algoritmo.

Figura 11. Algoritmo de Euclides para .

Para explicitar o tempo de execuo do algoritmo deve-se saber a quantidade de chamadas recursivas realizadas at que seja reduzido a zero. Em uma rodada os argumentos (, ) se tornam (, ), ou seja, sua ordem trocada e o maior deles reduzido . A reduo realizada de acordo com o seguinte lema: < A prova deste lema feita pela observao de dois casos, mostrados pelas Figura 12 e 13.

Figura 12. Comportamento do algoritmo de Euclides quando

Pode-se perceber pela Figura 12 que quando

obtemos < < .

Figura 13. Comportamento do algoritmo de Euclides quando >

Pela Figura 13 quando >

= <

Isso significa que a cada duas rodadas consecutivas, ambos os argumentos so reduzidos pela metade, ou seja, seu tamanho diminui em 1 bit. Se no incio do algoritmo eles tem bits ento para que cheguem a zero necessrio chamadas recursivas. Em cada chamada realizada uma diviso (()) para clculo do resto, logo o tempo de execuo total (). Uma extenso do algoritmo de Euclides a chave para a diviso modular, essa extenso baseada no seguinte teorema: | , | = + , (, ) A prova de tal teorema se d pelo seguinte pensamento:

Por um lado, pelas duas primeiras condies do teorema sabe-se que um divisor comum de e , portanto no pode exceder o mximo divisor comum, ou seja, (, ). Por outro lado, como (, ) um divisor comum de e ele tem de dividir uma combinao linear de e , ou seja, ele divide + . Como + = ento (, ) divide , logo (, ) . Juntando os dois fatos temos que = (, ).

A questo agora como encontrar os valores de e , e para isso temos o algoritmo de Euclides estendido, mostrado na Figura 14.

Figura 14. Algoritmo estendido de Euclides.

Deve-se demonstrar que para quaisquer inteiros e , o algoritmo estendido de Euclides retorna , e inteiros tal que (, ) = = + , para isso utilizamos uma prova por induo: Caso base: = (trivial pelo prprio algoritmo) Hiptese de induo: = + para todo Escolhendo como algum valor grande, sabe-se que para encontrar (, ) o algoritmo chama recursivamente o (, ). Como < podemos aplicar a hiptese de induo e concluir que os valores e retornados so corretos, ou seja, (, ) = + ( ) Escrevendo ( ) como obtemos = (, ) = (, ) = + ( ) = + ( ) = + ( ), e portanto validamos o comportamento do algoritmo.

Mesmo com essas alteraes no algoritmo ele continua apresentando tempo de execuo ().

3.5. Diviso A diviso modular ser apresentada somente agora pois ela utiliza vrios conceitos que necessitavam ser explicados a priori. Na aritmtica real, todo nmero , tem um

inverso e dividir por o mesmo que multiplicar pelo inverso. Na aritmtica modular, pode-se fazer uma definio similar: , , ( ) Entretanto esse inverso nem sempre existe. Os elementos que possuem inversos multiplicativos mdulo so aqueles relativamente primos a , isto , (, ) = . Se o inverso multiplicativo existe, ele pode ser determinado utilizando o algoritmo estendido de Euclides [Bissoli 2007]. Isto pode ser observado pelo fato que ( ) = (para algum inteiro ), ento temos que + () = e pelo teorema estendido de Euclides (, ) = . Ao trabalharmos mdulo , para efetivamente realizarmos a diviso fazemos uma multiplicao pelo inverso, e como para encontrar o inverso multiplicativo necessrio aplicar o algoritmo estendido de Euclides (()) a operao de diviso modular tambm ().

3. Consideraes Finais
Neste trabalho foram apresentadas vrias abordagens e algoritmos para as funes aritmticas bsicas e modulares, alm de explicitadas suas complexidades e aplicaes. Pode-se concluir que existem variadas formas de se resolver determinado problema, porm uma anlise da complexidade de cada soluo deve ser realizada com o intuito de explicitar quais solues apresentam abordagens mais eficientes.

Referncias
Bissoli, M. L. (2007). Impacto da Multiplicao e Exponenciao Modular em Hardware no Algoritmo RSA. 2007. 105 f. Dissertao (Mestrado em Cincia da Computao) Fundao de Ensino Eurpedes Soares da Rocha, Univem, Marlia. Clark, W. E. (2003). Elementary Number Theory. University of South Florida. 121 p. Cormen et al. (2009) Introduction do Algorithms. 3 Edio. The MIT Press. 1312 p. Dasgupta, S.; Papadimitriou, C.H.; Vazirani, U.V. (2006) Algorithms. 1 Edio. McGraw-Hill. 336 p. Rezai, A.; Keshavarzi, P. (2011). High-performance modular exponentiation algorithm by using a new modified modular multiplication algorithm and common-multiplicandmultiplication method. World Congress on Internet Security (WorldCIS). pp.192,197. Rosen, K. (2012). Discrete Mathematics and Its Applications. 7 Edio. McGraw-Hill. 1071 p. Scheinerman, E. A. (2012) Mathematics: a Discrete Introduction. 3 Edio. Cengage Learning. 504 p. Stein, W. (2008) Elementary Number Theory: Primes, Congruences, and Secrets. 1 Edio. Springer. 170 p.

You might also like