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.
fonte
Respostas:
Python 2, j = 2
Tentei encontrar uma espécie de 'formulário fechado' para j = 2. Talvez eu pudesse criar uma imagem do MathJax, embora fosse realmente feio com todo o manuseio do índice. Eu escrevi esse código não otimizado apenas para testar a fórmula. Demora cerca de 1 segundo para concluir. Os resultados correspondem ao código de Mitch Schwartz.
Considere uma sequência em que o i-ésimo membro é
e
se A [i] == A [i + 1] oun
se A [i]! = A [i + 1].i
no programa é o número den
s. Sei
for par, a sequência deve começar e terminar come
. Sei
for ímpar, a sequência deve começar e terminar comn
. As sequências são ainda classificadas pelo número de execuções dee
s ou s consecutivosn
. Existemj
+ 1 de um ej
do outro.Quando a ideia passeio aleatório é estendido a 3 dimensões, não é um problema lamentável que existem 4 possíveis direcções para andarem (um para cada uma das
ee
,en
,ne
, ornn
) o que significa que não são linearmente dependente. Portanto, ok
índice soma o número de etapas executadas em uma das direções (1, 1, 1). Depois, haverá um número exato de etapas que devem ser seguidas nas outras três direções para cancelá-lo.P (n, p) fornece o número de partições ordenadas de n objetos em p partes. W (l, d) fornece o número de maneiras para uma caminhada aleatória de
l
etapas percorrer uma distância exatad
. Como antes, há 1 chance de se mover para a esquerda, 1 chance de se mover para a direita e 2 para permanecer parado.fonte
j=3
. Isso seria incrível!Python, j = 2
A abordagem de programação dinâmica,
j = 1
na minha resposta à pergunta anterior, não precisa de muitas modificações para funcionar mais altoj
, mas fica lenta rapidamente. Tabela para referência:E o código:
Aqui nós estamos mantendo o controle dos dois primeiros elementos
A
, os dois últimos elementosB
(ondeb2
é o último elemento), e os produtos internos de(A[:n], B)
,(A[1:n], B[:-1])
e(A[2:n], B[:-2])
.fonte