Пример 1
Обозначим через m & n поразрядную конъюнкцию неотрицательных целых чисел m и n. Для какого наименьшего неотрицательного целого числа A формула
(x & 29 ≠ 0) → ((x & 12 = 0) → (x & A ≠ 0))
тождественно истинна, то есть принимает значение 1 при любом неотрицательном целом значении x?
Показать решение и ответ
1. Импликация ложна только в одном случае: x & 29 ≠ 0, x & 12 = 0 и x & A = 0. Нужно выбрать A так, чтобы этот случай был невозможен.
2. 29 = 11101₂ (биты 4, 3, 2, 0), 12 = 01100₂ (биты 3, 2).
3. x & 12 = 0 — у x нет битов 3 и 2. Тогда x & 29 ≠ 0 значит, что у x есть бит 4 или бит 0.
4. Для каждого такого x должно быть x & A ≠ 0. Значит, A должно содержать и бит 4, и бит 0 (иначе x = 16 или x = 1 сделают формулу ложной).
5. Наименьшее такое A = 10001₂ = 17.
Проверка перебором:
for A in range(256): # перебираем A по возрастанию
ok = True # предполагаем, что A подходит
for x in range(1024): # проверяем x; старшие биты на ответ не влияют
f = (x & 29 == 0) or (x & 12 != 0) or (x & A != 0) # a → (b → c) = ¬a ∨ ¬b ∨ c
if not f: # нашли x, при котором формула ложна
ok = False # A не подходит
break # дальше проверять незачем
if ok: # формула истинна при всех x
print(A) # первое такое A — наименьшее
break # остановкаОтвет: 17
