Книга Эта странная математика. На краю бесконечности и за ним - Дэвид Дарлинг
Шрифт:
Интервал:
Закладка:
Прежде чем говорить о быстрорастущей иерархии, нужно усвоить две вещи. Первое: она представляет собой ряд функций. Функция в математике – это просто соответствие, некое правило, превращающее одно значение, входное, в другое, выходное. Функцию можно представить себе как машинку, которая преобразует одни значения в другие, применяя к ним всегда единый набор действий, например, прибавляя тройку. Если обозначить входное значение буквой x, а функцию записать как f(x) (это произносится как “f от x”), то f(x) = x + 3.
Второе, что нужно знать о быстрорастущей иерархии: в качестве индекса функции (показывающего, сколько раз следует выполнить нужный набор действий) используются порядковые числа – ординалы. Мы уже сталкивались с ними в предыдущей главе, когда говорили о бесконечности. Ординалы указывают на положение того или иного объекта в списке или на порядок расположения элементов в ряду. Они могут быть конечными и бесконечными. С конечными порядковыми числами знакомы все: “пятый”, “восьмой”, “сто двадцать третий” и так далее. А вот бесконечные не на слуху, про них знают лишь те, кто интересуется математикой поглубже. Оказывается, и конечные, и бесконечные ординалы – чрезвычайно полезная штука, когда стоит задача добраться до сверхбольших (но все же конечных) чисел и описать их. Индексирование функций с помощью конечных ординалов позволяет дотянуться до вполне солидных больших чисел. Но когда к делу подключаются бесконечные ординалы, когда именно они начинают определять, сколько раз необходимо выполнить функцию, – вот тут быстрорастущая иерархия проявляет себя в полную силу.
С первой ступенькой иерархии все очень просто: это функция, которая всего-навсего прибавляет к числу единицу. Назовем такую начальную функцию f0. Предположим, мы хотим пропустить через жернова нашей функции число n. Тогда f0(n) = n + 1. Но такими крохотными шажками, прибавляя каждый раз по единице, мы не скоро доберемся до больших чисел, поэтому перейдем к функции f1(n). Она берет предыдущую функцию и подставляет ее саму в себя n раз: другими словами, f1(n) = f0(f0(… f0(n))) = = n + 1 + 1 + 1 + … + 1, где в общей сложности n единиц, что дает в итоге 2n. И опять-таки не слишком впечатляет – такими темпами нам долго добираться до страны больших чисел. Но зато эта функция наглядно демонстрирует процесс, из которого быстрорастущая иерархия черпает свою невероятную мощь. И процесс тот – рекурсия.
Искусство, музыка, язык, вычислительные системы, математика – рекурсия встречается во всех этих областях; она многолика, но это всегда нечто, что возвращается к самому себе. Иногда в результате получается просто бесконечно повторяющаяся петля. Возьмите, к примеру, шуточную словарную статью: “Рекурсия. См. рекурсия”. Более детально проработана рекурсивная петля в литографии Маурица Эшера “Картинная галерея” (1956 года), на которой изображено здание городской галереи, в которой выставлена картина, изображающая здание галереи, в которой… и так далее. Классический пример рекурсии в технике – обратная связь, когда выходной сигнал системы подается на ее вход. С этой проблемой нередко приходится сталкиваться, например, рок-музыкантам, если микрофон на сцене расположен перед акустической системой, к которой он подключен. Звук, принимаемый микрофоном, усиливается и подается на динамик системы, откуда вновь поступает на микрофон, и так продолжается до тех пор, пока – довольно скоро – из-за усиления при каждом прохождении цикла звук не превратится в знакомый пронзительный свист. Рекурсия в математике работает примерно так же, только вместо электронной системы “микрофон – усилитель – динамик” здесь функция, которая обращается к самой себе, так что ее выходное значение подается опять на вход.
Итак, мы достигли ступеньки f1(n) на лестнице быстрорастущей иерархии. Следующая ступенька, f2(n), подставляет функцию f1(n) саму в себя n раз. Ее можно записать как f2(n) = f1(f1(… f1(n))) = n × 2 × 2 × 2 × … × 2, где количество двоек равно n. Это то же самое, что n × 2n, где 2n – показательная функция. Если подставить вместо n, скажем, 100, то мы получим f2(100) = 100 × 2100 = = 126 765 060 022 822 940 149 670 320 537 600, или приблизительно 127 миллиардов миллиардов триллионов. Будь это сумма на банковском счете, такое состояние даже Биллу Гейтсу могло бы только во сне присниться, а ведь она гораздо меньше, чем некоторые из известных чисел, что нам уже встречались, таких как гугол. Меньше она и суммы самого крупного в истории иска о компенсации ущерба. Иск на 2 ундециллиона (то есть два триллиона триллионов триллионов) долларов был подан 11 апреля 2014 года жителем Манхэттена Энтоном Пьюрисимой, утверждавшим, что в городском автобусе его покусала “больная бешенством” собака. В бессвязном исковом заявлении на 22 страницы, написанном от руки, к которому была приложена фотография несуразно огромной повязки на среднем пальце, Пьюрисима требовал от управления городского транспорта Нью-Йорка, аэропорта Ла-Гуардия, кафе Au Bon Pain (где его якобы регулярно обсчитывали при покупке кофе), университетского медицинского центра города Хобокена и сотен других организаций выплаты компенсации на общую сумму, превышающую всю денежную массу на планете. В мае 2017 года иск был отклонен “за недостаточностью правовых и фактических оснований”. Будем надеяться, что познания Пьюрисимы в математике не распространяются на быстрорастущую иерархию – иначе за этим иском могут последовать другие, на еще бо́льшие суммы (раньше он уже подавал в суд на несколько крупных банков, Международный музыкальный фонд Лан Лана и Китайскую Народную Республику).
Функция f3(n) представляет собой n повторений функции f2(n), а получающееся в результате число чуть превышает 2 в степени n в степени n в степени n… со степенной башней высотой в n этажей. Это этап двух стрелок, или тетрации, – операции, что мы встречали на подступах к числу Грэма. Дальше продолжаем в том же духе: f4(n) – это три стрелки, f5(n) – четыре стрелки и так далее; то есть каждое увеличение ординала на единицу равносильно добавлению очередной стрелки и еще одному шагу к количеству стрелок n – 1. Это дает уже реально большие числа – не только по повседневным меркам, но даже по меркам сутяжника Пьюрисимы. Однако, если добавлять всего по одной стрелке за раз, даже до числа Грэма не скоро доберешься, не говоря уже о других, гораздо более солидных экземплярах. Здесь нужно какое-то неожиданное решение. Чтобы получить действительно колоссальные конечные числа, нам придется прибегнуть к помощи чисел бесконечных.
Как мы помним из предыдущей главы, самая маленькая из бесконечностей – это алеф-ноль, бесконечность натуральных чисел. Меняться по величине, то есть по количеству того, что в нем содержится, алеф-ноль не может, зато может меняться по длине – в зависимости от того, как его содержимое организовано. Самая маленькая длина алеф-нуля обозначается бесконечным ординалом омега (ω). Следующая – ω + 1, за ней ω + 2, потом ω + 3 и так далее, без конца. Эти бесконечные ординалы – они называются счетными, потому что их можно расставить по порядку, пронумеровать, – служат нам своего рода трамплином для прыжка в мир самых больших из когда-либо описанных конечных чисел. Для начала нам нужно определить, что подразумевается под функцией fω(n), где в качестве индекса стоит наименьший из бесконечных ординалов. Просто отнять 1 и применить рекурсию, о которой мы говорили выше, здесь не получится, поскольку такого понятия, как ω – 1, не существует. Вместо этого мы определяем fω(n) как fn(n). Заметьте, это не значит, что ω = n. Мы просто выражаем fω(n) через (конечные) ординалы, меньшие ω, чтобы привести функцию к виду, удобному для вычислений. Вы, возможно, возразите и скажете, что с таким же успехом можно просто написать fn(n) вместо fω(n) и получить тот же результат; но тогда нам не удастся сделать следующий шаг – а именно он является решающим и позволяет раскрыть весь невероятный потенциал, заложенный в быстрорастущей иерархии. Как только мы переходим от fω(n) к fω+1(n), происходит нечто качественно новое. Мы помним, что, увеличивая на единицу ординал, стоящий в индексе функции, мы подставляем предыдущую функцию саму в себя n раз. Если ординал конечный, в результате получается фиксированное количество стрелок. Ординал ω дает n – 1 стрелку. Использование же ординала ω + 1 позволяет нам применить рекурсию к количеству стрелок n раз – а это уже фантастический скачок, невероятно увеличивающий мощность рекурсии.