Anteriormente hice una pregunta sobre cómo calcular una probabilidad de forma rápida y precisa. Sin embargo, evidentemente fue demasiado fácil ya que se le dio una solución de forma cerrada. Aquí hay una versión más difícil.
Esta tarea consiste en escribir código para calcular una probabilidad de manera exacta y rápida . El resultado debe ser una probabilidad precisa escrita como una fracción en su forma más reducida. Es decir, nunca debería salir, 4/8
sino más bien 1/2
.
Para algún número entero positivo n
, considere una cadena uniformemente aleatoria de 1s y -1s de longitud n
y llámela A. Ahora concatene a A
una copia de sí mismo. Eso es A[1] = A[n+1]
si indexa desde 1, A[2] = A[n+2]
y así sucesivamente. A
Ahora tiene longitud 2n
. Ahora también considere una segunda cadena aleatoria de longitud n
cuyos primeros n
valores son -1, 0 o 1 con probabilidad 1 / 4,1 / 2, 1/4 cada uno y llámelo B.
Ahora considere el producto interno de B
con A[1+j,...,n+j]
para diferente j =0,1,2,...
.
Por ejemplo, considere n=3
. Los posibles valores de A
y B
podrían ser A = [-1,1,1,-1,...]
y B=[0,1,-1]
. En este caso, los dos primeros productos internos son 0
y 2
.
Tarea
Para cada uno j
, comenzando j=1
, su código debería generar la probabilidad de que todos los primeros j+1
productos internos sean cero para cada uno n=j,...,50
.
Copiando la tabla producida por Martin Büttner para obtener j=1
los siguientes resultados de muestra.
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
Puntuación
Su puntaje es el más grande que j
su código completa en 1 minuto en mi computadora. Para aclarar un poco, cada j
uno tiene un minuto. Tenga en cuenta que el código de programación dinámica en la pregunta vinculada anterior lo hará fácilmente j=1
.
Desempate
Si dos entradas obtienen el mismo j
puntaje, la entrada ganadora será la que obtenga la mayor puntuación n
en un minuto en mi máquina para eso j
. Si las dos mejores entradas son iguales en este criterio también, entonces el ganador será la respuesta presentada primero.
Idiomas y bibliotecas
Puede utilizar cualquier idioma y bibliotecas disponibles gratuitamente que desee. Debo poder ejecutar su código, así que incluya una explicación completa sobre cómo ejecutar / compilar su código en Linux si es posible.
Mi máquina Los tiempos se ejecutarán en mi máquina. Esta es una instalación estándar de ubuntu en un procesador AMD FX-8350 de ocho núcleos. Esto también significa que necesito poder ejecutar su código.
Entradas ganadoras
j=2
en Python por Mitch Schwartz.j=2
en Python por feersum. Actualmente la entrada más rápida.