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/8ale raczej 1/2.
Dla pewnej dodatniej liczby całkowitej nrozważ jednolicie losowy ciąg 1s i -1s długości ni nazwij ją A. Teraz połącz się Az kopią samego siebie. To znaczy, A[1] = A[n+1]jeśli indeksowanie od 1 A[2] = A[n+2]i tak dalej. Ateraz ma długość 2n. Teraz rozważ także drugi losowy ciąg długości, nktórego pierwsze nwartoś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 Bz A[1+j,...,n+j]dla różnych j =0,1,2,....
Rozważmy na przykład n=3. Możliwe wartości Ai Bmogą być A = [-1,1,1,-1,...]i B=[0,1,-1]. W tym przypadku pierwsze dwa produkty wewnętrzne to 0i 2.
Zadanie
Dla każdego j, zaczynając od j=1, twój kod powinien wyświetlać prawdopodobieństwo, że wszystkie pierwsze j+1wewnę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 jTwój kod wypełnia w ciągu 1 minuty na moim komputerze. Aby wyjaśnić trochę, każda jdostaje 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 jwynik, zwycięskim wejściem będzie ten, który osiągnie najwyższą wartość nw 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=2w Pythonie autor: Mitch Schwartz.j=2w Python przez feersum. Obecnie najszybszy wpis.