Ich habe zuvor eine Frage gestellt, wie man eine Wahrscheinlichkeit schnell und genau berechnet. Offensichtlich war es jedoch zu einfach, da eine Lösung in geschlossener Form gegeben wurde! Hier ist eine schwierigere Version.
Bei dieser Aufgabe geht es darum, Code zu schreiben, um eine Wahrscheinlichkeit genau und schnell zu berechnen . Die Ausgabe sollte eine genaue Wahrscheinlichkeit sein, die als Bruch in ihrer am meisten reduzierten Form geschrieben wird. Das heißt, es sollte nie ausgegeben werden 4/8, sondern 1/2.
nBetrachten Sie für eine positive Ganzzahl eine gleichmäßig zufällige Zeichenfolge mit einer Länge von 1s und -1s nund nennen Sie sie A. Verknüpfen Sie sie jetzt mit Aeiner Kopie von sich selbst. Das ist, A[1] = A[n+1]wenn von 1 indiziert wird, A[2] = A[n+2]und so weiter. Ahat jetzt länge 2n. Nun auch eine zweite zufällige Zeichenfolge der Länge betrachten , nderen erste nWerte -1, 0 oder 1 , mit einer Wahrscheinlichkeit von 1 / 4,1 / 2, 1/4 und jedes nennen es B.
Betrachten Sie nun das innere Produkt von Bmit A[1+j,...,n+j]für anders j =0,1,2,....
Betrachten Sie zum Beispiel n=3. Mögliche Werte für Aund Bkönnten A = [-1,1,1,-1,...]und sein B=[0,1,-1]. In diesem Fall sind die ersten beiden inneren Produkte 0und 2.
Aufgabe
Für jeden j, beginnend mit j=1, Code sollte eine Ausgabe , die Wahrscheinlichkeit , dass alle die ersten j+1inneren Produkte sind Null für jeden n=j,...,50.
Wenn Sie die von Martin Büttner erstellte Tabelle kopieren j=1, erhalten Sie die folgenden Beispielergebnisse.
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
Ergebnis
Ihre Punktzahl ist die größte, die jIhr Code in 1 Minute auf meinem Computer erreicht. Zur Verdeutlichung jerhält jeder eine Minute. Beachten Sie, dass der dynamische Programmiercode in der vorherigen verknüpften Frage dies problemlos erledigt j=1.
Tie Breaker
Wenn zwei Einträge die gleiche jPunktzahl erhalten, ist der Gewinner derjenige, der nin einer Minute auf meinem Computer den höchsten Wert erreicht j. Wenn die beiden besten Beiträge auch nach diesem Kriterium gleich sind, ist der Gewinner die zuerst eingereichte Antwort.
Sprachen und Bibliotheken
Sie können jede frei verfügbare Sprache und Bibliothek verwenden, die Sie mögen. Ich muss in der Lage sein, Ihren Code auszuführen. Bitte geben Sie eine vollständige Erklärung an, wie Sie Ihren Code unter Linux ausführen / kompilieren können, wenn dies überhaupt möglich ist.
Meine Maschine Die Timings werden auf meiner Maschine ausgeführt. Dies ist eine Standard-Ubuntu-Installation auf einem AMD FX-8350 Eight-Core-Prozessor. Dies bedeutet auch, dass ich Ihren Code ausführen kann.
Gewinnerbeiträge
j=2in Python von Mitch Schwartz.j=2in Python von feersum. Derzeit der schnellste Eintrag.