Функция Аккермана - Ackermann function

В теории вычислимости , то функция Аккермана , названная в честь Вильгельма Аккермана , является одним из самых простых и ранних открывшихся примеров полной вычислимой функции , которая не является примитивно рекурсивным . Все примитивно-рекурсивные функции являются итоговыми и вычислимыми, но функция Аккермана показывает, что не все итоговые вычислимые функции являются примитивно-рекурсивными. После публикации Аккерманом своей функции (которая имела три неотрицательных целочисленных аргумента) многие авторы модифицировали ее для различных целей, так что сегодня «функция Аккермана» может относиться к любому из многочисленных вариантов исходной функции. Одна общая версия, функция Петера-Аккермана с двумя аргументами, определяется следующим образом для неотрицательных целых чисел m и n :

Его ценность быстро растет даже при небольших затратах. Например, A (4, 2) представляет собой целое число из 19729 десятичных цифр (эквивалент 2 65536 −3 или 2 2 2 2 2 −3).

История

В конце 1920-х годов математики Габриэль Судан и Вильгельм Акерманн , ученики Дэвида Гильберта , изучали основы вычислений. И Судану, и Аккерману приписывают открытие общих вычислимых функций (называемых просто «рекурсивными» в некоторых источниках), которые не являются примитивно рекурсивными . Судан опубликовал менее известную функцию Судана , а вскоре после этого и независимо, в 1928 году, Аккерман опубликовал свою функцию (греческая буква фи ). Функция Аккермана с тремя аргументами определена так, что для , она воспроизводит основные операции сложения , умножения и возведения в степень как

а для p > 2 он расширяет эти базовые операции способом, который можно сравнить с гипероперациями :

(Помимо своей исторической роли как полностью вычислимой, но не примитивно-рекурсивной функции, исходная функция Аккермана расширяет базовые арифметические операции за пределы возведения в степень, хотя и не так гладко, как варианты функции Аккермана, специально разработанные для эта цель, такие как Гудстейна гипероператор последовательности.)

В О Infinite , Давид Гильберт выдвинул гипотезу о том , что функция Аккермана не примитивно рекурсивная, но это было Ackermann, Гильберта личный секретарь и бывший студент, который на самом деле доказал гипотезу в своей статье О построении Гильберта вещественных чисел .

Позже Рожа Петер и Рафаэль Робинсон разработали версию функции Аккермана с двумя переменными, которая стала предпочтительной для многих авторов.

Обобщенная последовательность гиперопераций , например , также является версией функции Аккермана.

В 1963 году Р. К. Бак основал интуитивно понятный вариант с двумя переменными ( ) на последовательности гиперопераций :

По сравнению с большинством других версий функция Бака не имеет несущественных смещений:

Были исследованы многие другие версии функции Аккермана.

Определение

Как м-арная функция

Исходная функция Аккермана с тремя аргументами рекурсивно определяется следующим образом для неотрицательных целых чисел и :

Из различных версий с двумя аргументами вариант, разработанный Петером и Робинсоном (называемый некоторыми авторами «функцией Аккермана»), определен для неотрицательных целых чисел и выглядит следующим образом:

Функция Петера-Аккермана также может быть выражена по отношению к различным другим версиям функции Аккермана:

Следовательно
( и будет соответствовать и , которые можно было бы логически добавить.)

Как итерированная 1-арная функция

Определим ф п как питерации из F

где id - функция идентичности, а fg обозначает композицию функции .

Представляя функцию Аккермана как последовательность унарных функций, можно установить .

Затем функция становится последовательностью унарных функций, определенных на итерации :

В качестве функции состава ( ег ) ( х ) = е ( г ( х )) является ассоциативной , последняя линия может также быть

Вычисление

Рекурсивное определение функции Аккермана может быть естественно перенесено в систему переписывания терминов (TRS) .

TRS, основанный на 2-арной функции

Определение 2-арной (Петер-) функции Аккермана соответствует правилам редукции

Пример

Вычислить

Для вычисления можно использовать стек , который изначально содержит элементы .

Затем повторно заменяют два верхних элемента согласно правилам

Схематично, начиная с :

WHILE stackLength <> 1
{
   POP 2 elements;
   PUSH 1 to 3 elements in conformance with the rules r1, r2, r3
}

Псевдокод опубликован в Grossman & Zeitman (1988) .

Например, на входе последовательные конфигурации стека:

Это отражает последовательность редукции

Замечания

  • Самая левая-самая внутренняя стратегия реализована на 225 компьютерных языках в Rosetta Code .
  • Гроссман и Zeitman (1988) указывал, что при вычислении длины максимальной из стека , пока .

TRS, основанный на повторяющейся 1-арной функции

Определение повторяющихся одномерных функций Аккермана приводит к различным правилам редукции

