Алгоритм четырёх русских

Алгоритм четырёх русских — в информатике представляет собой метод ускорения алгоритмов с использованием булевых матриц или, в более общем смысле, алгоритмов с использованием матриц, в которых каждая ячейка может принимать только ограниченное число возможных значений.

Разработанный комбинаторный алгоритм позволяет умножать матрицы за . С некоторыми изменениями можно получить время работы . В 2015 году был получен алгоритм, работающий за .[1]

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

Применение

править

Алгоритмы, к которым может быть применен метод четырех русских:

В каждом из этих случаев это ускоряет алгоритм в   или   раз.

Опубликованный Бардом алгоритм инверсии матрицы «Метод четырёх русских» реализован в библиотеке M4RI для быстрой арифметики с плотными матрицами над F2. M4RI используется SageMath и библиотекой PolyBoRi.[1]

Алгоритм умножения булевых матриц

править

Описание алгоритма

править

Алгоритм получает на вход две булевы матрицы     и   и возвращает матрицу  .

Пусть  .

Разобьём   на матрицы  , где  , состоит из столбцов матрицы   с номерами от   до  , а   — из оставшихся столбцов, к которым добавлены столбцы нулей, если это нужно, чтобы в матрице было   столбцов.

Разобьём   на матрицы  , где  , состоит из строк матрицы   с номерами от   до  , а   — из оставшихся строк, к которым добавлены строки нулей, если это нужно, чтобы в матрице было   строк.

Псевдокод

править

begin

  for   to   do

  begin

    comment Вычисляем суммы строк   матрицы  ;

    СУММАСТРОК[ ]  

    for   to   do

    begin

      Пусть   таково, что  

      СУММАСТРОК[ ] СУММАСТРОК[ ] 

    end

    Пусть   — матрица,  i-я строка которой равна СУММАСТРОК[ЧИС( )],

    где   — j-я строка матрицы  ,  ,

  end;

  Пусть  

end.[2]

ЧИС(v) — целое число, представленное двоичным вектором v, записанным в двоичной системе счисления с обратным порядком разрядов. Например, ЧИС([0,1,1])=6.

Обоснование корректности

править

Простая индукция по   показывает, что СУММАСТРОК[ ] становится равной поразрядной булевой сумме таких строк   матрицы  , что в двоичном представлении числа   на  -том месте справа стоит 1. Отсюда вытекает, что   и  .

Время работы

править

Рассмотрим цикл по  . Вычисление и присваивание значений СУММАСТРОК[ ] происходит за  . Вычисление   занимает время  . Итерация цикла выполняется за  , всего   итераций.  ,  , следовательно весь цикл выполнится за  .

Вычисление ЧИС( ) имеет сложность  , а копирование вектора СУММАСТРОК[ЧИС( )] — сложность  , так что инициализация   выполняется за  . Итого, цикл по   выполняется за  . Всего   итераций.  , следовательно сложность цикла —  .

Сумма   вычисляется за  .

Итоговая сложность алгоритма —  .

История

править

Алгоритм был введён В. Л. Арлазаровым, Е. А. Диницем, М. А. Кронродом и И. А. Фараджевым в 1970 году. Происхождение названия неизвестно; Ахо, Хопкрофт и Ульман (1974) объясняют:

Второй метод, часто называемый алгоритмом «четырёх русских», в честь его изобретателей, в какой-то мере «практичнее» алгоритма в теореме 6.9.[2]

Все четыре автора работали в Москве в то время.[3]

Примечания

править
  1. Huacheng Yu. An Improved Combinatorial Algorithm for Boolean Matrix Multiplication // arXiv:1505.06811 [cs]. — 2015-05-26. Архивировано 20 мая 2022 года.
  2. 1 2 А. Ахо, Дж. Ульман, Дж. Хопкрофт. Построение и анализ вычислительных алгоритмов. М.: Мир, 1979
  3. V. L. Arlazarov, Y. A. Dinitz, M. A. Kronrod, I. A. Faradzhev, “On economical construction of the transitive closure of an oriented graph”, Dokl. Akad. Nauk SSSR, 194:3 (1970), 487–488. www.mathnet.ru. Дата обращения: 18 апреля 2020. Архивировано 1 октября 2018 года.