La tarea es calcular OEIS A005434 lo más rápido posible.
Considere una cadena binaria S
de longitud n
. Indexando desde 1
, podemos determinar si S[1..i+1]
coincide S[n-i..n]
exactamente para todos i
en orden de 0
a n-1
. Por ejemplo,
S = 01010
da
[Y, N, Y, N, Y].
Esto se debe a que 0
coincide 0
, 01
no coincide 10
, 010
coincide 010
, 0101
no coincide 1010
y finalmente 01010
coincide a sí mismo.
Definir f(n)
a ser el número de matrices distintas de Y
s y N
s se obtiene cuando se itera sobre todas las 2^n
diferentes cadenas de bits posibles S
de longitud n
.
El observador notará que esta pregunta es una variante más simple de otra pregunta reciente mía . Sin embargo, espero que los trucos inteligentes puedan hacer esto mucho más rápido y fácil.
Tarea
Para aumentar a n
partir de 1
, su código debería salir n, f(n)
.
Ejemplo de respuestas
Para n = 1..24
, las respuestas correctas son:
1, 2, 3, 4, 6, 8, 10, 13, 17, 21, 27, 30, 37, 47, 57, 62, 75, 87, 102, 116, 135, 155, 180, 194
Puntuación
Su código debe iterar desde n = 1
dar la respuesta para cada uno n
por turno. Tomaré el tiempo de toda la carrera, matándola después de dos minutos.
Tu puntaje es el más alto n
que alcanzas en ese momento.
En caso de empate, la primera respuesta gana.
¿Dónde se probará mi código?
Ejecutaré su código en Virtualbox en una máquina virtual invitada de Lubuntu (en mi host de Windows 7).
Mi computadora portátil tiene 8GB de RAM y una CPU Intel i7 [email protected] GHz (Broadwell) con 2 núcleos y 4 hilos. El conjunto de instrucciones incluye SSE4.2, AVX, AVX2, FMA3 y TSX.
Entradas principales por idioma
- n = 599 en Rust bu Anders Kaseorg.
- n = 30 en C por Grimy. La versión paralela llega a 32 cuando se ejecuta de forma nativa en cygwin.
Respuestas:
Óxido , n ≈ 660
Pruébalo en línea!
Cómo funciona
Esta es una implementación memorable del predicado recursivo Ξ dado en Leo Guibas, "Períodos en cadenas" (1981). La función
f(memo, n, p, s)
encuentra el número de correlaciones de longitudn
con el período más pequeñop
y también cada uno de los períodos del conjuntos
.fuente
Solo una simple búsqueda de fuerza bruta, para comenzar el desafío:
Compilar con
clang -fopenmp -Weverything -O3 -march=native
. En mi máquina alcanza n = 34 en 2 minutos.EDITAR: roció algunas directivas OMP para facilitar el paralelismo.
fuente