Внимание любителям математики! 10 красивых математических формул, полезных в программировании
Программирование и математика на первый взгляд могут показаться совершенно разными областями. Программирование — это работа по написанию логичного и конкретного кода, а математика — это наука, стремящаяся к абстрактным и универсальным истинам. Однако в основе информатики всегда лежит математика. В оптимизации алгоритмов, науке о данных, машинном обучении, компьютерной графике и даже за кулисами повседневных приложений красивые математические формулы работают тихо и мощно.
В этой статье мы тщательно отобрали 10 математических формул, которые не только математически красивы, но и играют очень практическую и важную роль в контексте программирования и алгоритмов. Мы глубоко погрузимся в математический фон каждой формулы и очень подробно, с конкретными примерами кода на Python и C++, объясним, как она применяется в реальной практике программирования.
Добро пожаловать в мир, где пересекаются красота математики и практичность программирования.
1. Тождество Эйлера (Euler’s Identity)
Красота формулы и обзор
Тождество Эйлера называют «сокровищем человечества» и «самой красивой математической формулой в мире». Пять самых важных констант в математике (число Непера $e$, мнимая единица $i$, число пи $\pi$, нейтральный элемент по умножению $1$ и нейтральный элемент по сложению $0$) объединены в одной простой формуле.
$$ e^{i\pi} + 1 = 0 $$Это тождество выводится путем подстановки $\theta = \pi$ в более общую формулу Эйлера $e^{i\theta} = \cos\theta + i\sin\theta$.
Применение в программировании
В программировании, особенно в компьютерной графике и разработке игр, формула Эйлера становится чрезвычайно мощным инструментом для работы с «вращением». Вращение точек в двумерном пространстве можно выполнить и с помощью матричных вычислений, но использование комплексных чисел делает расчеты предельно простыми и интуитивно понятными. Вращение на комплексной плоскости можно реализовать просто путем умножения на $e^{i\theta}$, что делает код лаконичным.
Пример реализации (C++)
Ниже представлена программа на C++, которая использует стандартную библиотеку <complex> для вращения точки в 2D-координатах на заданный угол (в радианах).
| |
Подробное объяснение: Преимущество этого подхода заключается в том, что вычисления матрицы вращения (4 умножения и 2 сложения) инкапсулируются как операции с комплексными числами. Кроме того, в трехмерном пространстве используется расширенная концепция этого — «кватернионы» (quaternions). Использование кватернионов позволяет избежать фатальной проблемы «шарнирного замка» (Gimbal Lock), возникающей при использовании углов Эйлера, и реализовать плавную сферическую линейную интерполяцию (Slerp).
2. Ряд Тейлора (Taylor Series)
Красота формулы и обзор
Ряд Тейлора — это математический метод представления сложной функции (например, тригонометрической или показательной) в виде бесконечной суммы полиномов (многочленов). Разложение функции $f(x)$ в ряд Тейлора в окрестности точки $a$ определяется следующим образом:
$$ f(x) = \sum_{n=0}^\infty \frac{f^{(n)}(a)}{n!}(x-a)^n $$В частности, случай, когда $a=0$, называется «рядом Маклорена».
Применение в программировании
Компьютеры (CPU и FPU) по своей сути могут выполнять только четыре основных арифметических действия: сложение, вычитание, умножение и деление. Итак, как же вычисляются sin(x) или exp(x)? Хотя в современных процессорах часто используются алгоритм CORDIC или аппроксимация Чебышёва, ряд Тейлора (или его варианты) напрямую полезен при реализации математических функций на программном уровне или при создании собственных быстрых аппроксимирующих функций с пониженной точностью для повышения производительности.
Пример реализации (Python)
Ниже представлен код на Python, который приближенно вычисляет функцию синуса с помощью ряда Маклорена.
$$ \sin(x) \approx x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \dots $$ | |
Подробное объяснение:
В приведенном выше коде входное значение x нормализуется в диапазоне $[-\pi, \pi]$. Это связано с тем, что ряд Тейлора обладает свойством, при котором погрешность быстро возрастает по мере удаления от центра разложения (здесь это 0) — так называемая ошибка усечения. Поскольку бесконечные вычисления в программировании невозможны, вычисления прерываются на конечном числе terms, и управление компромиссом между возникающими из-за этого «ошибкой округления» и «ошибкой усечения» является сутью программирования численных методов.
3. Теорема Байеса (Bayes’ Theorem)
Красота формулы и обзор
Теорема Байеса — это теорема для обновления вероятности события (апостериорной вероятности) на основе предварительных знаний (априорной вероятности), связанных с этим событием. Это одна из самых важных формул в теории вероятностей и статистике.
$$ P(A|B) = \frac{P(B|A)P(A)}{P(B)} $$Здесь $P(A|B)$ представляет собой вероятность того, что событие A произойдет при условии, что произошло событие B (апостериорная вероятность).
Применение в программировании
В области машинного обучения и науки о данных она широко используется в качестве «наивного байесовского классификатора» (Naive Bayes Classifier). Типичным примером применения является фильтрация спама. Расчет типа «Какова вероятность того, что это спам, если в письме есть слово “бесплатно”?» динамически вычисляется на основе прошлых данных.
Пример реализации (Python)
Код, демонстрирующий базовую логику спам-фильтра.
| |
Подробное объяснение:
В реальной реализации (наивный байесовский классификатор) вероятности нескольких слов перемножаются. Однако, если перемножить вероятности (значения от 0 до 1) тысячи раз, из-за ограничений представления чисел с плавающей запятой в компьютере (потеря значимости - underflow) значение станет равным нулю. Поэтому в реальном программировании обязательным приемом является преобразование произведения вероятностей в «сумму логарифмов» (log(a * b) = log(a) + log(b)).
4. Информационная энтропия Шеннона (Shannon Entropy)
Красота формулы и обзор
Определенная отцом теории информации Клодом Шенноном, «энтропия» — это математическая формула для количественной оценки «неопределенности», «случайности» или «среднего количества информации» источника информации.
$$ H(X) = - \sum_{i=1}^n P(x_i) \log_2 P(x_i) $$Применение в программировании
Энтропия незаменима в алгоритмах сжатия данных (кодирование Хаффмана, теоретический предел алгоритма сжатия ZIP), оценке криптографической стойкости случайных чисел в теории криптографии и алгоритмах «деревьев принятия решений» (Decision Trees) в машинном обучении (например, ID3 и C4.5). При построении дерева решений алгоритм находит признак (feature), при разделении по которому уменьшение энтропии (прирост информации — Information Gain) будет максимальным.
Пример реализации (Python)
Функция для расчета энтропии строки (набора данных) и оценки количества информации.
| |
Подробное объяснение:
Единицей измерения энтропии является «бит» (bits). Если энтропия равна 1.5, это означает, что для представления этих данных требуется в среднем минимум 1,5 бита на элемент. В повседневной практике программирования она постоянно рассчитывается как ориентир (бенчмарк) для оценки эффективности алгоритмов сжатия и как важный показатель при выборе признаков в моделях машинного обучения.
5. Быстрое преобразование Фурье (Fast Fourier Transform - FFT)
Красота формулы и обзор
Дискретное преобразование Фурье (DFT), которое преобразует сигнал во временной области в сигнал в частотной области. Его формула выглядит следующим образом:
$$ X_k = \sum_{n=0}^{N-1} x_n e^{-i 2\pi k n / N} $$Если вычислять DFT напрямую, временная сложность (time complexity) составит $O(N^2)$, и по мере увеличения объема данных вычисления станут катастрофически медленными. Алгоритм, который радикально ускоряет это до $O(N \log N)$ с помощью метода «разделяй и властвуй», — это «Быстрое преобразование Фурье (FFT)». Он входит в десятку самых важных алгоритмов 20-го века.
Применение в программировании
FFT — это незаменимая технология, поддерживающая современное общество. Она работает повсюду: от распознавания голоса (Siri и Alexa), сжатия данных MP3 и JPEG/MPEG, цифровой связи, такой как LTE и Wi-Fi, до умножения огромных целых чисел (алгоритм Шёнхаге — Штрассена).
Пример реализации (Python)
Пример простой реализации рекурсивного алгоритма Кули-Тьюки. (※ На практике используются библиотеки, такие как FFTW или numpy.fft, которые максимально оптимизированы на C или ассемблере)
| |
Подробное объяснение: Суть этого алгоритма заключается в использовании симметрии и периодичности комплексных чисел, называемых «поворотными множителями» (Twiddle factor). Это позволяет избежать дублирования вычислений и, в случае $N=1024$, сократить необходимое количество операций с $1\,048\,576$ до примерно $10\,240$. Можно сказать, что это настоящее чудо, порожденное слиянием математики и алгоритмов.
6. Формула гаверсинуса (Haversine Formula)
Красота формулы и обзор
Это формула для расчета кратчайшего расстояния (расстояния по большому кругу) между двумя точками на поверхности сферы, такой как поверхность Земли.
$$ a = \sin^2\left(\frac{\Delta\phi}{2}\right) + \cos\phi_1 \cos\phi_2 \sin^2\left(\frac{\Delta\lambda}{2}\right) $$ $$ c = 2\cdot \text{atan2}\left(\sqrt{a}, \sqrt{1-a}\right) $$ $$ d = R \cdot c $$(Здесь $\phi$ — широта, $\lambda$ — долгота, а $R$ — радиус Земли)
Применение в программировании
Эта формула необходима при расчете расстояния между двумя координатами широты и долготы в приложениях для GPS-трекинга и сервисах на основе геолокации, таких как Uber или Pokemon GO. При расчете расстояния по прямой линии с использованием теоремы Пифагора не учитывается кривизна Земли, что приводит к значительным погрешностям на больших расстояниях.
Пример реализации (Python)
Функция, принимающая две координаты (широту и долготу) и возвращающая расстояние между ними в километрах.
| |
Подробное объяснение:
Существует также метод с использованием теоремы косинусов для сферической тригонометрии, но когда расстояние между двумя точками очень мало (например, несколько метров), может возникнуть так называемая «катастрофическая потеря значимости» (Catastrophic cancellation) в точности вычислений с плавающей запятой. Поскольку в формуле гаверсинуса используется sin^2, она имеет большое преимущество в программировании: она численно стабильна даже для микроскопических расстояний. Если требуется еще большая точность, используются формулы Винсенти (Vincenty’s formulae), в которых Земля рассматривается как эллипсоид.
7. Метод Ньютона-Рафсона (Newton-Raphson Method)
Красота формулы и обзор
Это чрезвычайно мощный алгоритм нахождения корней, который итеративно находит решение (корень) уравнения $f(x) = 0$ с помощью касательных.
$$ x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)} $$Используя значение функции $f(x_n)$ и ее наклон (производную) $f'(x_n)$ в текущей позиции $x_n$, метод оценивает следующую, более точную позицию для поиска — $x_{n+1}$.
Применение в программировании
Он используется в рендеринге графических движков, определении коллизий в физических симуляциях, задачах оптимизации и т.д. Особенно стоит отметить знаменитый «Быстрый обратный квадратный корень» (Fast Inverse Square Root), скрытый в исходном коде легендарной игры-шутера 『Quake III Arena』. Это был хак, в котором метод Ньютона применялся только один раз для молниеносного вычисления $1/\sqrt{x}$, что было критически важно для нормализации векторов.
Пример реализации (C++)
Здесь показан простой пример вычисления стандартного квадратного корня $\sqrt{N}$ (то есть решения уравнения $x^2 - N = 0$) с помощью метода Ньютона. $f(x) = x^2 - N$, $f'(x) = 2x$.
| |
Подробное объяснение:
Главное очарование метода Ньютона заключается в том, что при правильных условиях он обладает «квадратичной сходимостью» (Quadratic convergence). Это означает феноменальную скорость сходимости, когда количество правильных цифр примерно удваивается с каждой итерацией. Учитывая, что бинарный поиск имеет линейную сходимость, можно понять, насколько мощным является использование информации о производной (небольшом наклоне). В хаке 『Quake III』 начальное значение для метода Ньютона вычислялось с поразительной точностью с использованием “магического числа” для побитовых операций 0x5f3759df, взламывая структуру числа с плавающей запятой стандарта IEEE 754.
8. Кривые Безье (Bézier Curves)
Красота формулы и обзор
Параметрическое уравнение, которое определяет плавную кривую с использованием нескольких контрольных точек (Control Points). Наиболее часто используемая кубическая кривая Безье (Cubic Bézier Curve) имеет 4 точки $P_0, P_1, P_2, P_3$ и определяет координаты на кривой $B(t)$ с помощью параметра $t \ (0 \le t \le 1)$.
$$ B(t) = (1-t)^3 P_0 + 3(1-t)^2 t P_1 + 3(1-t) t^2 P_2 + t^3 P_3 $$Применение в программировании
Кривые Безье — это основа компьютерной графики. Они используются в инструментах векторной графики, таких как Adobe Illustrator, при рендеринге шрифтов (TrueType и OpenType), в функциях плавности (easing) для переходов и анимаций cubic-bezier() в CSS, для управления траекторией камеры в играх — везде, где требуется программная отрисовка «плавных движений и форм».
Пример реализации (Python)
Код, генерирующий набор точек на кубической кривой Безье из 4-х контрольных точек.
| |
Подробное объяснение:
Эта формула является развернутым видом «Алгоритма де Кастельжо» (De Casteljau’s algorithm), в котором рекурсивно применяется линейная интерполяция (Lerp: Linear Interpolation). Решение находится напрямую с использованием полиномиальных вычислений (полиномы Бернштейна). В программировании кривая аппроксимируется и отрисовывается как набор бесчисленного множества «крошечных отрезков». Поэтому, настраивая разрешение параметра $t$ (количество steps), можно управлять балансом между производительностью и качеством отрисовки.
9. Сигмоида (Sigmoid Function)
Красота формулы и обзор
Плавная S-образная функция, которая сжимает (сквизит) любой вещественный вход $x \ ( -\infty < x < \infty )$ строго в значение между $0$ и $1$.
$$ \sigma(x) = \frac{1}{1 + e^{-x}} $$Применение в программировании
Исторически она сыграла очень важную роль в логистической регрессии и как «функция активации» (Activation Function) в нейронных сетях (глубоком обучении). Главным ее преимуществом является то, что выходные данные ограничены диапазоном от 0 до 1, и поэтому результат можно интерпретировать как «вероятность».
Пример реализации (Python)
Код, который применяет функцию сигмоиды к заданному массиву (тензору).
| |
Подробное объяснение:
Ветвление кода x >= 0 и других вариантов выше сделано для предотвращения «переполнения» (overflow), специфичной проблемы программирования. Это численный математический прием, предотвращающий сбой программы (или возврат Inf) при попытке вычислить $e^{1000}$ в случаях, когда, например, $x = -1000$. В настоящее время в скрытых слоях глубокого обучения преобладает ReLU ($f(x) = \max(0, x)$) с точки зрения скорости вычислений и проблемы исчезающего градиента, но в выходном слое бинарной классификации сигмоида по-прежнему занимает незыблемые позиции.
10. Евклидово расстояние и теорема Пифагора (Euclidean Distance & Pythagorean Theorem)
Красота формулы и обзор
Это основа геометрии со времен Древней Греции и формула, определяющая прямолинейное расстояние между двумя точками в $n$-мерном пространстве. В двумерном пространстве это сама теорема Пифагора ($a^2 + b^2 = c^2$).
Евклидово расстояние $d$ между точкой $P(x_1, y_1, z_1)$ и $Q(x_2, y_2, z_2)$ в трехмерном пространстве выражается следующим образом:
$$ d = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2 + (z_2-z_1)^2} $$Применение в программировании
Это основное вычисление для любой разработки игр, физических движков и алгоритмов машинного обучения, таких как «Метод k-ближайших соседей» (K-Nearest Neighbors) и кластеризация (K-Means). В играх оно вычисляется миллионы раз каждый кадр, например, при определении столкновений персонажей (Bounding Circle / Sphere Collision).
Пример реализации (C++)
Оптимизированный код, который определяет, сталкиваются ли два круга (или сферы).
| |
Подробное объяснение:
При расчетах точно по математической формуле в конце необходимо извлечь квадратный корень $\sqrt{\cdot}$, но в программировании вызов функции sqrt() является очень тяжелой операцией для процессора (потребляет много тактовых циклов). Поэтому, если нужно только сравнить расстояния, стандартным приемом в программировании игр является сравнение обеих частей в квадрате (distanceSquared <= radiiSumSquared). Подобная оптимизация для снижения вычислительной нагрузки за счет свойств математических уравнений и неравенств — это истинное удовольствие от проектирования алгоритмов.
Заключение
Что вы об этом думаете? От тождества Эйлера до теоремы Пифагора — эти 10 формул не просто теоретические концепции из учебников. За кулисами кода, который мы пишем каждый день, они пульсируют как «сердце», сжимая данные, позволяя моделям машинного обучения делать прогнозы, плавно отрисовывая анимацию и обеспечивая быстрый поиск.
Понимание математической подоплеки необходимо для перехода от кодера, просто вызывающего существующие библиотеки (например, math.sin или numpy.fft), к инженеру, который понимает их внутреннюю структуру и может выжать из них максимум. В следующий раз, когда вы будете писать код, попробуйте немного пофантазировать о том, какие красивые математические формулы работают за ним.
Happy Coding and Math!
