- •Практикум Теория алгоритмов и сложность вычислений.
- •0 Иначе
- •0 Иначе
- •0 Иначе
- •0 Иначе
- •5. Целая часть от деления аргумента X на y
- •6. Остаток от деления аргумента X на y
- •7. Число различных делителей X (включая число 1)
- •1. Экспонента числа px в числе y
- •2. Квадратичный остаток числа X
- •3. Нумерация пар чисел
Практикум Теория алгоритмов и сложность вычислений.
Семинар 1
Машина Тьюринга. Теория.
В общем случае имеется лента, бесконечная в обе стороны. На лекции показана эквивалентность такой ленты и ленты, бесконечной в одном направлении. На основе последних и решаются все задачи в курсе.
Есть устройство, с помощью которого мы можем писать на ленту, читать с ленты и перемещаться по ленте.
σ |
t |
d |
e |
r |
t |
m |
λ |
λ |
A
Внешний алфавит a, b, c, 0, 1, 2…
σ - начальный символ
L H R λ - пустой символ
R
Aa-->bB L команда машины Внутренний алфавит A, B, C…
H So – начальное состояние
Ω – конечное состояние
Конфигурация машины
Если машина находится в конфигурации Aa, то, в соответствии с данной командой, она напишет на ленте b, перейдет в состояние B и переедет вправо, влево или останется на месте.
Набор таких команд – программа.
Итак, имеем ленту, бесконечную только в одну сторону. Начальный символ всегда σ, все пустые ячейки заполнены символом λ. Начальное состояние всегда So.
Первая строка программы всегда должна иметь вид:
Soσσ??
Окончание программы: ???ΩH
Машина Тьюринга позволяет решить любую алгоритмически разрешимую задачу.
Пожелание: для унификации всех нотаций при написании алгоритмов разными группами давайте все придерживаться следующей схемы (порядка символов в команде)
S0σ->σRA
Aa->bRB
Ac->bLB
Ad->bHB
Aλ->сHΩ
Жирным выделены зарезервированные символы (начальные состояние и символ, конечное состояние и пустой символ). Считается что:
Начальный символ трогать нельзя, он должен быть строго один на ленте
Пустых символов бесконечно много, и если такой символ появился – далее слово считается законченным.
Начальное состояние S0 можно использовать и как рабочее, т.е. смена состояния в первой строке должна производиться только по необходимости.
Если по каким то причинам задачу решить нельзя (не задано слово и т.д.), то машина должна закончить работу в состоянии Ω` (далее в скобках необходимо написать примечание, почему решения нет)
Общие критерии оценки программ:
Минимизация суммы: кол-во строк+кол-во новых состояний+кол-во новых символов на ленте.
и / или
Время работы при входном слове размерности n
Задачи к рассмотрению на первом семинаре
Алфавит {0,1}. Поставить в конце слова символ «1».
Алфавит {0,1}. Поставить в конце слова символ, который является первым символом слова.
Алфавит {0,1}. Поставить в конце слова символ, который является последним символом слова. Рассмотреть и сравнить два решения:
-идем до конца слова, возврат на шаг назад, запоминаем и копируем символ
-идем по слову, постоянно перезаписывая в память считанный только что символ пока не дойдем до конца слова – там его сразу печатаем.
Алфавит {0,1,2}. Найти в слове все последовательности {102} и заменить их на {***}. Рассмотреть и сравнить два решения:
-идем по слову, по ходу меняя состояния фиксируем нахождение {102}, «2» меняем на *, возвращаемся к «1», меняем ее, и далее к «0». Затем перешагиваем через * и бредем дальше.
-идем по слову, по ходу меняя состояния фиксируем нахождение {102}, «2» меняем на *, назад пока не возвращаемся, идем дальше. Когда слово кончится один раз возвращаемся назад и после каждой встреченной * ставим еще **.
5. Алфавит унарный. Дано число n (закодировано n+1 палочкой). Найти значение функции f(n)=n÷2, результат записать вместо входного слова. (÷ псевдоразность). Внимание: ноль кодируется одной палочкой.
Задача 1.
Есть слово в алфавите {0,1}. Нужно написать ''1'' в конце слова.
SoσσSoR
So11SoR
So00SoR
Soλ1ΩH
Задача 2.
Есть слово в алфавите {0,1}. Нужно написать 1-ый символ слова в конце слова.
SoσσSoR
So11A1R
So00AoR
SoλλΩh //пустое слово//
A111A1R
A100A1R
A1λ1ΩH
Ao11AoR
Ao00AoR
Aoλ0ΩH
Задача 3.
Есть слово в алфавите {0,1}. Нужно написать в конце слова последний символ.
Два варианта решения 1) Доходим до конца слова и возвращаемся назад
2) Каждый раз запоминаем результат
SoσσSoR
So11SoR
So00SoR
SoλλAL //A – дошли до конца слова//
A00BR
A11CR
AλλΩH //Слова нет//
Bλ0ΩH
Cλ1ΩH
SoσσSoR (A1 – нашли 1, A0 – нашли 0)
So11A1R
So00AoR
SoλλΩH //Слова нет//
A111A1R
A100AoR
A1λ1ΩH
Ao11A1R
Ao00AoR
Aoλ0ΩH
Задача 4.
Дан алфавит {0,1,2}. Нужно пройтись по слову и все последовательности 012 заменить на звездочки. 012***
SoσσSoR
So00AoR
So11SoR
So22SoR
SoλλΩH
Ao100AoR
Ao111SoR
Ao12*BL
Ao1λλΩH
Ao00AoR
Ao11Ao1R
Ao22SoR
AoλλΩH
B1*BL
B0*SoR
So**SoR
Задача 5.
Дано число n в унарном коде. Найти псевдоразность n-2.
Унарный код:
׀ “0”
׀׀ “1”
׀׀׀ “2”
n “n-1”
n-2, если n>=2
Псевдоразность: n-2=
0, если n<2
SoσσSoR
So11SoR
SoλλAL
A1λA1L
AσσΩH //Слова нет//
A11λA2L
A1σσBR
Bλ1ΩH
A211ΩH
A2σσBR
Семинар 2
Машины Тьюринга (продолжение). Копирование слов.
Задача 1.
Копирование слова в прямом порядке после *
Задача 2.
Копирование слова в прямом порядке без *
Задача 3.
Копирование слова в обратном порядке без *
SoσσSoR
SoaaSoR
SobbSoR //идем до конца слова//
SoλλCL // С-запись символа который необходимо скопировать//
Caa`AR
Cbb`BR
CσσΩH
AaaAR
AbbAR
BaaBR
BbbBR
AλaDL
BλbDL
DaaDL
DbbDL
Da`aCL
Db`bCL
Задача 4.
Копирование слова в обратном порядке после *
Задача 5.
Копирование слова в обратном порядке вместо слова
SoσσSoR
Soaa`AR
Sobb`BR
SoλλΩH
AaaAR
AbbAR
BaaBR
BbbBR
AλλA1L
BλλB1L
A1aa``A2L
A1ba``B2L
B1ab``A2L
B1bb``B2L
A2aaA2L
A2bbA2L
B2aaB2L
B2bbB2L
A2a`aSoR
A2b`aSoR
B2a`bSoR
B2b`bSoR
Aa``aA1L
Ab``bA1L
Ba``aB1L
Bb``bB1L
A1a`aΩH
A1b`bΩH
B1a`aΩH
B1b`bΩH
Задача 6.
Определить, является ли слово палиндромом.
Задача 7.
На ленте в унарном коде записана разность чисел а и б. Числа разделены знаком -
σ |
׀ |
׀ |
׀ |
- |
׀ |
λ |
λ |
λ |
Нужно вместо разности написать результат.
SoσσSoR
So11SoR
So--AR
A11`BL
AλλCL
B--BL
B11`SoR
B1`1`BL
BσσDR
A1`1`AR
So1`1`SoR
C1`λCL
C-λCL
C11ΩH
D1`λDR
D- λDR
D1 λDR
DλλΩH
CσσΩH
Рекомендованная задача для решения дома:
На ленте задано в унарном коде число n, вместо исходного слова написать на ленте 2*n+3.
Семинар 3
Машины Тьюринга (окончание). Анализ слов
Задача 1
Алфавит {0,1}. Определить, каких символов в слове больше: ноликов или единиц. Если больше единичек, то в конце слова поставить символ «+», если больше ноликов – в конце слова поставить символ «-». Если символов равное количество – знак «=».
Решение:
В принципе есть два пути решения:
Первый: помечать какой то определенный символ и потом искать ему пару среди непомеченных альтернатив.
Второй: после слова затеять подсчет встреченных символов, постепенно уничтожая уже нарисованные значки если встречается альтернативный символ.
Контрольная работа №1
Плановое время строго не более 50 минут.
Семинар 4
Многоленточные машины Тьюринга.
Теория: принципы работы многоленточных машин Тьюринга
Основное:
Управляющие головки на каждой из лент двигаются независимо.
Внутреннее состояние у машины – единое. Это св-во самой машины, а не управляющих головок и лент.
Как и ранее, способ записи программ для многоленточных машин – дело вкуса и договоренностей. Далее в тексте будет использоваться следующий порядок записи
Si{a,b,c}→{a',b',c'} Sj {R,L,H} Sj
Задача 1.
Алфавит {0,1}. Машина двухленточная. Дано слово, оно записано на первой ленте. Скопировать это слово на вторую ленту в обратном порядке.
Задача 2.
Алфавит {0,1}. Машина трехленточная. Даны два числа в двоичном коде, они записаны на первой и второй ленте соотв. Считается, что слова записаны нормально: т.е. оба слово всегда есть и начинаются они с единицы (исключение только для числа ноль). Определить чему равна сумма этих двух чисел и результат записать на третью ленту.
Важно: в ходе сложения возможно выяснится, что разрядов не хватает – тогда надо будет сдвинуть результат на одну клетку вправо для записи первой единицы.
Задача 3.
Алфавит унарный. Машина трехленточная. Даны два числа в унарном коде, они записаны на первой и второй ленте соотв. Определить чему равно произведение этих двух чисел и результат записать на третью ленту.
Семинар 5
Алгоритмы Маркова. Теория.
Основная операция при работе алгоритмов Маркова – это переработка слов в некотором алфавите. Эта переработка заключается в производстве некоторого количества замен определенных последовательностей символов. Эти замены совершаются в СТРОГО определенном порядке, а именно: после каждой замены алгоритм читается с самого начала, а слово анализируется с самого первого символа. В отличие от машин Тьюринга, алгоритмы Маркова выполняются без какого – либо устройства, осуществляющего движения и имеющего внутреннюю память. В данном случае мы можем оперировать только ленточными знаками. Сама лента в этом случае не разделяется на строгие ячейки, а имеет гибкую основу, что позволяет ей растягиваться и сжиматься исходя из того, увеличивается ли в слове число символов или уменьшается.
Формат команды (строки) следующий
{ai} {bj} [•],
где
{ai} – последовательность символов, которая ищется в слове
- знак перехода к операции записи
{bj} - последовательность символов, которая записывается вместо найденной
[•] - знак принудительного окончания алгоритма (необязательный параметр)
Программа (алгоритм) представляет собой совокупность строк указанного вида, причем порядок строк имеет важнейшее значение. Окончание работы алгоритма происходит в тот момент, когда выполняется строка, содержащая знак принудительной остановки, либо тогда, когда более ни одна строка не может быть выполнена (в слове нет ни одной из искомых последовательностей символов).
Например, алгоритм, состоящий из одной строки, вида
0 *
будучи примененным к слову в алфавите {0,1}, заменит все нули на звездочки.
В свою очередь алгоритм
0 * •
будучи примененным к слову в алфавите {0,1}, заменит на звездочку первый встреченный ноль.
Довольно сложная для реализации на машинах Тьюринга задача сортировки слова по возрастанию, допустим в алфавите {0,1,2}, решается при помощи Маркова весьма изящно:
20 02
10 01
21 12
Некоторые задачи переработки слов нельзя решить без расширения алфавита.
Например, дано произвольное двоичное слово. Надо убрать из него два первых знака.
Рассмотрим алгоритм вида:
00 •
01 •
10 •
11 •
Если в слове случайно первыми двумя символами были нули (например, «001011»), то алгоритм действительно выполнит указанную задачу. Также работа закончится успешно, если в слове ни разу не встретилось два нуля подряд, а первыми символами оказалась пара 01 (например, «01011101»). Но в слове 1100101 выбросятся два нуля, которые вовсе не являются первыми символами слова. В этом случае существующий алфавит надо расширить вспомогательными буквами, которых нет в начальном слове и которые появляются в ходе вычисления. По сути, это некоторые аналоги внутренней памяти (состояний машин Тьюринга). Они вводятся с помощью формулы λ α (α – вспомогательная буква) или, что более корректно, пары формул
λ 0 α 0
λ 1 α 1
Применив такие продукции к слову λ 1100101 λ получим:
λ α 1100101 λ
Дальше мы «тащим» эту букву по слову вправо, стирая и отсчитывая символы
(стерли первый):
α 0 β
α 1 β
(стерли второй):
β 0 •
β 1 •
Однако если мы расположит эти строки в обычном порядке, а именно:
λ 0 α 0
λ 1 α 1
α 0 β
α 1 β
β 0 •
β 1 •
алгоритм будет работать совсем не так, как хотелось бы. В частности вся его деятельность будет сводиться к созданию бесконечно большого числа символов α поочередно со стиранием символов слова. Это связано с тем, что после выполнения каждой замены управление передается снова первой строке, а слово анализируется с левого символа. Поэтому чаще всего алгоритм пишется как бы «снизу-вверх», т.е. в самом начале ставятся строки, относящиеся к группе «окончание алгоритма», далее «тело программы» и в самом низу блок «инициализация», которая будет выполняться только однажды, а затем управление перейдет к более ранним строкам.
Правильный алгоритм выглядит следующим образом.
β 0 •
β 1 •
α 0 β
α 1 β
λ 0 α 0
λ 1 α 1
Ту же самую задачу можно решить и использовав всего один дополнительный символ:
α00 •
α01 •
α10 •
α11 •
α0 •
α1 •
λ 0 α 0
λ 1 α 1
Задачи к решению на семинаре
Задача 1.
Алфавит {0,1} Переработать произвольное слово в 0.
Задача 2.
Алфавит {0,1} Удвоить все символы в слове.
Задача 3.
Алфавит {0,1} Удалить каждый третий символ
Задача 4.
Алфавит {0,1} Поставить в конце слова + если в нем есть хотя бы один ноль и – если это не так
Задача 5.
Алфавит {0,1} Переработать слово в + если в нем есть хотя бы два нуля (неважно расположены они рядом или нет) и в – если это не так (т.е. исходное слово удаляется)
Задача 6.
Алфавит {0,1} Поставить в конце слова +, если в нем рядом встречаются хотя бы два нуля (т.е. они соседние) и в - если это не так.
Задача 7.
Алфавит {0,1} Переработать произвольное слово в +, если в нем рядом встречаются точно два нуля (т.е. они соседние) и больше нулей в слове нет и в - если это не так.
СЕМИНАР 6
Алгоритмы Маркова (продолжение). Вычисления в унарном коде.
Алфавит {0,1}
Задача 1.
Скопировать слово в прямом порядке после слова.
Задача 2.
Вычислить сумму двух натуральных чисел в унарном коде. Результат записать вместо слова.
Задача 3.
Вычислить псевдоразность двух натуральных чисел в унарном коде. Результат записать вместо слова.
Задача 4.
Вычислить разность двух натуральных чисел в унарном коде. Результат записать вместо слова.
Задача 5.
Вычислить остаток от деления двух натуральных чисел в унарном коде. Результат записать вместо слова.
Задача 6.
Вычислить целую часть от деления двух натуральных чисел в унарном коде. Результат записать вместо слова.
Задача 7.
Подсчитать количество символов 0. Результат записать после слова в унарном коде.
СЕМИНАР 7
Алгоритмы Маркова (окончание). Анализ слов.
Задача 1.
Определить – каких символов 0 или 1 в слове больше. Если больше нулей – поставить в конце +, если больше 1 – поставить -. Если поровну – поставить в конце =.
Контрольная работа №2
Плановое время строго не более 50 минут.
СЕМИНАР 8
Тест №1
Темы, затрагиваемые тестом
-машины Тьюринга
-алгоритмы Маркова
-теоремы Шеннона
-алгоритмически неразрешимые проблемы (останова, печати и т.д.)
-числовые множества: мощность, счетность, эффективная перечислимость.
СЕМИНАР 9
Плановое время для переписывания к/р №№1 и 2
Работа над ошибками теста №1
Подготовка к тесту №2
СЕМИНАР 10
Тест №2
Темы, затрагиваемые тестом
- для множеств АФ, ЧАФ, ВАФ, ВЧАФ вопросы мощности, эффективной перечислимости, счетности
-для произвольных функций вопросы принадлежности к множествам АФ, ЧАФ, ВАФ, ВЧАФ
-вопросы распознаваемости классов функций друг в друге
-вопросы поиска области определенности заданных функций
-определения АФ, ЧАФ, ВАФ, ВЧАФ
-формулировки основных теорем (Тьюринга, Черча, сопутствующих)
СЕМИНАР 11
Примитивная рекурсивность функций.
1. Сумма
Доказано на лекции
2. Произведение
f(x,y)=xy
f(0,y)=0y=0=C01(y)= C01
f(x’,y) =(x+1)y=xy+y=f(x,y) +y=(f(x,y),y)=(U13,U33)=S23(,U13,U33)
Ответ: f(x,y)= R2[C01, S23(,U13,U33)].
3. Факториал
Доказано на лекции
4. Псевдоразность
x-y если x≥y
f(x,y)=x y=