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.
źródło
Odpowiedzi:
Python 2, j = 2
Próbowałem znaleźć rodzaj „zamkniętej formy” dla j = 2. Być może mógłbym zrobić z niego obraz MathJax, chociaż byłoby to naprawdę brzydkie z tym całym indeksowaniem. Napisałem ten niezoptymalizowany kod tylko w celu przetestowania formuły. Wykonanie zajmuje około 1 sekundy. Wyniki są zgodne z kodem Mitcha Schwartza.
Rozważ sekwencję, w której ósmym elementem jest,
e
jeśli A [i] == A [i + 1] lubn
jeśli A [i]! = A [i + 1].i
w programie jest liczban
s. Jeślii
jest parzyste, sekwencja musi zaczynać się i kończyć nae
. Jeślii
jest nieparzyste, sekwencja musi zaczynać się i kończyć nan
. Sekwencje są dalej klasyfikowane według liczby przebiegów kolejnyche
s lubn
s. Jestj
+ 1 jednego ij
drugiego.Gdy błądzenia losowego pomysł zostanie przedłużony do 3 wymiarach, jest niefortunne problem, że są 4 możliwe kierunki chodzić (po jednym dla każdego
ee
,en
,ne
, lubnn
), co oznacza, że nie są liniowo zależne. Tak więck
indeks sumuje się przez liczbę kroków wykonanych w jednym z kierunków (1, 1, 1). Następnie będzie dokładna liczba kroków, które należy wykonać w pozostałych 3 kierunkach, aby go anulować.P (n, p) podaje liczbę uporządkowanych partycji n obiektów na części p. W (l, d) podaje liczbę sposobów losowego przejścia
l
kroków na pokonanie odległości dokładnied
. Tak jak poprzednio, istnieje 1 szansa na ruch w lewo, 1 szansa na ruch w prawo i 2 na utrzymanie pozycji.źródło
j=3
. To by było wspaniałe!Python, j = 2
Podejście do programowania dynamicznego
j = 1
w mojej odpowiedzi na poprzednie pytanie nie wymaga wielu modyfikacji, aby pracować na wyższym poziomiej
, ale szybko zwalnia. Tabela w celach informacyjnych:I kod:
Tutaj jesteśmy śledzenie dwóch pierwszych elementów
A
, dwa ostatnie elementyB
(gdzieb2
jest ostatni element) i wewnętrzne produkty(A[:n], B)
,(A[1:n], B[:-1])
oraz(A[2:n], B[:-2])
.źródło