
1. Introdução
Suponha que eu pergunte quantas pessoas devem estar em uma sala para que duas delas tenham um aniversário com 50% de probabilidade de um dia. Qual será a resposta? Isso é chamado de paradoxo do aniversário.
O paradoxo diz:
Se houver 23 pessoas na sala, então, com uma probabilidade de 50%, duas delas nasceram no mesmo dia.
Algumas versões do paradoxo fazem afirmações ainda mais fortes:
Se a sala tiver 70 pessoas, com uma probabilidade de 99%, duas delas nasceram no mesmo dia.
No começo, isso pareceu surpreendente e contra-intuitivo para mim. Vamos descobrir por que isso é verdade. Para simplificar a tarefa, fazemos as seguintes suposições:
- Assumimos que todas as pessoas na sala não nasceram em um ano bissexto. Fazemos essa suposição para que não tenhamos que analisar dois casos diferentes.
- Não há gêmeos na sala. Com um par de gêmeos, a solução será trivial.
- Assumimos que as pessoas nascem de maneira uniforme e aleatória. O que isso significa? É provável que as pessoas nascam em qualquer dia do ano. Se isso for formalizado um pouco, a probabilidade de nascimento em qualquer dia escolhido será igual a frac1365 .
- As pessoas nascem independentemente uma da outra. Isso significa que a data de nascimento de qualquer pessoa não afeta a data de nascimento de outra pessoa.
Vale a pena notar que essas condições não são necessariamente observadas no mundo real. Em particular, no mundo real, as pessoas não nascem com aleatoriedade uniforme.
Este link possui estatísticas para os dias em que as pessoas nascem. Embora nosso modelo não seja um reflexo preciso do mundo real, sua simplicidade facilita muito a análise do problema.
Devo dizer que, se houver 366 ou mais pessoas em uma sala, é garantido que haja duas pessoas com o mesmo aniversário. Isso decorre do princípio de Dirichlet (o “princípio de pombos e caixas”): se houver 366 pessoas e 365 dias, pelo menos duas pessoas deverão ter o mesmo aniversário.
Imagine que há uma pessoa na sala, então a probabilidade de seu aniversário comum com outra pessoa é 0. Deixe
(An) será o resultado em que entre
n as pessoas não têm um único aniversário. Vamos
Pr[An] - a probabilidade de que entre
n das pessoas na sala, todo mundo faz aniversário no dia. Da mesma forma, vamos
overlineAn será complemento
An , ou seja, um resultado em que entre
n pessoas duas pessoas têm o mesmo aniversário.
Pr[An]+ Pr[ overlineAn]=1
Pr[A1]=1 textporqueexisteapenasumapessoanasala
Suponha que haja duas pessoas na sala, A e B. Sem perda de generalização, imagine que a pessoa A nasceu em 1º de janeiro. Para B e A terem aniversários diferentes, B precisa nascer em qualquer dia, exceto em 1º de janeiro. A pessoa B terá 364 opções de aniversário.
Pr[A2]= Pr[ textBédiferentedeA]= frac364365
Imagine que há três pessoas na sala, A, B e C. Suponha que a pessoa A tenha nascido em 1º de janeiro, para que todas tenham nascido em dias diferentes, a pessoa B tenha apenas 364 dias, como no exemplo anterior. Como A e B levam dois dias, a pessoa C só pode nascer aos 365 - 2 = 363 dias.
Pr[A3]= Pr[ textBédiferenteAeCédiferentedeB,A]= frac364365 times frac363365
Algo mais interessante acontece aqui: suponha que a sala já tenha
k−1 pessoas. Quando ele entra na sala
k essa pessoa
k pessoas tiveram aniversários diferentes, dois resultados devem ser verdadeiros
- Todos k−1 as pessoas que entraram na sala antes dele deveriam ter aniversários diferentes. Qual é a probabilidade disso? Pr[Ak−1] .
- k - essa pessoa precisa ter um aniversário diferente de todos os outros k−1 pessoas na sala. Qual é a probabilidade disso? frac365−(k−1)365 .
Note-se também que os dois resultados apresentados acima são independentes um do outro, porque, pelo pressuposto (4) feito no início do post,
k A segunda pessoa nasceu independentemente de todas as outras.
$$ display $$ \ begin {equação *} \ begin {split} \ Pr [A_k] e = \ Pr [k - 1 \ text {pessoas na sala têm diferentes aniversários} \ textbf {AND} \\ & \ \ \ \ \ \ \ \ text {pessoa k tem aniversário diferente do} k - 1 \ text {pessoas}] \\ & = \ Pr [k - 1 \ text {pessoas na sala têm aniversários diferentes}] \\ & \ \ \ \ \ times \ Pr [\ text {pessoa k tem um aniversário diferente do} k - 1 \ text {people}] \\ & = \ Pr [A_ {k-1}] \ times \ frac { 365 - (k-1)} {365} \ end {split} \ end {equação *} $$ display $$
Agora calculamos as probabilidades:
exibição em $$ $$ \ begin {equação *} \ begin {split} \ Pr [A_1] & = 1 \\ \ Pr [A_2] e = \ Pr [A_1] \ times \ frac {364} {365} = \ frac {364} {365} \ aproximadamente 0,997 \\ \ Pr [A_3] & = \ Pr [A_2] \ times \ frac {363} {365} = \ frac {364} {365} \ times \ frac {363} {365} \ aproximadamente 0,991 \\ \ Pr [A_4] e = \ Pr [A_3] \ times \ frac {362} {365} \ aproximadamente 0,983 \\ & \ vdots \\ \ Pr [A_ {22}] & = \ Pr [A_ {21}] \ times \ frac {344} {365} \ aprox 0,525 \\ \ Pr [A_ {23}] & = \ Pr [A_ {22}] \ times \ frac {343} {365 } \ aproximadamente 0,493 \\ \ end {divisão} \ end {equação *} $$ display $$
Desde que chegamos
Pr[A23]=0,493<0,5 , isso significa que a probabilidade de um aniversário comum para duas pessoas é igual
Pr[ overlineA23]=1− Pr[A23]=1−0,493=0,507>0,5
Com aumento
n a probabilidade tende a 1 e a atinge.
Tarefa mais difícil
Suponha que desejemos generalizar esse problema para o caso em que houver
n pessoas e
m possíveis aniversários. Tendo
n,m , podemos determinar a probabilidade de duas pessoas terem um aniversário em comum?
Você pode usar o mesmo sistema: teremos um resultado
An denotando tudo
n pessoas nascidas em dias diferentes. No caso de uma pessoa, nada muda
Pr[A1]=1
No caso de duas pessoas, designamo-las como A e B. Para a pessoa B nascer em outro dia, a pessoa B deve ter um aniversário entre
m−1 outras opções.
Pr[A2]= fracm−1m
No caso de três pessoas, a pessoa B deve ter um aniversário diferente do aniversário de A. A pessoa C deve ter um dia diferente dos aniversários de A e B.
Pr[A3]= fracm−1m times fracm−2m
Geralmente para qualquer
n podemos usar a mesma fórmula recursiva que na seção anterior:
Pr[An]= Pr[An−1] times fracm−(n−1)m
Suponha que, se queremos encontrar uma expressão de forma fechada para
Pr[An] , então decompomos a expressão
exibição $$ $$ \ begin {equação *} \ begin {split} \ Pr [A_n] & = \ Pr [A_ {n-1}] \ times \ frac {m - (n-1)} {m} \ \ & = \ Pr [A_ {n-2}] \ times \ frac {m - (n-2)} {m} \ times \ frac {m - (n-1)} {m} \\ & = \ Pr [A_ {n-3}] \ times \ frac {m - (n-3)} {m} \ times \ frac {m - (n-2)} {m} \ times \ frac {m - (n -1)} {m} \\ & \ \ vdots \\ & = \ Pr [A_2] \ times \ frac {m-2} {m} \ times \ frac {m-3} {m} \ times \ cdots \ times \ frac {m - (n-3)} {m} \ times \ frac {m - (n-2)} {m} \ times \ frac {m - (n-1)} {m} \\ & = \ prod_ {i = 1} ^ {n-1} \ frac {mi} {m} = \ prod_ {i = 1} ^ {n-1} 1 - \ frac {i} {m} \\ & \ approx \ prod_ {i = 1} ^ {n-1} e ^ {\ frac {-i} {m}} \ text {usando a identidade} 1 - x \ approx e ^ {- x} \\ & = e ^ {- \ sum_ {i = 1} ^ {n-1} \ frac {i} {m}} \\ & = e ^ {\ frac {-n (n-1)} {2m}} \ aprox e ^ {\ frac {-n ^ 2} {2m}} \ end {split} \ end {equação *} $$ display $$
Uma aproximação deste resultado é
Pr[An] approxe frac−n22m . Embora possamos encontrar limites mais aproximados, isso nos dá uma aproximação suficiente. A única identidade que usamos nesta aproximação:
1−x approxe−x
Em sua forma abstrata, o paradoxo do aniversário tem muitos usos na computação. Em particular, é usado no hash, que por si só tem muitos usos. As conclusões feitas nesta tarefa são fundamentais para analisar a probabilidade de fazer o hash de dois elementos em uma chave. Esse problema pode ser generalizado para o problema probabilístico de bolas e bacias (problema de bolas e caixotes), que deixaremos para outro post.
Aplicação
O paradoxo do aniversário não é apenas uma tarefa artificial ou um truque interessante, tem muitas aplicações no mundo real. Pessoalmente, acredito que a análise probabilística usada na evidência é útil na análise de outras tarefas nas quais a randomização está envolvida. Em particular, isso se refere ao desenvolvimento de funções hash criptográficas. Veremos como a análise feita acima pode ser bastante útil na criação de funções de hash com proteção contra ataques de "aniversários".
Primeiro, vamos definir o que é uma função hash. Função hash
h:U rightarrow[0,m−1] É uma função que executa um mapeamento de um conjunto
U em um número no intervalo
[0,m−1] . Função
h definido como
h(x)=x modm - função hash de exemplo de
mathbbN rightarrow[0,m−1] . As funções de hash têm muitos usos, especialmente em combinação com a estrutura de dados da tabela de hash popular. Também é usado em criptografia, onde é usado um tipo específico de função hash denominada "função hash criptográfica".
Uma das muitas propriedades que uma função hash criptográfica deve ter é a resistência à colisão. Deve ser difícil encontrar dois desses
u1,u2 emU para que eles colidam, ou seja,
h(u1)=h(u2) .
É sobre a resistência a colisões que focaremos. Primeiro, explicarei por que é uma propriedade desejável. Para fazer isso, primeiro consideraremos as assinaturas digitais.
No passado, pessoas e organizações usavam assinaturas e selos para "assinar" documentos. Recentemente, houve uma transição para assinaturas eletrônicas ou digitais. Uma assinatura digital deve satisfazer três propriedades básicas.
- Ao assinar um documento, você precisa verificar quem assinou o documento.
- Depois de assinar o documento, ninguém poderá falsificá-lo.
- A pessoa que assinou o documento não pode posteriormente refutar a assinatura do documento.
Uma assinatura digital é uma maneira de verificar comprovadamente a verdade de um documento ou mensagem. Uma assinatura digital garante que a mensagem recebida foi criada por um remetente conhecido e não alterada.
Digamos que temos um documento
m . Como assinamos?
Cada usuário / organização possui uma chave privada exclusiva
pk e chave pública
pubk . Eles usam a função de assinatura para assinar um documento com sua própria chave privada. No entanto, uma assinatura digital pode assinar apenas um pequeno número de documentos. O escopo da função de assinatura é pequeno. Uma maneira de resolver esse problema é criar um documento menor que represente o documento original, mas em um tamanho muito menor. Na maioria das vezes, uma função de hash é aplicada a este documento grande. Uma função de hash é usada para mapeá-la de um espaço grande para outro menor, e o resultado dessa operação é chamado de "impressão digital". A assinatura usa a impressão digital e a chave privada para criar a assinatura. O procedimento pode ser descrito da seguinte maneira:
- Obter a chave privada pk .
- Hash de um documento m e consiga h(m) .
- Assinar h(m) usando a chave privada pk .
- Nós enviamos
e chave pública pubk quem quiser confirmar o documento.
Quem tem

