La tarea es calcular OEIS A005434 lo más rápido posible.
Considere una cadena binaria Sde longitud n. Indexando desde 1, podemos determinar si S[1..i+1]coincide S[n-i..n]exactamente para todos ien orden de 0a n-1. Por ejemplo,
S = 01010
da
[Y, N, Y, N, Y].
Esto se debe a que 0coincide 0, 01no coincide 10, 010coincide 010, 0101no coincide 1010 y finalmente 01010coincide a sí mismo.
Definir f(n)a ser el número de matrices distintas de Ys y Ns se obtiene cuando se itera sobre todas las 2^ndiferentes cadenas de bits posibles Sde 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 npartir 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 = 1dar la respuesta para cada uno npor turno. Tomaré el tiempo de toda la carrera, matándola después de dos minutos.
Tu puntaje es el más alto nque 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 longitudncon el período más pequeñopy 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