J'ai déjà posé une question sur la façon de calculer une probabilité rapidement et avec précision. Cependant, c'était évidemment trop facile car une solution sous forme fermée a été donnée! Voici une version plus difficile.
Cette tâche consiste à écrire du code pour calculer une probabilité exactement et rapidement . La sortie doit être une probabilité précise écrite sous forme de fraction dans sa forme la plus réduite. C'est-à-dire qu'il ne devrait jamais sortir 4/8mais plutôt 1/2.
Pour un entier positif n, considérez une chaîne uniformément aléatoire de 1 et -1 de longueur net appelez-la A. Maintenant, concaténez à Aune copie d'elle-même. C'est A[1] = A[n+1]si l'indexation à partir de 1, A[2] = A[n+2]et ainsi de suite. Aa maintenant une longueur 2n. Considérons maintenant également une deuxième chaîne aléatoire de longueur ndont les premières nvaleurs sont -1, 0 ou 1 avec probabilité 1 / 4,1 / 2, 1/4 chacune et appelons-la B.
Considérez maintenant le produit intérieur de Bavec A[1+j,...,n+j]pour différent j =0,1,2,....
Par exemple, réfléchissez n=3. Les valeurs possibles pour Aet Bpourraient être A = [-1,1,1,-1,...]et B=[0,1,-1]. Dans ce cas, les deux premiers produits intérieurs sont 0et 2.
Tâche
Pour chacun j, en commençant par j=1, votre code devrait afficher la probabilité que tous les premiers j+1produits internes soient nuls pour tous n=j,...,50.
En copiant le tableau produit par Martin Büttner pour j=1nous avons les exemples de résultats suivants.
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
But
Votre score est le plus élevé que jvotre code complète en 1 minute sur mon ordinateur. Pour clarifier un peu, chacun jobtient une minute. Notez que le code de programmation dynamique de la question liée précédente le fera facilement j=1.
Tie break
Si deux entrées obtiennent le même jscore, l'entrée gagnante sera celle qui atteint le plus haut nen une minute sur ma machine pour cela j. Si les deux meilleures entrées sont également égales sur ce critère, le gagnant sera la réponse soumise en premier.
Langues et bibliothèques
Vous pouvez utiliser n'importe quelle langue et bibliothèque librement disponibles. Je dois être en mesure d'exécuter votre code, veuillez donc inclure une explication complète sur la façon d'exécuter / compiler votre code sous Linux si possible.
Ma machine Les horaires seront exécutés sur ma machine. Il s'agit d'une installation ubuntu standard sur un processeur AMD FX-8350 à huit cœurs. Cela signifie également que je dois pouvoir exécuter votre code.
Entrées gagnantes
j=2en Python par Mitch Schwartz.j=2en Python par feersum. Actuellement l'entrée la plus rapide.