Кодирование и автоматы (6 февраля 2024)

  1. CRC-32
    1. Один из вариантов хеширования последовательности бит a0, a1, ... an-1 − остаток от деления многочлена A(x)*xk на G(x),
    где G(x) -- специальный многочлен, и k = deg G.
    1. В CRC-32-IEEE-802.3 (используется в v.42, mpeg-2, png, POSIX cksum) k = 32, G(x) = 0xEDB88320 (32 бита).
    2. Вычисление взятия по модуля одним проходом за O(n) при w ≥ k
    3. Даны CRC-32(A) и CRC-32(B). Найдите CRC-32(A XOR B)
    4. Зная CRC-32(A), посчитайте за O(1) CRC-32(A1)

  2. Коды Рида-Соломона
    1. Пример 1: передать 1 бит по каналу, где любой 1 бит может быть заменён. 00, 11 − плохой код. 000, 111 − хороший.
    2. Пример 2: только проверка на корректность, без исправления ошибок. Передать xor.
    3. Пример 3: передать n бит. Код повторять три раза. Код частичные суммы.
    4. Критерий того, что при k ошибках всё можно однозначно декодировать: расстояния Хэмминга не менее 2k+1.

  3. Коды Рида-Соломона.
    1. Задача: хотим передать n слов из поля Fq, q > n, не более k ошибок.
    2. Какие бывают q, чтобы ∃ поле Fq? q = pn. Поля простого размера − остатки по модулю; для размера pn − нужно найти неприводимый многочлен степени n над Fp.
    3. F232 − конечные поля имеют размер pn, размера p это просто остатки по модулю p (Z/pZ), размера pn (232) − остатки по модулю неприводимого многочлена над Fp степени n. F232 = F2[x] / (x32 + x22 + x2 + x + 1).
    4. Входные данные − многочлен. Алгоритм кодирования − вычисление значений многочлена в произвольных n+2k точках xi.
    5. Корректность кодирования: у A1-A2 не более n-1 корней ⇒ у A1 и A2 значения хотя бы в 2k+1 точке различны
    6. Проверка наличия ошибок − интерполяция имеет степень не более n-1.
    7. Исправление ошибок: A(x) − входные данные, A'(x) − интерполяция переданного, E(x) = (x-xe1)...(x-xek) − многочлен ошибок. У B(x) = A(x)E(x) и A'(x)E(x) совпадают значения во всех n+2k точках. СЛАУ: неизвестные − коэффициенты B и E, каждая из n+2k точек даёт уравнение.
    8. Асимптотика декодирования. Гаусс O((n+k)3). Бэрликэмп-Мэсси O((n+k)2).
    9. Рид-Соломон. Где же ответ? B = A*E, A'*E, неизвестные - коэффициенты B и E

  4. Сверхбыстрая линейная рекуррента
    1. Фибоначчи за O(logn): возведение матрицы в степень
    2. Линейная рекурренты длины k за O(k3logn): возведение матрицы в степень
    3. Линейная рекурренты длины k за O(klogklogn): xn mod A(x), где A(x) = xk - ∑xk-iai

  5. ??? Бэрликэмп-Мэсси O((n+k)2).
− Перерыв −
  1. Автоматы. База.
    1. Определение детерминированного и недетерминированного.
    2. Принятие строки детерминированным O(|s|) и недетерминированным O(m|s|).
    3. Детерминизация: новые вершины = множества 2n.

  2. Эквивалентность и минимизация
    1. Проверка эквивалентности двух автоматов: очередь пар разных состояний O(m2).
    2. Минимизация автомата: правые контексты, разбиение вершин на классы эквивалентности, корректность определения мин автомата.
    3. Минимизация автомата: алгоритм за O(nm) перебором рёбер "вперёд" (n split-ов).
    4. Суффиксный автомат: прелюдия, мы уже почти понимаем что это и как это строить (минимизация суф. дерева). Он линейный (2n вершин, 3n рёбер).
    5. Проверка эквивалентности через минимизацию: попадут ли в один класс s1 и s2.
    6. Минимизация через детерминизацию (Алгоритм Бржозовского): Amin = d(r(d(r(A)))) = drdrA. Подходит для недетерминированных. [paper].

  3. Хопкрофт: Минимизация за O(nklogn)
    1. Замыкание автомата до полного ⇒ m = nk.
    2. Алгоритм за O(nm) −- переделываем на перебор рёбер "назад".
    3. Лемма: делить нужно только по любой одной из половин ⇒ по меньшей.
    4. Время работы: каждая вершина перекрасится ≤logn раз ⇒ O(mlogn).
    5. Реализация: Split(class, char) за линию с перекраской меньшей половины каждого затронутого split-ом класса.

  4. Изоморфность
    1. Изоморфность двух автоматов за O(m1+m2).
    2. Проверка изоморфности минимальному за O((n1+n2)k).