29Комплексные числа

Мы начинали курс с обсуждения чисел, ими же и закончим. Всё началось с натуральных чисел. Натуральные числа можно складывать, умножать и возводить в степени, но не всегда можно вычитать. Попробуйте-ка вычесть пять из трёх — если вам известны только натуральные числа, не получится. Приходится изобретать отрицательные. С отрицательными числами вычитание работает без проблем, но с делением есть трудности — четыре на два поделятся, а на три — нет. Рациональные числа лишены этой проблемы: делить можно что угодно на что угодно, кроме нуля (с нулём так всегда будет, тут уж ничего не поделать). Однако, корни извлекать не всегда получается — например, корень из двух не является рациональным числом. Чтобы эту проблему решить, придумали вещественные числа. Теперь корни извлекаются — но только из неотрицательных чисел. А что делать, если очень хочется извлечь корень из отрицательного числа? Как обычно — придумывать новые числа!

29.1Построение комплексных чисел

29.1.1Мнимая единица

Когда мы не смогли поделить четыре на три, мы сказали — ну и ладно, давайте просто объявим, что — это новое число — не натуральное и не целое, но рациональное. Потом мы придумали две вещи: во-первых, как вложить множество целых чисел в множество рациональных — мы знаем, что целое число — это то же самое, что рациональное число . Во-вторых, как рациональные числа складывать и умножать.

С корнями из отрицательных чисел можно поступить аналогично. Допустим, очень хочется вычислить квадратный корень из минус единицы. Давайте считать, что мы его вычислили, и обозначим результат через . Эта штука называется мнимой единицей. Мы бы хотели извлекать квадратный корень не только из минус единицы, но и из других отрицательных чисел. Однако, как мы скоро увидим, ничего специального для этого делать не придётся.

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

Самое главное (и, по большому счёту, единственное), что мы знаем про и арифметические операции — что если его умножить на себя, то получится минус единица:

Взаимодействие с вещественными числами определим самым простым образом: никак. То есть выражение, например, никак нельзя упростить — это просто запись одного из наших новых чисел. Когда мы придумали рациональные числа, у каждого такого числа оказалось две части — числитель и знаменатель, оба относились к ранее определенным классам чисел — целым и натуральным. А у комплексных чисел тоже две части, одна без , а другая с .

Итак, по определению, множество комплексных чисел — это множество

Пусть — какое-то комплексное число. Тогда называется его вещественной частью (real), а — мнимой (imaginary). Обозначаются:
Заметим, что и — вещественные числа. Всю комплексную магию добавляет число .

29.1.2Арифметические операции с комплексными числами

В дальнейшем мы будем предполагать, что привычные для нас правила работы с числами — например, «от перестановки слагаемых сумма не меняется» и т.д. сохраняются и в случае комплексных чисел — по крайней мере, до тех пор, пока это возможно.

Сложение. Пусть и — два комплексных числа. Их сумма определяется так:

Я воспользовался стандартными правилами — про перестановку слагаемых и про вынесение за скобку. Таким образом, чтобы сложить два комплексных числа, нужно сложить их вещественные и мнимые части по отдельности.

Умножение. Тут будет посложнее.

Коммутативность умножения, в которую мы по-прежнему верим, позволяет сказать, что и . Но мы знаем, что , и значит получается . Итак:
Формула не самая короткая, и сходу даже непонятно, какие свойства у этой операции. Например, точно ли выполняется ассоциативность (), как сложение взаимодействует с умножением и т.д. — всё это надо проверять (спойлер: всё работает). Чуть попозже мы обсудим, как умножение записывать короче и как правильно о нём думать.

Замечание 1. С умножением на вещественные числа всё просто:
то есть вещественная и комплексная части просто умножаются покомпонентно. Аналогично можно комплексные числа делить на вещественные. Как делить комплексные числа на комплексные мы обсудим позже.

29.1.3Комплексная плоскость

Всякие комплексное число задаётся парой вещественных чисел — действительной и мнимой частью. С другой стороны, мы знаем, что парами вещественных чисел задаются точки на плоскости. Каждой точке можно также сопоставить радиус-вектор — стрелочку, которая начинается в нуле, а заканчивается в этой точке. (Эту стрелочку также можно переносить по всей плоскости, сохраняя направление и длину — иногда бывает полезно откладывать вектор не от нуля, а от другой точки.) Мы будем думать про комплексные числа как про такие векторы. Точка и её радиус-вектор соответствуют вещественному числу , а точка — числу .

