In precedenza avevo posto una domanda su come calcolare una probabilità in modo rapido e preciso. Tuttavia, evidentemente è stato troppo facile dato che è stata data una soluzione a forma chiusa! Ecco una versione più difficile.
Questa attività riguarda la scrittura di codice per calcolare una probabilità esattamente e rapidamente . L'output dovrebbe essere una probabilità precisa scritta come una frazione nella sua forma più ridotta. Cioè non dovrebbe mai essere prodotto 4/8
ma piuttosto 1/2
.
Per alcuni numeri interi positivi n
, considera una stringa uniformemente casuale di 1 e -1 secondi di lunghezza n
e chiamala A. Ora concatena A
una copia di se stessa. Cioè A[1] = A[n+1]
se l'indicizzazione da 1 A[2] = A[n+2]
e così via. A
ora ha lunghezza 2n
. Ora considera anche una seconda stringa casuale di lunghezza i n
cui primi n
valori sono -1, 0 o 1 con probabilità 1 / 4,1 / 2, 1/4 ciascuno e chiamalo B.
Ora considera il prodotto interno di B
with A[1+j,...,n+j]
for different j =0,1,2,...
.
Ad esempio, considera n=3
. I valori possibili per A
e B
potrebbero essere A = [-1,1,1,-1,...]
e B=[0,1,-1]
. In questo caso i primi due prodotti interni sono 0
e 2
.
Compito
Per ciascuno j
, a partire da j=1
, il codice dovrebbe generare la probabilità che tutti i primi j+1
prodotti interni siano zero per ciascuno n=j,...,50
.
Copiando la tabella prodotta da Martin Büttner per j=1
abbiamo i seguenti risultati di esempio.
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
Punto
Il tuo punteggio è il più grande che il j
tuo codice completa in 1 minuto sul mio computer. Per chiarire un po ', ognuno ha j
un minuto. Si noti che il codice di programmazione dinamica nella domanda collegata precedente lo farà facilmente per j=1
.
Tie breaker
Se due voci ottengono lo stesso j
punteggio, quella vincente sarà quella che raggiungerà il massimo n
in un minuto sulla mia macchina per quello j
. Se anche le due migliori iscrizioni sono uguali su questo criterio, il vincitore sarà la risposta inviata per prima.
Lingue e biblioteche
Puoi usare qualsiasi linguaggio e librerie liberamente disponibili che ti piacciono. Devo essere in grado di eseguire il tuo codice, quindi per favore includi una spiegazione completa su come eseguire / compilare il tuo codice in Linux, se possibile.
La mia macchina I tempi verranno eseguiti sulla mia macchina. Questa è un'installazione ubuntu standard su un processore a otto core AMD FX-8350. Questo significa anche che devo essere in grado di eseguire il tuo codice.
Voci vincenti
j=2
in Python di Mitch Schwartz.j=2
in Python di feersum. Attualmente la voce più veloce.