- PVSM.RU - https://www.pvsm.ru -

Математика, которой я пользуюсь

Математика, которой я пользуюсь - 1

Недавно на одном онлайн-форуме был задан вопрос: насколько востребована математика в условиях работы реального программиста, как часто он пользуется ей и каким ее областями? И вот мой ответ.

Прежде всего я, как и почти все программисты, пользуюсь булевой логикой [1], от анализа логических выражений для условных операторов и критериев выхода из цикла, до приведения подобных выражений в соответствие, например, законам де Моргана [2]. Большая часть нашей работы граничит с исчислением предикатов первого порядка [3] и другой логикой предикатов в виде анализа предусловий, инвариантов и другого (хотя и может показаться, что мы при этом занимаемся какими-нибудь иными задачами).

Далее, я часто занимаюсь анализом трудоемкости алгоритмов. Размеры наборов данных, подвергаемые обработке в наши дни, просто колоссальны. В 2010 году на конференции Techonomy [4] Эрим Шмидт [5] сказал, что объем данных, создаваемых сегодня человечеством всего за два дня, равен объему всех существовавших в мире данных по состоянию на 2003 год. Мне важно уметь обрабатывать большие сегменты этих объемов и извлекать из них пользу. И в этом смысле понимание пространственно-временной сложности операций [6], применяемых нами к данным есть ключ к определению того, возможны ли те или иные вычисления в принципе. В отличие от более традиционных видов O-анализа [7] или тета-анализа [8] постоянные множители в таких масштабах оказывают существенное влияние: множитель 2 не меняет асимптотическую временную сложность алгоритма, но потребует увеличения количества процессоров с 10 тыс. до 20 тыс., и такая разница в потреблении ресурсов будет ощутима. В результате вычисления становятся более изощренными. Примеры: могу ли я взять некое линейное вычисление и снизить его в силе до логарифмического? Можно ли снизить потребление памяти в три раза? И так далее.

Часто мне необходимо вычислить наиболее неблагоприятный вариант верхней границы, скажем, размера некоторого набора данных. Во многих случаях такие вычисления могут оказаться нетривиальными. Или же может понадобиться проанализировать какую-нибудь рекуррентную формулу [9] чтобы проверить, как она меняется по мере увеличения глубины рекурсии. Для этого я в числе прочего должен знать основную теорему о рекуррентных соотношениях [10] и как следует понимать принципы анализа числовых рядов [11]. И, возможно, это покажется невероятным, но иногда это означает, что мне надо вычислить интеграл [12] (хотя преимущественно только интегралы Римана [13]). Или могу ли я просто решить рекурсивное соотношение и получить конечное число решений [14]? Придется ли мне прибегнуть к линейной алгебре [15]? Это ведет к таким вещам, как производящие функции [16], числа Стирлинга [17], матричные [18] вычисления. Если вам любопытно что входит в набор фундаментальных математических концепций, необходимых для понимания компьютерных наук, обратитесь к первому тому «Искусства программирования» Дональда Кнута, или «Конкретной математике» Кнута, Роналда Грэхема и Орена Паташника.

Я выполняю множество базовых вычислений в плане агрегирования, комбинирования и преобразования данных, и в этом мне помогает в основном комбинаторика [19] (подсчет количества, поиск симметрий в разных измерениях, и другое). Думаю примеры из этой области очевидны.

Я много пользуюсь дискретной математикой [20], в частности для поиска алгебраических систем в операциях над особенно крупными наборами данных. Можно ли отобразить ту или иную структуру с помощью гомоморфизма [21] в качестве некой группы [22] или кольца [23], которые будут мне более понятны? Если ли вариант с менее тесной связью? Могу ли я применить действие группы [24] для некоего множества чтобы создать умозрительную модель трансформации, которая упрощает рассуждения? Могу ли я определить некую топологию для анализа данных? Вы бы удивились, если бы узнали как много вещей могут быть описаны с помощью дискретных топологий [25]. А еще не меньше удивления бы вызвала востребованность неравенства треугольника [26].

