Eu já fiz uma pergunta sobre como calcular uma probabilidade com rapidez e precisão. No entanto, evidentemente, foi muito fácil, pois foi fornecida uma solução de formulário fechado! Aqui está uma versão mais difícil.
Esta tarefa é sobre escrever código para calcular uma probabilidade exata e rapidamente . A saída deve ser uma probabilidade precisa escrita como uma fração em sua forma mais reduzida. Ou seja, nunca deve produzir, 4/8mas sim 1/2.
Para um número inteiro positivo n, considere uma sequência uniformemente aleatória de 1s e -1s de comprimento ne chame-a de A. Agora concatene Auma cópia de si mesma. Ou seja, A[1] = A[n+1]se estiver indexando a partir de 1, A[2] = A[n+2]e assim por diante. Aagora tem comprimento 2n. Agora considere também uma segunda sequência aleatória de comprimento ncujos primeiros nvalores sejam -1, 0 ou 1 com probabilidade 1 / 4,1 / 2, 1/4 cada e chame-a de B.
Agora considere o produto interno de Bcom A[1+j,...,n+j]para diferente j =0,1,2,....
Por exemplo, considere n=3. Valores possíveis para Ae Bpoderiam ser A = [-1,1,1,-1,...]e B=[0,1,-1]. Nesse caso, os dois primeiros produtos internos são 0e 2.
Tarefa
Para cada um j, começando com j=1, seu código deve gerar a probabilidade de que todos os primeiros j+1produtos internos sejam zero para todos n=j,...,50.
Copiando a tabela produzida por Martin Büttner para j=1os seguintes resultados de amostra.
n P(n)
1 1/2
2 3/8
3 7/32
4 89/512
5 269/2048
6 903/8192
7 3035/32768
8 169801/2097152
Ponto
Sua pontuação é a maior que jseu código é concluído em 1 minuto no meu computador. Para esclarecer um pouco, cada jum recebe um minuto. Observe que o código de programação dinâmica na pergunta vinculada anterior fará isso facilmente j=1.
Desempate
Se duas entradas obtiverem a mesma jpontuação, a entrada vencedora será a que atingir a maior pontuação nem um minuto na minha máquina j. Se as duas melhores entradas também forem iguais nesse critério, o vencedor será a resposta enviada primeiro.
Línguas e bibliotecas
Você pode usar qualquer idioma e bibliotecas disponíveis gratuitamente que desejar. Devo ser capaz de executar seu código, portanto, inclua uma explicação completa de como executar / compilar seu código no Linux, se possível.
Minha máquina Os horários serão executados na minha máquina. Esta é uma instalação padrão do ubuntu em um processador AMD FX-8350 de oito núcleos. Isso também significa que eu preciso poder executar seu código.
Entradas vencedoras
j=2em Python por Mitch Schwartz.j=2em Python por feersum. Atualmente, a entrada mais rápida.