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.