Изменения

Перейти к: навигация, поиск
Нет описания правки
{{ Определение
|definition=<tex>\mathrm{A} \in \mathrm{NLC} \Leftrightarrow \mathrm{A} \in \mathrm{NL}</tex> и <tex>\forall \mathrm{B} \in \mathrm{NL} </tex> верно, что <tex>\mathrm{B} \leq_{\widetilde{L}} \mathrm{A}</tex>.
}}
 
{{ Теорема
| statement = <tex>\mathrm{A} \leq_{\widetilde{L}} \mathrm{B}</tex> и <tex>\mathrm{B} \in \mathrm{L} \Rightarrow \mathrm{A} \in \mathrm{L}</tex>.
| proof = По определению <tex>\mathrm{\widetilde{L}}</tex>-сводимости <tex>\exists f \in \widetilde{L} : x \in \mathrm{A} \Leftrightarrow f(x) \in \mathrm{B}</tex>. Просто выполнить <tex>f(x)</tex> и передать результат в качестве ввода МТ для <tex>\mathrm{B}</tex> нельзя, так как для этого требуется <tex>\Omega(n)</tex> дополнительной памяти. Поэтому будем хранить только позицию <tex>i</tex> головки МТ для <tex>\mathrm{B}</tex> на входной ленте (в двоичной записи это требует <tex>O(\log n)</tex> памяти), и вычислять <tex>i</tex>-ый бит <tex>f(x)</tex> при необходимости обращения к нему путём исполнения <tex>f(x)</tex> без записи результата целиком. Таким образом построим МТ для <tex>\mathrm{A}</tex>, удовлетворяющую определению.
}}
Алгоритм:
#Начиная с вершины <tex> s </tex> недетерминированно переходим в одну из вершин, смежных с ней. (Очевидно, для этого необходимо конечное число <tex> O(1) </tex> переменных).#Проверяем, правда ли, что текущая вершина совпадает с <tex> t </tex>. Если это так, возвращает возвращаем TRUE.#Отдельно считаем количество пройденных вершин. Как только это число превышает превысило количество вершин в графе, возвращаем FALSE, так как посетили некоторую вершину дважды.
Таким образом в каждый момент алгоритму достаточно хранить текущую вершину, количество посещенных вершин, финальную вершину <tex> t </tex> и некоторое число вспомогательных переменных, для совершения переходов. Все эти переменные принимают значения не более, чем максимальный номер вершины, то есть как раз занимают <tex> O(\log n) </tex> памяти.
Теперь докажем, что любая задача из класса <tex>\mathrm{NL}</tex> сводится к задаче <tex>\mathrm{CONN}</tex> с использованием не более чем логарифмической памяти.
Очевидно, что для любого слова из языка <tex>L</tex>, то есть принимаемого данной машиной Тьюринга, будет существовать путь из <tex> s </tex> в <tex> t </tex> в построенном графе <tex> G </tex>. А если для некоторого слова не из <tex>L</tex> в <tex> G </tex> существует путь из <tex> s </tex> в <tex> t </tex>, то он соответствует некоторой корректной последовательности переходов в изначальной машине, таким образом слово должно было приниматься этой недетерминированной машиной.
Такое построение графа <tex> G </tex> по данной машине Тьюринга можно выполнить с использованием конечного числа <tex> O(1) </tex> переменных, которые будут перебирать всевозможные мгновенные состояния машины (их <tex> O(poly(n)) </tex>, потому переменная, перебирающая его занимает <tex> O(\log n) </tex> памяти), переходов из него и проверки возможности перехода.
}}
editor
143
правки

Навигация