Поскольку композиция функций ассоциативна, вместо правила r6 можно определить

Как и в предыдущем разделе, вычисление может быть реализовано с помощью стека, который поддерживает текущий член.

Первоначально стек содержит три элемента .

Затем повторно три верхних элемента заменяются согласно правилам

Схематично, начиная с :

WHILE stackLength <> 1
{
   POP 3 elements;
   PUSH 1 or 3 or 5 elements in conformance with the rules r4, r5, r6;
}

Пример

На входе последовательные конфигурации стека

Соответствующие равенства имеют вид


При использовании правила сокращения r7 вместо r6, замены в стеке будут следовать

Последовательные конфигурации стека будут

Соответствующие равенства имеют вид

Замечания

  • На любом заданном входе все TRS, представленные выше, сходятся за одинаковое количество шагов. Они также используют те же правила редукции (в этом сравнении правила r1, r2, r3 считаются «такими же, как» правила r4, r5, r6 / 7 соответственно). Например, редукция сходится за 14 шагов: 6 X r1, 3 X r2, 5 X r3. Уменьшение также сходится в 14 шагов: 6 X r4, 3 X r5, 5 X r6 / 7. TRS различаются порядком применения правил сокращения.
  • При вычислении по правилам r4, r5, r6 максимальная длина стека остается ниже 2 * . Когда вместо правила r6 используется правило сокращения r7, максимальная длина стека становится меньше 2 (i + 2). Длина стека отражает глубину рекурсии. Поскольку вычисление в соответствии с правилами r4, r5, r7 включает наименьшую максимальную глубину рекурсии, наблюдаемую до сих пор, это эффективно в этом отношении.

Огромные числа

Чтобы продемонстрировать, как вычисление результатов происходит за много шагов и в большом количестве:

Таблица значений

Вычисление функции Аккермана можно переформулировать в терминах бесконечной таблицы. Сначала разместите натуральные числа в верхнем ряду. Чтобы определить число в таблице, возьмите число сразу слева. Затем используйте это число, чтобы найти необходимое число в столбце, заданном этим числом, и на одну строку вверх. Если слева от него нет числа, просто посмотрите на столбец с заголовком «1» в предыдущей строке. Вот небольшая верхняя левая часть таблицы:

Значения A ( mn )
п
м
0 1 2 3 4 п
0 1 2 3 4 5
1 2 3 4 5 6
2 3 5 7 9 11
3 5 13 29 61 125
4 13


65533


2 65536  - 3










5 65533

6
м

Числа здесь, которые выражаются только с помощью рекурсивного возведения в степень или стрелок Кнута , очень большие и занимают слишком много места для записи в виде простых десятичных цифр.

Несмотря на большие значения, встречающиеся в этом раннем разделе таблицы, были определены некоторые даже большие числа, такие как число Грэхема , которое нельзя записать с помощью небольшого количества стрелок Кнута. Это число создается с помощью техники, аналогичной рекурсивному применению функции Аккермана к самому себе.

Это повторение приведенной выше таблицы, но значения заменены соответствующим выражением из определения функции, чтобы четко показать шаблон:

Значения A ( mn )
п
м
0 1 2 3 4 п
0 0 + 1 1 + 1 2 + 1 3 + 1 4 + 1 п + 1
1 А (0, 1) А (0, А (1, 0))
= А (0, 2)
А (0, А (1, 1))
= А (0, 3)
А (0, А (1, 2))
= А (0, 4)
А (0, А (1, 3))
= А (0, 5)
А (0, А (1, n −1))
2 А (1, 1) А (1, А (2, 0))
= А (1, 3)
А (1, А (2, 1))
= А (1, 5)
А (1, А (2, 2))
= А (1, 7)
А (1, А (2, 3))
= А (1, 9)
А (1, А (2, n −1))
3 А (2, 1) А (2, А (3, 0))
= А (2, 5)
А (2, А (3, 1))
= А (2, 13)
А (2, А (3, 2))
= А (2, 29)
А (2, А (3, 3))
= А (2, 61)
A (2, A (3, n −1))
4 А (3, 1) А (3, А (4, 0))
= А (3, 13)
А (3, А (4, 1))
= А (3, 65533)
А (3, А (4, 2)) А (3, А (4, 3)) A (3, A (4, n −1))
5 А (4, 1) А (4, А (5, 0)) А (4, А (5, 1)) А (4, А (5, 2)) А (4, А (5, 3)) А (4, А (5, n −1))
6 А (5, 1) А (5, А (6, 0)) А (5, А (6, 1)) А (5, А (6, 2)) А (5, А (6, 3)) А (5, А (6, n −1))

Характеристики

