EssayAI
Блог
Блог

Как найти полином Жегалкина: решение по шагам

Запрос

Дано: булева функция f(x,y,z)f(x, y, z) задана вектором значений 10011110, наборы идут в порядке 000, 001, 010, ..., 111. Найти: полином Жегалкина функции и ответ на вопрос, линейна ли она.

Полином Жегалкина - это запись функции через сложение по модулю два и конъюнкцию, без отрицаний и дизъюнкций. Считать его удобнее всего треугольником Паскаля: под вектором значений выстраиваются строки поразрядных сумм по модулю два, а коэффициенты снимаются с левого края готового треугольника. Ответ: f=1⊕y⊕z⊕xy⊕xz⊕xyzf = 1 \oplus y \oplus z \oplus xy \oplus xz \oplus xyz, степень полинома равна 3, функция нелинейна. Калькулятор сверху строит тот же треугольник для любого вектора, а ниже каждый шаг разобран руками.

Решение по шагам

Шаг 1. Раскладываем вектор по наборам. Переменных три, поэтому наборов 23=82^3 = 8, и разряды вектора читаются сверху вниз в порядке двоичных чисел: нулевой разряд отвечает набору 000, последний - набору 111. Старший бит номера набора - это переменная xx, младший - zz.

№x y zf
00 0 01
10 0 10
20 1 00
30 1 11
41 0 01
51 0 11
61 1 01
71 1 10

Если функция дана не вектором, а таблицей или формулой, сначала получают именно этот столбец значений: порядок заполнения наборов подробно разобран в задаче как построить таблицу истинности.

Шаг 2. Строим треугольник Паскаля. Верхняя строка треугольника - сам вектор значений. Каждая следующая строка получается из предыдущей поразрядным сложением соседей по модулю два: берём первый и второй элементы, складываем, потом второй и третий, и так до конца. Строка при этом становится короче на один элемент, поэтому через восемь шагов от вектора остаётся одно число.

СтрокаЭлементыКоэффициентМоном
01 0 0 1 1 1 1 0111
11 0 1 0 0 0 11zz
21 1 1 0 0 11yy
30 0 1 0 10yzyz
40 1 1 10xx
51 0 01xzxz
61 01xyxy
711xyzxyz

Проверять себя тут легко: сложение по модулю два - это «равно нулю, если цифры одинаковые, и единице, если разные». Первая строка треугольника, например, начинается с 1⊕0=11 \oplus 0 = 1, потом идёт 0⊕0=00 \oplus 0 = 0, затем 0⊕1=10 \oplus 1 = 1.

Шаг 3. Сопоставляем коэффициентам мономы. Коэффициенты стоят в левом столбце, их читают сверху вниз. Номер строки, записанный в двоичном виде, прямо указывает состав монома: единичные разряды номера - это переменные, которые входят в слагаемое. Строка 5 в двоичной записи даёт 101, то есть единицы стоят на местах xx и zz, и коэффициент этой строки относится к моному xzxz. Нулевая строка не содержит ни одной единицы, значит её коэффициент - свободный член.

Шаг 4. Собираем полином. В левом столбце единицы оказались в строках 0, 1, 2, 5, 6 и 7, а нули - в строках 3 и 4. Значит, мономы yzyz и xx в ответ не входят, а остальные шесть складываются по модулю два:

f(x,y,z)=1⊕y⊕z⊕xy⊕xz⊕xyz.f(x, y, z) = 1 \oplus y \oplus z \oplus xy \oplus xz \oplus xyz.

Порядок слагаемых произволен: сложение по модулю два коммутативно, поэтому запись обычно упорядочивают по возрастанию степени монома, как здесь.

Шаг 5. Проверяем подстановкой. Полином обязан давать исходный вектор, и проверка занимает минуту, если подставлять «крайние» наборы. На наборе 000 все мономы с переменными обнуляются и остаётся свободный член: f=1f = 1, что совпадает с первым разрядом вектора. На наборе 111 работают все шесть слагаемых: 1⊕1⊕1⊕1⊕1⊕1=01 \oplus 1 \oplus 1 \oplus 1 \oplus 1 \oplus 1 = 0, и последний разряд вектора тоже нулевой. Для надёжности берут ещё один набор со смешанными значениями, скажем 101: остаются слагаемые 11, zz и xzxz, их сумма 1⊕1⊕1=11 \oplus 1 \oplus 1 = 1, а в векторе на пятой позиции стоит единица.