Я много работаю с теорией графов [27]. «Создание веб-сайтов» — требует не только умения размещать милые изображения котиков на странице. Этот процесс также подразумевает вставку узлов в глобальный граф гиперссылок [28]. Добавление одной единственной страницы ведет к потенциальному росту количества ребер графа, и это в свою очередь может оказать не очевидное на первый взгляд влияние на производительность, анализ, рейтинг в поисковой выдаче и другие характеристики. Понимание последствий подобных изменений может помочь получить интересную информацию, например о том, как растет граф. Оказывается, что динамика [29] эта до боли похожа на степенной закон [30]: всемирная паутина — это безмасштабная сеть [31]. Каков кратчайший путь [32] между двумя узлами этого графа? Как такая сеть будет выглядеть, если попытаться представить ее в виде планарного [33] или двудольного [34] графа? Когда возможно соответствие этим свойствам, если конечно вообще возможно? А что если мы рассматриваем в виде графа не всемирную паутину, а всю дорожную сеть Северной Америки, Европы или Азии?

Есть и другие следствия из этого знания. Зачастую люди не понимают, что современные веб-страницы представляют собой не просто HTML [35]-документы со ссылками и другими ресурсами, а древовидные структуры [36] данных, связанные друг с другом в граф [37]. Эти деревья часто подвергаются обходу, переработке и динамическому обновлению благодаря взаимодействию между веб-браузером пользователя и неким сервером (благодаря таким технологиям, как AJAX [38]).

Отличный и подходящий пример — MathJax [39]. Или Gmail [40]. Понимание того, как они работают предполагает некоторый уровень знания символьных вычислений [41] и семантического анализа [42] элементов страниц. Авторам MathJax нужно было написать программу, способную пройти дерево, сгенерированное на основе объектной модели документа [43], найти математические элементы, «запарсить [44]» их и произвести их динамическую замену новыми отрисованными элементами. Возможно, некоторых пользователей, которые просто видят как это работает, это не очень то и впечатлит, но под капотом там происходят довольно сложные вещи. Мне обычно не приходится делать нечто подобное (не работаю с фронт-эндом), но я все время занимаюсь похожими вещами на Lisp [45]. Обратите внимание, что Lisp был изначально заточен под математическую обработку символьной информации: его макросы целиком и полностью охватывают вопросы обработки символьных выражений.

Я много времени работаю с временными рядами [46]. Как меняется потребление трафика или ресурсов? Какие тенденции можно выделить? Проявляется ли тот или иной скачок в задержке ответа на запросы или потреблении памяти сезонно [47]? Как реагирует скорость изменения [48] чего-либо по мере варьирования входных данных в различных измерениях? Есть ли корреляция [49] с неким внешним событием?

Я много работаю со статистическим анализом данных, не только для определения характеристик производительности, но также и понимания данных как таковых. Вдобавок поиску в упомянутом выше DOM-дерева семантических метаданных (например, микроданных [50] и микроформатов [51], RDF [52], других XML [53]-данных с некой определенной схемой [54]), я также пытаюсь осмыслить неструктурированные данные [55]. Какова вероятность, что этот текст представляет собой адрес улицы? Или что это графические координаты [56]? В каком контексте он появляется? Спам [57] ли это? Есть ли в нем вообще смысл? Выглядит ли он как результат работы генератора текста на основе цепей Маркова [58]? Быть может это серия цитат из какого-либо хорошо известного литературного произведения? Или фрагмент литературной дискуссии? Или быть может это дискуссия о спаме, содержащая литературные фрагмент? Я до сих пор усмехаюсь всякий раз когда вспоминаю о спам-письме с рекламой препаратов, завернутую в фрагмент из «Мастера и Маргариты» Булгакова.

Теория категорий [59]. Типы [60] в компьютерных языках программирования грубо соответствуют категориям, а монады [61] и функторы [62] могут быть использованы для серьезного и изящного упрощения некоторых конструкций. К примеру, в функциональном языке [63] программирования Haskell монады применяются для ввода-вывода [64] и для моделирования состояния [65]. Имея дело с упрощенными программами проще сделать так, чтобы они работали. О них легче рассуждать, их проще понять, изменить и так далее. Типы часто могут быть определены на основе логических рассуждений, что приводит к появлению частных случаев [66] (которые также могут быть использованы в общих задачах рассуждения). Подумайте что будет, если использовать выводы [67] для применения логических функций, подобных тем, что используются в prolog [68], для преобразования графов [69] в распределенных системах [70].

Распределенные системы возвращают нас к теории графов. В масштабах реального мира в системах возникают сбои, экскаваторы рвут оптоволокно, случаются землетрясения, извержения вулканов, а рыболовные траулеры повреждают морские кабели. Чтобы понять последствия подобных событий и определить оптимальные способы реагирования на них, необходимо понимать характеристики графа сети. Алгоритмы маршрутизации и анализ сети тесно связаны с такими вещами, как поиск кратчайшего пути [32]между узлами графа. В этом Вам поможет алгоритм Дейкстры [71].

