Every Future has a Founding

Anatomy of the Mandelbrot set

The Mandelbrot set defined as a subset of the complex plane, the calculation that decides membership, and the shapes and dimension of its boundary.

13 minutes read

2726 words

Contents13

The pictures that carry the name Mandelbrot show a black bulb with spirals and curls along its edge. They are coloured in bands, and magnifying the edge reveals more detail without end. Those pictures are portraits of a set of complex numbers. One short calculation, repeated, decides which numbers belong. This page defines the set, works that calculation, and names the shapes the picture turns out to hold.

A magnified view of the edge of the Mandelbrot set, showing blue and amber spirals and curls against a pale blue ground
A magnified piece of the edge, centred near minus 0.7436 plus 0.1318i. The view is one thousandth of a unit across. Colour records how quickly the calculation ran away at each point, and the flat dark region is where it never did.

Assumed knowledge

Complex numbers, and the notation for writing a set and its members. Both are built up in numbers and sets .

Polar form, which names a point of the plane by a distance and an angle. It is built up in angles and polar form .

Iteration, which is applying one rule to its own output over and over, together with the words orbit, bounded and fixed point. That is iteration and orbits .

Nothing else. The test that decides membership is one line of arithmetic, repeated.

Ground covered

The Mandelbrot set defined as a subset of the complex numbers, and the orbit that decides which numbers belong. Why that orbit starts at zero. Squaring read as a rotation of the plane. The escape radius, which turns a test over infinitely many steps into a finite one. The two components whose boundaries are known in closed form, the dimension of the boundary, and the quantity that is still open.

Subset of the complex plane

Each complex number is drawn as a point, with its real part measured along the horizontal axis and its imaginary part up the vertical one. The set of all of them is written C\mathbb{C} .

The Mandelbrot set, written MM , is a subset of C\mathbb{C} . Every point of the plane is either a member of it or not, and one calculation settles which. That calculation is the subject of the next section.

The set is bounded. Every member lies within distance 2 of the origin, which the section on the escape radius proves. The whole of MM therefore fits in a small part of the plane.

2026-09-05T01:38:17.08 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/
Four values of c. The two teal points belong to the set and the two amber ones do not. The silhouette is drawn at 560 by 410 samples, which resolves the edge only as far as that grid allows.

Membership is not decided by nearness. Two values of cc a millionth apart can fall on opposite sides, and that is why the boundary carries detail at every magnification. The picture at the top of this page is one small piece of that boundary.

Orbit of zero

Fix a complex number cc . Apply the map zz2+cz \mapsto z^2 + c over and over, starting from zero. The map is called quadratic, because zz appears squared and no higher power of it appears.

The name describes the rule that is repeated, rather than the result of repeating it. Applying the rule twice gives z4+2cz2+c2+cz^4 + 2cz^2 + c^2 + c , where zz now reaches the fourth power. Applying it nn times reaches the power 2n2^n , so ten steps reach 1024. The rule stays quadratic however often it runs. Squaring and adding are the ordinary arithmetic of complex numbers. The result is a sequence.

z0=0,zn+1=zn2+c(1) z_0 = 0, \qquad z_{n+1} = z_n^2 + c \tag{1}

That sequence is the orbit of zero, which is the orbit of the map from the starting point 0. Three worked examples, each computed by squaring and adding:

c=1c = -1
the orbit runs 0,  1,  0,  1,  00,\; -1,\; 0,\; -1,\; 0 and repeats forever.
c=ic = i
the orbit runs 0,  i,  1+i,  i,  1+i,  i0,\; i,\; -1+i,\; -i,\; -1+i,\; -i and repeats after the first two terms.
c=1c = 1
the orbit runs 0,  1,  2,  5,  26,  6770,\; 1,\; 2,\; 5,\; 26,\; 677 and grows without limit.
The orbit of zero for two values of c Two ruled complex planes at the same scale. On the left the orbit for c = 0.28 + 0.53i stays in a small patch near the origin. On the right the orbit for c = -0.2 + 0.9i walks outward and leaves the frame. c = 0.2823 + 0.5301i the orbit repeats every four steps -0.5 0.5 0.5i i 0 first step c = -0.2 + 0.9i the orbit escapes -1 1 -i i 0 first step and onward, without limit
Two orbits, drawn one step at a time. A pulse marks the point each step lands on. On the left it returns to the same four points for ever, which is what a cycle looks like. On the right it lands somewhere new every time, until it leaves the picture. The two planes are drawn at different scales, so each orbit fills its own.

The first two orbits above stay bounded, which means one fixed distance from the origin holds every term. The third escapes, which means its moduli grow without limit. The Mandelbrot set MM is the set of values of cc whose orbit of zero stays bounded.1

So 1-1 and ii belong to MM . The value 11 escapes, and lies outside it. The figure above marks each of those, with a fourth value that also escapes.

M={cC  :  znR   for some R and every n}(2) M = \left\{\, c \in \mathbb{C} \;:\; |z_n| \le R \;\text{ for some } R \text{ and every } n \,\right\} \tag{2}

