Você está na página 1de 17

Gerando Nmeros Aleatrios u o

Fernando Henrique Ferraz Pereira da Rosa Vagner Aparecido Pedro Junior MAP-131 Laboratrio de Matemtica Aplicada o a Prof. Dr. Eduardo Colli 21 de novembro de 2002

Introduo ca

A disponibilidade de nmeros aleatrios extremamente util em uma varieu o e dade de situaoes, como na simulaoes de fenmenos f c c o sicos (indo desde a f sica nuclear at engenharia de sistemas), em amostragem de uma populaao, na e c programaao de computadores, na tomada de decises ou at mesmo em entrec o e tenimento (bingos, loterias ou jogos). Na area de simulaao, onsideremos por exemplo, a modelagem do tempo de c acesso de um disco r gido, num computador pessoal. Podemos determinar que a duraao desse evento ir car numa faixa conhecida, digamos de 0 a 200ms, de c a acordo com caracteristicas f sicas inerentes ao prprio disco rigido. Entretanto, o o valor real desse evento vai depender de vrios fatores, como a posiao da a c cabea de leitura quando a requisiao feita pelo sistema operacional, detalhes c c e esprios da implementaao do suporte a controladora no sistema e at mesmo da u c ` e temperatura e outras condioes ambientais. Podemos considerar ento que esse c a tempo de acesso uma varivel aleatria seguindo uma distribuiao conveniente, e a o c e simulamos com o objetivo de ver se nosso modelo adere a realidade. Para fazermos essa simulaao precisamos de nmeros aleatrios que sigam essa dada c u o distribuiao, e para isso precisamos saber primeiro como gerar esses nmeros c u aleatrios. o Algumas fontes de nmeros aleatrios so o lanamento de dados, a retirada u o a c de bolas numeradas de uma urna (com reposiao), o uso de uma roleta ou c ainda ru eletrnico cuja saida quantizada periodicamente [1]. Entretanto na do o e esmagadora maioria das vezes usa-se o que foi convecionado chamar de nmeros u pseudo-aleatrios. o Isso se d pois o uso de nmeros realmente aleatrios causa um impec a u o lio nas simulaoes assim como no desenvolvimento de programas para computador: c no se tem como repetir uma dada seqncia de nmeros, com a intenao de a ue u c vericar a simulaao ou tentar corrigir um problema no programa. c Alm da possibilidade se repetir uma dada seqncia, de [1] temos que ee ue xistem algumas outras propriedades importantes num bom gerador de nmeros u (pseudo)aleatrios, a saber: o 1. Os nmeros gerados devem seguir uma distribuiao uniforme, pois nmeros u c u aleatrios de verdade seguem essa distribuiao. o c 2. Os nmeros devem ser estatisticamente independentes entre si. O valor de u um nmero na seqncia no deve afetar o valor do prximo (na prtica a u ue a o a maioria dos geradores usa seqncias recursivas, ento h essa dependncia ue a a e dos valores anteriores, mas isso no estatisticamente signicavo, dai o a e destaque para independncia estat e stica). 3. A seqncia no deve se repetir nunca. Isso teoricamente imposs mas ue a e vel na prtica um per a odo de repetiao sucientemente grande o bastante. c e 4. A geraao desses nmeros deve ser rpida, de modo a poupar recursos c u a computacionais para as simulaoes em si. c O uso de um algoritmo para gerar um nmero aleatrio parece violar o u o princ pio bsico da aleatoridade, por isso que se convenciona chamar esses a e nmeros de sintticos ou pseudo-aleatrios. Esses nmeros correspondem as u e o u ` propriedades acima mas comeam sempre de um valor inicial chamado semente c 1

(seed ) e continuam numa maneira totalmente determin stica, por isso deve ser tomado muito cuidado para que a aleatoridade esteja presente. No desenvolvimento do trabalho vamos dar uma olhada nos principais algoritmos para geraao de nmeros aleatrios e em seguida vamos estudar tambm c u o e alguns testes de aleatoridade, que nos fornecem um meio objetivo de vericar a aleatoridade de uma seqncia. Vamos tambm implementar alguns desses ue e mtodos, e fazer testes para vericar como eles se comportam. e

2
2.1

Algoritmos para gerao de n meros pseudoca u aleatrios o


Mtodo do quadrado do meio e

