- •Содержание курса “Теория алгоритмов и вычислительных процессов”
- •I. Теория алгоритмов
- •Основные понятия теории алгоритмов
- •1.1. Предварительные сведения
- •1.2. Основные требования к алгоритмам
- •1.3. Необходимость математического понятия алгоритма
- •2. Типы алгоритмов
- •3. Способы представления (описания) алгоритмов
- •3.1. Исполнитель алгоритма
- •3.2. Строчная словесная запись алгоритма
- •3.3. Графическая форма записи
- •3.4. Управляющие структуры
- •4. Описание задачи и выбор алгоритма
- •5. Универсальные алгоритмические модели
- •Понятие конструктивного объекта
- •Понятие об алфавитных алгоритмах
- •5.3. Формализация понятия “алгоритм”
- •5.4. Схема построения алгоритмической системы
- •6. Рекурсивные функции
- •6.1. Примитивно-рекурсивные функции
- •6.1.1. Оператор суперпозиции (подстановки)
- •6.1.2. Оператор примитивной рекурсии
- •6.2. Частично-рекурсивные функции
- •Пример 6.2.2. Рассмотрим функцию
- •6.3. Тезис Черча
- •7. Машины Тьюринга (Поста)
- •7.1. Основные понятия машин Тьюринга
- •7.2. Способы представления машины Тьюринга
- •7.2.1. Представление машины Тьюринга совокупностью команд
- •7.2.2. Представление машины Тьюринга графом
- •7.2.3. Представление машины Тьюринга таблицей соответствия
- •7.3. Примеры построения машин Тьюринга
- •Вычислимость по Тьюрингу
- •7.5. Некоторые операции над машиной Тьюринга
- •7.5.1. Композиция машин Тьюринга
- •7.5.2. Итерация машины Тьюринга
- •7.5.3. Разветвление машин Тьюринга
- •7.4. Универсальная машина Тьюринга
- •7.5. Тезис Тьюринга
- •7.6. Машина Поста
- •9. Алгоритмическая разрешимость. Алгоритмические проблемы
- •10. Сложность алгоритмов и вычислений
- •Анализ скорости выполнения алгоритмов
- •Память или время
- •Временнáя сложность алгоритма
- •Оценка с точностью до порядка
- •Определение сложности
- •Сложность рекурсивных алгоритмов
- •Средний и наихудший случай
- •Общие функции оценки сложности
- •Скорость работы алгоритма в реальных условиях
- •19.5. Труднорешаемые задачи
6.1.1. Оператор суперпозиции (подстановки)
Определение 6.1.2. Оператором суперпозиции Snm называется подстановка в функцию от n переменных f(x1,…,xn ) n функций f1(x1,…, xm),…,fn(x1,…, xm) одних и тех же m переменных.
Рассмотрим n + 1 функций из F – n-местную функцию f и n m-местных функций f1,…,fn.
Говорят, что m-местную частичную функцию g(x1,…,xm) можно получить вследствие операций суперпозиции или подстановки (Sn+1m) из функций fn,f1m,…,fnm, если для любого из x1,…,xm N; gm(x1,…,xm) = fn(f1m(x1,…,xm ),…,fnm(x1,…,xm )).
Эта операция дает возможность вместо аргументов xi (i = 1,…,n) функции f подставлять некоторые заданные функции fj (j = 1,...,m) и получать новую вычислимую функцию g. Например, для функций
f(x1,…,xn), f1(x1,…,xm),…, fn(x1,…,xm) имеем
Sn+1m(f,f1,…,fn) = f(f1(x1,…,xm),…,fn(x1,…,xm)) = g(x1,…,xm),
где нижний индекс при S обозначает количество функций, подставляемых в качестве аргументов.
Оператор суперпозиции – это оператор построения сложной функции. Если мы умеем вычислять функции f1(x1,…,xm),…, fn(x1,…,xm) и f(x1,…,xn), то функция gm также может быть вычислена. Ясно также, что если все функции f, f1, …, fn всюду определены, то и функция g также всюду определена. Значения функции Sn+1m(f,f1,…,fn) могут быть получены последовательным вычислением значений функций f1m,…,fnm на некотором наборе значений переменных а1,…,аm, и вычислением значения функции fn на наборе значений f1m(а1,…,аm),…,fnm(а1,…,аm).
Таким образом, если функции f, f1, …, fn интуитивно вычислимы, то будет интуитивно вычислимой и функция g.
Например, осуществляя операцию суперпозиции функций f(x) = x+1 и f1(x) = 0, получим функцию: g(x) = f(f1(x)) = 0 + 1 = 1. При суперпозиции функции f(x) с этой же функцией получим g(x) = f(f(x)) = x + 2.
Пример 6.1.1. С помощью оператора суперпозиции можно получить любую константу S(S( …(О(x)) …)) = n, где число вложенных функций следования равно n.
Или сдвига числа на константу n, также равную числу вложенных функций следования: S(S( …(S(x)) …)) = x + n.
Пример 6.1.2. Найти значение S3(I22,I11,О). В этом случае конечная функция будет двуместной (n = 3 - 1 =2), следовательно, g(x1,x2) = I22(I11,О) = I22(x1,О) = 0.
Пример 6.1.3.
1. С помощью операции подстановки найти функцию g(x1, x2), если
f(x1,x2,x3) = 3x1+4x2-x3+5,
f1(x1,x2) = x1+x2, f2(x1,x2) = x1*x2, f3(x1,x2) = 2x1+x2-1.
С определения операции подстановки имеем:
g(x1, x2) = f(f1(x1,x2),f2(x1,x2),f3(x1,x2)) = 3(x1+x2)+4(x1*x2)-(2x1+x2-1)+5 =
= x1+2x2+4x1x2+6.
2. Функция g(x1,x2) = f(x2,x1) перестановки аргументов получается из функции f(x1,x2) с помощью операции подстановки и функций проекции:
g(x1,x2) = f(I22(x1,x2),I12(x1,x2)) = f(x2,x1).
6.1.2. Оператор примитивной рекурсии
Пусть заданы произвольные частичные функции: n-местная функция g(x1, ...,xn) и n+2-местная функция h(x1, ..., xn, y, z). Говорят, что n+1-местная функция f(x1, ..., xn, y) получена операцией примитивной рекурсии Rn с функций g, h(R(g,h)), если для всех x1,x2,…,xnN имеем (когда n<>0):
f(x1,x2,…,xn,0) = g(x1,x2,…,xn),
f(x1,x2,…,xn,y+1) = h(x1,x2,…,xn,y,f(x1,x2,…,xn,y)), (6.1)
где числовые функции g(x1,x2,…,xn), h(x1,x2,…,xn,y,z) заданы, а функция f(x1,x2,…,xn,y+1) определяется соотношением (6.1), если f(x1,x2,…,xn,y) определена. Если функция f(x1,x2,…,xn,y) не определена, то и f(x1,x2,…,xn,y+1) не определена.
Тот факт, что функцию определено схемой (6.1), выражается равенством
f(x1,x2,…,xn,y) = Rn(g,h).
Поскольку областью определения функций является множество всех натуральных чисел, частичная функция f, удовлетворяющая условиям (6.1), существует для каждых частичных функций g и h, и функция эта будет единственной.
Схемы примитивной рекурсии определяют fn+1 рекурсивно не только через другие известные примитивно-рекурсивные функции gn и hn+2, но и через значения fn+1 в предыдущих точках: значения fn+1 в точке y+1 зависит от значения fn+1 в точке y. То есть, операция примитивной рекурсии дает возможность построить (n+1)-местную вычислимую функцию (функцию от n+1 аргументов) с помощью двух известных примитивно-рекурсивных функций, с которых одна n-местная, а другая – (n+2)-местная.
Для понимания операции примитивной рекурсии необходимо заметить, что всякую функцию от меньшего числа аргументов можно рассматривать как функцию от большего числа аргументов. Существенным в операторе примитивной рекурсии является то, что независимо от числа переменных в f рекурсия ведется только по одной переменной у. Остальные n переменных x1, x2, ..., xn на момент применения схемы (6.1) зафиксированы и играют роль параметров.
Пусть задан набор значений аргументов α = (α1,...,αn) N .
Если
функция
в (6.1) определена на ,
т.е.
существует, то функция f
на наборе
определена и
.
В
противоположном случае f
на
не определена, а также не определена
она и для любого набора
,
где y
N
.
Далее,
анализируется определенность функции
f
на наборе
.
Значение
существует,
если существует значения функции h
на наборе
,
затем
и т.д.
Заметим, что схема (6.1) имеет место для n >= 1. При n = 0 определяется функция f от одной переменной f(0) = k, f(y+1) = h(y,f(y)),
где k – фиксированное число из N. В данном случае роль функции g выполняет одна из функций-констант:
f(1)=h(0,f(0))=h(0,k), f(2)=h(1,f(1))=h(1,h(0,k)), f(3)=h(2,f(2))=h(2,h(1,h(0,k))) и т.д.
Определение 6.1.3. Пусть Z - некоторая система частичных функций. Функция f называется примитивно рекурсивною относительно системы Z , если f можно получить с функций системы Z и наипростейших (примитивных) функций O, S, Imn с помощью конечного числа операций подстановки и примитивной рекурсии.
Если операции суперпозиции и примитивной рекурсии применить к всюду определенным функциям, в результате будет получена также всюду определенная функция. В частности, все примитивно рекурсивные функции всюду определены.
Примитивно рекурсивная функция f относительно пустой системы функций Z называется просто примитивно рекурсивной функцией.
Этому определению можно предоставить более строгий (формальный) индуктивный вывод:
Функции О(х), S(x), Іmn(x) для всех натуральных n, m есть примитивно-рекурсивными.
Если f1(x1,…, xm),…,fn(x1,…, xm) и f(x1,…,xn) - примитивно-рекурсивные функции, то Sn+1m(f,f1,…,fn) - примитивно-рекурсивные функции для любых натуральных n, m .
Если g(x1,x2,…,xn), h(x1,x2,…,xn,y,z) - примитивно-рекурсивные функции, то Rn(g,h) - примитивно-рекурсивная функция.
Другими словами, существует три возможности доказательства того, что функция является примитивно-рекурсивной:
показать, что заданная функция является простейшей;
показать, что заданная функция построена с помощью оператора суперпозиции;
показать, что заданная функция построена с помощью оператора примитивной рекурсии.
Теорема 6.1.1. Пусть n-арна частичная функция g примитивно рекурсивная (относительно системы частичных функций Z). Тогда n-арная функция f, определенная с помощью уравнений
f(x1,x2,…,xn) = ∑g(x1,x2,…,xn-1,i), i = 0,1,…,xn
f(x1,x2,…,xn) = Пg(x1,x2,…,xn-1,i), i = 0,1,…,xn
также примитивно рекурсивная (относительно Z). Доказательство теоремы можно найти в [7], стр.128.
Пример 6.1.3.
Для n-арной операции On(x1,…,xn) = 0 имеем
On(x1,…,xn) = S2n(O,I1n) = O(I1n(x1,…,xn)) = O(x1) = 0.
То есть, эта функция примитивно рекурсивна.
2. Функцию f+(x,y) = Sum(x,y) = x+y (суммы) можно получить с функции I11(x) (тождественности) и h(x,y,z) = z+1 (следования) операцией примитивной рекурсии. Рассмотрим способ рекурсивного определения данной функции. Действительно, за схемой примитивной рекурсии (6.1) имеем:
f+(x, 0) = x,
f+(x, y+1) = x + y + 1 = f(x, y) +1.
Чтобы показать соответствие данной рекурсивной схемы схеме примитивной рекурсии, воспользуемся функциями выбора и следования:
f+(x,0) = x + 0 = x = I11(x),
f+(x,y+1) = x + (y + 1) = (x + y) + 1 = S(x+y) = S(f(x, y)) = S(z).
Таким образом, f+(x,y) = x+y = R1(I11(x),h(x,y,z)). То есть, функция f+(x,y) образуется из примитивно рекурсивных функций (выбора g(x)= I11(x) и следования h(x,y,z)=z+1=s(z)) операцией примитивной рекурсии и, следовательно, она сама примитивно рекурсивна.
3. Функцию f*(x,y)=P(x,y) = x*y можно получить из функций O(x) и сложения h(x,y,z) = х +z операцией примитивной рекурсии. Рассмотрим способ рекурсивного определения данной функции:
f(x, 0) = 0,
f(x, y+1) = x*(y + 1) = x*y + x = f(x, y) +x,
из которого следует, что
x*0 = 0 = g(x) = O(x),
f*(x,y+1) = h(x,y,f(x,y)) = x(y+1) = xy+x = f*(x,y)+x = f+(x,f*(x,y)) = h(x,y,z)=z+x – сложение.
Поскольку x+y – примитивно рекурсивная функция, то f*(x,y) – примитивно рекурсивная функция.
Двуместная функция fs(x,y) = xy удовлетворяет схеме примитивной рекурсии:
fs(x,0) = x0 = 1 = S(О(x)); fs(x,y+1) = xy+1 = x*xy = f*(x,fs(x,y)).
Это есть рекурсия с помощью функций g(x) = S(x) (или константа), h(x,y,z) = x*z - умножение.
5. Несколько сложнее дело обстоит с функцией x–y. Функция x–y на множестве N частичная функция. Для того чтобы сделать эту функцию определенной на множестве N, рассмотрим так называемую срезанную разность
x ÷ y = { x – y, x >= y, или 0, если x < y}.
Из определения этой функции вытекают такие свойства:
x ÷ 0 = x,
x ÷ (y + 1) = (x ÷ y ) ÷ 1,
(x ÷ y) ÷ z = x ÷ (y + z).
Покажем сначала, что функция x ÷ 1 примитивно рекурсивна, поскольку ее можно получить с наипростейших функций О и I12 операцией примитивной рекурсии:
0 ÷ 1 = 0 = О(x),
(x + 1) ÷ 1 = x = I12(x,y)
С примитивно рекурсивности функции x ÷ 1 и приведенных свойств операции срезанной разницы имеем:
x ÷ 0 = x = I11(x),
x ÷ (y + 1) = (x ÷ y ) ÷ 1,
т.е. эти тождества показывают, что двуместную функцию x ÷ y можно получить с помощью операции примитивной рекурсии с функций I11(x) и h(x,y,z) = z ÷ 1. Обе последние функции примитивно рекурсивны, поэтому и функция x÷y примитивно рекурсивная.
6. Двухместная функция f(x,y) = |x-y| = {x-y, при x>=y; y-x, при x<y} примитивно рекурсивная вследствие |x-y| = (x ÷ y ) + (y ÷ x) и примитивно рекурсивности функций x ÷ y и f+.
7. Рассмотрим функцию sg(x) = {0, при x=0; 1, при x<>0} и противоположную ей функцию Sg(x) = (1÷ sg(x)) {1, при x=0; 0, при x<>0}.
Их примитивна рекурсивность вытекает из того, что
sg(0) = 0, sg(x+1) = 1. Это рекурсия, в которой g = О(х), h = S(O(x)).
Sg(0) = 1, Sg(x+1) = 0. Это рекурсия, в которой g = 1, h = 0.
8. Двухместные функции min(x,y) = x ÷ (x ÷ y) и max(x,y) = y + (x ÷ y) или max(x,y) = x + (y ÷ x) примитивно рекурсивные.
9. Покажем, что частное от деления x на y, то есть функция [x/y], и остаток от деления x на y, то есть функция rest(x,y), - примитивно рекурсивные функции. Для этого необходимо доопределить данные функции. Положим для всех x N [x/0] = x, rest(x,0) = x.
Очевидно, что определенные так функции связаны тождественностью
rest(x,y) = x ÷ (y*[x/y])
и значит, из примитивно рекурсивности функции [x/y] вытекает примитивная рекурсивность функции rest(x,y).
По определению, при y > 0 число [x/y] = n удовлетворяет соотношения
n*y<=x<(n+1)*y. Отсюда n равняется числу нулей в последовательности
1*y ÷ x, 2*y ÷ x, ... , n*y ÷ x, ... , x*y ÷ x.
Поэтому при y > 0 справедливая формула
[x/y] = ∑(1 – (i*y÷x)), i = 1,…,x
Непосредственной проверкой можно убедиться, что данная формула справедливая и при y = 0. Вследствие примитивно рекурсивности функции х÷y и теоремы 6.1.1 получаем, что функция [x/y], а вместе с ней и функция rest(x,y) примитивно рекурсивные.
Покажем, что функции f(x) =n, f(x) =x, f(x) =x+n примитивно рекурсивные.
f(x) = n = S(…(S(O(x)))…), (n+1 скобок); f(x) = x = I11(x);
f(x) = x+n = S(…(S(I11(x)))…), (n+1 скобок).
