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

15.06 Смешанное

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

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

Задача 1#29734

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

На числовой прямой дан промежуток A  и множество S = {23,27,45,46,47,67} .

Определите максимальную длину промежутка A  , такого что его правая граница не больше 50  и выражение

                                                                -------
((¬Д ЕЛ(x,3)∧ (y ∕∈ S)) → ((x > 7) → (y > 11)))∨ (x⋅y ≤ 76)∨(x ∕∈ A)∨ (y ∈ A)

тождественно истинно, то есть принимает значение 1  при любых натуральных значениях переменных x  , y  .

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

Решение аналитикой

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

(
||| x ||... 3
||||
|||| y ∕∈ S
|||| x > 7
|{
| y ≤ 11
||||
|||| x⋅y > 76
|||| x ∈ A
|||(
  y ∈ A

Враги мечтают, чтобы x > 7  , y ≤ 11  и x ⋅y > 76  . Тогда при xmin = 8  единственные y  , которые смогут взять враги, чтобы условие x⋅y > 76  выполнялось, будут равны 10  и 11  . Заметит, что при увеличении x  враги смогут брать больше вариантов y  , но всегда максимальное значение ymax = 11  . Все натуральные y <= ymax  не принадлежат S  , значит условие y ∕∈ S  автоматически выполнено. Мечты врагов такие: «Вот бы y ∈ A  ».

Друзья говорят: «Нет, y ∕∈ A  ». Тогда при условии, что правая граница отрезка A  не больше 50  , Amax = (11,50]  (чтобы даже ymax ∕∈ A  ), а его максимальная длина равна 50 − 11 = 39  .

 

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

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

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

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

2. Мы создаём функцию f(x, y, A), которая вычисляет логическое выражение для конкретной пары (x,y)  и заданного промежутка A  :

- Множество S  задаём как S = {23, 27, 45, 46, 47, 67}.

- Проверяем условие:

      - если x  не делится на 3 и y∈∕S  , тогда x > 7  влечёт y > 11  ,

      - либо x ⋅y ≤ 76  ,

      - либо x  не в A  ,

      - либо y  не в A  .

- Все эти условия объединяем логическим or, чтобы получить итоговое значение функции.

3. Для поиска максимальной длины промежутка используем масштабирование, чтобы работать с дробными значениями промежутка:

- Задаём n = 5 — делитель для дробного шага.

- Переменная ans хранит текущую максимальную длину промежутка.

4. Перебор всех возможных промежутков:

- Цикл for a in range(1 * n, 50 * n) перебирает левую границу a  с шагом 1∕n  .

- Цикл for b in range(a, 50 * n + 1) перебирает правую границу b  так, чтобы b ≥ a  .

- Промежуток A  задаём как A = [a / n, b / n].

- Для каждого промежутка устанавливаем flag = True, предполагая, что промежуток подходит.

5. Проверка логического выражения для всех x  и y  в разумных диапазонах:

- Внешний цикл for x in range(1, 100) перебирает x  .

- Внутренний цикл for y in range(1, 15) перебирает y  .

- Если выражение f(x, y, A) ложно, устанавливаем flag = False и прерываем внутренний цикл.

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

6. Если после всех проверок flag = True, обновляем ans, используя ans = max(ans, A[1] - A[0]).

7. В конце выводим максимальную найденную длину промежутка A  .

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

# Функция вычисляет логическое выражение для x, y и A
def f(x, y, A):
    S = {23, 27, 45, 46, 47, 67}
    return (((x % 3 != 0) and (not y in S)) <= ((x > 7) <= (y > 11))) \
        or (x * y <= 76) or (not inn(x, A)) or (not inn(y, A))

# Масштабирование для дробного шага
n = 5
# Переменная для хранения максимальной длины промежутка
ans = 0

# Перебор возможных левых границ промежутка
for a in range(1 * n, 50 * n):
    # Перебор возможных правых границ промежутка
    for b in range(a, 50 * n + 1):  # +1 чтобы проверить саму точку b
        # Задаём промежуток A
        A = [a / n, b / n]
        # Предполагаем, что промежуток подходит
        flag = True
        # Проверяем все x от 1 до 99
        for x in range(1, 100):
            # Проверяем все y от 1 до 14
            for y in range(1, 15):
                # Если выражение ложно для текущих x и y
                if not f(x, y, A):
                    # Устанавливаем флаг в False
                    flag = False
                    # Прерываем цикл по y
                    break
            # Если флаг False, прерываем цикл по x
            if not flag:
                break
        # Если выражение истинно для всех x и y, обновляем максимальную длину
        if flag:
                                                                                                     
                                                                                                     
            ans = max(ans, A[1] - A[0])
# Выводим максимальную длину подходящего промежутка
print(ans)

Ответ: 39

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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