A tarefa é calcular o OEIS A005434 o mais rápido possível.
Considere uma cadeia S
de comprimento binária n
. Indexando de 1
, podemos determinar se S[1..i+1]
corresponde S[n-i..n]
exatamente a todos i
na ordem de 0
até n-1
. Por exemplo,
S = 01010
dá
[Y, N, Y, N, Y].
Isso ocorre porque 0
combina 0
, 01
não combina 10
, 010
combina 010
, 0101
não combina 1010
e finalmente 01010
combina com si próprio.
Define f(n)
-se o número de matrizes distintas de Y
s e N
s que se tem quando iteração sobre todas as 2^n
sequências de bits diferentes possíveis S
de comprimento n
.
O observador notará que esta questão é uma variante mais simples de outra questão recente minha . No entanto, espero que truques inteligentes possam tornar isso muito mais rápido e fácil.
Tarefa
Para aumentar a n
partir de 1
, seu código deve ser exibido n, f(n)
.
Respostas de exemplo
Pois n = 1..24
, as respostas corretas são:
1, 2, 3, 4, 6, 8, 10, 13, 17, 21, 27, 30, 37, 47, 57, 62, 75, 87, 102, 116, 135, 155, 180, 194
Pontuação
Seu código deve repetir n = 1
a resposta de cada um n
. Eu cronometrarei a corrida inteira, matando-a depois de dois minutos.
Sua pontuação é a mais alta que n
você obtém nesse período.
Em caso de empate, a primeira resposta vence.
Onde meu código será testado?
Executarei seu código no Virtualbox em uma VM convidada do Lubuntu (no meu host do Windows 7).
Meu laptop possui 8 GB de RAM e uma CPU Intel i7 [email protected] GHz (Broadwell) com 2 núcleos e 4 threads. O conjunto de instruções inclui SSE4.2, AVX, AVX2, FMA3 e TSX.
Entradas principais por idioma
- n = 599 em Rust bu Anders Kaseorg.
- n = 30 em C por Grimy. A versão paralela chega a 32 quando é executada nativamente no cygwin.
Respostas:
Ferrugem , n ° 660
Experimente online!
Como funciona
Esta é uma implementação memorizada do predicado recursivo Ξ dado em Leo Guibas, “Períodos em cadeias” (1981). A função
f(memo, n, p, s)
encontra o número de correlações de comprimenton
com o menor períodop
e também cada um dos períodos do conjuntos
.fonte
Apenas uma pesquisa simples de força bruta, para iniciar o desafio:
Compile com
clang -fopenmp -Weverything -O3 -march=native
. Na minha máquina, atinge n = 34 em 2 minutos.EDIT: espalhou algumas diretivas do OMP para facilitar o paralelismo.
fonte