Wcześniej zadałem pytanie, jak szybko i dokładnie obliczyć prawdopodobieństwo. Jednak najwyraźniej było to zbyt łatwe, ponieważ podano rozwiązanie w formie zamkniętej! Oto trudniejsza wersja.
To zadanie dotyczy pisania kodu w celu dokładnego i szybkiego obliczenia prawdopodobieństwa . Wynik powinien być precyzyjnym prawdopodobieństwem zapisanym jako ułamek w najbardziej zredukowanej formie. Oznacza to, że nigdy nie powinien generować, 4/8
ale raczej 1/2
.
Dla pewnej dodatniej liczby całkowitej n
rozważ jednolicie losowy ciąg 1s i -1s długości n
i nazwij ją A. Teraz połącz się A
z kopią samego siebie. To znaczy, A[1] = A[n+1]
jeśli indeksowanie od 1 A[2] = A[n+2]
i tak dalej. A
teraz ma długość 2n
. Teraz rozważ także drugi losowy ciąg długości, n
którego pierwsze n
wartości to -1, 0 lub 1 z prawdopodobieństwem 1 / 4,1 / 2, 1/4 każdy i nazwij go B.
Teraz rozważ wewnętrzny produkt B
z A[1+j,...,n+j]
dla różnych j =0,1,2,...
.
Rozważmy na przykład n=3
. Możliwe wartości A
i B
mogą być A = [-1,1,1,-1,...]
i B=[0,1,-1]
. W tym przypadku pierwsze dwa produkty wewnętrzne to 0
i 2
.
Zadanie
Dla każdego j
, zaczynając od j=1
, twój kod powinien wyświetlać prawdopodobieństwo, że wszystkie pierwsze j+1
wewnętrzne produkty są zerowe dla każdego n=j,...,50
.
Kopiując tabelę wyprodukowaną przez Martina Büttnera j=1
, mamy następujące przykładowe wyniki.
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
Wynik
Twój wynik jest najwyższy, jaki j
Twój kod wypełnia w ciągu 1 minuty na moim komputerze. Aby wyjaśnić trochę, każda j
dostaje jedną minutę. Zauważ, że kod programowania dynamicznego w poprzednim połączonym pytaniu zrobi to łatwo j=1
.
Łamacz krawatów
Jeśli dwa zgłoszenia otrzymają ten sam j
wynik, zwycięskim wejściem będzie ten, który osiągnie najwyższą wartość n
w ciągu jednej minuty na mojej maszynie j
. Jeśli dwa najlepsze zgłoszenia są równe również w tym kryterium, zwycięzcą będzie odpowiedź przesłana jako pierwsza.
Języki i biblioteki
Możesz korzystać z dowolnego darmowego języka i bibliotek, które ci się podobają. Muszę być w stanie uruchomić Twój kod, więc proszę podać pełne wyjaśnienie, jak uruchomić / skompilować kod w systemie Linux, jeśli to w ogóle możliwe.
Moja maszyna Czasy zostaną uruchomione na moim komputerze. Jest to standardowa instalacja ubuntu na ośmiordzeniowym procesorze AMD FX-8350. Oznacza to również, że muszę być w stanie uruchomić Twój kod.
Zwycięskie zgłoszenia
j=2
w Pythonie autor: Mitch Schwartz.j=2
w Python przez feersum. Obecnie najszybszy wpis.