Приоритет and / or / not и скобки
Порядок действий
Логические операции выполняются в строгом порядке — от самой «сильной» к самой «слабой»:
| Приоритет | Операции | Значок в условии |
|---|---|---|
| 1 (выполняется первым) | арифметика: **, *, /, //, %, +, - | — |
| 2 | сравнения: <, >, <=, >=, ==, !=, сюда же импликация A <= B | →, ≡ |
| 3 | not | ¬ |
| 4 | and | ∧ |
| 5 (последним) | or | ∨ |
Импликация в этой таблице стоит на второй строке, потому что записывается оператором сравнения <=. В математической записи из условия ЕГЭ она наоборот самая слабая — слабее or. Порядок перевёрнут, поэтому операнды импликации всегда берут в скобки: (A) <= (B).
Главное следствие: оператор and сильнее, чем or. Выражение читается так, будто вокруг всех and уже стоят скобки:
1
Второе следствие: сравнения выполняются раньше логических операций, поэтому x % 3 == 0 and x > 10 работает без скобок — сначала считается x % 3, потом == 0, и только потом and.
Где это ломает решение
1 2 3 4
Здесь ответы совпали случайно. Возьмём x = 101:
1 2 3 4
Совпадения будут встречаться часто — и именно поэтому ошибка живучая: программа выдаёт верный ответ на проверочных числах и неверный на экзаменационных. Вывод простой: в задании 15 скобки ставим всегда, даже там, где они формально не нужны.
Логические операции
В ЕГЭ логические выражения записывают математическими значками. Перевод на Python:
| В условии | На Python |
|---|---|
| ¬A (отрицание) | not A |
| A ∧ B (конъюнкция, И) | A and B |
| A ∨ B (дизъюнкция, ИЛИ) | A or B |
| A → B (импликация) | A <= B |
| A ≡ B (эквивалентность) | A == B |
| ДЕЛ(x, k) | x % k == 0 |
Каждый операнд обязательно берётся в скобки. У <= приоритет сравнения — самый высокий среди логических операций, а у импликации в математике почти самый низкий, поэтому без скобок порядок получится обратным. И a <= b <= c Python читает как цепочку (a <= b) and (b <= c), а не как две импликации.
Пример с ЕГЭ: задание 15
Формулировка: «Найдите наибольшее натуральное число A, при котором выражение ДЕЛ(x, A) ∨ (¬ДЕЛ(x, 21) ∧ ¬ДЕЛ(x, 35)) истинно для любого натурального x».
Решается перебором: пробуем каждое A и проверяем выражение на большом диапазоне x.
1 2 3 4 5 6 7
Ответ — 7. Обрати внимание на три вещи:
- каждое элементарное условие обёрнуто в скобки — так формула из условия переносится в код один в один;
- all(...) проверяет «истинно для любого x»; для формулировки «существует x» берётся any(...);
- диапазон проверки берут с запасом: 100 000 значений достаточно почти всегда, а вот 100 — уже нет, легко получить лишние подходящие A.
Если в условии спрашивают наименьшее A, меняется только последняя строка: min(res).
Пример с ЕГЭ: задание 2
Перебор всех наборов переменных удобно делать через itertools.product
1 2 3 4 5
product([0, 1], repeat=4) даёт все 16 наборов из нулей и единиц — ровно строки таблицы истинности. Ноль и единица работают как False и True, поэтому писать x == 1 не нужно.
