Сведение по Куку задачи факторизации к языку из NP
Версия от 16:36, 19 марта 2010; Anastasia.agapova (обсуждение | вклад)
Формулировка задачи
Задача факторизации FACTORIZE — это задача разложения натурального числа на простые множители.
Сведение задачи факторизации к языку FACTOR
Рассмотрим язык
.Используя его в качестве оракула, можно за полиномиальное время найти простые делители числа
.Пусть функция f разрешает язык FACTOR:
Тогда, воспользовавшись двоичным поиском, можно написать функцию p, работающую за полином от длины входа и возвращающую список A простых делителей n:
p(n) { n' = n; A = {}; while (n' > 1) { if (!f(n', n')) //если число простое - добавляем его в список делителей и завершаем цикл { A.add(n'); n' = 1; break; } r = n'; l = 2; while (r > l + 1) //находим наименьший простой делитель { c = (l + r) / 2; if (f(n', c)) r = c; else l = c; } A.add(l); n' = n' / l; } return A; }
Принадлежность языка FACTOR классу NP
.
Сертификатом y является нетривиальный делитель числа n, а верификатором - функция, которая проверяет, является ли y делителем n и меньше ли он числа x:
R(<n, x>, y) { if ((y >= x) || (y <= 1)) return false; if (n % y != 0) return false; return true; }
Таким образом, задача FACTORIZE сводится по Куку за полиномиальное время к языку FACTOR, принадлежащему классу NP.