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/8
mas sim 1/2
.
Para um número inteiro positivo n
, considere uma sequência uniformemente aleatória de 1s e -1s de comprimento n
e chame-a de A. Agora concatene A
uma 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. A
agora tem comprimento 2n
. Agora considere também uma segunda sequência aleatória de comprimento n
cujos primeiros n
valores 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 B
com A[1+j,...,n+j]
para diferente j =0,1,2,...
.
Por exemplo, considere n=3
. Valores possíveis para A
e B
poderiam ser A = [-1,1,1,-1,...]
e B=[0,1,-1]
. Nesse caso, os dois primeiros produtos internos são 0
e 2
.
Tarefa
Para cada um j
, começando com j=1
, seu código deve gerar a probabilidade de que todos os primeiros j+1
produtos internos sejam zero para todos n=j,...,50
.
Copiando a tabela produzida por Martin Büttner para j=1
os 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 j
seu código é concluído em 1 minuto no meu computador. Para esclarecer um pouco, cada j
um 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 j
pontuação, a entrada vencedora será a que atingir a maior pontuação n
em 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=2
em Python por Mitch Schwartz.j=2
em Python por feersum. Atualmente, a entrada mais rápida.