А еще, как можно распределить нагрузку от крупного вычисления между расположенными в разных частях мира дата-центрами? Здесь вам также понадобится некоторое знание физики: в масштабах Интернета, скорость света [72] превращается в «бутылочное горлышко». Рассеивание тепла [73], плотность тока [74] на единицу площади и другое — примеры того, что программистам приходится учитывать работая с задачами реального мира. Следует ли размещать дата-центр в Исландии? Дешевое охлаждение и геотермальные источники энергии создают привлекательные условия, но что насчет минимальной задержки до пользователей, которым может быть интересна аренда оборудования в таком дата-центре? Каково расстояние по дуге большого круга [75] между, например Исландией и Лондоном, или Берлином и Амстердамом? Вычислить все это довольно просто, но для этого необходимо обладать определенными математическими знаниями. Можем ли мы пустить оптоволокно из Исландии в какой-нибудь другой центр? Какова средняя задержка? Какова вероятность разрыва подводного кабеля в Северном море в течение 12 месяцев эксплуатации? А для 48 месяцев?

Конечно же, теория алгоритмов [76], теория автоматов [77], синтаксический анализ [44], формальная грамматика [78], регулярные языки [78] — все это области знаний, с которыми программисты постоянно имеют дело. Я часто работаю с синтаксическим анализом и сопоставлением паттернов [79]. В работе с данными реального мира, даже наборы не очень большого размера могут содержать элементы, способные вызвать патологически плохое поведение [80] при использовании, например, техник бэктрекинга [81]. Используя регулярные выражения [82] для сопоставления данных, мне следует быть осторожным и убедиться, что выражения эти действительно регулярные [83].

Используя автомат с магазинной памятью [84] для синтаксического анализа контекстно-свободной грамматики [85] (что, кстати происходит всякий раз, когда вы отправляете запрос на HTTP [86]-сервер), мне необходимо удостовериться, что я ограничил глубину рекурсии чтобы избежать исчерпания процедурного стека вызовов [87] процессора, что требует понимания лежащих в основе принципов вычисления и математики, на которой они основаны.

Если мне необходимо написать свой алгоритм рекурсивного спуска [88] для какой-нибудь необычной грамматики и он не может соответствовать LALR(1) [89] (поэтому я не могу просто воспользоваться yacc [90] или bison [91]), мне нужно быть осторожным или поддерживать стек состояния отдельно от процедурной рекурсии. Это понимание также необходимо, если я обхожу DOM-дерево (или любую рекурсивно-определенную структуру данных). Некоторые языки программирования [92] считают это трудностью в работе программиста и обходят ее путем использования сегментированных стеков [93]. Конечно же, было бы здорово, если бы я мог определить свой сборник некоторых анализируемых ресурсов в виде функции [94] (в математическом смысле). И как же было бы здорово, если бы это сводилось всего лишь к какой-нибудь задаче оптимизации линейного программирования [95]?

Обратите внимание, что ничто из вышеперечисленного не есть какие-то эзотерические знания. Все это основано на опыте работы с задачами и данными реального мира. Конечно же, я не занимаюсь всем этим каждый день, но большую часть этих знаний я применяю регулярно, и лишь некоторую — время от времени. Наверное, наблюдение, опыт и эвристика оказывают на процесс больше влияния, чем следовало бы (эвристические модели часто незавершены и неточны). Достаточно ли у меня математических знаний, чтобы вычислить среднюю погрешность [96] между реальностью и моей эвристической моделью?

Вот в этом и заключается суть компьютерных наук, а также того, как они взаимодействуют с программированием и реалиями современного вычисления. Быть IT-профессионалом не есть то же самое, что быть специалистом в области теории вычислительных систем, и как многие верно замечают, такой специалист гораздо ближе к прикладному математику, нежели к специалисту-ремесленнику. Я ни в коем случае не хочу умалять важность таких профессионалов, поскольку они полезны и пользуются всеобщим уважением, но лишь хочу отметить, что компьютерные науки — это нечто другое.

(Кстати, сам я не специалист компьютерных наук. Обучался я на чистого математика, а мой профессиональный род деятельности гораздо ближе к инженерному делу.)

Автор: Wirex

Источник [97]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/281041

Ссылки в тексте:

[1] булевой логикой: https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BA%D0%B8