Esse mtodo foi inventado por John von Neumann. Comea-se com uma semente e c (seed), esse nmero ento elevado ao quadrado, os d u e a gitos do centro so usados a como prximo elemento da seqncia. Caso o nmero de d o ue u gitos que que a esquerda seja maior que os que quem a direita no h problema, simplesmente a a xamos para qual lado vamos fazer o corte. Exemplo: comeando a partir de x0 = 44214 vamos gerar uma seqncia de c ue nmeros aleatrios de 5 d u o gitos: x0 (44214)2 (54877)2 (11485)2 (19052)2 (29787)2 = = = = = = 44214 1954877796 3011485129 0131905225 0362978704 0887265369 x1 x2 x3 x4 x5 = = = = = 48777 14851 19052 29787 72653

Veja 4.1 para a implementaao em c do algoritmo do quadrado do meio (midsc quare). Esse algoritmo tem diversas desvantagens. Em primeiro lugar geralmente as seqncias geradas por esse algoritmo se repetem em pouco tempo. Em segundo, ue sempre que um 0 for gerado todos os nmeros seguintes da seqncia sero 0 u ue a tambm. e Exemplo: tomando x0 = 121: x0 (121)2 (464)2 (529)2 (984)2 (825)2 (062)2 (384)2 (745)2 (502)2 (200)2 (000)2 = = = = = = = = = = = = 121 014641 215296 279841 968256 680625 003844 147456 555025 252004 040000 000000 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 = = = = = = = = = = = 464 529 984 825 062 384 745 502 200 000 000

2.2

Mtodo linear congruente e

A grande maioria dos geradores de nmeros pseudo-aleatrios hoje em dia so u o a modicaoes do mtodo linear congruente. Ele dado atravs duma relaao de c e e e c recorrncia, a saber: e xn+1 = (axn + c) mod m, n 0 (1)

O valor inicial x0 chamado de semente (seed ), a o multiplicador, c o e e incremento e m o mdulo. A escolha desses valores afeta drasticamente o e o 3

a comprimento do per odo da seqncia de nmeros aleatrios. E fcil notar ue u o que o per odo ser sempre menor que m, e que portanto, para aumentarmos o a per odo devemos usar m o maior poss vel. Esse algoritmo apesar de extremamente simples podeross e mo, dada uma escolha adequada dos parmetros a, c e m. Em [2] temos o seguinte Teorema a que nos informa qual a escolha otima desses parmetros: a Teorema A O mtodo linear congruente tem um per e odo m se e somente se: i) c e m so primos entre si. a ii) b = a 1 um mltiplo de p, para todo p primo divisor de m e u iii) b um mltiplo de 4, se m um mltiplo de 4. e u e u Uma prova desse Teorema para um caso especial foi dada h pelo menos a 100 anos atrs, por M. Greenberger e o caso geral foi dado por Hull e Dobel. a No iremos entrar em detalhes na sua demonstraao matemtica, que envolve a c a diversos conceitos avanados de Algebra. c Em 4.2 implementamos em c esse algoritmo para geraao de nmeros aleatrios. c u o Fizemos algumas modicaoes e escolhas particulares dos parmetros a, m e c de c a modo que o usurio precisa entrar apenas com o nmero de nmeros aleatrios a u u o que ele quer gerar (entre 0 e 1) e opcionalmente uma semente. 2.2.1 Escolhendo os parmetros a

Em primeiro lugar, levamos em consideraao o valor de m. Como j foi obc a servado, o per odo da seqncia na melhor das hipteses vai ser igual a m (ou ue o seja, a cada m elementos a seqncia vai se repetir). Baseados no nmero de ue u elementos n que o usurio quer gerar, escolhemos ento um valor de m sua a cientemente maior que n mas no necessariamente sempre grande, de forma a a poupar recursos computacionais, tendo m como funao de n. Chegamos na c seguinte relaao: c m = (menor primo( 10n))2 (2) Onde a funao menor primo(x) retorna o maior nmero primo d, tal que c u d<x. Com (2) garantimos que m ser sucientemente maior que n e ao mesmo a tempo que m da forma m = p2 com p primo, e logo os unicos divisores de m e sero 1, m e p. Convenientemente ento, escolhemos a de acordo com a seguinte a a relaao: c a = menor primo( 10n) + 1. (3) Seja: q = menor primo( 10n)

