• Nenhum resultado encontrado

Integra¸c˜ ao de Monte Carlo

2.3 M´ etodo de Monte Carlo

2.3.3 Integra¸c˜ ao de Monte Carlo

A integra¸c˜ao num´erica pode ser muito dif´ıcil, dependendo do dom´ınio, de condi¸c˜oes espe- ciais ou de numerosas vari´aveis. O m´etodo de Monte Carlo ganha vantagem na resolu¸c˜ao de problemas em que n˜ao se conhece nenhum m´etodo determin´ıstico, ou em que m´etodos determin´ısticos n˜ao s˜ao pratic´aveis.

Podemos aplicar o m´etodo de Monte Carlo para o calcular um integral definido I =

Z b

a

f (x)dx, (2.14)

em que f (x) ´e um fun¸c˜ao positiva e limitada.

Consideremos o rectˆangulo [(a, 0), (b, 0), (b, fm), (a, fm)], em que fm ´e o valor m´aximo

que a fun¸c˜ao toma no intervalo [a, b]. O integral de f (x) pode ser entendido como uma frac¸c˜ao do rectˆangulo, ou seja, a ´area abaixo da curva f (x) contida no rectˆangulo. O m´etodo de integra¸c˜ao em si consiste em gerar uma grande quantidade de pares de n´umeros aleat´orios (pseudoaleat´orios) (x, y) no rectˆangulo e contar os pontos que est˜ao sob a curva f (x) para obter a ´area aproximada

I ≈ Ns Nt

V,

em que Nt´e o n´umero total de pontos gerados, Ns´e o n´umero de pontos sob a curva f (x)

e V a ´area do rectˆangulo que limita f (x). Para verificar se um ponto est´a sob a curva basta testar y ≤ f (x).

Este m´etodo ´e muito ineficiente pois s˜ao necess´arias grandes quantidades de pontos aleat´orios para convergir para a solu¸c˜ao.

No entanto, existem maneiras mais f´aceis e menos dispendiosas de usar n´umeros ale- at´orios para calcular integrais.

Notemos que I = Z b a f (x)g(x)dx = 1 V Z b a f (x)g(x)V dx, (2.15) em que g(x) =      1 se x pertence ao dom´ınio, 0 caso contr´ario.

e V ´e o volume do dom´ınio. A equa¸c˜ao 2.15 pode ser interpretada como o valor esperado da fun¸c˜ao h(x) = f (x)g(x)V , para a vari´avel aleat´oria x de uma distribui¸c˜ao de probabilidade

uniforme no dom´ınio. Logo I ≈ 1 n n X i=1 h(xi) = V n n X i=1 f (xi) (2.16)

Uma estimativa baseada em 2.16 ´e muito mais r´apida do que em 2.14.

Para aplica¸c˜oes como a integra¸c˜ao de Monte Carlo, os n´umeros pseudoaleat´orios po- dem ter propriedades excessivamente aleat´orias. Pode acontecer que, ao “lan¸car” n´umeros pseudoaleat´orios no dom´ınio, determinadas regi˜oes s˜ao representadas em excesso com um amontoado de pontos, enquanto que outras tˆem buracos, ou seja, n˜ao tˆem representantes. Isto pode mesmo dar origem a uma estimativa errada!

Podemos melhorar a nossa estimativa se alterarmos o nosso gerador de n´umeros ale- at´orios de modo a cobrir (quase) uniformemente todo o dom´ınio. Aos n´umeros obtidos por este gerador chamamos de n´umeros quasi–aleat´orios.

Exemplo 2.3.1 O valor exacto de I = Z 1 0 Z 1 0 (x2+ y2)dxdy ´

e 23. Ao aplicarmos 2.16 efectuando o “lan¸camento” de 5000 pontos usando n´umeros pseudoaleat´orios, obtivemos 0.6634. No mesmo teste us´amos n´umeros quasi–aleat´orios e obtivemos ´e 0.6664.

Cap´ıtulo 3

Testes de primalidade

Num sistema de cifragem assim´etrico ´e importante gerar eficientemente os parˆametros da chave p´ublica e privada. Por exemplo, no sistema de cifragem RSA, geramos dois inteiros primos p e q para obter o m´odulo n = pq. Neste caso, os primos p e q devem ter “tamanho” suficiente para que a factoriza¸c˜ao de n seja extremamente dif´ıcil. Os primos devem ser “aleat´orios” no sentido em que a probabilidade de escolher um primo em particular ´e suficientemente pequena, para prevenir que se tire vantagens de uma pesquisa optimizada baseada nessa probabilidade.

