Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
41
Добавлен:
10.02.2015
Размер:
334.79 Кб
Скачать

Вычислимость и сложность

Мубаракзянов Р. Г.

Лекции осеннего семестра 2003 г.

2

Глава 1

Введение

В этом курсе ставится задача дать студентам теоретические знания о различных моделях вычислений, научить их ориентироваться в проблемах сложности и вычислимости задач, дать им навыки сведения вычислительных проблем друг к другу для нахождения решения одной проблемы через алгоритм решения другой.

Это пособие является конспектом лекций, прочитанных осенью 2003 года студентам 4-го курса ВМК. Автор заранее приносит извинения за незавершенность и неполноту изложения. Работа по созданию пособия продолжается и автор будет благодарен за любые замечания по тексту изложения.

3

4

Глава 1. Введение

Глава 2

Вычислимость

2.1Лекция 1. Понятие алгоритма, интуитивная вычислимость

При рассмотрении тех или иных языков программмирования (Pascal, Java, C++. . . ) процесс вычисления кодируется определенным образом. Например, программа

input(n); output(n)

вычисляет f(n) = n ; программа

input(n); m := 0;

for i := 1 to n do m := m + 2; output(n)

вычисляет f(n) = 2n; программа

input(n); m := 2;

for i := 1 to n do m := m m; output(n)

вычисляет f(n) = f(n − 1)2; f(0) = 2.

Неформально говоря, программа задает алгоритм, то есть последовательность действий, определяющих по входным данным выход. Таким образом, алгоритм определяет некоторую функцию. Заметим, что кроме

5

6

Глава 2. Вычислимость

детерминированных алгоритмов, выход которых однозначно определяется по входным данным, существуют недетерминированные, вероятностные алгоритмы. Возможно и то, что для определенных входных данных значение функции, вычисляемой алгоритмом, не всегда определено. На этой лекции нас будет интересовать соотношение между классом функций и множеством алгоритмов. Попробуйте сначала (без доказательства) ответить на вопросы задания 1.1. Определяя функцию, можно задать ее через алгоритм, как это было сделано ранее. Можно описать функцию и иначе: например, fa,b(n)- n-я позиция десятичного представления дроби a/b. Нетрудно определить алгоритм ее вычисления (Сделайте это).

Как алгоритм вычисления, так и описание функции – это конечный текст. Поэтому множества вычислимых функций и функций, допускающих конечное описание, равномощны. (Докажите это. Рассмотрите также задание 1.2. ). Таким образом, на этом этапе у нас нет средств явного описания невычислимой функции. Однако, показать существование интуитивно невычислимой функции, учитывая чисто мощностные соображения, оказывается возможным. То есть можно показать, что

Теорема 1 Существует больше функций, чем алгоритмов.

Доказательство. 1. Каждый алгоритм (соответствующая вычислимая функция) описывается конечным текстом. Множество конечных текстов перечислимо (задание 1.2.1).

2.Mножество всюду определенных функций M = f : IN → [0, 1] – неперечислимо. Следующая функция b является биекцией между M и 2IN - b : M → IN, b(f) = {n|f(n) = 1}. Напомним, что функция биективна тогда и только тогда, когда она инъективна ( f 6= g b(f) 6= b(g) ) и сюръективна ( A IN f : b(f) = A).

3.Таким образом, множество M неперечислимо. Множество всех функций является надмножеством множества M и, следовательно, неперечислимо. (Докажите этот факт, используя элементарные преобразования

алгебры логики и задание 1.2.3 ).

Невычислимые функции.

Если предполагать, что все алгоритмы описываются программами, то можно описать интуитивно невычислимую функцию через программное описание алгоритмов (это не противоречит высказанному ранее утверждению о невозможности независимого явного описания невычислимой

2.2. Лекция 2. LOOP -программы

7

функции) . Можно считать, что все программы задаются в языке σ и вычисляют функции σ → σ . Тогда функция G : σ → [0, 1]; G(p) = 0, если программа p при вводе p выдает 1, в противном случае G(p) = 1 – невычислима.

Действительно, если бы существовала программа pG , вычисляющая эту функцию, то определение G(pG) было бы невозможно. Интересно, что описание алгоритма (программы) не позволяет говорить, что соответствующая функция однозначно определима. Дело в том, что не всегда удается для любых значений входа выяснить, будет ли определено значение выхода. Точнее не всегда проблема остановки (незацикливания) программы разрешима.

Проблема остановки. По-прежнему, рассмотрим программы в языке σ . Следующая функция H, называемая проблема остановки, определяется следующим образом: H : σ → [0, 1]; H(p) = 1, если программа p при вводе p останавливается , в противном случае H(p) = 0. Докажем, что H невычислима.

Пусть это не так, тогда вычислима и функция H0, определяемая следующим алгоритмом.

Input(p); t := H(p); if t = 1

then зацикливается else output(1).

Пусть pH0 вычисляет H0. Тогда, если pH0 на pH0 не останавливается, то с одной стороны H(pH0 ) = 0 и, следовательно, H0(pH0 ) = 1; с другой стороны H0(pH0 ) неопределено.

