Сведение по Куку задачи факторизации к языку из NP — различия между версиями
Строка 20: | Строка 20: | ||
p(n) | p(n) | ||
{ | { | ||
− | + | n' = n; | |
+ | A = {}; | ||
+ | '''for''' (b = 2; b <= n/2; b++) //''b - текущий простой делитель'' | ||
+ | { | ||
+ | '''while''' (f(n', t)) | ||
+ | { | ||
+ | n' /= b; | ||
+ | A.add(b); | ||
+ | } | ||
+ | } | ||
+ | '''return''' A; | ||
} | } | ||
</code> | </code> |
Версия 22:37, 13 марта 2010
Формулировка задачи
Задача факторизации FACTORIZE — это задача разложения натурального числа на простые множители.
Сведение задачи факторизации к языку FACTOR
Рассмотрим язык
.Используя его в качестве оракула, можно за полиномиальное время найти нетривиальные простые делители числа
.Пусть функция f разрешает язык FACTOR:
Тогда можно написать функцию p, работающую не медленнее, чем за полином, и возвращающую список A нетривиальных простых делителей n:
p(n) { n' = n; A = {}; for (b = 2; b <= n/2; b++) //b - текущий простой делитель { while (f(n', t)) { n' /= b; A.add(b); } } 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.