Here C\mathbb{C} is the set of all complex numbers, and RR is one distance that holds every term of the orbit inside it. Which distance does not matter, only that one exists.

The starting value is zero for a reason. The derivative of a map at a point says how much it stretches a small step taken from there. That stretch is the test separating an attracting fixed point from a repelling one. For fc(z)=z2+cf_c(z) = z^2 + c the derivative is 2z2z , so at zero it stretches nothing. A point where the derivative is zero is a critical point. The orbit of the critical point decides the behaviour of every other orbit. One sequence per value of cc is therefore enough.1

The two letters carry different roles. The variable zz moves along the sequence. The variable cc is fixed for the whole sequence, and the picture is drawn over cc . A point of the image is a value of cc , never a value of zz .

Squaring as rotation

Write rr for the modulus of zz , which is its distance from the origin, and θ\theta for its argument, which is its direction. Polar form then gives z=reiθz = r e^{i\theta} .

Multiplying two complex numbers multiplies their moduli and adds their arguments. Setting both factors to zz in that rule gives the geometric content of the map.

z2=r2e2iθ(3) z^2 = r^2 e^{2i\theta} \tag{3}

Squaring doubles the argument and squares the modulus. One step of equation (1) is three operations in sequence:

  1. Rotate the point to twice its angle.
  2. Scale its distance to the square of itself.
  3. Translate it by cc .
2026-09-05T01:38:17.68 image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/
One step of the map. Squaring doubles the argument and squares the modulus. Adding c translates the result.

The unit circle is the set of points at modulus one, and squaring behaves differently on each side of it. A point with r<1r < 1 has r2<rr^2 < r and moves inward. A point with r>1r > 1 has r2>rr^2 > r and moves outward. Under repeated squaring alone, with c=0c = 0 , every point inside the unit circle converges to the origin. Every point outside it escapes. The circle itself is preserved.

Adding cc breaks that separation. A point moved inward by squaring can be moved back outside by the translation. The two operations together produce the boundary shown below.

Escape radius

Once the modulus of a term passes two, the orbit escapes. The bound follows from the reverse triangle inequality, which states that x+yxy|x + y| \ge |x| - |y| for any two complex numbers. Suppose zn>2|z_n| > 2 and znc|z_n| \ge |c| . Then

zn+1=zn2+czn2czn2zn=zn(zn1).(4) \begin{aligned} |z_{n+1}| &= |z_n^2 + c| \\ &\ge |z_n|^2 - |c| \\ &\ge |z_n|^2 - |z_n| \\ &= |z_n|\,\bigl(|z_n| - 1\bigr). \end{aligned} \tag{4}

The second line applies the inequality. The third uses czn|c| \le |z_n| . Write λ=zn1\lambda = |z_n| - 1 . The factor λ\lambda exceeds one, because zn>2|z_n| > 2 . So zn+1λzn>zn|z_{n+1}| \ge \lambda |z_n| > |z_n| . The modulus grows, and λ\lambda grows with it. After kk further steps zn+kλkzn|z_{n+k}| \ge \lambda^k |z_n| , and that bound grows without limit.

The condition znc|z_n| \ge |c| costs nothing. If c>2|c| > 2 then z1=cz_1 = c already has modulus above two, so such a cc lies outside MM . Every cc that needs testing satisfies c2|c| \le 2 . Every term under test satisfies zn>2c|z_n| > 2 \ge |c| . The whole set lies inside the disc of radius two, and one comparison decides escape.1

def escapes(c, nmax=400):
    """Return the step at which the orbit of 0 leaves the disc of radius 2."""
    z = 0j
    for n in range(nmax):
        z = z * z + c
        if abs(z) > 2.0:
            return n
    return None

A returned value of None means the orbit survived nmax steps. That is evidence of membership, never proof. No finite computation decides membership for a point of the boundary.

Two exact shapes

The interior of MM breaks into components. A component is one connected piece of that interior, a region that holds together and touches no other such region. Two of them have shapes given in closed form, and both are drawn over the computed set below.

The Mandelbrot set with the main cardioid and the period-2 disc traced over it
The set computed by escape time. The amber curve is the main cardioid from equation 6. The teal circle is the period-2 disc of radius one quarter centred at minus one.

The main cardioid is the largest component, the heart-shaped region on the right of the figure. It holds the values of cc for which fcf_c has an attracting fixed point. A fixed point is a value zz that the map leaves where it is, so z=z2+cz = z^2 + c . It attracts when nearby points move towards it under repeated application. That happens when the derivative there has modulus below one, which is 2z<1|2z| < 1 .

Substitute μ=2z\mu = 2z . Then z=μ/2z = \mu/2 , and the fixed-point equation rearranges to c=zz2c = z - z^2 . Therefore

c(μ)=μ2μ24,(5) c(\mu) = \frac{\mu}{2} - \frac{\mu^2}{4}, \tag{5}

and the condition 2z<1|2z| < 1 becomes μ<1|\mu| < 1 . The main cardioid is the image of the open unit disc under equation (5).1 Its boundary follows from μ=eiθ\mu = e^{i\theta} ,

