La tâche consiste à calculer OEIS A005434 le plus rapidement possible.
Considérons une chaîne binaire S
de longueur n
. L'indexation de 1
, nous pouvons déterminer si S[1..i+1]
correspond S[n-i..n]
exactement à tous i
dans l'ordre de 0
à n-1
. Par exemple,
S = 01010
donne
[Y, N, Y, N, Y].
En effet, 0
correspond 0
, 01
ne correspond pas 10
, 010
correspond 010
, 0101
ne correspond pas 1010
et correspond finalement à 01010
lui-même.
Définissez f(n)
comme le nombre de tableaux distincts de Y
s et N
s que l'on obtient lors de l'itération sur toutes les 2^n
différentes chaînes S
de bits possibles de longueur n
.
L'observateur remarquera que cette question est une variante plus simple d' une autre question récente . Cependant, je m'attends à ce que des astuces intelligentes puissent rendre cela beaucoup plus rapide et plus facile.
Tâche
Pour augmenter à n
partir de 1
, votre code devrait sortir n, f(n)
.
Exemples de réponses
Pour n = 1..24
, les bonnes réponses sont:
1, 2, 3, 4, 6, 8, 10, 13, 17, 21, 27, 30, 37, 47, 57, 62, 75, 87, 102, 116, 135, 155, 180, 194
Notation
Votre code doit répéter n = 1
la réponse de chacun n
à son tour. Je chronométrerai la course entière, en la tuant après deux minutes.
Votre score est le plus élevé que n
vous ayez atteint pendant cette période.
En cas d'égalité, la première réponse l'emporte.
Où mon code sera-t-il testé?
Je vais exécuter votre code sous Virtualbox dans une machine virtuelle invitée Lubuntu (sur mon hôte Windows 7).
Mon ordinateur portable a 8 Go de RAM et un processeur Intel i7 5600U@2,6 GHz (Broadwell) avec 2 cœurs et 4 threads. Le jeu d'instructions comprend SSE4.2, AVX, AVX2, FMA3 et TSX.
Entrées principales par langue
- n = 599 à Rust bu Anders Kaseorg.
- n = 30 en C par Grimy. La version parallèle passe à 32 lorsqu'elle est exécutée en natif dans cygwin.
Réponses:
Rouille , n ≈ 660
Essayez-le en ligne!
Comment ça fonctionne
Il s'agit d'une implémentation mémorisée du prédicat récursif Ξ donné dans Leo Guibas, «Periods in strings» (1981). La fonction
f(memo, n, p, s)
trouve le nombre de corrélations de longueurn
avec la plus petite périodep
et également chacune des périodes de l'ensembles
.la source
Juste une simple recherche par force brute, pour lancer le défi:
Compilez avec
clang -fopenmp -Weverything -O3 -march=native
. Sur ma machine, il atteint n = 34 en 2 minutes.EDIT: saupoudré quelques directives OMP pour un parallélisme facile.
la source