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/8sino más bien 1/2.
Para algún número entero positivo n, considere una cadena uniformemente aleatoria de 1s y -1s de longitud ny llámela A. Ahora concatene a Auna copia de sí mismo. Eso es A[1] = A[n+1]si indexa desde 1, A[2] = A[n+2]y así sucesivamente. AAhora tiene longitud 2n. Ahora también considere una segunda cadena aleatoria de longitud ncuyos primeros nvalores 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 Bcon A[1+j,...,n+j]para diferente j =0,1,2,....
Por ejemplo, considere n=3. Los posibles valores de Ay Bpodrían ser A = [-1,1,1,-1,...]y B=[0,1,-1]. En este caso, los dos primeros productos internos son 0y 2.
Tarea
Para cada uno j, comenzando j=1, su código debería generar la probabilidad de que todos los primeros j+1productos internos sean cero para cada uno n=j,...,50.
Copiando la tabla producida por Martin Büttner para obtener j=1los 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 jsu código completa en 1 minuto en mi computadora. Para aclarar un poco, cada juno 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 jpuntaje, la entrada ganadora será la que obtenga la mayor puntuación nen 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=2en Python por Mitch Schwartz.j=2en Python por feersum. Actualmente la entrada más rápida.