Jump to content

последовательность де Брейна

(Перенаправлено из сцен Де Брейна )
Последовательность де Брейна для размера алфавита k = 2 и длины подстроки n = 2 . Вообще существует множество последовательностей для конкретных n и k, но в данном примере они уникальны, с точностью до цикличности.

В комбинаторной математике последовательность де Брейна порядка n размера k в алфавите A представляет собой циклическую последовательность , в которой каждая возможная длины n строка в A встречается ровно один раз как подстрока (т. е. как непрерывная подпоследовательность ). Такая последовательность обозначается B ( k , n ) и имеет длину k н , что также является количеством различных строк длины n в A . Каждая из этих отдельных строк, взятая как подстрока B ( k , n ) , должна начинаться с другой позиции, поскольку подстроки, начинающиеся с одной и той же позиции, не различны. Следовательно, B ( k , n ) должно иметь не менее k н символы. А поскольку B ( k , n ) имеет ровно k н символов, последовательности де Брейна оптимально коротки с точки зрения свойства содержать каждую строку длины n хотя бы один раз.

Число различных последовательностей де Брейна B ( k , n ) равно

Последовательности названы в честь голландского математика Николааса Говерта де Брейна , написавшего о них в 1946 году. [1] Как он позже писал, [2] существование последовательностей де Брейна для каждого порядка вместе с указанными выше свойствами было впервые доказано для случая алфавитов с двумя элементами Камиллой Флай Сент-Мари ( 1894 ). Обобщение на более крупные алфавиты принадлежит Татьяне ван Аарденн-Эренфест и де Брюйну ( 1951 ). Автоматы , распознающие эти последовательности, называются автоматами де Брейна.

В большинстве приложений A = {0,1}.

Самый ранний известный пример последовательности де Брёйна взят из санскритской просодии , где, начиная с работы Пингалы , каждому возможному трехсложному образцу длинных и коротких слогов дается имя, например «y» для короткого-долгого-долгого и «y». м' долго-долго-долго. Чтобы запомнить эти имена, используется мнемоника яматараджабханасалагам , в которой каждая трехсложная модель начинается с ее имени: «ямата» имеет образец «короткий-длинный-длинный», «матара» имеет образец «длинный-длинный-длинный», и так дальше, пока не произойдет «салагам», который имеет структуру «короткий-короткий-длинный». Эта мнемоника, эквивалентная последовательности де Брейна на двоичных тройках, имеет неизвестную древность, но по крайней мере так же стара, как книга Чарльза Филипа Брауна по санскритской просодии 1869 года, в которой она упоминается и считается «древней строкой, написанной Панини ». [3]

В 1894 году А. де Ривьер в номере французского проблемного журнала L'Intermédiaire des Mathématiciens поднял вопрос о существовании кругового расположения нулей и единиц размера который содержит все двоичные последовательности длины . Задача была решена (положительно) вместе с подсчетом отдельные решения Камиллы Флай Сент-Мари в том же году. [2] Об этом в значительной степени забыли, и Мартин (1934) доказал существование таких циклов для общего размера алфавита вместо 2 с алгоритмом их построения. Наконец, когда в 1944 году Кес Постумус предположил, что счет для двоичных последовательностей де Брейн доказал эту гипотезу в 1946 году, благодаря чему проблема стала широко известна. [2]

Карл Поппер независимо описывает эти объекты в своей «Логике научных открытий» (1934), называя их «кратчайшими случайными последовательностями». [4]

  • Если взять A = {0, 1}, то получится два различных числа B (2, 3): 00010111 и 11101000, одно из которых является обратным или отрицанием другого.
  • Две из 16 возможных букв B (2, 4) в одном алфавите — это 0000100110101111 и 0000111101100101.
  • Две из 2048 возможных букв B (2, 5) в одном алфавите — это 00000100011001010011101011011111 и 00000101001000111110111001101011.

Строительство