[2] законам де Моргана: https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD%D1%8B_%D0%B4%D0%B5_%D0%9C%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D0%B0

[3] исчислением предикатов первого порядка: https://ru.wikipedia.org/wiki/%D0%9B%D0%BE%D0%B3%D0%B8%D0%BA%D0%B0_%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0

[4] Techonomy: http://techonomy.com/

[5] Эрим Шмидт: https://plus.google.com/104233435224873922474/posts

[6] пространственно-временной сложности операций: https://en.wikipedia.org/wiki/Analysis_of_algorithms

[7] O-анализа: https://ru.wikipedia.org/wiki/%C2%ABO%C2%BB_%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B5_%D0%B8_%C2%ABo%C2%BB_%D0%BC%D0%B0%D0%BB%D0%BE%D0%B5

[8] тета-анализа: http://mathworld.wolfram.com/Big-ThetaNotation.html

[9] рекуррентную формулу: https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%80%D0%B5%D0%BD%D1%82%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B0

[10] основную теорему о рекуррентных соотношениях: https://ru.wikipedia.org/wiki/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%BE_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%80%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D1%85_%D1%81%D0%BE%D0%BE%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%D1%85

[11] числовых рядов: https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9_%D1%80%D1%8F%D0%B4

[12] интеграл: https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D0%BB

[13] Римана: https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D0%BB_%D0%A0%D0%B8%D0%BC%D0%B0%D0%BD%D0%B0

[14] конечное число решений: http://mathworld.wolfram.com/Closed-FormSolution.html

[15] линейной алгебре: https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0

[16] производящие функции: https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D1%8F%D1%89%D0%B0%D1%8F_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8

[17] числа Стирлинга: https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%A1%D1%82%D0%B8%D1%80%D0%BB%D0%B8%D0%BD%D0%B3%D0%B0

[18] матричные: https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)

[19] комбинаторика: https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%82%D0%BE%D1%80%D0%B8%D0%BA%D0%B0

[20] дискретной математикой: https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0

[21] гомоморфизма: https://ru.wikipedia.org/wiki/%D0%93%D0%BE%D0%BC%D0%BE%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC

[22] группы: https://ru.wikipedia.org/wiki/%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B0_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)

[23] кольца: https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D1%8C%D1%86%D0%BE_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)

[24] действие группы: https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B

[25] дискретных топологий: http://mathworld.wolfram.com/DiscreteTopology.html

[26] неравенства треугольника: https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%80%D0%B0%D0%B2%D0%B5%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D1%82%D1%80%D0%B5%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%B0

[27] теорией графов: https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2

[28] гиперссылок: https://ru.wikipedia.org/wiki/%D0%93%D0%B8%D0%BF%D0%B5%D1%80%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0

[29] динамика: http://science.sciencemag.org/content/287/5461/2115.full

[30] степенной закон: http://letopisi.org/index.php/%D0%A1%D1%82%D0%B5%D0%BF%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%B7%D0%B0%D0%BA%D0%BE%D0%BD

[31] безмасштабная сеть: https://ru.wikipedia.org/wiki/%D0%91%D0%B5%D0%B7%D0%BC%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C

[32] кратчайший путь: https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%BE_%D0%BA%D1%80%D0%B0%D1%82%D1%87%D0%B0%D0%B9%D1%88%D0%B5%D0%BC_%D0%BF%D1%83%D1%82%D0%B8

[33] планарного: http://en.wikipedia.org/wiki/Planar_graph

[34] двудольного: http://en.wikipedia.org/wiki/Bipartite_graph

[35] HTML: http://www.w3.org/html/

[36] древовидные структуры: https://ru.wikipedia.org/wiki/%D0%94%D1%80%D0%B5%D0%B2%D0%BE%D0%B2%D0%B8%D0%B4%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0

[37] граф: https://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D1%84_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)

[38] AJAX: http://en.wikipedia.org/wiki/Ajax_(programming)

[39] MathJax: http://www.mathjax.org/

[40] Gmail: https://mail.google.com/

[41] символьных вычислений: https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F

[42] семантического анализа: https://en.wikipedia.org/wiki/Semantic_analysis_(compilers)

[43] объектной модели документа: https://ru.wikipedia.org/wiki/Document_Object_Model

[44] запарсить: https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7

[45] Lisp: https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D1%81%D0%BF

[46] временными рядами: https://ru.wikipedia.org/wiki/%D0%92%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D1%80%D1%8F%D0%B4

