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

15.06 Смешанное

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

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

Задача 1#57873

Пусть на числовой прямой дан отрезок B = [35;65]  . Обозначим через ДЕЛ(n, m) утверждение «натуральное число n делится без остатка на натуральное число m». Для какого наибольшего натурального числа А формула

(x ∈ B ) −→ (¬ ДЕЛ(x,21)∨ ДЕЛ(x,A ))

тождественно истинна (т.е. принимает значение 1) при любом натуральном значении переменной х?

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

Решение руками:

Сначала проанализируем высказывание целиком. Дана импликация, она дает 0 только в том случае, когда из 1 следует 0. Определим, когда левая часть высказывания дает 1 – когда x  принадлежит отрезку [35;65]  . Значит, все эти иксы должны давать 1 в левой части.

Рассмотрим левую для x ∈ [35;65]  : высказывание ¬ ДЕЛ(x,21)  дает истину для всех x  отрезка, кроме x = 42  и x = 63  , следовательно, нужно подобрать такое A  , которое будет давать истину в высказываниии ДЕЛ(x,A)  для этих двух значений.

Чтобы найти такое наибольшее A  нужно определить наибольший общий делитель чисел 42 и 63. Это число 21.

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

Для того чтобы найти наибольшее значение A  , при котором выражение

(x ∈ B) − → (¬Д ЕЛ(x,21)∨ ДЕ Л(x,A))

тождественно истинно для всех x ∈ ℕ  , мы используем перебор.

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

1. Сначала мы формируем список всех чисел, входящих в отрезок B = [35;65]  , то есть от 35 до 65 включительно. Для этого применяем генератор списка [i for i in range(35, 66)], где функция range(35, 66) создаёт числа от 35 до 65.

2. Далее мы запускаем цикл for a in range(100, 1, -1), который перебирает все целые числа A  от 100 до 2 включительно в порядке убывания. Мы начинаем с больших значений A  , чтобы при первой же полной проверке найти максимально возможное.

3. Внутри цикла для каждого a  мы создаём переменную-флаг f = 0, которая отвечает за то, корректно ли выполняется условие для данного A  . Если флаг изменится на 1, значит, найдено нарушение.

4. Дальше мы перебираем переменную x  в диапазоне range(1, 300), то есть от 1 до 299. В этом цикле мы проверяем для каждого x  , выполняется ли логическое выражение:

- условие (x ∈ B)  проверяется с помощью (x in b),

- условие ¬ДЕ Л(x,21)  проверяется через x % 21 != 0, так как операция % возвращает остаток от деления, и если остаток не равен 0, то число не делится,

- условие ДЕ Л(x,A)  проверяется через x % a == 0, то есть остаток от деления равен нулю.

Таким образом, вся проверка реализована как (x in b) <= (x % 21 != 0 or x % a == 0). Здесь символ <= играет роль импликации: если x in b истинно, то должно выполняться хотя бы одно из условий справа.

5. Если для какого-то x  выражение оказалось ложным, то есть результат сравнения равен False, мы присваиваем f = 1 и прерываем цикл. Это означает, что данное a  не подходит.

6. Если после полного перебора всех x  флаг f остался равным 0, значит, выражение истинно для всех x  . Тогда мы печатаем текущее значение a  и прерываем цикл, так как оно гарантированно является наибольшим подходящим A  .

Таким образом, программа методом перебора проверяет все кандидаты на A  и выбирает максимальный из них.

# формируем список чисел из отрезка [35; 65]
b = [i for i in range(35, 66)]

# перебираем кандидаты для A от 100 до 2 (включительно), в обратном порядке
for a in range(100, 1, -1):
    # флаг: 0 - условие выполняется для всех x, 1 - найдено нарушение
    f = 0
    # перебор значений x от 1 до 299
    for x in range(1, 300):
        # проверка импликации: (x in B) -> (x не делится на 21 или x делится на A)
        if ((x in b) <= (x % 21 != 0 or x % a == 0)) == False:
            # если найдено нарушение, ставим флаг = 1 и прерываем цикл
            f = 1
            break
    # если для данного a не было нарушений, выводим результат и останавливаем программу
    if f == 0:
        print(a)
        break

Ответ: 21

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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