Green October
Текст раз


Этот пост будет про формулу, которая меня недавно совершенно очаровала, и про то, как я к этой формуле остыл.

Из штатно просмотренного видео я узнал о существовании так называемой формулы Таппера:



В этой формуле «покусанные» квадратные скобки означают взятие целой части от числа (отбрасывание всех знаков после запятой), а запись mod(a,b) означает «остаток от деления a на b». Эта формула есть неравенство от двух переменных, x, y. Давайте отметим все точки на плоскости, которые удовлетворяют этому неравенству, черным цветом. Получим такую картинку:



Получили, собственно, саму же формулу. Итак, формула Таппера --- это формула, которая задаёт множество точек на плоскости, которые представяют собой формулу Таппера. Здорово, правда?

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

Так, скажем, в приведённом графике я умышленно сделал страшную, вообще говоря, вещь --- не подписал оси. Истинные значения могут немного озадачить: по оси х отложены числа от 106 до 1, по оси y --- от k до k+17, где k равно следующему числу из 543 цифр:

960939379918958884971672962127852754715004339660129306651505519271702802395266424689642842174350718121267153782770623355993237280874144307891325963941337723487857735749823926629715517173716995165232890538221612403238855866184013235585136048828693337902491454229288667081096184496091705183454067827731551705405381627380967602565625016981482083418783163849115590225610003652351370343874461848378737238198224849863465033159410054974700593138339226497249461751545728366702369745461014655997933798537483143786841806593422227898388722980000748404719.

Константы из 543 цифр встречаются довольно нечасто в повседневной жизни, что наводит на некоторые подозрения. Оказывается, формула Таппера порождает абсолютно все изображения размером 106 на 17 пикселов в полосе по иксам от 1 до 106, стоящих друг на друге, и приведенная выше константа k просто показывает нам, где смотреть. Понятно, что в этой полосе есть и много других содержательных картинок. Так, если взять k равным

527268689724235388014462216951482233882433734747336965126812286783173510865270258591063937343687493284484456394265964024690599160099454020506309952891947089828414442823800443371705086518568064780175381440571607364054161412298624644423267091067858705446730087877586688981221863393151155144304218797125144654525064449919264423849019019876444762510968254992311992764142160964677117260094510986199273404619108230528998111049383146114766285152649424672321235180683251244073579540694245966403817433068754897119572130265619608109056

(525 цифр), то мы получим такую формулу:



Формулами, конечно, можно и не ограничиваться. Можно взять k равным следующему числу из 533 цифр

35367950685310008062502380353596828136752083805332627922126644503416440072291915524186276003078486071650245765218809652982672189211815444450823862032152639618332484848175347859154053803803858516125213461539873054501626006755197630572278519724662522746407056293325712552559553673492482280317728432592769790260296194550060229132627134519339122712810507226186219568958026366487654184149415028627290450983977637377190064624775525631031654398366952029380827795034913556183921154758119472234683295036571756495535166734241366966412911837184

и получить логотип:





Более того, константу k легко посчитать для любого наперёд заданного монохромного изображения размером 106 на 17 пикселов: она равна номеру желаемого изображения, умноженному на 17. Номер изображения получается так. Пусть имеется картинка (тут для простоты она 3 на 3 пиксела):



Все белые пикселы заменяются нулями, черные --- единицами:



После этого эти цифры колонка за колонкой выписываются в двоичное число: 001101011. В десятичной системе это 107. Для картинки три на три этот номер не может быть больше 512, однако для 106 на 17 максимальный номер равен
285793394306920833441610418092098634655629245793956098678773267955742373149291514664653927800704880150373913388423749690746007967577679155184353688551864105050094392601490879904551645289937784458453139617535910572704774231271588108092253680499408135958507227058036551719659148821493652464309016970613693109544906508636480672894494640559860467878289647366663850331954867463170600301178621010101029372654264171297982037231491311892858947537525986757827169736600317880446647247045504644272222656049350793825164158207773197137018282319809299349504

(543 цифры), что на сотни порядков больше числа атомов в обозримой части Вселенной.

Таким образом, формула Таппера просто-напросто порождает абсолютно все картинки заданного небольшого размера (в том числе, скажем, фразу «Слава КПСС» на большинстве языков мира), и одна здоровенная некрасивая константа нам просто показывает, где именно в её «выводе» нам надо смотреть. Если, кстати, глянуть в окрестность исходной константы, то мы увидим набор клонов формулы, отличающейся только последней колонкой:


,
что неплохо показывает всю механичность происходящего.


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

P.S. В процессе написания программы, рисующей формулу Таппера, я заглядывал в замечательную книгу Learn You A Haskell For Great Good!, потому как программку это я писал на хаскеле, в котором по-прежнему часто и активно путаюсь. Сия книжка --- большое и подробное пособие для начинающих, написанная веселым и непринужденным стилем (что само по себе не редкость в подобной литературе) и снабженная авторскими иллюстрациями (что уже редкость). У меня до этого была старая (пиратская?) версия этой книжки, без части глав и совсем без иллюстраций. К моему огромному удивлению, я обнаружил, что об одном из ключевых понятий языка мы с автором думаем совершенно одинаково --- вплоть до художественной аналогии. См. подчеркнутый текст:




P.P.S. Мне надо уже наконец-то придумать какой-то другой способ сочинять сюда посты.

@музыка: Dream Theater --- Home

@темы: хаскелл, точный мир чисел, простойный пост