Шаг 6. Отвечаем про линейность. Функция линейна тогда и только тогда, когда в её полиноме Жегалкина нет мономов длиннее одной переменной. Здесь есть xyxy, xzxz и xyzxyz, поэтому условие нарушено. Степень полинома - это длина самого длинного монома, у нас это xyzxyz, то есть степень 3.

Ответ: f(x,y,z)=1⊕y⊕z⊕xy⊕xz⊕xyzf(x, y, z) = 1 \oplus y \oplus z \oplus xy \oplus xz \oplus xyz; степень полинома 3, функция нелинейна и классу LL не принадлежит.

Формула и откуда она берётся

Полином Жегалкина от nn переменных - это сумма по модулю два произведений переменных без повторений, взятых с коэффициентами 0 или 1:

f(x1,…,xn)=a0⊕⨁iaixi⊕⨁i<jaijxixj⊕⋯⊕a12…nx1x2…xn.f(x_1, \dots, x_n) = a_0 \oplus \bigoplus_{i} a_i x_i \oplus \bigoplus_{i < j} a_{ij} x_i x_j \oplus \dots \oplus a_{12\ldots n} x_1 x_2 \ldots x_n.

Существование такой записи доказывается конструктивно. Любую функцию можно записать формулой через отрицание, конъюнкцию и дизъюнкцию, а эти операции выражаются через ⊕\oplus и ∧\wedge: ¬x=x⊕1\neg x = x \oplus 1 и x∨y=x⊕y⊕xyx \vee y = x \oplus y \oplus xy. Подставляем замены, раскрываем скобки и сокращаем одинаковые слагаемые по правилам x⊕x=0x \oplus x = 0 и x⋅x=xx \cdot x = x - остаётся полином нужного вида.

Единственность следует из подсчёта. Мономов ровно 2n2^n (каждое подмножество переменных даёт свой), коэффициенты независимы, значит различных полиномов 22n2^{2^n} - ровно столько же, сколько булевых функций от nn переменных. Отображение «полином - функция» сюръективно, а множества равномощны, поэтому оно взаимно однозначно: у каждой функции полином Жегалкина ровно один.

Коэффициент при мономе выражается напрямую через значения функции. Обозначим набор индексов монома через маску α\alpha; тогда

aα=⨁β⊆αf(β),a_{\alpha} = \bigoplus_{\beta \subseteq \alpha} f(\beta),

то есть складываются значения функции на всех наборах, которые «вкладываются» в α\alpha по единицам. Это преобразование Мёбиуса, и треугольник Паскаля вычисляет именно его. Элемент строки kk на нулевой позиции равен сумме f(j)f(j), взятых с биномиальными коэффициентами (kj) mod 2\binom{k}{j} \bmod 2, а по теореме Люка (kj)\binom{k}{j} нечётен ровно тогда, когда jj - подмаска kk. Отсюда и совпадение: левый край строки kk есть коэффициент при мономе с номером kk.

Метод неопределённых коэффициентов

Второй школьный способ не требует треугольника. Записываем полином общего вида с восемью неизвестными коэффициентами и подставляем наборы по возрастанию числа единиц, начиная с нулевого:

f(x,y,z)=a0⊕a1x⊕a2y⊕a3z⊕a4xy⊕a5xz⊕a6yz⊕a7xyz.f(x, y, z) = a_0 \oplus a_1 x \oplus a_2 y \oplus a_3 z \oplus a_4 xy \oplus a_5 xz \oplus a_6 yz \oplus a_7 xyz.

Набор 000 обнуляет всё, кроме свободного члена, поэтому a0=f(0,0,0)=1a_0 = f(0,0,0) = 1 сразу. На наборах с одной единицей выживают свободный член и один линейный моном: из f(1,0,0)=1f(1,0,0) = 1 получаем 1⊕a1=11 \oplus a_1 = 1, то есть a1=0a_1 = 0; аналогично f(0,1,0)=0f(0,1,0) = 0 даёт a2=1a_2 = 1, а f(0,0,1)=0f(0,0,1) = 0 даёт a3=1a_3 = 1.