Тогда, если pH0 на pH0 останавливается, то H0(pH0 ) = 1 и, следовательно, H(pH0 ) = 0 и, следовательно, pH0 на pH0 не останавливается. В обоих случаях получаем противоречие.

Взаключение, рассмотрим примеры вычислимых функций...

2.2Лекция 2. LOOP -программы

На этой лекции будет определена один из простейших языков описания алгоритмов: LOOP -программа.

Синтаксис.

1. xi := 0 - LOOP -программа

8

Глава 2. Вычислимость

2.xi := xi + 1 - LOOP -программа

3.Если A, B - LOOP -программы, то

A; B - LOOP -программа

LOOP xi DO A END - LOOP -программа

Семантика.

1.xi := 0 - переменной xi присваивается значение 0

2.xi := xi + 1 - значение переменной xi увеличиывется на 1

3.A; B – выполняется A, потом B

4.LOOP xi DO A END - если xi = k, программа A выполняется k раз.

Рассмотрим функцию f : INt → IN. Функция f LOOP -вычислима, если существует LOOP -программа A, которая работает следующим образом. Для всех m1, m2, . . . , mt из IN, если A стартует с xi = mi, 1 ≤ i ≤ t, и xi = 0, i 6 1{, . . . , t}, то по окончании работы программы A в x0 будет содержаться f(m1, m2, . . . , mt).

Примеры.

1.Пустая программа вычисляет константу 0.

2.Функцию f(n) = n вычисляет следующая программа LOOP x1 DO x0 := x0 + 1 END

3.Функцию f(n) = n + вычисляет следующая программа

LOOP x1 DO x0 := x0 + 1 END

x0 := x0 + 1

c. . .

x0 := x0 + 1

4.Функцию f(n) = n −· 1 вычисляет следующая программа

LOOP x1 DO LOOP x2 DO

2.2. Лекция 2. LOOP -программы

9

x0 := x0 + 1

END

x2 := 0;

x2 := x2 + 1;

END

5.Функцию f(n, m) = n −· m вычисляет следующая программа x0 := x1;

LOOP x2 DO

x0 := x0 · 1

END

x2 := 0;

x2 := x2 + 1;

6.Функцию f(n, m) = n + m вычисляет следующая программа

LOOP x1 DO x0 := x0 + 1 END;

LOOP x2 DO x0 := x0 + 1 END

7.f(n, m) = |n − m| = (n − m) + (m − n)

8.Функцию sg(n) вычисляет следующая программа

LOOP x1 DO x0 := 0; x0 := x0 + 1 END

9.sg0(n) = 1 − sg(n)

10.f(n, m) = max(n, m) = m + (n − m)

LOOP -невычислимые функции.

Рассмотрим множество программ длины не более n. Каждая из них останавливается, следовательно, вычисляет некоторое натуральное число при вводе n. Пусть m - самое большее из этих чисел. Определим значение функции bbLOOP на n равным m + 1. Таким образом, bbLOOP - вычислима. Но

Теорема 2 Функция bbLOOP не является LOOP -вычислимой.

10

Глава 2. Вычислимость

Действительно, для любой LOOP -программы P , вычисляющей функцию fP , bbLOOP (|P |) > fP (|P |). Если бы существовала LOOP -программа B, вычисляющая bbLOOP , то для нее предыдущее утверждение давало бы противоречие:

bbLOOP (|B|) > fB(|B|) = bbLOOP (|B|).

Другим примером вычислимой, но не LOOP -вычислимой функции является функция Аккермана (Ackermann):

ack(0, y) = y+1; ack(x, 0) = ack(x−1, 1); ack(x, y) = ack(x−1, ack(x, y−1)).

По определению

ack(x, y) = ack(x − 1, ack(x − 1, . . . ack(x − 1, 1) . . . )),

где в правой части равенства обозначение функции ack (соотвественно закрывающих скобок) используется y + 1 раз. Если представить функцию Аккермана в виде бесконечной таблицы, в которой столбцы (строки) соответствуют значениям x (y), то элементы каждого последующего столбца определяются элементами предыдущего. Функция Аккермана растет быстрее любой LOOP -вычислимой функции.

Теорема 3 Пусть cLOOP (m) - длина самой маленькой LOOP -программы, которая на 0 вычисляет m. Функция cLOOP не является LOOP -вычислимой.

Доказательство. Пусть существует LOOP -программа B, вычисляющая cLOOP . Построим новую LOOP -программу D, в которой используется константа k, определяемая позже. Пусть c - мощность алфавита записи LOOP -программ (какова она ?). Тогда D имеет следующий вид:

x1 := ck + 1; {x1больше числа всех программ длины не болееk} x2 := 0;

LOOP x2 DO

if B(x2) > kthenx0 := x2; x2 := x2 + 1;

END

D имеет фиксированную длину, именно она и равна k. Результатом работы D является максимальный номер t такой программы среди всех программ длины не более k, что B(t) > k (длина самой маленькой программы, вычисляющей на 0 число t, больше k). Итак, D(0) = t и B(t) > k. По определению cLOOP (t) ≤ |D(0)| = k, следовательно, B не вычисляет

cLOOP .

Соседние файлы в папке теория вычислительной сложности