Por (2) sabemos que q o unico divisor primo de m, e da condiao (ii) do e c Teorema A sabemos que a1 deve ser mltiplo de p para todo p primo divisor u de m. Ora, temos ento que a deve ser da forma: a a 1 = nq a = nq + 1 (n N) Fazendo n = 1 chegamos na relaao (3) acima. c

m Escolhemos c aleatrio entre 0 e 10 , c diferente de q. Dessa forma completao mos a condiao (i) do Teorema A. A condiao (iii) no precisa ser levada em c c a conta, j que escolhemos m mltiplo apenas de q, q primo. a u

E por m, caso o usurio no tenha escolhido ele prprio uma semente, a a o escolhemos x0 aleatrio entre 0 e m. o Obtivemos resultados excelentes com essa implementaao, conseguindo sec qncias melhores que de alguns pacotes estat ue sticos dispon veis. Mais a frente, quando entrarmos na parte de Testes de Aleatoridade vamos falar disso com mais detalhes.

2.3

Outros mtodos e

Claramente, o mtodo linear congruente no o unico meio de se conseguir e a e boas seqncias de nmeros aleatrios. Nessa sesso vamos dar uma olhada em ue u o a alguns algoritmos outros algoritmos dispon veis. Uma verso quadrtica do mtodo linear congruente dada por: a a e e xn+1 = (dx2 + axn + c) mod m. n (4)

Com a, d e m escolhidos convenientemente, de forma similar que o mtodo e linear, tambm pode-se garantir que a seqncia vai ter per e ue odo m. Outro mtodo quadrtico interessante proposto, foi: e a xn+1 = xn (xn + 1) mod 2e , n 0. (5)

Com m uma potncia de 2 e x0 mod 4 = 2, tambm fornece um per e e odo longo. Outras generalizaoes podem ser feitas, obtendo xn+1 a partir de um poc linmio que depende de xn , xn1 , ..., xk . Aplicam-se a tambm regras as conso e ` tantes e pode-se garantir per odos sucientemente longos.

Testes de Aleatoriedade

Ns acabamos de estudar alguns mtodos para geraao de seqncias que pareo e c ue cem aleatrias. Vimos que seguindo alguns critrios nas escolhas dos algoritmos o e e parmetros podemos aumentar o per a odo da seqncia o quanto quisermos, ue mas somente isso no garante que nossa seqncia ser util para propsitos a ue a o prticos. Considere a seqncia: a ue 0, 1, 2, 3, 4, 5, 6, ..., n 1, n O per odo pode car to grande quanto quisermos, mas essa seqncia no a ue a aleatria de forma alguma. Qual deve ser o critrio de deciso para que e o e a possamos concluir com conana se uma seqncia aleatria ou no? c ue e o a Se for dada uma caneta e um papel para uma pessoa e pedir-se para essa pessoa escrever uma seqncia de nmeros aleatrios, provavelmente a pessoa no ue u o a conseguir escrever uma seqncia satisfatoriamente aleatria. Ns tendemos a a ue o o evitar coisas que no parecem aleatrias, como dois nmeros repetidos, enquando a o u que estatisticamente se espera que isso ocorra com freqncia. Ao mesmo tempo ue que se mostrarmos uma tabela de nmeros aleatrios para algem essa pessoa u o u vai dizer que os nmeros no so aleatrios. u a a o Um outro exemplo da nossa errnea intuiao com relaao a expanso o c e c ` a decimal do nmero . Um estat u stico diria que apenas uma seqncia de e ue nmeros aleatrios, enquanto um numerlogo vai encontrar provavelmente toda u o o a histria da humanidade ali. o Em [3] podemos procurar qualquer seqncia de d ue gitos em . Pegando as 4 primeiras notas da primeira prova de MAP-131 e colocando em seqncia: ue 4.85.32.13.8 = 48532138 Obtemos o resultado: The string 48532138 was found at position 3135428 counting from the first digit after the decimal point. O que signica que o resultado da prova j estava predestinado por ou... precisamos de a um conceito mais rigoroso de aleatoridade. A seguir veremos os principais testes utilizados para se vericar a aleatoridade de uma seqncia. Em geral supe-se que a seqncia no aleatria, e ue o ue a e o se ela passar satisfatoriamente por uma meia dzia de testes, consideramos ela u satisfatoriamente aleatria. o

3.1

Testes de Qui-Quadrado

