Zadaniem jest jak najszybsze obliczenie OEIS A005434 .
Rozważ ciąg binarny S
o długości n
. Indeksując od 1
, możemy ustalić, czy dokładnie S[1..i+1]
pasuje S[n-i..n]
do wszystkich i
w kolejności od 0
do n-1
. Na przykład,
S = 01010
daje
[Y, N, Y, N, Y].
Jest tak, ponieważ 0
dopasowuje 0
, 01
nie pasuje 10
, 010
dopasowuje 010
, 0101
nie pasuje 1010
i ostatecznie 01010
dopasowuje się do siebie.
Zdefiniuj f(n)
liczbę odrębnych tablic Y
s i N
s, które otrzymujesz podczas iteracji wszystkich 2^n
różnych możliwych ciągów bitów S
długości n
.
Spostrzegający zauważy, że to pytanie jest prostszym wariantem innego mojego ostatniego pytania . Oczekuję jednak, że sprytne sztuczki mogą to uczynić o wiele szybszym i łatwiejszym.
Zadanie
Aby zwiększyć, n
zaczynając od 1
, twój kod powinien wypisywać n, f(n)
.
Przykładowe odpowiedzi
Dla n = 1..24
, poprawne odpowiedzi są:
1, 2, 3, 4, 6, 8, 10, 13, 17, 21, 27, 30, 37, 47, 57, 62, 75, 87, 102, 116, 135, 155, 180, 194
Punktacja
Twój kod powinien powtarzać się od n = 1
udzielenia odpowiedzi po n
kolei. Poświęcę czas na cały bieg, zabijając go po dwóch minutach.
Twój wynik jest najwyższy n
w tym czasie.
W przypadku remisu pierwsza odpowiedź wygrywa.
Gdzie będzie testowany mój kod?
Uruchomię twój kod pod Virtualbox na maszynie wirtualnej gościa Lubuntu (na moim hoście Windows 7).
Mój laptop ma 8 GB pamięci RAM i procesor Intel i7 [email protected] GHz (Broadwell) z 2 rdzeniami i 4 wątkami. Zestaw instrukcji obejmuje SSE4.2, AVX, AVX2, FMA3 i TSX.
Wiodące wpisy według języka
- n = 599 w Rust bu Anders Kaseorg.
- n = 30 w C według Grimy'ego. Wersja równoległa osiąga 32, gdy działa natywnie w cygwin.
Odpowiedzi:
Rdza , ≈ 660
Wypróbuj online!
Jak to działa
Jest to zapamiętana implementacja rekurencyjnego predykatu Ξ podanego przez Leo Guibasa, „Periods in strings” (1981). Funkcja
f(memo, n, p, s)
wyszukuje liczbę korelacji długościn
z najmniejszym okresem,p
a także każdy z okresów w zbiorzes
.źródło
Wystarczy proste wyszukiwanie z użyciem siły, aby rozpocząć wyzwanie:
Kompiluj z
clang -fopenmp -Weverything -O3 -march=native
. Na mojej maszynie osiąga n = 34 w ciągu 2 minut.EDYCJA: posypałem niektóre dyrektywy OMP dla łatwego równoległości.
źródło