Вероятно, вы помните, что векторы на плоскости складываются по правилу параллелограмма или правилу треугольника (что в сущности одно и то же). В координатах, сложение векторов происходит покомпонентно — первая компонента первого вектора складывается с первой компонентой второго, втарая — со второй. Точно так же складываются комплексные числа. Поэтому сложение комплексных чисел работает в точности так же, как сложение векторов.

С умножением интереснее. На плоскости не существует обычного векторного умножения. (Вероятно, вы помните, что есть скалярное умножение, но оно на выходе возвращает не вектор, а число — скаляр; бывает ещё векторное умножение, но оно действует в трёхмерном пространстве, а не на плоскости.) А вот комплексные числа умножать можно. Есть ли у умножения какой-то геометрический смысл? Есть! Но сперва нужно поговорить про полярные координаты.

29.1.4Тригонометрическая форма записи комплексных чисел

Задать точку на плоскости можно по-разному. Можно — её координатами в декартовой системе, как мы это обычно делаем. А можно — в полярных координатах.

Возьмём некоторое направление — например, направление горизонтальной координатной оси от начала координат в сторону плюс бесконечности. Рассмотрим теперь какую-нибудь точку . Она однозначно задаётся двумя числами: расстоянием до начала координат и углом , который составляет с нашим исходным направлением. Числа и называются полярными координатами точки .

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

Если заданы полярные координаты, восстановить декартовы легко. Если , то и — это определение синуса и косинуса. Если , всю картинку нужно растянуть в раз, то есть умножить обе координаты на . Получается такая штука:

Вернёмся к комплексным числам. Их тоже можно задавать в полярных координатах:
Число называется модулем комплексного числа, оно равно расстоянию от точки до начала координат, а число называется аргументом. Обозначения такие:
Таким образом, для любого ,

Замечание 2. Модуль комплексного числа задаётся однозначно — он находится по формуле . А вот аргумент — нет; его можно менять на целое число полных оборотов , и число не поменяется.

Умножение в тригонометрической форме. Посмотрим, как работает формула умножения комплексных чисел (29.1), если представлять их не в декартовых координатах, а в комплексных.

Теперь нужно внимательно вглядеться и напрячь память… это же формулы для косинуса и синуса суммы!
Итак, при умножении комплексных чисел их модули умножаются, а аргументы складываются. В отличие от формулы (29.1), это правило реально запомнить, и оно имеет интересный геометрический смысл: умножение на комплексное число работает как поворот плоскости.

Вопрос 1. Умножение на приводит к
  повороту на угол против часовой стрелки;

Верный ответ. Верно! Собственно, если взять число , умножить его на , оно повернётся как раз на в положительном направлении (против часовой стрелки).

  повороту на угол по часове стрелке;

Неверный ответ. Попробуйте взять число и умножить его на . Куда оно повернётся?

  повороту на 180 градусов;

Неверный ответ. Попробуйте взять число и умножить его на . Куда оно повернётся?

  отражению относительно горизонтальной оси?

Неверный ответ. Попробуйте взять число и умножить его на . Что с ним произойдёт?

29.1.5Комплексное сопряжение и деление

Обсудим ещё две важные операции. Во-первых, с комплексным числом можно сделать такую штуку, которую нельзя сделать в вещественным числом: поменять знак мнимой части. Вернее, сделать её с вещественным числом можно, но вещественное число от этого не поменяется. Если же у комплексного числа есть ненулевая мнимая часть, её знак заменится на противоположный и получится другое комплексное число. Эта операция называется комплексным сопряжением и обозначается чертой:
Геометрически комплексное сопряжение соответствует отражению плоскости относительно вещественной оси. Если применить комплексное сопряжение дважды, всё вернётся на место:

Упражнение 1. Докажите, что и .

Рассмотрим теперь любое число . Что будет, если умножить его на сопряженное?

Получается вещественное число — квадрат модуля .

Научимся теперь делить комплексные числа. Для этого научимся для всякого находить такое число , что . То есть — обратное к .

Начнём с равенства, которое мы только что вывели:

и поделим его на , при условии, что и следовательно :
Итак, обратное к — это число
Почему такая запись лучше, чем просто ? Потому что в формуле выше мы делим на вещественное число , а как умножать (и делить) на вещественные числа мы знаем — это можно делать покомпонентно (см. замечание 1). Можно записать операцию деления в обычных координатах:
а можно и в полярных: взятие комплексного сопряжения меняет знак аргумента, а чтобы поделить комплексное число на вещественное, достаточно поделить его модуль:
Ну а раз для всякого числа определено обратное к нему число , то деление устроено как обычно — как умножение на обратное:

29.2Функции от комплексных чисел

29.2.1Возведение в квадрат

Мы начали с того, что добавили к обычным вещественным числам одно-единственное число — квадратный корень из минус единицы — и пообещали, что в получившейся системе чисел можно будет найти квадратный корень из любого числа. Давайте проверим, что это верно. Но сначала разберёмся, как действует возведение в квадрат.

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

Запишем в тригонометрической форме:

Тогда
при возведении в квадрат модуль возводится в квадрат, а аргумент умножается на два.

Как действует это отображение? Для простоты рассмотрим случай, когда с радиусом ничего не происходит — а именно, пусть . В этом случае наше квадратичное отображение просто удваивает аргумент, то есть отображает точку на единичной окружности с угловой координатой в точку .

Пусть точка постепенно обходит окружность от точки в положительном направлении (против часовой стрелки). Что происходит с ? Она также обходит окружность, но вдвое быстрее, см. анимацию на рис. 29.1. Когда сделает четверть оборота и окажется в точке с (то есть в точке ), её квадрат сделает полоборота и окажется в — так и должно быть, мы знаем, что . Дальше будет преодолевать расстояние от до , за это время преодолеет ещё полоборота и окажется в точке . Всё логично: . Потом будет проходить вторую половину окружности, а — обходить всю окружность по второму разу. В частности, в тот момент, когда попадёт в точку (что соответствует ), её квадрат снова попадёт в . То есть не только , но и (что, конечно, мгновенно следует из правила «минус на минус даёт плюс», которое никто не отменял). Итак, полное прохождение окружности точкой соответствует двукратному прохождению окружности точкой ?

import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

from mpl_toolkits.mplot3d import Axes3D
from celluloid import Camera
from scipy.integrate import odeint, simps

def draw_z2(Rs, labels):

    ph = np.linspace(0, 2 * np.pi, 301)
    fig = plt.figure(figsize=(7, 7))
    camera = Camera(fig)
    ax = fig.add_subplot(111, projection="3d")
    ax.set_axis_off()


    def v(ph):
        return np.sin(2 * ph) ** 2 + 0.1


    t_max = simps(1 / v(ph), ph)
    ph_steps = odeint(lambda ph, t: v(ph), 0, np.linspace(0, t_max, 101))
    for t in ph_steps.ravel():
        for plane in [1, -1]:
            ax.text(-0.1, 0, plane, "$0$")

            ax.text(0.8, 0.2, plane, "$1$")
            ob.arrow3D(ax,
                -1,
                0,
                plane,
                2,
                0,
                0,
                arrowstyle="-|>",
                mutation_scale=20,
                linestyle="dashed",
                color="gray",
            )

            ax.text(0, 1.2, plane, "$i$")
            ob.arrow3D(ax,
                0,
                -1,
                plane,
                0,
                2,
                0,
                arrowstyle="-|>",
                mutation_scale=20,
                linestyle="dashed",
                color="gray",
            )

        for R, label in zip(Rs, labels):
            # circles
            ax.plot(R * np.cos(ph), R * np.sin(ph), np.ones_like(ph), color="C0")
            ax.plot(R ** 2 * np.cos(ph), R ** 2 * np.sin(ph), -np.ones_like(ph), color="C1")

            # map
            ax.plot(
                [R * np.cos(t), R ** 2 * np.cos(2 * t)],
                [R * np.sin(t), R ** 2 * np.sin(2 * t)],
                [1, -1],
                "o-",
                color="C2",
            )
            rlabel = 1.1
            ax.text(rlabel * R * np.cos(t), rlabel * R * np.sin(t), 1, f"$ {label} $")
            ax.text(
                rlabel * R ** 2 * np.cos(2 * t),
                rlabel * R ** 2 * np.sin(2 * t),
                -1,
                f"$ {label}^2$",
            )

        camera.snap()
    animation = camera.animate()
    return animation
animation = draw_z2([1], ["z"])
Рис. 29.1: Куда точки окружности на комплексной прямой переходят под действием квадрата
Что изменится, если теперь взять окружность не единичного радиуса, а какого-нибудь другого? Эта окружность всё равно перейдёт в окружность, но радиус образа будет квадратом радиуса прообраза. Если он был меньше 1, он ещё сильнее уменьшится. А если больше — увеличится. В остальном, никаких отличий нет: угол будет по-прежнему удваиваться, см. анимацию на рис. 29.2.
import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

