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

15.04 Побитовая конъюнкция

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

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

Задача 21#18142Максимум баллов за задание: 1

Введём выражение m&n  , обозначающее поразрядную конъюнкцию n и m (логическое «И» между соответствующими битами двоичной записи). Определите наименьшее натуральное число A  , такое что выражение

(x&41 = 0) → ((x&119 ⁄= 0) → (x&A ⁄= 0))

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

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

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

Враги хотят чтобы одновременно x&41 = 0  , x&119 ⁄= 0  , x&A = 0  .

41  = 0101001
  10         2

11910 = 11101112

Для выполнения первого условия x  должен иметь вид _ _ _ 0 _ 0 _ _ 0. На месте _ может стоять либо 0, либо 1.

Для выполнения и второго условия x  должен иметь вид _ _ * 0 * 0 * * 0. На месте хотя бы одной звездочки должна стоять единичка.

Для выполнения третьего условия единиц должно быть как можно меньше, значит x  должен иметь вид 0 0 * 0 * 0 * * 0. На месте только одной звездочки должна стоять единица.

Тогда друзья подберут такое минимальное A  чтобы x&A ⁄= 0  . Друзьям достаточно подставить единички в тех местах где они могут появиться в x  . Итоговое A = 10101102 = 86  .

 

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

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

(x&41 = 0) → ((x&119 ⁄= 0) → (x&A ⁄= 0))

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

# функция проверяет выполнение выражения для конкретного x и A
def f(a):
    # перебираем x от 1 до 999 и проверяем тождественную истинность выражения
    for x in range(1, 1000):
        if ((x & 41 == 0) <= ((x & 119 != 0) <= (x & a != 0))) == 0:
            return False
    return True

# перебор возможных значений A от 1 до 999
for a in range(1, 1000):
    # если выражение тождественно истинно для всех x, выводим A и прекращаем поиск
    if f(a):
        print(a)
        break

Ответ: 86

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

Задача 22#18143Максимум баллов за задание: 1

Введём выражение m&n  , обозначающее поразрядную конъюнкцию n и m (логическое «И» между соответствующими битами двоичной записи). Определите наибольшее натуральное число A  , такое что выражение

(((x&13 ⁄= 0)∨ (x&39 = 0)) → (x&13 ⁄= 0))∨((x&A = 0) ∧(x&13 = 0))
тождественно истинно (то есть принимает значение 1 при любом натуральном значении переменной x  )?
Показать ответ и решение

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

Враги хотят чтобы одновременно x&39 = 0  , x&13 = 0  , x&A ⁄= 0  .

13  = 001101
  10        2

3910 = 1001112

Для выполнения первого условия x  должен иметь вид _ _ _ _ 0 0 _ 0. На месте _ может стоять 1 или 0.

Для выполнения и второго условия x  должен иметь вид _ _ 0 _ 0 0 0 0.

Для выполнения третьего условия единиц в x  должно быть как можно больше. Тогда он имеет вид ...1 1 0 1 0 0 0 0.

Друзья хотят такое максимальное A  чтобы x&A  = 0  . Тогда на местах с единицами в x  будут нули, а на местах нулей будут единицы. Значит A = 1011112 = 47  .

 

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

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

(((x&13 ⁄= 0)∨ (x&39 = 0)) → (x&13 ⁄= 0))∨((x&A = 0) ∧(x&13 = 0))

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

# функция проверяет выполнение выражения для конкретного x и A
def f(a):
    # перебираем x от 1 до 999 и проверяем тождественную истинность выражения
    for x in range(1, 1000):
        if ((((x & 13 != 0) or (x & 39 == 0)) <= (x & 13 != 0)) or ((x & a == 0) and (x & 13 == 0))) == 0:
            return False
    return True

# перебор возможных значений A от 1000 до 2 включительно, сверху вниз
for a in range(1000, 1, -1):
    # если выражение тождественно истинно для всех x, выводим A и прекращаем поиск
    if f(a):
        print(a)
        break

Ответ: 47

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

Задача 23#20051Максимум баллов за задание: 1

Введём выражение M &K,  обозначающее поразрядную конъюнкцию M  и K  (логическое «И» между соответствующими битами двоичной записи). Определите наименьшее неотрицательное число A  , такое что выражение

(x&25 ⁄= 0) → ((x&17 = 0) → (x&A ⁄= 0))

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

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

Для нахождения наименьшего неотрицательного числа A  , при котором выражение

(x&25 ⁄= 0) → ((x&17 = 0) → (x&A ⁄= 0))

тождественно истинно для всех натуральных x  , используем программный перебор. Идея заключается в том, чтобы проверить все значения A  от 0 до 9999. Для каждого A  перебираем все значения x  от 0 до 999 и проверяем выполнение выражения. Если хотя бы для одного x  выражение ложно, текущее A  отбрасываем. Если выражение истинно для всех проверяемых x  , выводим это A  как минимальное подходящее и прекращаем поиск.

# функция проверяет выполнение выражения для конкретного x и A
def f(x, A):
    # возвращает True, если выражение тождественно истинно для данного x
    return (x & 25 != 0) <= ((x & 17 == 0) <= (x & A != 0))

# перебор возможных значений A от 0 до 9999
for A in range(10000):
    # флаг: True, если выражение ложно хотя бы для одного x
    met_false = False
    for x in range(1000):
        # если выражение ложно для текущего x, ставим флаг
        if not(f(x, A)):
            met_false = True
    # если выражение истинно для всех x, выводим A и завершаем поиск
    if not(met_false):
        print(A)
        break

