Тема 15. Алгебра логики – преобразование логических выражений

15.06 Смешанное

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела алгебра логики – преобразование логических выражений
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#29731

Обозначим через ДЕЛ(n, m) утверждение «натуральное число n делится без остатка на натуральное число m». Обозначим через m&n  поразрядную конъюнкцию неотрицательных целых чисел m  и n  .

На числовой прямой даны отрезки Q = [12;48]  и P = [32,64]  .

Определите наименьшее натуральное число A  , такое что выражение

Д ЕЛ (x,5)∨ (x ∕∈ Q )∨ (x &A = 0)∨ ((x ∈ P) → (|x − 31| ≥ 17))

тождественно истинно, то есть принимает значение 1 при любом целом значении переменной х.

Показать ответ и решение

Решение аналитикой
Система для врагов:

(
||| x|| ... 5
||||
|||{ x ∈ Q
  x&A ⁄= 0
|||
|||| x ∈ P
|||(
  |x − 31| < 17

Раскроем последнее неравенство системы: x− 31 < 17  и x− 31 > − 17  , то есть x < 48  и x > 14  , то есть x ∈ (14;48)  . Враги мечтают, чтобы x ∈ [32;48]  P  и в Q  ), x ∈ (14;48)  и при этом они не делились на 5  . Таким образом, чтобы победить, враги будут брать только следующие иксы: {32,33,34,36,37,38,39,41,42,43,44,46,47} . Также враги мечтают, чтобы x&A ⁄= 0  . Максимальный икс, который могут взять друзья, равен 47  , то есть 1011112  , а минимальный икс = 32  , то есть 1000002  . Отсюда заметим, что ни один икс, подходящий врагам, не содержит единичку в пятом с конца разряде в двоичной записи. Тогда мечты врагов такие: «Вот бы у числа A  была единичка в первом, втором, третьем, четвёртом или шестом с конца разряде в двоичной записи».

Друзья говорят: «Нет, число A  не содержит единичку ни на одном из этих разрядов». Минимальное A  , которое могут взять друзья, равно 100002  , то есть Amin = 16  .

 

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

Мы решаем задачу перебором, чтобы найти наименьшее число A  , при котором заданное логическое выражение верно для любого целого числа x  . Идея решения заключается в следующем:

1. Мы создаём функцию f(x, A), которая проверяет истинность формулы для конкретного x  и A  . - Внутри функции задаём отрезки Q = [12, 48] и P = [32, 64]. - Возвращаем результат логического выражения: число делится на 5 (x%5==0) или не принадлежит Q  (not inn(x, Q)) или поразрядная конъюнкция с A  равна нулю (x&A==0) или импликация для P  ((inn(x, P) <= (abs(x-31)>=17))).

2. Для проверки принадлежности числа x  отрезку P  или Q  определяем вспомогательную функцию inn(x, P), которая возвращает True, если P [0] ≤ x ≤ P[1]  , и False иначе.

3. Мы перебираем все значения A  от 1 до 999 с помощью цикла for A in range(1, 1000): - Для каждого A  устанавливаем флаг flag = True, предполагая, что текущий A  подходит. - Перебираем все значения x  от -1000 до 999 с помощью вложенного цикла for x in range(-1000, 1000). - Если для текущего x  функция f(x, A) возвращает False, устанавливаем flag = False и прерываем цикл по x  , так как это A  не подходит.

4. Если после проверки всех x  флаг flag остался равен True, это значит, что выражение истинно для всех x  при текущем A  . Мы выводим этот A  как наименьший и завершаем перебор с помощью break.

Таким образом, программа гарантированно находит наименьшее целое A  , при котором формула тождественно истинна для любого целого x  .

# Функция проверяет истинность формулы для конкретного x и A
def f(x, A):
    # Определяем отрезки Q и P
    Q = [12, 48]
    P = [32, 64]
    # Проверяем выражение: делимость на 5 или не принадлежность Q или поразрядная конъюнкция с A равна нулю
    # или импликация для P
    return ((x % 5 == 0) or (not inn(x, Q)) or (x & A == 0) or ((inn(x, P)) <= (abs(x - 31) >= 17)))

# Вспомогательная функция для проверки принадлежности x отрезку P
def inn(x, P):
    return P[0] <= x <= P[1]

# Перебираем все возможные значения A от 1 до 999
for A in range(1, 1000):
    # Предполагаем, что текущее A подходит
    flag = True
    # Перебираем все значения x от -1000 до 999
    for x in range(-1000, 1000):
        # Если выражение ложно для текущего x и A
        if not f(x, A):
            # Устанавливаем флаг в False, так как найден случай, где выражение ложно
            flag = False
            # Прерываем цикл по x, текущее A не подходит
            break
    # Если выражение истинно для всех x, выводим текущее A и завершаем перебор
    if flag:
        print(A)
        break

Ответ: 16

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!