Подтема 5 из 6
Поразрядная конъюнкция
Что делает x & M, какие биты обязаны быть в наименьшем A и какие разрешены наибольшему.
Операция &
Что означает запись x & 22?
Числа записывают в двоичной системе друг под другом. В каждом разряде результата стоит 1, только если в этом разряде у обоих чисел 1. Операцию называют поразрядной конъюнкцией: это логическое И, применённое к каждой паре цифр.
Посчитаем 26 & 13. Веса разрядов справа налево — 1, 2, 4, 8, 16, как в теме о системах счисления: 26 = 16 + 8 + 2 = 11010₂, 13 = 8 + 4 + 1 = 01101₂.
В формулах чаще важен не сам результат, а равен ли он нулю. x & M ≠ 0 — у x и M есть общая единица хотя бы в одном разряде. x & M = 0 — общих единиц нет. Например, 26 & 13 ≠ 0, а 26 & 5 = 0: у 5 = 101₂ единицы в разрядах 4 и 1, а у 26 там нули.
В Python операция записывается так же: даёт 8.
Наименьшее A
Найдём наименьшее неотрицательное A, при котором формула (x & 22 ≠ 0) → ((x & 10 = 0) → (x & A ≠ 0)) тождественно истинна при любом неотрицательном целом x.
Всё решает A при тех x, у которых есть единица из 22 и нет единиц из 10. A должно иметь общую единицу с каждым таким x.
Заменим стрелки: ¬(x & 22 ≠ 0) ∨ ¬(x & 10 = 0) ∨ (x & A ≠ 0). Части без A ложны, когда x & 22 ≠ 0 и x & 10 = 0. Разложим маски: 22 = 16 + 4 + 2, 10 = 8 + 2. У такого x нет весов 8 и 2, но есть 16 или 4 — единственные веса 22, которых нет в 10.
Возьмём x = 16. У него одна единица, значит, A обязано содержать вес 16 — иначе общей единицы не будет. Так же x = 4 требует вес 4. Значит, в A есть веса 16 и 4, и наименьшее такое A = 16 + 4 = 20.
Проверка: любой x, где решает A, содержит 16 или 4 — общая единица с 20 найдётся. A = 19 = 16 + 2 + 1 не подходит: при x = 4 общих единиц нет, и формула ложна.
Тонкости:почему хватает x с одной единицей
У x с одной единицей меньше всего шансов совпасть с A. Если A подходит для x = 16 и x = 4, то подходит и для x = 20, 22 или 30: в них есть хотя бы один из этих весов.
Наибольшее A
Теперь A стоит слева от стрелки: найдём наибольшее A, при котором (x & A ≠ 0) → ((x & 12 = 0) → (x & 5 ≠ 0)) тождественно истинна.
Когда A стоит слева от стрелки, ищут разряды, которые брать в A нельзя, — и берут все остальные.
Заменим стрелки: (x & A = 0) ∨ (x & 12 ≠ 0) ∨ (x & 5 ≠ 0). Части без A ложны, когда у x нет единиц ни из 12 = 8 + 4, ни из 5 = 4 + 1 — то есть нет весов 8, 4 и 1. Тогда нужно x & A = 0.
Такой x может содержать любой другой вес — 2, 16, 32, … Значит, этих весов в A быть не должно. Разрешены только 8, 4 и 1: наибольшее A = 8 + 4 + 1 = 13.
Программой
Как проверить ответ 20 программой?
Шаблон тот же, что для задачи темы; меняется только формула и диапазон x. В Python знак & выполняется раньше сравнения, поэтому x & 22 != 0 означает (x & 22) ≠ 0.
def imp(p, q): return (not p) or q def f(x, A): return imp(x & 22 != 0, imp(x & 10 == 0, x & A != 0))for A in range(0, 256): if all(f(x, A) for x in range(0, 256)): print(A) breakПочему x до 255? Все маски меньше 32 — в них пять разрядов. Разряды x старше пятого с масками не совпадают и на формулу не влияют. Диапазон до 256 берёт все сочетания восьми младших разрядов — с запасом.
Итого
- x & M1 там, где 1 у обоих чисел
- x & M ≠ 0есть общая единица
- Наименьшее Aвеса, которые обязаны быть в A
- Наибольшее Aвсе разрешённые веса
- Проверкаx с одной единицей
- Pythonx до 256 — с запасом
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
27 & 14
Обозначим через m & n поразрядную конъюнкцию неотрицательных целых чисел m и n. Чему равно 27 & 14?
Введите число.
Подсказка
Запиши оба числа в двоичной системе друг под другом.
Решение
27 = 11011₂, 14 = 01110₂. Единицы у обоих — в разрядах 8 и 2: 01010₂ = 10.
print(27 & 14)Ответ: 10
Наименьшее A: маски 26 и 12
Обозначим через m & n поразрядную конъюнкцию неотрицательных целых чисел m и n. Для какого наименьшего неотрицательного целого числа A формула (x & 26 ≠ 0) → ((x & 12 = 0) → (x & A ≠ 0)) тождественно истинна при любом неотрицательном целом x?
Введите число.
Подсказка
Найди веса, которые есть в 26, но нет в 12.
Решение
26 = 16 + 8 + 2, 12 = 8 + 4. Всё решает A при x без весов 8 и 4, но с весом 16 или 2. x = 16 и x = 2 требуют, чтобы эти веса были в A. Наименьшее A = 16 + 2 = 18.
def imp(p, q): return (not p) or q def f(x, A): return imp(x & 26 != 0, imp(x & 12 == 0, x & A != 0)) for A in range(0, 256): if all(f(x, A) for x in range(0, 256)): print(A) breakОтвет: 18
Наименьшее A: маски 28 и 12
Обозначим через m & n поразрядную конъюнкцию неотрицательных целых чисел m и n. Найди наименьшее неотрицательное целое A, при котором формула (x & 28 ≠ 0) → ((x & 12 = 0) → (x & A ≠ 0)) истинна при любом неотрицательном целом x.
Введите число.
Подсказка
Веса 28, которых нет в 12, обязаны быть в A.
Решение
28 = 16 + 8 + 4, 12 = 8 + 4. В 28, но не в 12 — только вес 16. x = 16 требует его в A, а другие веса не нужны: A = 16.
def imp(p, q): return (not p) or q def f(x, A): return imp(x & 28 != 0, imp(x & 12 == 0, x & A != 0)) for A in range(0, 256): if all(f(x, A) for x in range(0, 256)): print(A) breakОтвет: 16
Наименьшее A: маски 50 и 22
Обозначим через m & n поразрядную конъюнкцию неотрицательных целых чисел m и n. Для какого наименьшего неотрицательного целого числа A формула (x & 50 ≠ 0) → ((x & 22 = 0) → (x & A ≠ 0)) тождественно истинна при любом неотрицательном целом x?
Введите число.
Подсказка
Разложи 50 и 22 по весам.
Решение
50 = 32 + 16 + 2, 22 = 16 + 4 + 2. В 50, но не в 22 — только вес 32. Он обязан быть в A, наименьшее A = 32.
def imp(p, q): return (not p) or q def f(x, A): return imp(x & 50 != 0, imp(x & 22 == 0, x & A != 0)) for A in range(0, 256): if all(f(x, A) for x in range(0, 256)): print(A) breakОтвет: 32
Наибольшее A: маски 6 и 9
Обозначим через m & n поразрядную конъюнкцию неотрицательных целых чисел m и n. Для какого наибольшего неотрицательного целого числа A формула (x & A ≠ 0) → ((x & 6 = 0) → (x & 9 ≠ 0)) тождественно истинна при любом неотрицательном целом x?
Введите число.
Подсказка
A может брать только веса, которые есть в 6 или в 9.
Решение
Формула равна (x & A = 0) ∨ (x & 6 ≠ 0) ∨ (x & 9 ≠ 0). При x без весов 6 = 4 + 2 и 9 = 8 + 1 нужно x & A = 0, поэтому другие веса в A брать нельзя. Разрешены 8, 4, 2, 1: A = 15.
def imp(p, q): return (not p) or q def f(x, A): return imp(x & A != 0, imp(x & 6 == 0, x & 9 != 0)) answer = Nonefor A in range(0, 256): if all(f(x, A) for x in range(0, 256)): answer = Aprint(answer)Ответ: 15
Наибольшее A: маски 20 и 3
Обозначим через m & n поразрядную конъюнкцию неотрицательных целых чисел m и n. Найди наибольшее неотрицательное целое A, при котором формула (x & A ≠ 0) → ((x & 20 = 0) → (x & 3 ≠ 0)) истинна при любом неотрицательном целом x.
Введите число.
Подсказка
Собери все веса масок 20 и 3.
Решение
Разрешены только веса, которые есть в 20 = 16 + 4 или в 3 = 2 + 1. Все вместе: 16 + 4 + 2 + 1 = 23.
def imp(p, q): return (not p) or q def f(x, A): return imp(x & A != 0, imp(x & 20 == 0, x & 3 != 0)) answer = Nonefor A in range(0, 256): if all(f(x, A) for x in range(0, 256)): answer = Aprint(answer)Ответ: 23
Наибольшее A: маски 41 и 15
Обозначим через m & n поразрядную конъюнкцию неотрицательных целых чисел m и n. Для какого наибольшего неотрицательного целого числа A формула (x & A ≠ 0) → ((x & 41 = 0) → (x & 15 ≠ 0)) тождественно истинна при любом неотрицательном целом x?
Введите число.
Подсказка
Общий вес двух масок считается один раз.
Решение
41 = 32 + 8 + 1, 15 = 8 + 4 + 2 + 1. Разрешены веса 32, 8, 4, 2, 1 — вес 8 и вес 1 есть в обеих масках, но в A каждый входит один раз: 32 + 8 + 4 + 2 + 1 = 47.
def imp(p, q): return (not p) or q def f(x, A): return imp(x & A != 0, imp(x & 41 == 0, x & 15 != 0)) answer = Nonefor A in range(0, 256): if all(f(x, A) for x in range(0, 256)): answer = Aprint(answer)Ответ: 47
Первый x, где формула ложна
Обозначим через m & n поразрядную конъюнкцию неотрицательных целых чисел m и n. При A = 8 формула (x & 28 ≠ 0) → ((x & 12 = 0) → (x & A ≠ 0)) ложна при некоторых неотрицательных целых x. Найди наименьшее такое x.
Введите число.
Подсказка
Формула ложна, когда у x есть вес из 28, нет весов 12 и нет общих единиц с 8.
Решение
28 = 16 + 8 + 4, 12 = 8 + 4. Формула ложна, когда у x есть вес 16, нет весов 8 и 4 и нет общей единицы с A = 8. Наименьшее такое x — 16. Программа перебирает x по возрастанию и останавливается на первом, где формула ложна.
def imp(p, q): return (not p) or q def f(x, A): return imp(x & 28 != 0, imp(x & 12 == 0, x & A != 0)) for x in range(0, 256): if not f(x, 8): print(x) breakОтвет: 16