O teste de Qui-Quadrado provavelmente o teste estat e stico mais conhecido, e serve para diversas situaoes, como teste de homogeneidade de subpopulaoes, c c aderncia de modelos ou independncia de var e e aveis. Sua essncia se baseia na e soma dos res duos em relaao a um modelo esperado, e pode ser esquematizado, c de acordo com [4] da seguinte maneira: Dada uma varivel X para a qual temos uma amostra de valores, desejamos a vericar se essa var avel se adequa ou no a uma dada distribuiao. Dividimos a c esses valores em k categorias, montando a tabela de freqncia: ue Categoria 1 Freq. Observada o1 6 2 o2 3 o3 .... ... k ok

A partir do modelo que supomos ser adequado, constru mos a tabela de freqncias ue esperadas de acordo com as categorias acima: Categoria 1 Freq. Esperada e1 2 e2 3 e3 .... ... k ek

Calculamos ento uma medida de distncia entre os dados observados e o a a que se esperaria sob a hiptese de que ele segue o modelo que supomos, atravs o e da seguinte expresso: a k (oi ei )2 Q2 = ei i=1 Sabe-se que para uma amostra razoavelmente grande, essa quantidade segue uma distribuiao de Qui-Quadrado, com k 1 graus de liberdade. Calculamos c ento: a P (2 > Q2 ) (6) k1 obs Caso esse valor seja muito pequeno ( 0.01) rejeitamos a hiptese de que nossos o dados seguem o modelo sugerido. Para testar seqncias de nmeros aleatrios, temos duas aplicaoes dos ue u o c testes de Qui-Quadrado. Em primeiro lugar podemos fazer um teste de homogeneidade de subpopulaoes, dividindo os nmeros aleatrios que geramos em c u o seqncias de m valores e vericando se a distribuiao dos nmeros entre esses ue c u grupos homognea ou no. e e a Outro teste poss pegar toda a seqncia de nmeros aleatrios, divid vel e ue u o la em k classes, e vericar as freqncias observadas. Supomos ento que essa ue a var avel segue distribuiao uniforme contnua, calculamos as freqncias espec ue radas sob essa hiptese, e vericamos ento atravs de (6) se nossa suposiao o a e c est correta. a

3.2

Testes usando Monte Carlo

No trabalho anterior, usamos mtodos Monte Carlo para estimar o valor de . e Um dos experimentos consistia em jogar pontos aleatrios numa circunferncia o e circunscrita num quadrado, e fazendo uma razo incluindo as areas das duas a formas geomtricas, estimavamos . Quanto mais aleatoriamente conseguimos e jogar os pontos na circunferncia, ou em outras palavras, quanto mais aleatrios e o so os nmeros que conseguimos gerar, melhor vai ser nossa estimativa de . a u Para testar a aleatoridade de uma seqncia podemos ento fazer o teste do ue a quadrado e ver quo boa a estimativa de . a e

3.3

Teste de Kolmogorov-Smirnov

Um outro teste dispon o teste de Kolmogorov-Smirnov, que pode ajudar vel e a determinar se um dado conjunto de valores provm de uma dada distribuiao e c ou no. Geramos os nmeros aleatrios, normalmente entre 0 e 1, e vericamos a u o se esse conjunto de dados adere a uma distribuiao uniforme no intervalo [0,1]. c

3.4

Testes seriais

Os testes que vimos at agora vericam a uniformidade de uma seqencia e e u suas subseqncias, mas ainda assim, no so capazes de detectar o n ue a a vel de 7

dependncia entre um nmero e seu antecessor, para isso temos alguns procedie u mentos espec cos. Um dos testes mais comuns desse gnero o chamado teste do Poker. Neste e e teste considera-se n grupos de 5 inteiros sucessivos, e observamos em quais classiscaoes se encaixam as seqncias: c ue 5 4 3 2 1 diferentes diferentes diferentes diferentes diferentes = = = = = todos os nmeros diferentes entre si. u um par. dois pares ou trs iguais. e quatro iguais. todos os 5 iguais.

Fazemos ento um teste de Qui-Quadrado, supondo que o nmero de casos vai a u ser equivalente para cada qu ntupla.

3.5

Teste de Fernando e Vagner

