Задача состоит в том, чтобы как можно быстрее вычислить OEIS A005434 .
Рассмотрим двоичную строку S
длины n
. Индексируя с 1
, мы можем определить, S[1..i+1]
совпадают ли S[n-i..n]
точно для всех i
в порядке от 0
до n-1
. Например,
S = 01010
дает
[Y, N, Y, N, Y].
Это потому , что 0
совпадает 0
, 01
не совпадает 10
, 010
совпадает 010
, 0101
не совпадает 1010
и, наконец, 01010
соответствует самому себе.
Определите f(n)
количество различных массивов Y
s и N
s, получаемых при переборе всех 2^n
возможных битовых строк S
длины n
.
Наблюдатель заметит, что этот вопрос - более простой вариант другого моего недавнего вопроса . Тем не менее, я ожидаю, что умные трюки могут сделать это намного быстрее и проще.
задача
Для увеличения, n
начиная с 1
, ваш код должен выводить n, f(n)
.
Пример ответов
Для n = 1..24
, правильные ответы:
1, 2, 3, 4, 6, 8, 10, 13, 17, 21, 27, 30, 37, 47, 57, 62, 75, 87, 102, 116, 135, 155, 180, 194
счет
Ваш код должен повторяться от n = 1
предоставления ответа для каждого n
по очереди. Я рассчитываю весь пробег, убив его через две минуты.
Ваш результат - самый высокий n
за это время.
В случае ничьей победит первый ответ.
Где будет проверяться мой код?
Я буду запускать ваш код в Virtualbox на гостевой виртуальной машине Lubuntu (на моем хосте Windows 7).
Мой ноутбук имеет 8 ГБ оперативной памяти и процессор Intel i7 5600U @ 2,6 ГГц (Broadwell) с 2 ядрами и 4 потоками. Набор команд включает SSE4.2, AVX, AVX2, FMA3 и TSX.
Ведущие записи по языку
- п = 599 в Руст бу Андерс Касерорг.
- n = 30 в С по Грими. Параллельная версия получает до 32 при запуске в Cygwin.
Ответы:
Ржавчина , n ≈ 660
Попробуйте онлайн!
Как это работает
Это запоминающаяся реализация рекурсивного предиката Ξ, приведенного в книге Лео Гибаса «Периоды в строках» (1981). Функция
f(memo, n, p, s)
находит количество корреляций длиныn
с наименьшим периодом,p
а также каждый из периодов в набореs
.источник
Просто простой перебор, чтобы начать испытание:
Компилировать с
clang -fopenmp -Weverything -O3 -march=native
. На моей машине он достигает n = 34 за 2 минуты.РЕДАКТИРОВАТЬ: посыпать некоторые директивы OMP для легкого параллелизма.
источник