Наборы с двумя единицами добавляют по одному парному моному к уже известным величинам. Из f(1,1,0)=1f(1,1,0) = 1 следует a0⊕a1⊕a2⊕a4=1a_0 \oplus a_1 \oplus a_2 \oplus a_4 = 1, подставляем найденное и получаем a4=1a_4 = 1. Точно так же f(1,0,1)=1f(1,0,1) = 1 приводит к a5=1a_5 = 1, а f(0,1,1)=1f(0,1,1) = 1 - к a6=0a_6 = 0. Последний набор 111 включает все слагаемые: сумма известных семи коэффициентов равна 1, а значение функции равно 0, поэтому a7=1a_7 = 1.

Итог совпадает с треугольником: f=1⊕y⊕z⊕xy⊕xz⊕xyzf = 1 \oplus y \oplus z \oplus xy \oplus xz \oplus xyz. Метод медленнее, но нагляднее и полезен, когда нужно найти всего один-два коэффициента, а не весь полином. Порядок подстановки менять нельзя: каждый следующий набор обязан добавлять ровно одно новое неизвестное, иначе уравнение не решится в одно действие.

Если функция задана формулой, а не вектором

Когда дана готовая формула, таблицу можно не строить: достаточно подставить тождества ¬x=x⊕1\neg x = x \oplus 1, x∨y=x⊕y⊕xyx \vee y = x \oplus y \oplus xy и x→y=1⊕x⊕xyx \rightarrow y = 1 \oplus x \oplus xy, после чего раскрыть скобки. Работать при этом нужно по обычным правилам алгебры, но с двумя поправками: одинаковые слагаемые уничтожаются парами, а степень переменной всегда падает до первой.

Возьмём импликацию как пример. Замена даёт x→y=¬x∨y=(1⊕x)∨yx \rightarrow y = \neg x \vee y = (1 \oplus x) \vee y, а дизъюнкция раскрывается в (1⊕x)⊕y⊕(1⊕x)y=1⊕x⊕y⊕y⊕xy(1 \oplus x) \oplus y \oplus (1 \oplus x)y = 1 \oplus x \oplus y \oplus y \oplus xy. Слагаемые yy и yy сокращаются, остаётся 1⊕x⊕xy1 \oplus x \oplus xy - этот вариант есть среди чипов калькулятора сверху, и треугольник даёт для него тот же ответ. Путь через формулу короче, если исходная запись компактна, и заметно длиннее, если в ней много вложенных дизъюнкций: тогда проще выписать вектор значений и вернуться к треугольнику.

Тот же приём работает и от совершенной дизъюнктивной нормальной формы. Конъюнкции в СДНФ попарно ортогональны, то есть одновременно истинными быть не могут, поэтому дизъюнкцию между ними разрешено заменить на сложение по модулю два без поправочных слагаемых. Дальше остаётся раскрыть отрицания внутри конъюнкций и привести подобные.

Частые ошибки

  • Путают порядок переменных в наборе. Если вектор выписан для порядка z,y,xz, y, x, треугольник даст верные коэффициенты, но отнесёт их к другим мономам. Порядок фиксируют один раз и держат до конца задачи.
  • Складывают соседей обычным сложением. В строке треугольника допустимы только 0 и 1: результат 1+11 + 1 равен нулю, а не двойке.
  • Снимают коэффициенты с правого края или с последней строки. Ответ даёт только левый столбец, прочитанный сверху вниз.
  • Теряют степень при раскрытии скобок. Произведение x⋅xx \cdot x равно xx, а не x2x^2: в булевой алгебре квадратов не бывает.
  • Забывают сократить повторяющиеся слагаемые. Пара одинаковых мономов даёт ноль, и если её не убрать, полином перестанет быть единственным представлением функции.
  • Считают линейной функцию с большим числом слагаемых. Линейность определяется длиной мономов, а не их количеством: x⊕y⊕z⊕1x \oplus y \oplus z \oplus 1 линейна, а короткое xyxy уже нет.