Analisando as seqncias, tivemos a idia de um outro teste para vericar a ue e dependncia entre os nmeros numa seqncia. Dado um vetor num com n e u ue elementos, tiramos uma cpia de num em num2, acrescentamos um 0 no nal o de num e outro 0 no nal de num2. Fazemos ento a diferena num num2, a c armazenando isso num vetor residuo. Vericamos ento como se comporta a a distribuiao desses res c duos. Caso no haja uma dependncia entre os nmeros, esses res a e u duos devem se distribuir de forma normal, sem nenhuma tendncia espec e ca. Caso haja uma relaao forte de dependncia, espera-se uma distribuiao assimtrica acentuada c e c e para um dos lados, assemelhando-se a uma exponencial ou similar. No caso de uma progresso aritmtica, como a seqncia proposta no in a e ue cio dessa sesso (0, 1, 2, ..n) esse teste descobre na hora que a seqncia no a ue a e aleatria, pois todos os res o duos sero iguais, de forma que quando plotarmos o a histograma de res duos todos eles vo estar concentrados numa regio s. a a o

3.6

Testando uma seqncia de nmeros aleatrios ue u o

Por m, vamos gerar nmeros aleatrios usando nossa implementaao do algou o c ritmo linear congruente, e realizar testes para vericar como essa seqncia se ue comporta. Comeamos gerando 50000 nmeros entre 0 e 1, com uma semente no esc u a pecicada. $ numeros 50000 | tail -50000 > num.txt Importamos esses dados no pacote estat stico R: > num <- scan("num.txt") E para ns de controle, geramos mais 50000 nmeros aleatorios com distriu buiao uniforme em [0,1] mas no pela nossa implementaao do algoritmo linear c a c congruente e sim pela funao equivalente em R: c > rnum <- runif(50000,0,1)

Vericando as estat sticas descritivas observamos que os dados se assemelham: > summary(num) Min. 1st Qu. Median Mean 3rd Qu. Max. 6.105e-06 2.498e-01 4.993e-01 4.997e-01 7.494e-01 9.999e-01 > summary(rnum) Min. 1st Qu. Median Mean 3rd Qu. Max. 6.294e-05 2.492e-01 4.996e-01 4.984e-01 7.475e-01 1.000e+00 Veriquemos os histogramas para essas duas seqncias: ue

Realizando um teste de Kolmorov-Smirnov nos dois conjuntos de dados, obtemos: One-sample Kolmogorov-Smirnov test data: num D = 0.0014, p-value = 1 One-sample Kolmogorov-Smirnov test data: rnum D = 0.0044, p-value = 0.3001 Indicando que a nossa implementaao do mtodo linear congruentes gerou c e nmeros mais prximos da distribuiao uniforme que o prprio gerador do R. u o c o Por m, veriquemos atravs do teste que ns implementamos o n e o vel de dependncia entre os nmeros subseqentes. Geramos os vetores auxiliares, e u u calculamos os res duos, e gerando os histogramas, obtemos:

10

O que mostra novamente que a nossa implementaao do Algoritmo Linear c Congruente foi bem sucedida, gerando a distribuiao esperada de res c duos.

11

4
4.1

Anexos
Implementao do algoritmo do quadrado do meio ca

/*********************************************************/ /* midsquare.c */ /* Este programa implementa o algoritmo de midsquare */ /* de von Neumann, para geracao de numeros aleatorios */ /* Fernando Henrique Ferraz Pereira da Rosa */ /* Vagner Aparecido Pedro Junior */ /* Data: 12/11/2002 */ /* */ /*********************************************************/

#include <stdio.h> #include <stdlib.h> int conta_digitos(int num); int midcut(int num,int nd); int main(int argc,char **argv) { int seed,nd,next,qtd,i; if (argc != 3) { printf("Uso: \n" " %s semente num, onde semente e um inteiro e \n" " num o numero de numeros aleatorios que voce quer gerar.\n", argv[0]); return(0); } sscanf(argv[1],"%d",&seed); sscanf(argv[2],"%d",&qtd); nd = conta_digitos(seed); printf("x[0] = %d\n",seed); for(i=1;i<=qtd;i++) { next = midcut(seed * seed,nd); printf("(%4d)^2 = %10d => x[%3d] = %d\n",seed,seed*seed,i,next); seed = next; } return(0); } /* conta_digitos: conta o numero de digitos * da representacao decimal de num */ int conta_digitos(int num) {

12