animation = draw_z2([0.8, 1, 1.3], ["z_1", "z_2", "z_3"])
Рис. 29.2: Окружности различных радиусов и их образы под действием квадрата
Если поднапрячь воображение, можно представить себе, что делает это отображение с плоскостью целиком. Оно накладывает её саму на себя, накручивая два раза — так что у каждой точки, кроме нуля, есть ровно два прообраза. Это будет важно для дальнейшего.

29.2.2Квадратный корень

Попробуем теперь понять, как найти квадратный корень из комплексного числа. Это операция, обратная к возведению в квадрат. Чтобы возвести комплексное число в квадрат нужно его модуль возвести в квадрат, а аргумент удвоить. Значит, чтобы сделать обратную операцию, нужно извлечь корень из модуля (это всегда возможно, модуль — неотрицательное вещественное число) и поделить аргумент на два.

Звучит просто? Но не совсем.

Мы говорили о том, что аргумент не является определенным однозначно. Например, можно сказать, что аргумент числа — это , а можно сказать, что , а можно — что . И всё это будет верно, потому что эти аргументы отличаются ровно на и задают одну и ту же точку.

Однако, когда мы их разделим пополам, вычисляя корень, мы можем получить разные точки. Действительно, если аргумент равняется , я его делю пополам, и получаю аргумент . Ему соответствует точка . Если же я взял аргумент , после деления пополам я получу аргумент , что соответствует числу . То есть при делении аргумента пополам можно получить две разные точки.

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

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

Возьмём снова точку на окружности, и пусть точка — это её квадратный корень. Пусть сначала , то есть аргумент числа равен нулю или . Есть два возможных кандидата для значения корня — либо , либо . Конечно, мы хотим, чтобы корень из единицы равнялся единице. Итак, пусть при . Теперь начнём постепенно двигать по окружности. Мы также хотим, чтобы корень был непрерывной функцией, и когда мы немножко увеличим аргумент числа , аргумент числа не должен измениться сильно. Это означает, что не может такого быть, чтобы мы только-только выехали из единицы, а вдруг стал близок к . Значит, если, например, аргумент числа равен , то аргумент числа будет , а не . Пусть мы так постепенно сдвигая , пройдём им полоборота по окружности, оказавшись в точке . В это время проедет четверть оборота и окажется в точке . Что ж, пока всё отлично — мы же знаем, что корень из минус единицы равен , так и должно быть. Однако, пусть теперь едет дальше, и проезжает вторую половину окружности. В это время проедет вторую четвертинку и окажется в точке .

Стоп.

Но ведь точка , проехав вторую половину окружности, сделал полный круг и вернулась в . И мы только что сказали, что точка , которая равна корню из , при это оказалась равной . Хотя начинали мы с того, что принудительно положили корень из единицы равным единице. Как же так? Откуда вдруг противоречие?

Никакого содержательного противоречия тут на самом деле нет: и в принципе число может с тем же правом претендовать на звание квадратного корня из единицы, как и число . Единственное, с чем возникло противоречие — это с нашим предположением, что мы можем по своем усмотрению однозначно выбрать, какому из двух возможных чисел этот корень равен. И вот это противоречие мы уже не сможем преодолеть — по крайней мере, сохраняя непрерывность корня.

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

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

29.2.3Экспонента

Давайте поговорим ещё про одну важную функцию — экспоненту. Для вещественнного числа мы определяли экспоненту как предел
и доказывали, что это определение эквивалентно такому определению через ряд (который впоследствии оказался рядом Тейлора):
Ничто не мешает нам использовать одно из этих соотношений — например, второе — для определения экспоненты комплексного числа: достаточно уметь складывать числа, делить и возводить в степени. И мы всё это умеем!

Определение 1. Экспонентой комплексного числа называется

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

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

Запишем теперь первые члены ряда (29.4) и выделим вещественную и мнимую части:

Нет ли здесь чего-то вам знакомого? Ну конечно: ряд для вещественной части равен ряду Тейлора для косинуса, а для мнимой — синусу. Поскольку косинус и синус равны своим рядам Тейлора, мы получаем:
иными словами — это число с единичным модулем и аргументом . Таким образом, тригонометрическую запись комплексного числа (29.3) можно в сокращенной форме записывать так:
(Если вы видите это впервые, я думаю, ваше ощущение примерно такое — а-а-а, откуда тут синусы, у нас же была экспонента?! А вот так. На самом деле, экспоненты и синус — это родственные функции. Но на вещественной оси этого совершенно не видно. Чтобы понять эту связь, нужны комплексные числа.)

