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

15.06 Смешанное

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

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

Задача 1#29732

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

Так, например, 14&5 = 1110 &0101 = 0100  = 4
           2     2      2  .

На числовой прямой дан отрезок Q = [12;48]  и множество S = {45,23,67} .

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

(¬Д ЕЛ(x,3)∧ (x∈∕S)) → ((|x− 50| ≤ 7) → (x ∈ Q ))∨ (x&A = 0)

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

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

Решение 1 (ручками):

Система для врагов:

(
||| x ||... 3
||||
|||{ x ∕∈ S
  |x− 50| ≤ 7
|||
|||| x ∕∈ Q
|||(
  x&A  ⁄= 0

Разберём мечты врагов:

1)  |x − 50| ≤ 7  , то есть x ∈ [43;57]  .

2)  x∈∕Q  , то есть x ∈ [49,57]  (объединяя с первым условием)

3)  x∈∕S  , то есть x ∈ [49,57]  (предыдущие два условия уже учли третье)

4)  x| ...| 3  , то есть x ∈ {49,50,52,53,55,56} (учитывая три предыдущих условия)

Теперь рассмотрим последнюю мечту: x&A  ⁄= 0  . Поскольку мы знаем все иксы, которые будут выбирать враги, переведём их в двоичную систему счисления:

4910 = 1100012

5010 = 1100102

5210 = 1101002

5310 = 1101012

5510 = 1101112

5610 = 1110002

Таким образом, мечты врагов такие: «Вот бы на любом из последних шести разрядов в двоичной записи у числа    A  была единичка».

Друзья говорят: «Нет, любая из последних шести цифр числа A  в двоичной записи равна нолику». Таким образом, Amin = 10000002 = 26 = 64  .

 

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

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

1. Мы определяем вспомогательную функцию inn(x, A), которая проверяет принадлежность числа x  отрезку A  .

- Функция возвращает True, если x  находится между A[0]  и A [1]  включительно, иначе False.

- Это позволяет легко проверять часть выражения (x ∈ Q)  .

2. Далее мы определяем основную функцию f(x, A), которая вычисляет логическое выражение для конкретного     x  и текущего кандидата A  .

- Внутри функции мы задаём множество S = {45,23,67} и отрезок Q = [12,48]  .

- Логическое выражение реализуем через Python:

      - проверяем, делится ли x  на 3 (x % 3 != 0)

      - проверяем, что x  не принадлежит множеству S  (not (x in S))

      - проверяем вложенное условие (|x− 50| ≤ 7) → (x ∈ Q)  через функцию inn(x, Q)

      - проверяем, выполняется ли (x&A ==  0)

- Используем логический оператор <= для импликации, так как в Python p → q  можно записать как not p or q, или используя оператор сравнения <= с логическими значениями.

3. После этого мы перебираем все возможные значения A  от 1 до 999 с помощью цикла for A in range(1, 1000).

- Для каждого A  предполагаем, что оно подходит, и создаём логический флаг flag = True.

4. Для текущего A  проверяем все значения x  от -100 до 999 (чтобы учесть отрицательные значения) с помощью цикла for x in range(-100, 1000).

- Для каждого x  вызываем функцию f(x, A).

- Если выражение ложно для хотя бы одного x  , устанавливаем flag = False и прерываем цикл, так как текущее      A  не подходит.

5. Если после проверки всех x  флаг flag остался равен True, это значит, что выражение тождественно истинно для всех x  при текущем A  .

- В этом случае выводим A  как наименьшее и прерываем внешний цикл с помощью break.

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

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

# Функция проверяет выполнение логического выражения для конкретного x и A
def f(x, A):
    # Задаем множество S и отрезок Q
    S = {45, 23, 67}
    Q = [12, 48]
    # Вычисляем логическое выражение по условию задачи
    return (((x % 3 != 0) and (not (x in S))) <=
    ((abs(x - 50) <= 7) <= (inn(x, Q))) or (x & A == 0))

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

Ответ: 64

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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