Ответ: 8

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

Задача 24#20052Максимум баллов за задание: 1

Введём выражение M & K, обозначающее поразрядную конъюнкцию M и K (логическое «И» между соответствующими битами двоичной записи). Определите наименьшее натуральное число a, такое что выражение

((x&28 ⁄= 0)∨ (x&45 ⁄= 0)) → ((x&48 = 0) → (x&a ⁄= 0))

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

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

Для нахождения наименьшего натурального числа a  , при котором выражение

((x&28 ⁄= 0)∨ (x&45 ⁄= 0)) → ((x&48 = 0) → (x&a ⁄= 0))

тождественно истинно для всех натуральных x  , используем программный перебор. Идея заключается в том, чтобы проверить все значения a  от 0 до 9999. Для каждого a  перебираем все значения x  от 0 до 999 и проверяем выполнение выражения. Если хотя бы для одного x  выражение ложно, текущее a  отбрасываем. Если выражение истинно для всех проверяемых x  , выводим это a  как минимальное подходящее и прекращаем поиск.

# функция проверяет выполнение выражения для конкретного x и A
def f(x, A):
    # возвращает True, если выражение тождественно истинно для данного x
    return ((x & 28 != 0) or (x & 45 != 0)) <= ((x & 48 == 0) <= (x & A != 0))

# перебор возможных значений A от 0 до 9999
for A in range(10000):
    # флаг: True, если выражение ложно хотя бы для одного x
    met_false = False
    for x in range(1000):
        # если выражение ложно для текущего x, ставим флаг
        if not(f(x, A)):
            met_false = True
    # если выражение истинно для всех x, выводим A и завершаем поиск
    if not(met_false):
        print(A)
        break

Ответ: 13

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

Задача 25#22655Максимум баллов за задание: 1

Обозначим через a&b  поразрядную конъюнкцию неотрицательных целых чисел a и b.

Так, например, 16&18 = 100002&100102 = 1610.

Для какого наименьшего неотрицательного целого числа А формула

(x&144 = 0) → (x&220 ⁄= 0 → x&A ⁄= 0)

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

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

Для нахождения наименьшего неотрицательного числа A  , при котором выражение

(x&144 = 0) → (x&220 ⁄= 0 → x&A ⁄= 0)

тождественно истинно для всех неотрицательных x  , используем программный перебор. Идея заключается в том, чтобы проверить все значения A  от 0 до 999. Для каждого A  перебираем все значения x  от 1 до 999 и проверяем выполнение выражения. Если хотя бы для одного x  выражение ложно, текущее A  отбрасываем. Если выражение истинно для всех проверяемых x  , выводим это A  как минимальное подходящее и завершаем поиск.

# функция проверяет выполнение выражения для конкретного x и a
def f(a):
    # возвращает True, если выражение тождественно истинно для данного x
    for x in range(1, 1000):
        if ((x & 144 == 0) <= ((x & 220 != 0) <= (x & a != 0))) == 0:
            return False
    return True

# перебор возможных значений a от 0 до 999
for a in range(1000):
    # если выражение истинно для всех x, выводим a и прекращаем поиск
    if f(a):
        print(a)
        break

Ответ: 76

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

Задача 26#22895Максимум баллов за задание: 1

Определите наибольшее натуральное число A из интервала [10, 50] такое, что выражение

(((x&56  ⁄= 0) →  (x&18  ⁄= 0)) ∨ (x &A ⁄= 0)) → ((x&18  = 0 ) ∧ (x&A =  0) ∧ (x&43 ⁄= 0))
тождественно ложно (то есть принимает значение 0 при любом натуральном значении переменной x)?
Показать ответ и решение

Для нахождения наибольшего числа A  из интервала [10,50]  , при котором выражение

(((x&56 ⁄= 0) → (x&18 ⁄= 0))∨ (x&A ⁄= 0)) → ((x&18 = 0)∧ (x&A = 0) ∧(x&43 ⁄= 0))

тождественно ложно для всех натуральных x  , используем программный перебор. Идея заключается в том, чтобы проверить все значения A  из заданного интервала. Для каждого A  перебираем значения x  от 0 до 99999 и проверяем, принимает ли выражение значение 1. Если хотя бы для одного x  выражение истинно, A  не подходит. Если же выражение равно 0 для всех x  , обновляем текущее максимальное A  . В конце цикла получаем наибольшее подходящее A  .

# перебор возможных значений A от 10 до 50 включительно
for A in range(10, 50+1):
    # флаг: True - выражение ложно для всех x, False - хотя бы один случай нарушает
    flag = True
    # проверяем выражение для всех x от 0 до 99999
    for x in range(100000):
        f = (((x & 56 != 0) <= (x & 18 != 0)) or (x & A != 0)) <= (
            (x & 18 == 0) and (x & A == 0) and (x & 43 != 0))
        # если выражение оказалось истинным хотя бы для одного x
        if f == 1:
            flag = False
            break
    # если выражение ложно для всех x, обновляем максимальное значение A
    if flag:
        maxim = A

# выводим наибольшее подходящее A
print(maxim)

Ответ: 47

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

Задача 27#23189Максимум баллов за задание: 1

