Булевы функции и полином Жегалкина: единственная нормальная форма
Любую булеву функцию можно записать многочленом из XOR и И — и такой многочлен единственный. Разбираем два способа построения, линейные функции и мажоритарную схему голосования.
Инженер собирает схему из элементов «И-НЕ»: два вида работы — отрицание и конъюнкция — покрывают всё. Возникает неудобный вопрос: а из чего собирает математик? Если разрешить только сложение по модулю 2 и умножение, выйдет ли полноценная арифметика логики? Ответ: да, выйдет, и даже лучше, чем в ДНФ — каждая функция получит единственную запись. Эту запись называют полиномом Жегалкина, и она сидит внутри самых разных вещей: от контрольных сумм из урока об основах кодирования до криптографии, где линейность полинома меряется буквально, потому что линейная функция вскрывается проще нелинейной.
Сколько вообще булевых функций#
Булева функция принимает аргументы из и возвращает 0 или 1. Таблица истинности из столбцов переменных имеет строк — по строке на каждый входной набор, и в каждой строке значение выбирается из двух вариантов. Отсюда арифметика: функций от переменных ровно . При их шестнадцать — все были разложены по полочкам ещё в уроке о булевой алгебре; при — уже 256, а при — более триллиона. Писать для каждой свою формулу бессмысленно, нужны стандартные формы.
Одна из них вам уже знакома — дизъюнктивная нормальная форма: дизъюнкция конъюнкций, по одному слагаемому на каждую строку таблицы с единицей. СДНФ честно воспроизводит функцию, но у неё есть дефект: она не единственная. Функцию XOR можно записать как , а можно упростить до — и обе записи «правильные». Для сравнения схем, для автоматических доказательств и для криптографии нужна форма, которая у каждой функции одна. Такой формой и оказывается многочлен.
Что такое полином Жегалкина#
Это обычный многочлен, но арифметика — модульная. Сложение — XOR: . Умножение — обычное И: . Отрицаний нет, степеней выше первой нет — и быть не может, ведь : квадрат переменной в мире нулей и единиц равен самой переменной. Именно это правило убивает все высшие степени и делает число возможных многочленов конечным: для каждой из комбинаций переменных одночлен либо есть, либо нет. Многочленов ровно — столько же, сколько функций. Гадать не приходится: если различных объектов поровну и каждый многочлен задаёт какую-то функцию, то соответствие взаимно однозначно. Единственность полинома доказывается без единой строки вычислений.
Мостом между привычными операциями и полиномиальным миром служат три тождества — их достаточно, чтобы перевести любую формулу:
- — дизъюнкция равна сумме минус произведение (проверьте на четырёх наборах: совпадение на трёх, а на двойная единица схлопывается в ноль, и остаётся )
- — отрицание это прибавление единицы; в мире по модулю 2 знак минус неотличим от плюса
- — импликация тоже раскладывается, хотя на вид кажется далёкой от многочленов
Дальше механика: заменить в ДНФ каждую связку по этим правилам, раскрыть скобки (дистрибутивность И над XOR работает, как в школьной алгебре), собрать повторяющиеся одночлены парами и вычеркнуть — .
Способ первый: алгебра, раскрытие скобок#
Возьмём функцию мажоритарного голосования — она равна 1, когда хотя бы два из трёх аргументов равны 1. Такое устройство стоит в тройных системах дублирования: два канала против одного. В ДНФ она записывается как — три слагаемых, каждый голос в паре. Переводим: дизъюнкция трёх слагаемых раскладывается итеративно, каждое заменяется по правилу выше. Раскрытие скобок даёт шесть одночленов-произведений (все пары возникают дважды), пары гасятся по чётности, и остаётся элегантный итог:
Способ быстрый, но требует алгебраической аккуратности: на четырёх-пяти переменных скобки распухают, и потерять слагаемое проще, чем его найти. Для контрольных работ и самопроверки существует второй путь — систематический.
Способ второй: метод неопределённых коэффициентов#
Выпишем полином с восемью неизвестными коэффициентами — по одному на каждую возможную комбинацию переменных :
И подставим строки таблицы истинности одну за другой. Каждая строка даёт линейное уравнение над , а хитрость в порядке чтения: если идти от набора вверх, каждый новый коэффициент входит в уравнение один — он умножен на произведение, которое на строках с большим числом единиц ещё не встречалось. Решение выпадает последовательно, без систем уравнений.
Метод выигрывает в надёжности: он не требует ни формулы-исходника, ни знания ДНФ — только таблицу. Именно таблица и есть полный паспорт функции, а полином — её сжатая портретная карточка. Для функций с большим числом переменных оба пути механизируются: коэффициенты метода — это в точности биты преобразования Уолша—Адамара, и вся процедура сводится к быстрому преобразованию, которое работает за операций.
Линейные функции: полином без произведений#
Если все коэффициенты при произведениях нулевые, полином вырождается в сумму переменных и константы: . Такие функции называют линейными. Их немного: коэффициентов , каждый выбирается из двух значений, итого линейных функций на всех — при шестнадцать из 256. Из уже знакомых линейны: отрицание (), эквивалентность (), само сложение по модулю 2, тождественный ноль и единица.
Практический тест на линейность без построения полного полинома: производная по паре переменных. В обычном анализе смешанная вторая производная нелинейного члена не нулевая; здесь то же самое на пальцах — возьмите функцию на двух наборах, различающихся ровно в и одновременно. У линейной функции эффекты двух переменных складываются независимо, и разность значений на «диагональной» паре определяется линейными членами. Быстрее всего нелинейность ловится прямым сравнением: посчитайте на четырёх наборах из квадрата при фиксированных остальных и проверьте, раскладывается ли этот фрагмент в . Если нет — где-то спрятано произведение.
Почему за линейностью следят? Во-первых, по теореме Поста из булевой алгебры класс линейных функций не полон: из одних XOR-сумм не собрать ни конъюнкцию, ни запертую систему — значит, не собрать и вычислитель. Во-вторых, в криптографии шифры стараются строить так, чтобы выход не был линейной функцией входа: линейность для криптоаналитика — открытая дверь, взлом сводится к решению системы уравнений. Существуют даже специально «предельно нелинейные» функции — бент-функции, у которых полином содержит произведения максимальной плотности.
Полином Жегалкина полезен и как инструмент сравнения схем: две формулы задают одну функцию тогда и только тогда, когда их полиномы совпали. Пришла пара кандидаток из оптимизатора схем? Приведите обе к Жегалкину — разошлись, значит, функции разные. Тот же критерий работает для проверки эквивалентности логических формул в логике высказываний, только там удобнее сравнивать таблицы; полином экономнее — он короче таблицы.
Отдельная приятность для алгоритмистов: функция, заданная полиномом, вычисляется за один проход по одночленам — нет ни каскада отрицаний, ни длинных дизъюнкций. Комбинационные схемы из XOR-деревьев и умножителей — это в точности железная реализация полинома Жегалкина, а конечные автоматы из соответствующего урока умеют пересчитывать его по мере поступления битов: вспомните сдвиговые регистры с обратной связью — там линейный полином определяет, какие разряды складывать на каждом такте.
Частые промахи при построении полинома: первый — забыть правило и оставить «квадраты»; второй — при замене дизъюнкции потерять произведение , записав (это XOR, а не ИЛИ — на наборе они расходятся); третий — в методе коэффициентов решать строки в случайном порядке и упираться в систему из нескольких уравнений. Итоговую шпаргалку темы удобно держать в голове списком:
- Полином Жегалкина — сумма по модулю 2 одночленов без отрицаний и степеней выше первой; у каждой функции он ровно один
- Три тождества-переводчика: , ,
- Метод коэффициентов: строки таблицы от нулевого набора вверх, каждый коэффициент выписывается независимо
- Линейные функции — штук; их класс не полон, а в шифрах линейность — уязвимость
Чему равен полином Жегалкина функции XOR, ?
Сколько линейных булевых функций от трёх переменных?
Функция (конъюнкция) — линейная?
Частые вопросы
Почему полином Жегалкина единственный?
Счётное рассуждение: одночлен определяется подмножеством переменных, для переменных подмножеств , и каждый входит или нет — всего различных полиномов. Ровно столько же булевых функций от переменных. Каждый полином задаёт какую-то функцию (подставь значения — посчитай), значит, функций и полиномов поровну, и два разных полинома не могут описывать одну функцию — иначе каких-то функций не хватило бы.
Как быстро проверить, линейна ли функция?
Постройте полином и посмотрите на коэффициенты при произведениях. Для ручной проверки хватит фрагмента таблицы: зафиксируйте все переменные, кроме двух, и сравните значения на четырёх наборах из . Если функция линейна, четвёрка значений всегда имеет вид — сумма первой и четвёртой равна сумме второй и третьей.
Чем полином Жегалкина лучше СДНФ?
Единственностью и компактностью. СДНФ зависит от того, как вы упрощали формулу, — разных СДНФ у одной функции сколько угодно, сравнивать их бессмысленно. Полином один, он служит канонической формой: совпали полиномы — совпали функции. Кроме того, в нём нет отрицаний, что упрощает автоматические преобразования и аппаратную реализацию.
Что делать с отрицанием при переводе из ДНФ?
Заменить его первым же тождеством: , и дальше работать как обычно. Двойное отрицание автоматически сократится: . Единственная ловушка — не путать «минус один» с «плюс один»: в арифметике по модулю 2 это одно и то же, поэтому вычитание одночлена означает его добавление, а повторное появление одночлена гасит его пару.
Готовитесь к контрольной?
Чеклист тем по «Дискретка»: что вы уже умеете, что повторить и в каком порядке.
Открыть чеклист предмета →
Проверьте себя в бою
Босс-экзамен по «Дискретка»: квизы всех уроков плюс бесконечный поток сгенерированных задач. Каждая попытка — новый расклад.
Начать босс-экзамен →