Die Aufgabe besteht darin, OEIS A005434 so schnell wie möglich zu berechnen .
Betrachten Sie eine binäre Zeichenfolge mit S
einer Länge n
. Indizierung von 1
, können wir bestimmen, ob S[1..i+1]
Übereinstimmungen S[n-i..n]
genau für alle i
in der Reihenfolge von 0
bis übereinstimmen n-1
. Zum Beispiel,
S = 01010
gibt
[Y, N, Y, N, Y].
Dies liegt daran, dass 0
Übereinstimmungen 0
, 01
nicht übereinstimmen 10
, 010
übereinstimmen 010
, 0101
nicht übereinstimmen 1010
und schließlich 01010
selbst übereinstimmen.
Definieren Sie f(n)
die Anzahl der unterschiedlichen Arrays von Y
s und N
s, die Sie erhalten, wenn Sie über alle 2^n
möglichen Bitfolgen S
der Länge iterieren n
.
Der Beobachter wird feststellen, dass diese Frage eine einfachere Variante einer anderen meiner jüngsten Fragen ist . Ich gehe jedoch davon aus, dass clevere Tricks dies viel schneller und einfacher machen können.
Aufgabe
Zum Erhöhen n
ab 1
sollte Ihr Code ausgegeben werden n, f(n)
.
Beispielantworten
Denn n = 1..24
die richtigen Antworten sind:
1, 2, 3, 4, 6, 8, 10, 13, 17, 21, 27, 30, 37, 47, 57, 62, 75, 87, 102, 116, 135, 155, 180, 194
Wertung
Ihr Code sollte sich wiederholen, wenn Sie nacheinander n = 1
die Antwort geben n
. Ich werde den gesamten Lauf zeitlich festlegen und ihn nach zwei Minuten beenden.
Ihre Punktzahl ist die höchste, die n
Sie in dieser Zeit erreichen.
Bei einem Unentschieden gewinnt die erste Antwort.
Wo wird mein Code getestet?
Ich werde Ihren Code unter Virtualbox in einer Lubuntu- Gast-VM (auf meinem Windows 7-Host) ausführen .
Mein Laptop verfügt über 8 GB RAM und eine Intel i7 [email protected] GHz (Broadwell) CPU mit 2 Kernen und 4 Threads. Der Befehlssatz enthält SSE4.2, AVX, AVX2, FMA3 und TSX.
Führende Einträge pro Sprache
- n = 599 in Rust bu Anders Kaseorg.
- n = 30 in C von Grimy. Die parallele Version erreicht 32, wenn sie nativ in Cygwin ausgeführt wird.
Antworten:
Rust , n ≈ 660
Probieren Sie es online aus!
Wie es funktioniert
Dies ist eine auswendig gelernte Implementierung des rekursiven Prädikats Ξ, das in Leo Guibas, „Perioden in Strings“ (1981) angegeben ist. Die Funktion ermittelt
f(memo, n, p, s)
die Anzahl der Längenkorrelationenn
mit der kleinsten Periodep
und auch jede der Perioden in der Menges
.quelle
Nur eine einfache Brute-Force-Suche, um die Herausforderung zu starten:
Kompilieren mit
clang -fopenmp -Weverything -O3 -march=native
. Auf meiner Maschine erreicht es in 2 Minuten n = 34.BEARBEITEN: Einige OMP-Anweisungen wurden für eine einfache Parallelität gestreut.
quelle