[ редактировать ]
Граф де Брёйна. Каждая четырехзначная последовательность встречается ровно один раз, если пройти каждое ребро ровно один раз и вернуться в исходную точку (эйлеров цикл). Каждая трехзначная последовательность встречается ровно один раз, если каждую вершину посещают ровно один раз (гамильтонов путь).

взяв гамильтонов путь n Последовательности де Брейна можно построить , -мерного графа де Брейна над k символами (или, что то же самое, эйлеров цикл ( n - 1)-мерного графа де Брейна). [5]

Альтернативная конструкция предполагает объединение в лексикографическом порядке всех слов Линдона , длина которых делит n . [6]

Обратное преобразование Берроуза – Уиллера можно использовать для генерации необходимых слов Линдона в лексикографическом порядке. [7]

Последовательности де Брейна также можно построить с использованием сдвиговых регистров. [8] или через конечные поля . [9]

Пример использования графа де Брёйна

[ редактировать ]
Ориентированные графы двух B (2,3) последовательностей де Брейна и B (2,4) последовательности. В B (2,3) каждая вершина посещается один раз, тогда как в B (2,4) каждое ребро проходится один раз.

Цель: построить B (2, 4) последовательность де Брейна длины 2. 4 = 16 с использованием эйлерова ( n - 1 = 4 - 1 = 3) трехмерного цикла графа де Брейна.

Каждое ребро в этом трехмерном графе де Брёйна соответствует последовательности из четырех цифр: три цифры, обозначающие вершину, из которой выходит ребро, за которыми следует цифра, обозначающая ребро. Если пройти ребро, помеченное 1, от 000, то мы придем к 001, тем самым указывая на наличие подпоследовательности 0001 в последовательности де Брёйна. Чтобы пройти каждое ребро ровно один раз, нужно использовать каждую из 16 четырехзначных последовательностей ровно один раз.

Например, предположим, что мы следуем по следующему эйлерову пути через эти вершины:

000, 000, 001, 011, 111, 111, 110, 101, 011,
110, 100, 001, 010, 101, 010, 100, 000.

Это выходные последовательности длины k :

0 0 0 0
_ 0 0 0 1
_ _ 0 0 1 1

Это соответствует следующей последовательности де Брейна:

0 0 0 0 1 1 1 1 0 1 1 0 0 1 0 1