3.1

Gera¸c˜ao de primos grandes

O m´etodo mais natural consiste em gerar um n´umero aleat´orio n de um determinado ta- manho e verificar se ´e primo. Podemos verificar se n ´e primo efectuando divis˜oes sucessivas por todos os primos at´e √n.

De facto, suponha que n ´e composto, que p ´e o menor divisor primo de n e que p >√n. Ent˜ao m = np ∈ Z e m < √n

n =

n. Se m ´e composto, como a decomposi¸c˜ao em factores primos ´e ´unica, existe um primo q que divide m e q < m < √n. O absurdo resulta de considerarmos que p > √n ´e o menor primo divisor.

Efectuar divis˜oes sucessivas por todos os primos at´e √n n˜ao resulta na pr´atica. Ima- ginemos que n ´e um n´umero com 100 d´ıgitos e que um computador realiza cerca de 1012 divis˜oes por segundo. O n´umero total de divis˜oes que ter´ıamos que efectuar seria da ordem de

√ 10100

2 , ou seja, 1050

2 . ´E f´acil calcular, nestas condi¸c˜oes, quantos anos s˜ao necess´arios

para realizar todas estas divis˜oes, nada mais do que: 1050

1012× 3 600 × 24 × 365 = 3 170 979 198 376 458 650 431 253 170 979, 2!

Seriam precisos cerca de 1031 anos para efectuar todas as divis˜oes, o que ´e algo desani-

mador! O facto ´e que o algoritmo envolvendo divis˜oes pode provar que um n´umero n ´e primo, e ainda fornece a sua decomposi¸c˜ao em factores primos. Mas n´os sabemos que factorizar ´e muito dif´ıcil!

Talvez se possa ganhar tempo se n˜ao determinarmos a factoriza¸c˜ao prima de n. Re- almente o nosso objectivo ´e, literalmente, determinar se n ´e primo ou composto, sem se conhecer os seus factores primos. De facto, veremos mais adiante que h´a algoritmos, r´apidos, que determinam com um grau de certeza elevado a primalidade de n.

Mediante a fun¸c˜ao gen_prime(nbits, secret, random_level), vamos analisar com algum detalhe o processo utilizado pelo GnuPG v1.06, para gerar um n´umero primo p, de tamanho nbits.

(i) Gera um n´umero aleat´orio p de tamanho nbits como sendo o candidato a primo;

(ii) Assegura que o primeiro e ´ultimo bit tˆem valor 1, para garantir que p ´e ´ımpar e que p tem realmente tamanho nbits, respectivamente;

(iii) Calcula a tabela mods[i] ≡ p (mod pi), para primos pi menores que

5000, contidos na tabela small_prime_numbers[i];

(iv) Calcula o primeiro n´umero p + j, para j = 2, 4, . . . , 20 000, que passa os seguintes testes de primalidade:

(a) Verifica se p + j ´e divis´ıvel por algum primo pequeno contido na tabela mods[i], calculando p + j ≡ mods[i] + j (mod pi);

(b) Verifica p + j ´e um pseudoprimo de Fermat para a base b = 2; (c) Atrav´es da fun¸c˜ao isprime(p+j,5,&count2), aplica o teste proba-

bil´ıstico 3.2.4 de Miller–Rabin a p + j para um total de t = 5 bases. ´

E testada a base b = 2 e quatro bases aleat´orias b 6= ±1;

(v) Se nenhum dos inteiros p + i, para i = 0, 2, 4, . . . , 20 000, passou os testes, ent˜ao voltamos ao passo (i).

Este processo s´o p´ara quando um n´umero p + j passa os 3 testes (a), (b) e (c).

O GnuPG v1.06 recruta os seus candidatos de forma “mista”, isto ´e, gera um n´umero aleat´orio n e restringe os candidatos a primos ao conjunto finito R(n) = {n, n + 2, . . . , n + 20 000}. Se este conjunto esgotar, ent˜ao o GnuPG v1.06 gera outro n´umero aleat´orio para substituir o conjunto R(n).

No passo (iv), o teste de primalidade pode ser uma prova de que o candidato n ´e primo ou um teste que estabelece um resultado mais fraco: que n ´e provavelmente um n´umero primo. Na seguinte sec¸c˜ao vamos estudar com detalhe os dois testes probabil´ısticos usados pelo GnuPG v1.06 e um terceiro teste usado no PGP v7.0.3.

Documentos relacionados