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/8
mais plutôt 1/2
.
Pour un entier positif n
, considérez une chaîne uniformément aléatoire de 1 et -1 de longueur n
et appelez-la A. Maintenant, concaténez à A
une 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. A
a maintenant une longueur 2n
. Considérons maintenant également une deuxième chaîne aléatoire de longueur n
dont les premières n
valeurs 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 B
avec A[1+j,...,n+j]
pour différent j =0,1,2,...
.
Par exemple, réfléchissez n=3
. Les valeurs possibles pour A
et B
pourraient être A = [-1,1,1,-1,...]
et B=[0,1,-1]
. Dans ce cas, les deux premiers produits intérieurs sont 0
et 2
.
Tâche
Pour chacun j
, en commençant par j=1
, votre code devrait afficher la probabilité que tous les premiers j+1
produits internes soient nuls pour tous n=j,...,50
.
En copiant le tableau produit par Martin Büttner pour j=1
nous 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 j
votre code complète en 1 minute sur mon ordinateur. Pour clarifier un peu, chacun j
obtient 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 j
score, l'entrée gagnante sera celle qui atteint le plus haut n
en 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=2
en Python par Mitch Schwartz.j=2
en Python par feersum. Actuellement l'entrée la plus rapide.