FAQ

Чем полином Жегалкина отличается от СДНФ? СДНФ собирается из конъюнкций, соединённых дизъюнкцией, и содержит отрицания переменных. Полином Жегалкина использует только конъюнкцию и сложение по модулю два, отрицаний в нём нет вообще. При этом обе формы однозначны: у каждой функции, кроме тождественного нуля, своя СДНФ и свой полином.

Можно ли получить полином Жегалкина после упрощения формулы? Да, и это часто быстрее: чем короче исходная запись, тем меньше скобок придётся раскрывать. Сначала сводят формулу к компактному виду, как в разборе про упрощение логических выражений, и только потом подставляют тождества для отрицания и дизъюнкции.

Зачем вообще проверять линейность? Линейные функции образуют замкнутый класс LL - один из пяти предполных классов в критерии Поста. Система функций полна тогда и только тогда, когда она не вкладывается целиком ни в один из этих классов, и полином Жегалкина отвечает на вопрос про LL мгновенно. Подробный разбор самих классов есть в материале про классы Поста.

Что делать с функцией от четырёх и более переменных? Схема не меняется, растёт только размер: вектор длины 16 даёт треугольник из шестнадцати строк, а мономов становится 16. Руками это ещё считается, а начиная с пяти переменных удобнее быстрое преобразование Мёбиуса, которое делает то же самое за n⋅2n−1n \cdot 2^{n-1} операций вместо квадратичного перебора.

Коротко

  1. Выписать вектор значений функции в порядке наборов 000, 001, ..., 111; для трёх переменных это восемь разрядов.
  2. Построить треугольник Паскаля: каждая следующая строка - поразрядные суммы соседей по модулю два, длина строки уменьшается на единицу.
  3. Снять коэффициенты с левого столбца сверху вниз; номер строки в двоичной записи указывает, какие переменные входят в моном.
  4. Для вектора 10011110 получается f=1⊕y⊕z⊕xy⊕xz⊕xyzf = 1 \oplus y \oplus z \oplus xy \oplus xz \oplus xyz; проверка подстановкой наборов 000, 101 и 111 даёт 1, 1 и 0, как в исходном векторе.
  5. Степень полинома равна 3, мономы xyxy, xzxz и xyzxyz длиннее одной переменной, поэтому функция нелинейна и в класс LL не входит.
Задача в тетради или методичке? Сфотографируйте условие - сервис распознает его и решит по шагам с пояснениями.

Похожие задачи

Дискретная математика

Как найти двойственную функцию: решение по шагам

Как найти двойственную функцию булевой алгебры: определение через отрицание аргументов и результата, вектор значений наоборот, замена операций в формуле и проверка на самодвойственность.

Дискретная математика

Как составить СКНФ по таблице: пошаговое решение

СКНФ по таблице истинности: разбор задачи с числами. Строки с нулём дают макстермы, отрицание ставится на единицах, ответ проверяется подстановкой. Внутри калькулятор и сравнение с СДНФ.

Дискретная математика

Как найти матрицу инцидентности графа: пошаговое решение

Как найти матрицу инцидентности графа: строки вершины, столбцы рёбра, пошаговый разбор примера на 5 вершинах и 6 рёбрах, знаки для орграфа, проверка по степеням вершин и связь с матрицей смежности.

Дискретная математика

Как найти мощность множества: пошаговое решение

Как найти мощность множества: разбор задачи о 30 студентах по формуле включений исключений, мощность булеана 2 в степени n, счётные и континуальные множества, частые ошибки.

Дискретная математика

Как построить карту Карно: решение по шагам

Как построить карту Карно на четыре переменные: разметка осей кодом Грея, перенос единиц из таблицы истинности, склейка соседних клеток в группы и запись МДНФ с проверкой.

Дискретная математика

Как разложить бином Ньютона: формула и разбор примера

Разбираем, как разложить бином Ньютона: общий член, биномиальные коэффициенты, пошаговое раскрытие выражения в шестой степени, поиск члена без x, проверка и частые ошибки.