chave pública, pode verificar se o documento é realmente
m assinado pela pessoa certa.
Problema: suponha que o invasor Eva encontrou dois documentos
m,m′ onde
m - este é o presente contrato, e
m′ - um documento fraudulento que
h(m)=h(m′) . Suponha que Eva saiba com antecedência que Alice só assinará
m mas não
m′ . Antes de assinar, uma função de hash criptográfico é aplicada ao documento
h . Eve vai até Alice e pede que ela assine um documento
m usando a sequência descrita acima. Agora, Eve pode alegar que Alice assinou um documento fraudulento
m′ porque
h(m)=h(m′) . Alice não poderá provar de forma alguma que não assinou
m′ .
No exemplo acima
h acabou por ser uma função resistente a colisões, portanto, Eve conseguiu encontrar dois conjuntos de dados recebidos com o mesmo valor. Eve foi capaz de afirmar que Alice assinou
m′ embora de fato ela tenha assinado apenas
m . Isso enfatiza a importância da resistência à colisão e mostra por que as assinaturas digitais são vulneráveis se a função hash é instável.
Vamos
h:U rightarrow[0,m−1] será uma função de hash. Suponha que os dados de entrada sejam distribuídos aleatoriamente de maneira uniforme e independente em qualquer um dos elementos
m .
A tarefa do ataque de "aniversário" é encontrar o menor número de elementos
n que pode ser misturado com
h para que possamos encontrar dois elementos
x,y emU em que
h(x)=h(y) .
Ao atacar "aniversários", o atacante pega aleatoriamente
x emU e manter casais
(x,h(x)) . Um atacante seleciona e salva repetidamente esses pares até encontrar dois valores
x,y em que
h(x)=h(y) . Precisamos determinar quantas vezes o atacante precisa repetir essa operação até encontrar uma colisão.
Para analisar o ataque de "aniversários", você pode usar os mesmos princípios que usamos para o paradoxo do aniversário. No ataque "aniversários"
m denota o número de dias em um ano e
U semelhante a pessoas que entram em uma sala. As pessoas fazem hash nos aniversários, o que pode ser um dos significados.
m . Digamos que precisamos encontrar uma colisão com uma probabilidade de 99%. Precisamos saber qual é o menor
n , em que o hash de dois valores será um aniversário (no mundo das funções de hash, isso significa que dois conjuntos de dados de entrada são divididos em hash no mesmo valor).
Mostramos anteriormente que
Pr[An] approxe frac−n22mNós queremos perguntar
Pr[ overlineAn] approxe frac−n22m= frac99100 isso é
Pr[An] approxe frac−n22m= frac1100 .
exibição $$ $$ \ begin {equação *} \ begin {split} e ^ {\ frac {-n ^ 2} {2m}} & = \ frac {1} {100} \\ \ frac {n ^ 2} {2m} & = \ ln 100 \\ n ^ 2 & = 2 m \ ln 100 \\ n & = \ sqrt {2 m \ ln 100} \ end {split} \ end {equação *} $$ display $$
A análise mostrada acima nos diz que para obter colisões em funções hash com um intervalo de tamanho
m um invasor precisa fazer o hash de maneira uniforme e independente, aproximadamente
sqrt2m ln100=O( sqrtm) para uma garantia quase completa (probabilidade de 99%) de que dois elementos são hash no mesmo valor.
Suponha que desejemos obter uma colisão com uma probabilidade de 50%; então precisamos
n= sqrt2m ln2 . A conclusão importante aqui é que, para obter uma colisão com uma probabilidade superior a 0,5, precisamos fazer o hash da ordem
sqrtm elementos. Isso é consistente com nossa análise anterior para
m=365 porque
sqrt2 ln2 cdot365 aproximadamente igual a 23.
Tarefas adicionais
- Tendo n de pessoas m dias e um certo número k encontre a probabilidade de que exatamente k as pessoas têm o mesmo aniversário.
- Vamos transformar um pouco a tarefa acima. Digamos que temos m dias e um certo número k . Qual será o menor valor n em que não menos k as pessoas terão o mesmo aniversário com uma probabilidade de pelo menos 0,5? Você pode generalizar esta tarefa com qualquer probabilidade p>0 ?
- Suponha que temos 100 números de 1 a 100, bem como uma máquina que adivinha um número aleatório de 1 a 100 em uma ordem uniforme e aleatória. Quantas vezes precisaremos usar a máquina conforme o esperado, para que ela adivinhe todos os números de 1 a 100?
- Você pode generalizar esta tarefa para qualquer n ?
- Suponha que tenhamos uma função hash que exibe aleatoriamente uniformemente elementos em uma região de memória. Deixe áreas totais m . Quantos itens n precisamos adicionar expectativa matemática à nossa estrutura de dados para que pelo menos dois elementos sejam divididos em hash em cada região?