Основные пометки

  • Может быть не сразу очевидно, что оценка всегда завершается. Однако рекурсия ограничена, потому что в каждом рекурсивном приложении либо уменьшается, либо остается прежним и уменьшается. Каждый раз, когда он достигает нуля, уменьшается, так что в конечном итоге тоже достигает нуля. (Выражаясь более технически, в каждом случае пара уменьшается в лексикографическом порядке по парам, что является хорошим упорядочением , точно так же, как упорядочение отдельных неотрицательных целых чисел; это означает, что нельзя идти вниз в упорядочении бесконечно много раз подряд. .) Однако при уменьшении нет верхней границы того, насколько может увеличиться - и он часто будет значительно увеличиваться.
  • Для малых значений m, таких как 1, 2 или 3, функция Аккермана растет относительно медленно по отношению к n (не более чем экспоненциально ). Для , однако, он растет гораздо быстрее; даже составляет примерно 2 × 10 19 728 , а десятичное разложение A (4, 3) очень велико по любым типичным меркам.
  • Интересный аспект заключается в том, что единственная арифметическая операция, которую он когда-либо использует, - это сложение 1. Его быстрорастущие возможности основаны исключительно на вложенной рекурсии. Это также означает, что время его работы, по крайней мере, пропорционально его производительности, и поэтому оно также чрезвычайно велико. На самом деле, в большинстве случаев время работы намного больше, чем результат; см. ниже.
  • Версия с одним аргументом, которая увеличивает обе и в то же время затмевает каждую примитивную рекурсивную функцию, включая очень быстрорастущие функции, такие как экспоненциальная функция , факториальная функция, много- и сверхфакторные функции и даже функции, определенные с помощью стрелки Кнута вверх обозначение (кроме случаев, когда используется индексированная стрелка вверх). Можно видеть , что примерно сопоставимо с в быстро растущей иерархии . Этот экстремальный рост может быть использован для демонстрации того, что очевидно вычислимо на машине с бесконечной памятью, такой как машина Тьюринга, и, следовательно, является вычислимой функцией , растет быстрее, чем любая примитивно рекурсивная функция, и, следовательно, не является примитивно рекурсивной.

Не примитивно рекурсивный

Функция Аккермана растет быстрее, чем любая примитивно-рекурсивная функция, и поэтому сама по себе не является примитивно-рекурсивной.

В частности, один показывает , что для каждой примитивно рекурсивной функции существует неотрицательное целое число , такое , что для всех неотрицательных целых чисел ,

Как только это установлено, следует, что само по себе не является примитивно рекурсивным, поскольку в противном случае установка привела бы к противоречию

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

и показать, что содержит все примитивные рекурсивные функции. Последнее достигается путем демонстрации того, что он содержит постоянные функции, функцию-последователь, функции проекции и что он закрыт при операциях композиции функций и примитивной рекурсии.

Обратный

Поскольку рассмотренная выше функция f ( n ) = A ( n , n ) растет очень быстро, ее обратная функция , f −1 , растет очень медленно. Эту обратную функцию Аккермана f −1 обычно обозначают через α . Фактически, α ( n ) меньше 5 для любого практического входного размера n , поскольку A (4, 4) имеет порядок .  

Эта инверсия проявляется во временной сложности некоторых алгоритмов , таких как структура данных с непересекающимся набором данных и алгоритм Шазеля для минимальных остовных деревьев . Иногда в этих настройках используются исходная функция Аккермана или другие варианты, но все они растут с одинаково высокими темпами. В частности, некоторые модифицированные функции упрощают выражение, удаляя −3 и аналогичные члены.

Двухпараметрическая вариация обратной функции Аккермана может быть определена следующим образом, где - минимальная функция :

Эта функция возникает при более точном анализе упомянутых выше алгоритмов и дает более точные временные рамки. В структуре данных с непересекающимся набором m представляет количество операций, а n представляет количество элементов; в алгоритме минимального остовного дерева m представляет количество ребер, а n представляет количество вершин. Существует несколько немного разных определений α ( m , n ) ; например, log 2 n иногда заменяется на n , а функция пола иногда заменяется потолком .

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

Функция, обратная функции Аккермана, является примитивно рекурсивной.

Использовать как эталон

Функция Аккермана, благодаря своему определению в терминах чрезвычайно глубокой рекурсии, может использоваться в качестве эталона способности компилятора оптимизировать рекурсию. Впервые функция Аккермана была опубликована таким образом в 1970 году Драгоу Вайда и почти одновременно в 1971 году Ингве Сундбладом.

Основополагающая статья Сандблада была подхвачена Брайаном Вичманном (соавтором теста Whetstone ) в трилогии статей, написанных между 1975 и 1982 годами.

Смотрите также

Примечания

использованная литература

Библиография

внешние ссылки