На числовой прямой задан отрезок . Известно, что формула
тождественно истинна при любых вещественных и
. Какую наименьшую длину может иметь отрезок
?
Аналитическое решение
Упростим выражение, раскрыв импликацию:
Красным на этом рисунке выделены области, которые перекрываются известной частью выражения, а синей те части, которые необходимо перекрыть отрезком . Так как
и
, то наименьший отрезок, которым может быть
это [-5; 5]. Так как если сделать его еще меньше, то будут точки на оси
для которых выражение не будет являться истиной. Длина этого отрезка – 10.
Решение программой
minLen = 10**10 # Наименьшая длина отрезка А
# Так как по задаче числа - вещественные,
# то будем делать перебор с точностью до 0.25.
# Для этого нужно перебирать целые числа (заранее умноженные на 4),
# а затем делить на 4. Это нужно, так как range перебирает только целые числа.
# Представим отрезок A = [a; b]
for a in range(-30, 30):
for b in range(a, 30):
ok = 1 # Создадим переменную-флаг
# Если она будет равна 1, то отрезок подходит
# Если она изменится и станет равна 0, то отрезок не подходит
# Делаем перебор x,y в пределах отрезка А
for x in range(-30*4, 30*4 + 1):
x /= 4
for y in range(-30*4, 30*4 + 1):
y /= 4
# (x принадлежит отрезку А=[a;b]) равносильно выполнению неравенства (a <= x <= b)
F = ((a <= x <= b) <= (x**2 <= 100)) and ((y**2 <= 25) <= (a <= y <= b))
if F == 0: # Если условие нарушается
ok = 0 # Изменяем переменную-флаг
break # Выходим из текущего цикла перебора y
if ok == 0: # Условие оказалось нарушено
break # Прекращаем перебор x
# Если по итогу перебора x и y
# Переменная-флаг осталась быть равна 1
if ok == 1:
# Пробуем сохранить минимальную длину
minLen = min(minLen, (b - a))
print(minLen)