c(θ)=eiθ2e2iθ4.(6) c(\theta) = \frac{e^{i\theta}}{2} - \frac{e^{2i\theta}}{4}. \tag{6}

The component attached at c=3/4c = -3/4 holds values of cc with an attracting orbit of period two. An orbit has period two when it returns to its starting value after two steps. The orbit for c=1c = -1 does that. That component is a disc of radius one quarter centred at 1-1 .1 The circle in the figure is that disc drawn from its formula. Components of higher period surround the cardioid.

Filaments and islands

Adrien Douady and John Hubbard proved in 1985 that MM is connected, meaning it forms a single piece. They built a conformal isomorphism.1 It runs between the outside of MM and the outside of the closed unit disc. A conformal isomorphism is a map between two regions. It preserves angles, and a map of the same kind undoes it. Its existence shows the outside of MM is as simple as the outside of a disc.

Every island in a rendering is therefore joined to the main body by a filament. That includes the small copies along the horizontal axis. A filament can be thinner than the pixel grid, so the islands look separate.

Shishikura’s theorem

The boundary of MM is the set of points that have both members of MM and non-members arbitrarily close by. Its Hausdorff dimension is two. Hausdorff dimension measures how thoroughly a set fills the space around it. A smooth curve has dimension one. A filled region of the plane has dimension two. A rough curve takes a value in between. Mitsuhiro Shishikura proved that this boundary reaches two, the largest value the plane allows.2

The same is true of the Julia set of zz2+cz \mapsto z^2 + c for most cc in the boundary, in a sense the proof makes precise. For a fixed cc , the Julia set is the boundary between two kinds of starting point. On one side the orbit stays bounded, and on the other it escapes. The Julia set holds cc fixed and varies the starting point. The set MM holds the starting point at zero and varies cc . A set of dimension two has no length that finer measurement converges on. That is why zooming never resolves the edge into a curve.

Pixel counting

The area of MM is known only from numerical estimates. The best pixel-counting estimate is 1.5065918849. The uncertainty is 2.8 at the tenth decimal place. Thorsten Förstemann obtained it by testing about 87 trillion points.3 The grid was 2097152 by 2097152.

Pixel counting draws the set on a grid and counts the points whose orbit survives the iteration limit. The method converges slowly, because the boundary it resolves has dimension two.

Logistic family

The part of MM on the horizontal axis is the interval from 2-2 to 1/41/4 . Values of cc in that interval correspond to the logistic family xrx(1x)x \mapsto rx(1-x) . That map acts on ordinary numbers and is used in population models. The correspondence is

r=1+14c.(7) r = 1 + \sqrt{1 - 4c}. \tag{7}

As rr rises, the attracting cycle of the logistic family doubles its period again and again. The doublings come at ever closer values of rr . That sequence of doublings is the period-doubling cascade. Equation (15) carries it onto the components in that interval.1 The cardioid becomes the range of rr with an attracting fixed point. The disc at 1-1 becomes the range with an attracting two-cycle.

Figure sources

Every image is generated by a script kept beside this page.

membership.py draws the set as one filled outline. The drawing then follows the page’s colours, which a raster image cannot do, and it gzips to 19 KB. It runs the escape test on a grid of 560 by 410 points, to a limit of 120 iterations. It prints the verdict for each of the four marked values.

planes.py draws one step of the map on a ruled plane.

orbit.py draws the two orbits. It writes the animation as CSS inside the file, so nothing runs to play it. A reader who asks for reduced motion is given every step at once.

mandelbrot.py computes escape time on a grid of 1600 by 1387 points, to a limit of 400 iterations. It then draws equation (6) and the period-2 circle over the result.

zoom.py draws the magnified edge at the top, with a limit of 3000 steps and a smooth escape count. It then reduces the result to 256 colours.

membership.py, planes.py and mandelbrot.py need NumPy and Matplotlib. zoom.py needs Pillow as well. orbit.py needs nothing beyond Python.

Each one is published with this page, so it can be read or run without asking for anything: membership.py, planes.py, orbit.py, mandelbrot.py and zoom.py.

python3 orbit.py
uv run --with numpy --with matplotlib python3 membership.py
uv run --with numpy --with matplotlib python3 planes.py
uv run --with numpy --with matplotlib python3 mandelbrot.py
uv run --with numpy --with matplotlib --with pillow python3 zoom.py

References


  1. Mandelbrot set. Wikipedia. Retrieved 30 August 2026. https://en.wikipedia.org/wiki/Mandelbrot_set (opens in a new tab)  ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  2. Mitsuhiro Shishikura. The Hausdorff dimension of the boundary of the Mandelbrot set and Julia sets. Annals of Mathematics 147 (1998), 225 to 267. Preprint at https://arxiv.org/abs/math/9201282 (opens in a new tab)  ↩︎

  3. Thorsten Förstemann. Numerical estimation of the area of the Mandelbrot set. Retrieved 30 August 2026. https://www.foerstemann.name/labor/area/Mset_area.pdf (opens in a new tab)  ↩︎

Tags