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/8ma piuttosto 1/2.
Per alcuni numeri interi positivi n, considera una stringa uniformemente casuale di 1 e -1 secondi di lunghezza ne chiamala A. Ora concatena Auna copia di se stessa. Cioè A[1] = A[n+1]se l'indicizzazione da 1 A[2] = A[n+2]e così via. Aora ha lunghezza 2n. Ora considera anche una seconda stringa casuale di lunghezza i ncui primi nvalori sono -1, 0 o 1 con probabilità 1 / 4,1 / 2, 1/4 ciascuno e chiamalo B.
Ora considera il prodotto interno di Bwith A[1+j,...,n+j]for different j =0,1,2,....
Ad esempio, considera n=3. I valori possibili per Ae Bpotrebbero essere A = [-1,1,1,-1,...]e B=[0,1,-1]. In questo caso i primi due prodotti interni sono 0e 2.
Compito
Per ciascuno j, a partire da j=1, il codice dovrebbe generare la probabilità che tutti i primi j+1prodotti interni siano zero per ciascuno n=j,...,50.
Copiando la tabella prodotta da Martin Büttner per j=1abbiamo 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 jtuo codice completa in 1 minuto sul mio computer. Per chiarire un po ', ognuno ha jun 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 jpunteggio, quella vincente sarà quella che raggiungerà il massimo nin 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=2in Python di Mitch Schwartz.j=2in Python di feersum. Attualmente la voce più veloce.