Восемь вершин появляются в последовательности следующим образом:

      {0  0  0  0} 1  1  1  1  0  1  1  0  0  1  0  1       0 {0  0  0  1} 1  1  1  0  1  1  0  0  1  0  1       0  0 {0  0  1  1} 1  1  0  1  1  0  0  1  0  1       0  0  0 {0  1  1  1} 1  0  1  1  0  0  1  0  1       0  0  0  0 {1  1  1  1} 0  1  1  0  0  1  0  1       0  0  0  0  1 {1  1  1  0} 1  1  0  0  1  0  1       0  0  0  0  1  1 {1  1  0  1} 1  0  0  1  0  1       0  0  0  0  1  1  1 {1  0  1  1} 0  0  1  0  1       0  0  0  0  1  1  1  1 {0  1  1  0} 0  1  0  1       0  0  0  0  1  1  1  1  0 {1  1  0  0} 1  0  1       0  0  0  0  1  1  1  1  0  1 {1  0  0  1} 0  1       0  0  0  0  1  1  1  1  0  1  1 {0  0  1  0} 1       0  0  0  0  1  1  1  1  0  1  1  0 {0  1  0  1}       0} 0  0  0  1  1  1  1  0  1  1  0  0 {1  0  1 ...   ... 0  0} 0  0  1  1  1  1  0  1  1  0  0  1 {0  1 ...   ... 0  0  0} 0  1  1  1  1  0  1  1  0  0  1  0 {1 ...

...и затем мы возвращаемся в исходную точку. Каждая из восьми трехзначных последовательностей (соответствующих восьми вершинам) появляется ровно два раза, а каждая из шестнадцати четырехзначных последовательностей (соответствующих 16 ребрам) появляется ровно один раз.

Пример использования обратного преобразования Берроуза — Уиллера

[ редактировать ]

Математически обратное преобразование Берроуза-Уиллера для слова w генерирует мультимножество классов эквивалентности, состоящее из строк и их вращений. [7] Каждый из этих классов эквивалентности строк содержит слово Линдона в качестве уникального минимального элемента, поэтому можно считать, что обратное преобразование Берроуза-Уиллера генерирует набор слов Линдона. Можно показать, что если мы выполним обратное преобразование Берроуза-Уиллера для слова w, состоящего из алфавита размера k, повторяющегося k п -1 раз (так что получится слово той же длины, что и желаемая последовательность де Брёйна), то результатом будет набор всех слов Линдона, длина которых делит n . Отсюда следует, что расположение этих слов Линдона в лексикографическом порядке даст последовательность де Брейна B ( k , n ), и что это будет первая последовательность де Брейна в лексикографическом порядке. Следующий метод можно использовать для выполнения обратного преобразования Берроуза-Уиллера с использованием его стандартной перестановки :

  1. Отсортируйте символы в строке w , получив новую строку w
  2. Поместите строку w над строкой w и сопоставьте положение каждой буквы в w с ее позицией в w , сохраняя порядок. Этот процесс определяет стандартную перестановку .
  3. Запишите эту перестановку в обозначениях циклов, начиная с наименьшей позиции в каждом цикле, а циклы отсортируйте в порядке возрастания.
  4. Для каждого цикла замените каждое число соответствующей буквой из строки w в этой позиции.
  5. Каждый цикл теперь стал словом Линдона, и они расположены в лексикографическом порядке, поэтому после удаления скобок получается первая последовательность де Брейна.

Например, чтобы построить наименьшую B (2,4) последовательность де Брейна длины 2 4 = 16, повторите алфавит (ab) 8 раз, получив w =ababababababab . Отсортируйте символы в w , получив w =aaaaaaaabbbbbbb . Расположите w над w, как показано, и сопоставьте каждый элемент w соответствующему элементу w , нарисовав линию. Пронумеруйте столбцы, как показано, чтобы мы могли прочитать циклы перестановки:

Начиная слева, циклы обозначений стандартной перестановки: (1) (2 3 5 9) (4 7 13 10) (6 11) (8 15 14 12) (16) . ( Стандартная перестановка )

Затем замена каждого числа соответствующей буквой в w из этого столбца дает: (a)(aaab)(aabb)(ab)(abbb)(b) .

Это все слова Линдона, длина которых делится на 4 в лексикографическом порядке, поэтому удаление скобок дает B (2,4) = aaaabaabbababbbb .

Алгоритм

[ редактировать ]

Следующий код Python вычисляет последовательность де Брёйна по заданным k и n на основе алгоритма из Фрэнка Раски » «Комбинаторной генерации . [10]

from typing import Iterable, Union, Anydef de_bruijn(k: Union[Iterable[str], int], n: int) -> str:    """de Bruijn sequence for alphabet k    and subsequences of length n.    """    # Two kinds of alphabet input: an integer expands    # to a list of integers as the alphabet..    if isinstance(k, int):        alphabet = list(map(str, range(k)))    else:        # While any sort of list becomes used as it is        alphabet = k        k = len(k)    a = [0] * k * n    sequence = []    def db(t, p):        if t > n:            if n % p == 0:                sequence.extend(a[1 : p + 1])        else:            a[t] = a[t - p]            db(t + 1, p)            for j in range(a[t - p] + 1, k):                a[t] = j                db(t + 1, t)    db(1, 1)    return "".join(alphabet[i] for i in sequence)print(de_bruijn(2, 3))print(de_bruijn("abcd", 2))

который печатает

00010111aabacadbbcbdccdd

Обратите внимание, что эти последовательности считаются «зацикливающимися» в цикле. Например, первая последовательность таким образом содержит 110 и 100.

Использование

[ редактировать ]

Циклы де Брейна широко используются в нейробиологических и психологических экспериментах, изучающих влияние порядка стимулов на нервные системы. [11] и может быть специально разработан для использования с функциональной магнитно-резонансной томографией . [12]

Обнаружение угла

[ редактировать ]

Символы последовательности де Брейна, написанные вокруг круглого объекта (например, колеса робота ) , можно использовать для определения его угла , исследуя n последовательных символов, обращенных к фиксированной точке. Эта проблема кодирования угла известна как «проблема вращающегося барабана». [13] Коды Грея могут использоваться в качестве аналогичных механизмов поворотного позиционного кодирования - метод, обычно встречающийся в поворотных энкодерах .

Поиск наименее или наиболее значимого бита в слове

[ редактировать ]

Последовательность де Брюйна можно использовать для быстрого поиска индекса младшего бита набора («самая правая 1») или самого старшего бита набора («самая левая 1») в слове с использованием поразрядных операций и умножения. [14] В следующем примере используется последовательность де Брейна для определения индекса младшего значащего установленного бита (эквивалентно подсчету количества конечных нулевых битов) в 32-битном беззнаковом целом числе:

uint8_t lowestBitIndex(uint32_t v){         static const uint8_t BitPositionLookup[32] = // hash table  {    0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,     31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9  };  return BitPositionLookup[((uint32_t)((v & -v) * 0x077CB531U)) >> 27];}

The lowestBitIndex() Функция возвращает индекс младшего установленного бита в v или ноль, если v не имеет установленных битов. Константа 0x077CB531U в выражении представляет собой последовательность B (2, 5) 0000 0111 0111 1100 1011 0101 0011 0001 (пробелы добавлены для ясности). Операция (v & -v) обнуляет все биты, кроме набора наименее значащих битов, в результате чего получается новое значение, которое представляет собой степень 2. Эта степень 2 умножается (арифметика по модулю 2 32 ) с помощью последовательности де Брейна, создавая таким образом 32-битное произведение, в котором битовая последовательность 5 старших битов уникальна для каждой степени двойки. 5 старших битов сдвигаются в позиции младших битов для создания хэш-кода в диапазоне [0 , 31], который затем используется как индекс в хэш-таблице BitPositionLookup. Выбранное значение хэш-таблицы представляет собой битовый индекс наименее значимого установленного бита в v .

В следующем примере определяется индекс старшего бита, установленного в 32-битном беззнаковом целом:

uint32_t keepHighestBit(uint32_t n){    n |= (n >>  1);    n |= (n >>  2);    n |= (n >>  4);    n |= (n >>  8);    n |= (n >> 16);    return n - (n >> 1);}uint8_t highestBitIndex(uint32_t v){    static const uint8_t BitPositionLookup[32] = { // hash table         0,  1, 16,  2, 29, 17,  3, 22, 30, 20, 18, 11, 13,  4,  7, 23,        31, 15, 28, 21, 19, 10, 12,  6, 14, 27,  9,  5, 26,  8, 25, 24,    };    return BitPositionLookup[(keepHighestBit(v) * 0x06EB14F9U) >> 27];}

В приведенном выше примере используется альтернативная последовательность де Брейна (0x06EB14F9U) с соответствующим переупорядочением значений массива. Выбор этой конкретной последовательности де Брейна произволен, но значения хеш-таблицы должны быть упорядочены так, чтобы соответствовать выбранной последовательности де Брейна. keepHighestBit() Функция обнуляет все биты, кроме самого старшего установленного бита, в результате чего получается значение, равное степени 2, которое затем обрабатывается, как в предыдущем примере.

Атаки грубой силы на замки

[ редактировать ]
Одна возможная последовательность B (10, 4). Подстроки 2530 читаются сверху вниз, затем слева направо, и их цифры объединяются. Чтобы получить строку для взлома кодового замка, добавляются последние три цифры в скобках (000). Связана 10003 цифра составляет «0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0011 ... 79 7988 7989 7998 7999 8 8889 8899 89 8999 9 000» (пространства для читаемости).

Последовательность де Брейна можно использовать для сокращения грубой атаки на PIN -кодовый замок, который не имеет клавиши «ввода» и принимает последние введенные n цифр. Например, цифровой дверной замок с 4-значным кодом (каждая цифра имеет 10 вариантов, от 0 до 9) будет иметь решения B (10, 4) длиной 10 000 . Следовательно, для открытия замка необходимо не более 10 000 + 3 = 10 003 (поскольку решения циклические) нажатий, тогда как для проверки всех кодов по отдельности потребуется 4 × 10 000 = 40 000 нажатий.

Упрощенный принцип работы цифровой ручки Anoto.
Камера определяет матрицу точек размером 6×6, каждая из которых смещена от синей сетки (не напечатана) в одном из 4 направлений.
Комбинации относительных смещений 6-битной последовательности де Брейна между столбцами и между строками дают ее абсолютное положение на цифровой бумаге.

f-кратные последовательности де Брейна

[ редактировать ]

f -кратная n-арная последовательность де Брейна является расширением понятия n -арной последовательности де Брейна, так что последовательность длины содержит все возможные подпоследовательности длины n ровно f раз. Например, для циклические последовательности 11100010 и 11101000 представляют собой двукратные двоичные последовательности де Брейна. Число двукратных последовательностей де Брейна, для является , другие известные числа [16] являются , , и .

тор де Брёйна

[ редактировать ]
STL- модель тора де Брейна (16,32;3,3) 2 с единицами в виде панелей и нулями в виде отверстий в сетке - при последовательной ориентации каждая матрица 3×3 появляется ровно один раз.

Тор де Брёйна свойство которого состоит в том, что каждая k -арная матрица m -n — это тороидальный массив , встречается ровно один раз.

Такой шаблон можно использовать для двумерного позиционного кодирования способом, аналогичным описанному выше для ротационного кодирования. Положение можно определить, исследуя матрицу m - n , непосредственно примыкающую к датчику, и вычисляя ее положение на торе де Брёйна.

расшифровка де Брёйна

[ редактировать ]

Вычисление позиции конкретного уникального кортежа или матрицы в последовательности или торе де Брейна известно как проблема декодирования де Брейна . Эффективно алгоритмы декодирования существуют для специальных рекурсивно построенных последовательностей. [17] и распространяется на двумерный случай. [18] Декодирование де Брейна представляет интерес, например, в тех случаях, когда для позиционного кодирования используются большие последовательности или торы.

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ де Брейн (1946) .
  2. ^ Перейти обратно: а б с де Брейн (1975) .
  3. ^ Браун (1869) ; Штейн (1963) ; Как (2000) ; Кнут (2006) ; Холл (2008) .
  4. ^ Поппер (2002) .
  5. ^ Кляйн (2013) .
  6. ^ Согласно Berstel & Perrin (2007) , последовательность, сгенерированная таким способом, была впервые описана (с другим методом генерации) Мартином (1934) , а связь между ней и словами Линдона наблюдалась Фредриксеном и Майораной (1978) .
  7. ^ Перейти обратно: а б Хиггинс (2012) .
  8. ^ Горески и Клэппер (2012) .
  9. ^ Ралстон (1982) , стр. 136–139.
  10. ^ «Последовательности Де Брейна» . Мудрец . Проверено 7 марта 2023 г.
  11. ^ Агирре, Маттар и Магис-Вайнберг (2011) .
  12. ^ «генератор циклов де Брёйна» . Архивировано из оригинала 26 января 2016 г. Проверено 15 сентября 2015 г.
  13. ^ ван Линт и Уилсон (2001) .
  14. ^ Андерсон (1997–2009) ; Буш (2009)
  15. ^ «последовательность де Брёйна (DeBruijn) (K=10, n=3)» .
  16. ^ Osipov (2016) .
  17. ^ Тулиани (2001) .
  18. ^ Херлберт и Исаак (1993) .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 7e00c10cf2346357d6b7dc4dc398583f__1711326000
URL1:https://arc.ask3.ru/arc/aa/7e/3f/7e00c10cf2346357d6b7dc4dc398583f.html
Заголовок, (Title) документа по адресу, URL1:
de Bruijn sequence - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)