Упражнение 2. Докажите формулы о синусе и косинусе двойного аргумента пользуясь равенством

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

Если вы верите в то, что экспонента суммы равна произведению экспонент (а это можно доказать, анализируя ряд (29.4)), эта формула не должна казаться вам необычной.

29.2.4Логарифм

Итак, у нас есть экспонента. Как определить логарифм?

Посмотрим ещё раз на формулу (29.5). Её можно записать в таком виде. Пусть . Тогда

Теперь мы хотим наоборот, по найти . Это и будет наш логарифм.

Во-первых, легко найти : раз , числа и вещественны, и можно посчитать обычный вещественный логарифм:

Кажется, что найти ещё проще — это просто . Однако, тут кроется подвох (он всегда кроется, когда мы рассматриваем аргумент): поскольку определен неоднозначно, тоже определен неоднозначно.

В комплексных числах экспонента не является инъективным отображением — что, впрочем, неудивительно, учитывая появление в ней синусов и косинусов. Более того, у каждой точки под действием экспоненты оказывается бесконечно много прообразов (а не два, как было в случае с возведением в квадрат). Поэтому каждое значение логарифма — это набор из бесконечного числа точек! И мы снова не можем выделить из них одну правильную.

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

29.3Фрактал Мандельброта

Теперь я могу рассказать про штуку, которая — в какой-то мере — привела меня в математику. Может быть, вам тоже понравится. Это фрактал Мандельброта.

Возьмём произвольное комлпексное число и рассмотрим такую последовательность комплексных чиспел :

Например, , , и т.д.

К чему стремится эта последовательность? Если , вся последовательность тождественно нулевая, и значит стремится к нулю. Если маленькое, наверное, последовательность колеблется где-то вблизи нуля или какой-то другой точки с небольшим модулем. Если большое, логично ожидать, что возведение в квадрат сделает его ещё больше и довольно быстро последовательность будет стремиться к бесконечности. Но как выглядит разделительная область между двумя режимами — когда последовательность ограничена и когда неограничена?

Давайте возьмём все точки комплексной плоскости, и раскрасим их в разные цвета. Если последовательность для выбранного значения не стремится к бесконечности — закрасим в чёрный. Если стремится — закрасим в разные цвета, в зависимости от того, как быстро она это делает (например, как быстро модуль становится больше десяти или даже двух — можно доказать, что если это произошло, то последовательность точно стремится к бесконечности). Что получится? Наверное, что-то вроде окружности? Или эллипс? Или что-то более сложное?

Оказывается, получается что-то неимоверно сложное — а именно, вот такая картинка.

import matplotlib.pyplot as plt
import numpy as np
import qqmbr.odebook as ob
# see https://github.com/ischurov/qqmbr/blob/master/qqmbr/odebook.py

def mandelbrot(pmin, pmax, ppoints, qmin, qmax, qpoints, 
               max_iterations=200, infinity_border=10):
    image = np.zeros((ppoints, qpoints))
    p, q = np.mgrid[pmin:pmax:(ppoints*1j), qmin:qmax:(qpoints*1j)]
    c = p + 1j*q
    z = np.zeros_like(c)
    for k in range(max_iterations):
        z = z**2 + c
        mask = (np.abs(z) > infinity_border) & (image == 0)
        image[mask] = k
        z[mask] = np.nan
    return -image.T
plt.figure(figsize=(10, 10))
image = mandelbrot(-2.5, 1.5, 1000, -2, 2, 1000)
plt.xticks([])
plt.yticks([])
plt.imshow(image, cmap='flag', interpolation='none')
Рис. 29.3: Множество Мандельброта и код для его построения
Чтобы понять, насколько же она сложна, вы можете посмотреть, например, это видео (или любое другое по запросу mandelbrot zoom) — там нет ничего, кроме масштабирования этой картинки со всё большим увеличением — и там видно, что в ней бесконечно много всё более и более мелких деталей. (Подробнее о построении можно прочитать, например, здесь.)

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

Ну а пока можно просто посмотреть на картинку. Что самое удивительно — всю эту сложность породила одна очень простая формула: !

Пожалуй, трудно придумать лучшую иллюстрацию к величию и красоте математического мира — первые шаги в котором мы сделали в этом курсе.