222 Глава 6. Основы теории сложности вычислений
При таком определении, однако, возникает один неприят-
ный эффект. Например, алгоритм 13 «Переполнение памяти
умножением», вне всякого сомнения, полиномиален, если по-
следний оператор R ← R · R понимать как вызов процедуры
умножения.
Мы уже отмечали в разделе 1.2.1, что для умножения также
существует полиномиальный алгоритм. Тем не менее, состав-
ной алгоритм 13 «Переполнение памяти умножением» непо-
линомиален, и, более того, вычисляемая им функция 2
2
t
по
очевидным причинам не принадлежит классу P. Таким обра-
зом, класс P оказывается незамкнутым относительно полино-
миальной сводимости, что, разумеется, ненормально. Понятны
и причины этого: при повторных обращениях к функциональ-
ным процедурам может происходить лавинообразный рост зна-
чений числовых параметров. Наиболее кардинальный и в то
же время общепринятый способ борьбы с этим явлением — с
самого начала ограничиться рассмотрением лишь задач разре-
шения, т. е. таких, ответ на которые имеет вид ДА/НЕТ. При
таком ограничении в полиномиальных сводимостях использу-
ются только предикатные процедуры, указанная выше пробле-
ма снимается, и класс P уже будет замкнутым относительно
полиномиальной сводимости.
Прежде чем двигаться дальше, отметим, что любую пере-
борную задачу дискретной оптимизации можно без ограниче-
ния общности заменить на переборную же задачу разрешения,
так что рассматриваемое ограничение не слишком обремени-
тельно. Мы проиллюстрируем, как осуществляется эта замена
на примере задачи 4 «TSP», хотя видно, что тот же самый
метод годится для любой задачи дискретной оптимизации.
А именно, давайте вместо нахождения минимального зна-
чения суммы (1.1) ограничимся более простым вопросом: верно
ли, что Comm(m, d) ≤ B, где Comm(m, d) — минимально воз-
можная стоимость пути коммивояжера, а B — новый числовой
параметр?