int cont; for(cont=1;num%10 != num;cont++) num /= 10; return(cont); } /* midcut: retorna o numero que esta no centro * de num, com nd digitos. * o cutpoint e para a esquerda, quando a divisao * nao e exata */ int midcut(int num,int nd) { int i,res,volta; char *string,*midpoint; nd *= 2; res = nd - conta_digitos(num); string = malloc((nd+1) * sizeof(char)); if (res > 0) { for(i=0;i<res;i++) { string[i] = 0; midpoint = &string[i+1]; } sprintf(midpoint,"%d",num); } else sprintf(string,"%d",num); nd /= 2; if (nd % 2 == 0) { /*divisao exata, primeiro tiramos nd/2 elementos do comeco *e depois nd/2 do final*/ for(i=0;i<nd/2;i++) string[i] = ; for(i=3*nd/2;i<2*nd+1;i++) string[i] = ; } else { /*como o corte e a esquerda, tiramos nd-nd/2 elementos da esquerda *e nd/2 elementos da direita.*/ for(i=0;i<nd-nd/2;i++) string[i] = ; for(i=2*nd-nd/2;i<2*nd;i++) string[i] = ; } sscanf(string,"%d",&volta); return(volta); } 13

4.2

Implementao do algoritmo linear congruente ca

/*********************************************************/ /* linearcong.c */ /* Este programa implementa o algoritmo linear */ /* congruente. */ /* Fernando Henrique Ferraz Pereira da Rosa */ /* Vagner Aparecido Pedro Junior */ /* Data: 21/11/2002 */ /* */ /*********************************************************/ #include #include #include #include <stdio.h> <math.h> <stdlib.h> <time.h>

int verifica_primo(int n); int sorteia_c(unsigned int aux,unsigned int m); int main (int argc,char **argv) { unsigned int n,aux,x0,c,next,m,i,a; srand(time(0)); if (argc != 2 && argc != 3) { printf("Uso: \n %s n [semente]\n" " com numero o n o numero de numeros aleatorios que voce quer\n" " gerar e opcionalmente uma semente.\n\n",argv[0]); return(0); } sscanf(argv[1],"%d",&n); aux = sqrt(n*10); while (verifica_primo(aux) == 0) aux--; m = aux*aux; a = aux+1; c = sorteia_c(aux,m); if (argc == 3) sscanf(argv[2],"%d",&x0); else x0 = ((double)rand()/RAND_MAX)*m; printf("x0 = %d\n" "a = %d\n" "c = %d\n" "aux = %d\n" "m = %d\n",x0,a,c,aux,m);

14

for (i=0;i<n;i++) { next = (a*x0 + c) % m; x0 = next; printf("%.20f\n",(double)next/m); } return(0); } /* verifica_primo: verifica se n e um numero e primo * Pos: retorna 1 se for primo. * retorna 0 caso contrario. */ int verifica_primo(int n) { int i,pausa; pausa = n/2; if (n == 0) return(0); for(i=2;i < pausa;i++) if (n % i == 0) return(0); return(1); } /* sorteia_c: acha um valor para c, tal que * c e m sao primos entre si. */ int sorteia_c(unsigned int aux,unsigned int m) { int num; num = ((double)rand()/RAND_MAX)*m/10; while (num == aux) num = ((double)rand()/RAND_MAX)*m/10; return(num); }

15

Referncias e
[1] GRAYBEAL J.W. e POOCH W. U. Simulation: Principle and Methods. Winthrop Publishers, Inc. 1980. [2] KNUTH D.E. The Art of Computer Programming vol. 2 : Seminumerical Algorithms. Reading,Mass.: Addilson-Wesley, 1991. [3] ANDERSEN G. D. The Search Page http://www.angio.net/pi/ piquery#award. [4] MAGALHAES. M. N. e LIMA A.C.P. Nooes de Probabilidade e Esc tat stica. Edusp, 2002.

Sobre
A verso eletrnica desse arquivo pode ser obtida em http://www.feferraz. a o net Copyright (c) 1999-2005 Fernando Henrique Ferraz Pereira da Rosa. dada permiss~o para copiar, distribuir e/ou modificar este documento E a sob os termos da Licena de Documentaao Livre GNU (GFDL), vers~o 1.2, c c~ a publicada pela Free Software Foundation; Uma cpia da licena em est inclusa na seao intitulada o c a c~ "Sobre / Licena de Uso". c

16