Введём выражение M &K  , обозначающее поразрядную конъюнкцию M  и K  (логическое «И» между соответствующими битами двоичной записи). Определите наименьшее натуральное число a  , такое что выражение

(x &27 ⁄= 0) → ((x&83 = 0) → (x&a ⁄= 0))

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

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

Решение аналитически

Для начала упростим данное выражение:

----------  ----------
(x&27 ⁄= 0)∨ ((x&83 = 0)∨(x&a ⁄= 0))

(x&27 = 0)∨ (x&83 ⁄= 0)∨(x&a ⁄= 0)

Отделим скобками известную часть выражения от части с A  :

((x&27 = 0)∨ (x&83 ⁄= 0))∨ (x&a ⁄= 0)

Сделаем отрицание известной части, чтобы найти те значения x  , которые будут давать истину для отрицания. Тогда они будут обязаны выполняться для условия с A  : ((x&a  ⁄= 0)

(x&27 ⁄= 0) ∧(x&83 = 0)

Выпишем поразрядную конъюнкцию (x&83 = 0)  :

  1010011
  xxxxxxx
----------
  x0x00xx

Значит для истинности отрицания числа x  должны в двоичном виде принимать вид ...0x0xx00  , где x – любая цифра.

Теперь выпишем поразрядную конъюнкцию (x &27 ⁄= 0)  с учётом известных цифр в числах x  :

     11011
   0x0xx00
-----------
 ...000b000

Условие (x&27 ⁄= 0)  выполнится, если хотя бы одна цифра на месте b  будет равна 1. Значит в числах x  обязательно должна быть единица в 3 разряде. Выпишем числа x  , которые дают истину для отрицания известной части: 1000  .

Для всех таких чисел x  должно быть истинным условие (x&a ⁄= 0)  . Значит, двоичная запись числа a  обязательно должна иметь вид ...xx1xxx  , чтобы при поразрядной конъюнкции с любым числом x  получался в результате хотя бы один разряд 1. Значит наименьшее число a  имеет значение 10002 = 810  . Ответ 8  .

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

Для нахождения наименьшего натурального числа a  , при котором выражение

(x &27 ⁄= 0) → ((x&83 = 0) → (x&a ⁄= 0))

тождественно истинно для всех натуральных x  , используем программный перебор. Идея заключается в том, чтобы проверить все значения a  от 1 до 999. Для каждого a  перебираем все x  от 1 до 999 и вычисляем логическое выражение, используя поразрядное «И». Если хотя бы для одного x  выражение ложно, текущее a  отбрасываем. Если выражение истинно для всех x  , останавливаем перебор и получаем минимальное подходящее a  .

# функция проверяет выполнение выражения для конкретного a и всех x
def f(a):
    for x in range(1, 1000):
        # если выражение ложно для текущего x, возвращаем False
        if ((x & 27 != 0) <= ((x & 83 == 0) <= (x & a != 0))) == 0:
            return False
    # если для всех x выражение истинно, возвращаем True
    return True

# перебор возможных значений a от 1 до 999
for a in range(1, 1000):
    # если текущий a удовлетворяет условию, выводим его и прекращаем поиск
    if f(a):
        print(a)
        break

Ответ: 8

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

Задача 28#24416Максимум баллов за задание: 1

Введём выражение M &K,  обозначающее поразрядную конъюнкцию M  и K  (логическое «И» между соответствующими битами двоичной записи). Определите наименьшее натуральное число a  , такое что выражение

(x &125 ⁄= 1)∨ ((x&34 = 2) → (x&a = 0))

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

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

Для нахождения наименьшего натурального числа a  , при котором выражение

(x &125 ⁄= 1)∨ ((x&34 = 2) → (x&a = 0))

тождественно истинно для всех натуральных x  , используем программный перебор. Идея заключается в том, чтобы проверить все значения a  от 1 до 999. Для каждого a  перебираем все x  от 1 до 999 и вычисляем логическое выражение, используя поразрядное «И». Если хотя бы для одного x  выражение ложно, текущее a  отбрасываем. Если выражение истинно для всех x  , останавливаем перебор и получаем минимальное подходящее a  .

# функция проверяет выполнение выражения для конкретного a и всех x
def f(a):
    for x in range(1, 1000):
        # если выражение ложно для текущего x, возвращаем False
        if ((x & 125 != 1) or ((x & 34 == 2) <= (x & a == 0))) == 0:
            return False
    # если для всех x выражение истинно, возвращаем True
    return True

# перебор возможных значений a от 1 до 999
for a in range(1, 1000):
    # если текущий a удовлетворяет условию, выводим его и прекращаем поиск
    if f(a):
        print(a)
        break

Ответ: 4

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

Задача 29#25907Максимум баллов за задание: 1

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

(x&A = 0)∧ (x&58 ⁄= 0)∧ (x &22 = 0)

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

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

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

(x&A = 0)∧ (x&58 ⁄= 0)∧ (x &22 = 0)

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

# функция проверяет выполнение выражения для конкретного x и A
def f(x, a):
    # возвращает True, если выражение истинно для данного x и A
    return ((x & a == 0) and (x & 58 != 0) and (x & 22 == 0))

# перебор возможных значений A от 1 до 999
for a in range(1, 1000):
    # если для всех x от 1 до 99 выражение ложно, выводим A и прекращаем поиск
    if all(f(x, a) == False for x in range(1, 100)):
        print(a)
        break

Ответ: 40

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

Задача 30#29362Максимум баллов за задание: 1

Введём выражение M &K  , обозначающее поразрядную конъюнкцию M  и K  (логическое «И» между соответствующими битами двоичной записи). Определите наибольшее натуральное число A  , меньшее 1000  , при котором выражение

(x&A ⁄= 0)∧ (x&48 = 0)∧ (x &27 = 0)

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

 

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

Для нахождения наибольшего числа A < 1000  , при котором выражение

(x&A ⁄= 0)∧ (x&48 = 0)∧ (x &27 = 0)

тождественно ложно для всех натуральных x  , используем программный перебор. Идея заключается в том, чтобы проверить значения A  в обратном порядке от 999 до 2. Для каждого A  перебираем x  от 1 до 999 и проверяем истинность логического выражения. Если выражение истинно хотя бы для одного x  , текущее A  не подходит. Если выражение ложно для всех x  , выводим этот A  как наибольшее подходящее и прекращаем перебор.

# перебор возможных значений A от 999 до 2 включительно
for A in range(1000, 1, -1):
    # флаг: True - выражение ложно для всех x, False - хотя бы один случай нарушает
    p = True
    # проверяем выражение для всех x от 1 до 999
    for x in range(1, 1000):
        f = (x & A != 0) and (x & 48 == 0) and (x & 27 == 0)
        # если выражение оказалось истинным хотя бы для одного x
        if f == True:
            p = False
            break
    # если выражение ложно для всех x, выводим текущее A и прекращаем перебор
    if p == True:
        print(A)
        break

Ответ: 59

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

Задача 31#29712Максимум баллов за задание: 1

Обозначим через m&n  поразрядную конъюнкцию неотрицательных целых чисел m  и n  .

Для какого наименьшего целого числа A  формула

(x&38 = 0) → ((x&55 ⁄= 0) → (x&A ⁄= 0))

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

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

Для начала упростим данное выражение:

(x&38 = 0) → ((x&55 ⁄= 0) → (x&A ⁄= 0))

Раскроем импликации:

----------   ----------
(x&38 = 0)∨ ((x&55 ⁄= 0) ∨(x&A  ⁄= 0))

(x&38 ⁄= 0)∨ (x&55 = 0) ∨(x&A  ⁄= 0)

Отделим скобками известную часть выражения от части с A  :

((x&38 ⁄= 0)∨ (x&55 = 0))∨ (x&A ⁄= 0)

Сделаем отрицание известной части, чтобы найти те значения x  , которые будут давать истину для отрицания. Тогда они будут обязаны выполняться для условия с A  : (x&A ⁄= 0)

(x&38 = 0) ∧(x&55 ⁄= 0)

Выпишем поразрядную конъюнкцию (x&38 = 0)  :

  100110

-xxxxxx--
 x00xx0

Значит для истинности отрицания числа x  должны в двоичном виде принимать вид ...xx0xx00x  , где x – любая цифра.

Теперь выпишем поразрядную конъюнкцию (x &55 ⁄= 0)  с учётом известных цифр в числах x  :

  00110111
-xx0xx00x--
  000a000a

Условие x&55 ⁄= 0  выполнится, если хотя бы одна цифра на месте a будет равна 1. Значит в числах x  обязательно должна быть единица в 0 разряде или в 4 разряде. Выпишем числа x  , которые дают истину для отрицания известной части: 10000,00001,10001  Для всех таких чисел x  должно быть истинным условие (x&A  ⁄= 0)  . Значит, двоичная запись числа A  обязательно должна иметь вид ...xx1xxx1  , чтобы при поразрядной конъюнкции с любым числом x  получался в результате хотя бы один разряд 1. Значит наименьшее число A  имеет значение 100012 = 1710  . Ответ 17  .

Программное решение

Для нахождения наименьшего целого числа A  , при котором выражение

(x&38 = 0) → ((x&55 ⁄= 0) → (x&A ⁄= 0))

тождественно истинно для всех неотрицательных x  , используем программный перебор. Идея заключается в том, чтобы проверить все значения A  от 0 до 999. Для каждого A  перебираем x  от 0 до 9999 и проверяем выполнение логической формулы. Если формула ложна хотя бы для одного x  , текущее A  отбрасываем. Если формула истинна для всех   x  , выводим этот A  как наименьшее подходящее и прекращаем перебор.

# перебор возможных значений A от 0 до 999 включительно
for a in range(1000):
    # флаг: True - выражение выполняется для всех x, False - хотя бы один случай нарушает
    flag = True
    # проверяем выражение для всех x от 0 до 9999
    for x in range(10000):
        # проверка выполнения формулы для конкретного x и a
        if ((x & 38 == 0) <= ((x & 55 != 0) <= (x & a != 0))) == False:
            flag = False
            break
    # если выражение выполняется для всех x, выводим текущее a и прекращаем перебор
    if flag == True:
        print(a)
        break

Ответ: 17

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

Задача 32#29713Максимум баллов за задание: 1

Обозначим через m&n  поразрядную конъюнкцию неотрицательных целых чисел m  и n  .

Так, например, 14&5 = 11102&01012 = 01002 = 4  .

Для какого наибольшего целого числа A  формула

(x&A  ⁄= 0) → ((x&25 = 0) → (x&17 ⁄= 0))

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

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

Решение аналитически

Для начала упростим данное выражение:

---------   ----------
(x&A  ⁄= 0)∨((x&25 = 0)∨ (x &17 ⁄= 0))

(x&A = 0)∨ (x&25 ⁄= 0)∨ (x &17 ⁄= 0)

Отделим скобками известную часть выражения от части с A  :

(x&A  = 0)∨((x&25 ⁄= 0)∨ (x &17 ⁄= 0))

Сделаем отрицание известной части, чтобы найти те значения x  , которые будут давать истину для отрицания.

(x&17 = 0) ∧(x&25 = 0)

Выпишем поразрядную конъюнкцию (x&17 = 0)  :

 10001
 xxxxx
--------
 x000x

Значит для истинности отрицания числа x  должны в двоичном виде принимать вид ...x0xxx0  , где x – любая цифра.

Теперь выпишем поразрядную конъюнкцию (x &25 = 0)  с учётом известных цифр в числах x  :

  011001
 x0xxx0
---------
  00b000

Условие (x&25 = 0)  выполнится, если на месте b  будет стоять 0. Значит в числах x  обязательно должен быть ноль в 4 разряде. Тогда, все x  , которые дают истину для отрицания известной части имеют вид: ...0x00xx0  .

Для всех таких чисел x  должно быть истинным условие (x&A = 0)  . Значит, двоичная запись числа A  обязательно должна иметь вид xx00x  , чтобы при поразрядной конъюнкции с любым числом x  все разряды были нулями.

Тогда, чтобы найти наибольшее значение A  , подставим на место x единицы: A = 11001 = 25
         2    10  .  

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

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

(x&A  ⁄= 0) → ((x&25 = 0) → (x&17 ⁄= 0))

тождественно истинно для всех неотрицательных x  , используем программный перебор. Идея заключается в том, чтобы проверить все значения A  от 1000 вниз до 1. Для каждого A  перебираем x  от 0 до 999 и проверяем выполнение логической формулы. Если формула ложна хотя бы для одного x  , текущее A  отбрасываем. Если формула истинна для всех x  , выводим этот A  как наибольшее подходящее и прекращаем перебор.

# функция проверяет выполнение формулы для конкретного A
def f(a):
    # перебираем все значения x от 0 до 999
    for x in range(1000):
        # проверяем истинность формулы для текущего x и a
        if ((x & a != 0) <= ((x & 25 == 0) <= (x & 17 != 0))) == 0:
            return False
    return True

# перебор возможных значений A от 1000 до 1 включительно
for a in range(1000, 0, -1):
    # если формула выполняется для всех x, выводим A и прекращаем перебор
    if f(a):
        print(a)
        break

Ответ: 25

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

Задача 33#29714Максимум баллов за задание: 1

Обозначим через m&n  поразрядную конъюнкцию неотрицательных целых чисел m  и n  .

Так, например, 14&5 = 11102&01012 = 01002 = 4  .

Для какого наибольшего целого числа A  формула

---------
(x&A  ⁄= 0)∨ (x&74 = 0 → x&65 ⁄= 0)

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

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

Решение аналитически

Для начала упростим данное выражение раскрыв импликацию и отрицание:

---------   ----------
(x&A  ⁄= 0)∨((x&74 = 0)∨ (x &65 ⁄= 0))

(x&A = 0)∨ (x&74 ⁄= 0)∨ (x &65 ⁄= 0)

Отделим скобками известную часть выражения от части с A  :

(x&A  = 0)∨((x&74 ⁄= 0)∨ (x &65 ⁄= 0))

Сделаем отрицание известной части, чтобы найти те значения x  , которые будут давать истину для отрицания.

(x&74 = 0) ∧(x&65 = 0)

Выпишем поразрядную конъюнкцию (x&65 = 0)  :

 1000001
 xxxxxxx
----------
 x00000x

Значит для истинности отрицания числа x  должны в двоичном виде принимать вид ...x0xxxxx0  , где x – любая цифра.

Теперь выпишем поразрядную конъюнкцию (x &74 = 0)  с учётом известных цифр в числах x  :

  1001010
  0xxxxx0
----------
  000b0b0

Условие (x&65 = 0)  выполнится, если на месте b  будет стоять 0. Значит в числах x  обязательно должен быть ноль в 1 и 3 разряде. Тогда, все x  , которые дают истину для отрицания известной части имеют вид: ...x0xx0x00  .

Для всех таких чисел x  должно быть истинным условие (x&A  = 0)  . Значит, двоичная запись числа A  обязательно должна иметь вид x00x0xx  , чтобы при поразрядной конъюнкции с любым числом x  все разряды были нулями.

Тогда, чтобы найти наибольшее значение A  , подставим на место x единицы: A = 1001011 = 75
           2    10  .

 

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

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

(x&A--⁄=-0)∨ (x&74 = 0 → x&65 ⁄= 0)

тождественно истинно для всех неотрицательных x  , используем программный перебор. Идея заключается в том, чтобы проверить все значения A  от 1000 вниз до 1. Для каждого A  перебираем x  от 0 до 999 и проверяем выполнение логической формулы. Если формула ложна хотя бы для одного x  , текущее A  отбрасываем. Если формула истинна для всех x  , выводим этот A  как наибольшее подходящее и прекращаем перебор.

# функция проверяет выполнение формулы для конкретного A
def f(a):
    # перебираем все значения x от 0 до 999
    for x in range(1000):
        # проверяем истинность формулы для текущего x и a
        if ((x & a == 0) or ((x & 74 == 0) <= (x & 65 != 0))) == 0:
            return False
    return True

# перебор возможных значений A от 1000 до 1 включительно
for a in range(1000, 0, -1):
    # если формула выполняется для всех x, выводим A и прекращаем перебор
    if f(a):
        print(a)
        break

Ответ: 75

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

Задача 34#29715Максимум баллов за задание: 1

Обозначим через m&n  поразрядную конъюнкцию неотрицательных целых чисел m  и n  .

Так, например, 14&5 = 11102&01012 = 01002 = 4  .

Для какого наибольшего целого числа A  формула

¬(x&A ⁄= 0) ∨¬ (x&122 = 0)∨ (x&144 ⁄= 0)

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

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

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

Для начала упростим данное выражение:

¬(x&A ⁄= 0) ∨¬ (x&122 = 0)∨ (x&144 ⁄= 0)

Раскроем отрицания:

(x&A = 0) ∨(x&122 ⁄= 0)∨ (x &144 ⁄= 0)

Отделим скобками известную часть выражения от части с A  :

(x&A  = 0)∨((x&122 ⁄= 0)∨ (x &144 ⁄= 0))

Сделаем отрицание известной части, чтобы найти те значения x  , которые будут давать истину для отрицания. Тогда они будут обязаны выполняться для условия с A  : (x&A = 0)

(x &122 = 0) ∧(x&144 = 0)

Выпишем поразрядную конъюнкцию (x&122 = 0)  :

  01111010
 xxxxxxxx
-----------
 0xxxx0x0

Значит для истинности отрицания числа x  должны в двоичном виде принимать вид ...xx0000x0x  , где x – любая цифра.

Теперь выпишем поразрядную конъюнкцию (x &144 = 0)  с учётом известных цифр в числах x  :

  10010000
  x0000x0x
-----------
  a0000000

Условие (x&144 = 0)  выполнится, если цифра a будет равна 0. Значит двоичная запись чисел x  , которые делают отрицание истинным, имеет следующий вид: ..xx00000x0x  , где x - любая цифра. Чтобы условие условие (x&A = 0)  было истинным нужно, чтобы двоичная запись числа A  имела вид ..00xxxxx0x0  . Тогда при поразрядной конъюнкции с любым числом x  в результате будет 0. Значит наибольшее число A  имеет значение 111110102 = 25010  . Ответ 250  .

Программное решение

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

¬(x&A ⁄= 0) ∨¬ (x&122 = 0)∨ (x&144 ⁄= 0)

тождественно истинно для всех неотрицательных x  , используем программный перебор. Идея заключается в том, чтобы проверить все значения A  от 0 до 999. Для каждого A  перебираем все значения x  от 0 до 9999 и проверяем истинность формулы. Если хотя бы для одного x  формула ложна, текущее A  отбрасываем. Если формула истинна для всех x  , обновляем максимум и продолжаем перебор. В конце выводим наибольшее подходящее A  .

# переменная для хранения наибольшего подходящего A
ans = 0

# перебор возможных значений A от 0 до 999
for a in range(1000):
    # флаг: True - формула выполняется для всех x, False - хотя бы один случай нарушает
    flag = True
    # перебор всех значений x от 0 до 9999
    for x in range(10000):
        # проверка истинности формулы для текущего x и a
        if ((not (x & a != 0)) or (not (x & 122 == 0)) or (x & 144 != 0)) == False:
            flag = False
            break
    # если формула выполняется для всех x, обновляем максимум
    if flag == True:
        ans = max(ans, a)

# выводим наибольшее подходящее A
print(ans)

Ответ: 250

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

Задача 35#29716Максимум баллов за задание: 1

Обозначим через m&n  поразрядную конъюнкцию неотрицательных целых чисел m  и n  .

Так, например, 14&5 = 11102&01012 = 01002 = 4  .

Для какого наименьшего неотрицательного целого числа A  формула

((x&35 ⁄= 0)∨ (x &23 ⁄= 0)) → ((x&26 = 0)∨ (x&A ⁄= 0))

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

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

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

Для нахождения наименьшего неотрицательного числа A  , при котором выражение

((x&35 ⁄= 0)∨ (x &23 ⁄= 0)) → ((x&26 = 0)∨ (x&A ⁄= 0))

тождественно истинно для всех неотрицательных x  , используем программный перебор. Идея заключается в том, чтобы проверить все значения A  от 0 до 299. Для каждого A  перебираем все значения x  от 0 до 299 и проверяем истинность формулы. Если хотя бы для одного x  формула ложна, текущее A  отбрасываем. Если формула истинна для всех   x  , фиксируем найденное минимальное A  и прекращаем перебор. В конце выводим наименьшее подходящее A  .

# функция проверяет выполнение формулы для конкретного x и a
def f(x, a):
    return ((x & 35 != 0) or (x & 23 != 0)) <= ((x & 26 == 0) or (x & a != 0))

# перебор возможных значений A от 0 до 299
for a in range(0, 300):
    # флаг: True - формула выполняется для всех x, False - хотя бы один случай нарушает
    p = True
    # перебор всех значений x от 0 до 299
    for x in range(0, 300):
        # проверка истинности формулы для текущего x и a
        if f(x, a) == False:
            p = False
            break
    # если формула выполняется для всех x, выводим найденное минимальное A и прекращаем поиск
    if p == True:
        print(a)
        break

Ответ: 26

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

Задача 36#33873Максимум баллов за задание: 1

Обозначим через m & n  поразрядную конъюнкцию неотрицательных целых чисел m  и n  . Например, 14 & 5 = 11102 & 01012 = 01002 = 4  .

Для какого наименьшего целого числа A  формула

(x & 85 = 0) → (x & 54 ⁄= 0 → x & A ⁄= 0)

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

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

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

Для нахождения наименьшего целого числа A  , при котором выражение

(x&85 = 0) → (x&54 ⁄= 0 → x&A ⁄= 0)

тождественно истинно для всех неотрицательных x  , используем программный перебор. Идея заключается в том, чтобы проверить все значения A  от 0  до 999  . Для каждого A  перебираем все значения x  от 0  до 999  и проверяем истинность формулы. Если хотя бы для одного x  формула ложна, текущее A  отбрасываем. Если формула истинна для всех x  , фиксируем найденное минимальное A  и прекращаем перебор. В конце выводим наименьшее подходящее A  .

# функция проверяет выполнение формулы для конкретного x и a
def f(a):
    # если отрицание формулы возвращает истину,
    # то сама формула возвращает ложь
    for x in range(1000):
        if not((x & 85 == 0) <= ((x & 54 != 0) <= (x & a != 0))):
            return False
    return True

# перебор возможных значений A от 0 до 999
for a in range(1000):
    # проверяем, выполняется ли формула для всех x
    if f(a):
        # если выполняется, выводим найденное минимальное A и прекращаем поиск
        print(a)
        break

Ответ: 34

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

Задача 37#33874Максимум баллов за задание: 1

Обозначим через m & n  поразрядную конъюнкцию неотрицательных целых чисел m  и n  . Например, 14 & 5 = 11102 & 01012 = 01002 = 4  .

Для какого наименьшего целого числа A  формула

(x & 105 = 0) → ((x & 58 ⁄= 0) → (x & A ⁄= 0))

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

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

Для нахождения наименьшего целого числа A  , при котором выражение

(x&105 = 0) → ((x&58 ⁄= 0) → (x&A ⁄= 0))

тождественно истинно для всех неотрицательных x  , используем программный перебор. Идея заключается в том, чтобы проверить все значения A  от 0  до 999  . Для каждого A  перебираем все значения x  от 0  до 999  и вычисляем логическое выражение формулы. Если хотя бы для одного x  формула ложна, текущее A  отбрасываем. Если формула истинна для всех x  , фиксируем найденное минимальное A  и прекращаем перебор. В конце выводим наименьшее подходящее A  .

# перебор возможных значений A от 0 до 999
for A in range(1000):
    # флаг: True - формула выполняется для всех x, False - хотя бы один x нарушает
    p = True
    for x in range(1000):
        # проверка истинности формулы для текущего x и A
        f = (x & 105 == 0) <= ((x & 58 != 0) <= (x & A != 0))
        # если формула ложна для текущего x
        if f == False:
            p = False
            break
    # если формула выполняется для всех x, выводим A и прекращаем поиск
    if p == True:
        print(A)
        break

Ответ: 18

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

Задача 38#39302Максимум баллов за задание: 1

Обозначим через m&n  поразрядную конъюнкцию неотрицательных целых чисел m  и n  .

Так, например, 14&5 = 11102&01012 = 01002 = 4  .

Для какого наименьшего натурального числа A  формула

((x&35 ⁄= 0)∨ (x &23 ⁄= 0)) → ((x&26 ⁄= 0)∨ (x&A = 0))

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

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

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

Для начала упростим данное выражение раскрыв импликацию и отрицания:

((x&35 = 0)∧ (x&23 = 0))∨ (x&26 ⁄= 0)∨ (x &A = 0)

Разделим известную часть и выражения с A  :

(((x&35 = 0)∧ (x&23 = 0))∨ (x&26 ⁄= 0))∨(x&A  = 0)

Сделаем отрицание известной части, чтобы найти те значения x  , которые будут давать истину для отрицания.

Тогда они будут обязаны выполняться для условия с A  : (x&A  = 0)

((x&35 ⁄= 0)∨(x&23 ⁄= 0))∧ (x &26 = 0)

Выпишем поразрядную конъюнкцию x&26 = 0  :

  11010

--xxxxx-
  xx0x0

Значит для истинности отрицания числа x  должны в двоичном виде принимать вид ...xx00x0x  , где x – любая цифра.

Теперь выпишем поразрядные конъюнкции ((x&35 ⁄= 0)∨ (x&23 ⁄= 0))  с учётом известных цифр в числах x  :

x&23

 10111

-00x0x--
 00x0x

Условие x&23 ⁄= 0  выполнится, если хотя бы одна цифра на месте x будет равна 1. Выпишем числа x  , которые дают истину для отрицания известной части: 001

100
101

x&35

  100011
 x00x0x
---------
  x0000x

Условие x&35 ⁄= 0  выполнится, если хотя бы одна цифра на месте x будет равна 1. Выпишем числа x  , которые дают истину для отрицания известной части: 000001
000101

100000
100001
100100
100101

После объединения чисел x  из предыдущего пункта получаем весь список x  которые дают истину отрицания известной части: 1,100,101,100000,100001,100100,100101  .

Для этих чисел x  должно быть истинным условие (x&A = 0)  . Значит, в числе A  обязательно должны быть нули в двоичном виде на разрядах 0, 2 и 5 при нумерации с 0 справа налево. Так как число A  натурально, то все нули в нем стоять не могут, поэтому поставим 1 на самый правый доступный разряд. Значит наименьшее число A  имеет значение 102 = 210  . Ответ 2.  

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

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

((x&35 ⁄= 0)∨ (x &23 ⁄= 0)) → ((x&26 ⁄= 0)∨ (x&A = 0))

тождественно истинно для всех неотрицательных x  , используем программный перебор. Идея заключается в том, чтобы проверить все значения A  от 1  до 299  . Для каждого A  перебираем все значения x  от 0  до 299  и вычисляем логическое выражение формулы. Если хотя бы для одного x  формула ложна, текущее A  отбрасываем. Если формула истинна для всех x  , фиксируем найденное минимальное A  и прекращаем перебор. В конце выводим наименьшее подходящее A  .

# функция проверяет выполнение формулы для конкретного x и A
def f(x, a):
    return ((x & 35 != 0) or (x & 23 != 0)) <= ((x & 26 != 0) or (x & a == 0))

# перебор возможных значений A от 1 до 299
for a in range(1, 300):
    # флаг: True - формула выполняется для всех x, False - хотя бы один x нарушает
    p = True
    for x in range(0, 300):
        # проверка истинности формулы для текущего x и A
        if f(x, a) == False:
            p = False
            break
    # если формула выполняется для всех x, выводим A и прекращаем поиск
    if p == True:
        print(a)
        break

Ответ: 2

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

Задача 39#51793Максимум баллов за задание: 1

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

(X &10 ⁄= 0)∨ (X &39 = 0)∨ (X&A  = 0)

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

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

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

Преобразуем выражение по законам алгебры логики:

X-+ Y + Z = X → (Y + Z) = (X  → Y )+ (X  → Z )

((X&10 = 0) → (X&39 = 0))∨ ((X &10 = 0) → (X &A  = 0))

Заметим, что первое слагаемое логической суммы является импликацией Z10 →  Z39  , которая не является истинной для всех x  . Тогда необходимо и достаточно, чтобы второе слагаемое логической суммы было тождественно истинным.

Итак, импликация Z10 → ZA  должна быть тождественно истиной. Запишем число 10 в двоичной системе счисления: 10  = 1010
  10      2

Единичные биты, стоящие в правой части, должны являться единичными битами левой. Поэтому в правой части единичными битами независимо друг от друга могут быть (а могут и не быть) только первый и третий биты (считая справа налево, начиная с нуля). Поскольку искомое А – наибольшее натуральное число, все биты, которые могут быть единичными будут единичными.

Тем самым, наибольшее A = 10102 = 1010  .

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

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

(X &10 ⁄= 0)∨ (X &39 = 0)∨ (X&A  = 0)

тождественно истинно для всех натуральных X  , используем программный перебор. Идея заключается в том, чтобы проверить все значения A  от 1  до 999  . Для каждого A  перебираем все значения X  от 1  до 999  и вычисляем логическое выражение формулы. Если хотя бы для одного X  формула ложна, текущее A  отбрасываем. Если формула истинна для всех X  , фиксируем найденное A  . В конце перебора максимальное подходящее A  и будет ответом.

# перебор возможных значений A от 1 до 999
for a in range(1, 1000):
    # флаг: True - формула выполняется для всех X, False - хотя бы один X нарушает
    flag = True
    for x in range(1, 1000):
        # проверка истинности формулы для текущего X и A
        if ((x & 10 != 0) or (x & 39 == 0) or (x & a == 0)) == False:
            flag = False
            break
    # если формула выполняется для всех X, выводим A
    if flag:
        print(a)

Ответ: 10

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

Задача 40#51794Максимум баллов за задание: 1

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

((X &13 ⁄= 0)∨(X &13 = 0)) → ((X&A ⁄= 0)∨ (X &39 = 0))

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

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

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

Упростим выражение, раскрыв импликацию:

((X &13 = 0)∧ (X&13 ⁄= 0))∨ ((X &A  ⁄= 0) ∨(X &39 = 0))

Преобразуем выражение по законам алгебры логики:

(X &39 = 0)∨ (X&A  ⁄= 0)

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

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

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

((X &13 ⁄= 0)∨(X &13 = 0)) → ((X&A ⁄= 0)∨ (X &39 = 0))

тождественно истинно для всех натуральных X  , используем программный перебор. Идея заключается в том, чтобы проверить все значения A  от 1  до 999  . Для каждого A  перебираем все значения X  от 1  до 999  и вычисляем логическое выражение формулы. Если хотя бы для одного X  формула ложна, текущее A  отбрасываем. Если формула истинна для всех X  , фиксируем найденное A  и прерываем цикл, так как ищем наименьшее значение.

# перебор возможных значений A от 1 до 999
for a in range(1, 1000):
    # флаг: True - формула выполняется для всех X, False - хотя бы один X нарушает
    flag = True
    for x in range(1, 1000):
        # проверка истинности формулы для текущего X и A
        if (((x & 13 != 0) or (x & 13 == 0)) <= ((x & a != 0) or (x & 39 == 0))) == False:
            flag = False
            break
    # если формула выполняется для всех X, выводим наименьшее подходящее A и прерываем цикл
    if flag:
        print(a)
        break

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