[47] сезонно: https://www.lokad.com/ru/%D1%81%D0%B5%D0%B7%D0%BE%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5

[48] скорость изменения: https://en.wikipedia.org/wiki/Rate_(mathematics)#Of_change

[49] корреляция: https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D1%80%D1%80%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D1%8F

[50] микроданных: http://www.w3.org/TR/2011/WD-microdata-20110525/

[51] микроформатов: http://microformats.org/

[52] RDF: https://www.w3.org/TR/rdfa-core/

[53] XML: https://www.w3.org/XML/

[54] схемой: https://en.wikipedia.org/wiki/XML_schema

[55] неструктурированные данные: https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5

[56] графические координаты: https://ru.wikipedia.org/wiki/%D0%93%D0%B5%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BE%D1%80%D0%B4%D0%B8%D0%BD%D0%B0%D1%82%D1%8B

[57] Спам: https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B0%D0%BC

[58] Маркова: https://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BF%D1%8C_%D0%9C%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D0%B0

[59] Теория категорий: https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B9

[60] Типы: https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D1%82%D0%B8%D0%BF%D0%BE%D0%B2

[61] монады: https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%BD%D0%B0%D0%B4%D0%B0_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)

[62] функторы: https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%82%D0%BE%D1%80_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)

[63] функциональном языке: https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

[64] ввода-вывода: https://ru.wikipedia.org/wiki/%D0%92%D0%B2%D0%BE%D0%B4-%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4

[65] состояния: https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5_(%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)

[66] частных случаев: https://ru.wikipedia.org/wiki/%D0%A7%D0%B0%D1%81%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B

[67] выводы: https://ru.wikipedia.org/wiki/%D0%92%D1%8B%D0%B2%D0%BE%D0%B4_(%D1%80%D0%B0%D1%81%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5)

[68] prolog: https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%BB%D0%BE%D0%B3_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)

[69] преобразования графов: https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

[70] распределенных системах: http://pdos.csail.mit.edu/6.824/

[71] алгоритм Дейкстры: https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%94%D0%B5%D0%B9%D0%BA%D1%81%D1%82%D1%80%D1%8B

[72] скорость света: https://ru.wikipedia.org/wiki/%D0%A1%D0%BA%D0%BE%D1%80%D0%BE%D1%81%D1%82%D1%8C_%D1%81%D0%B2%D0%B5%D1%82%D0%B0

[73] Рассеивание тепла: https://en.wikipedia.org/wiki/Thermal_management_(electronics)

[74] плотность тока: https://ru.wikipedia.org/wiki/%D0%9F%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D1%82%D0%BE%D0%BA%D0%B0

[75] большого круга: https://ru.wikipedia.org/wiki/%D0%91%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9_%D0%BA%D1%80%D1%83%D0%B3

[76] теория алгоритмов: https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2

[77] теория автоматов: https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%BE%D0%B2

[78] формальная грамматика: https://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0

[79] сопоставлением паттернов: https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%86%D0%BE%D0%BC

[80] патологически плохое поведение: https://en.wikipedia.org/wiki/Pathological_(mathematics)

[81] техник бэктрекинга: https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D1%81_%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%D0%BE%D0%BC

[82] регулярные выражения: https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F

[83] действительно регулярные: https://swtch.com/~rsc/regexp/

[84] автомат с магазинной памятью: https://ru.wikipedia.org/wiki/%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82_%D1%81_%D0%BC%D0%B0%D0%B3%D0%B0%D0%B7%D0%B8%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C%D1%8E

[85] контекстно-свободной грамматики: https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BD%D0%BE-%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%B0%D1%8F_%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0

[86] HTTP: http://www.ietf.org/rfc/rfc2616.txt

[87] стека вызовов: https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D0%BA_%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%BE%D0%B2

[88] алгоритм рекурсивного спуска: https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D0%BF%D1%83%D1%81%D0%BA%D0%B0

[89] LALR(1): https://ru.wikipedia.org/wiki/LALR(1)

[90] yacc: https://ru.wikipedia.org/wiki/Yacc

[91] bison: http://www.gnu.org/software/bison/

[92] Некоторые языки программирования: http://golang.org/

[93] сегментированных стеков: https://golang.org/doc/faq#stack_or_heap

[94] функции: https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)

[95] оптимизации линейного программирования: https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)

[96] погрешность: http://mathworld.wolfram.com/ErrorPropagation.html

[97] Источник: https://geektimes.com/post/300333/?utm_campaign=300333