Julia sets are one of the most well-known and beautiful class of fractals. I explain a little bit of the mathematics at the bottom of this page. For now, check out this video for a visual intuition of how a Julia set is formed (feel free to skip ahead):

A while ago, one of my friends told me that I should create a gallery of the Julia sets that I've created over the years. I think there are several colorations here that everyone will enjoy!

__Quadratic Julias__

__Cubic Julias__

__Julia Sets for Various Rational Functions__

And now you can make your own Julia sets by dragging your mouse across the image of the Mandelbrot set! (values near the boundary are especially interesting).

c = 0

So, what are Julia sets and how did I render them?

Here, $\mathbb{C}$ is the set of complex numbers and $\hat{\mathbb{C}}=\mathbb{C}\cup\{\infty\}$ is the Riemann sphere. Fix some $c\in\mathbb{C}$ and define $f_c:\hat{\mathbb{C}}\rightarrow\hat{\mathbb{C}}$ by $f_c(z)=z^2+c$.

The **quadratic Julia set** for the parameter $c$ is the set of all $z\in\mathbb{C}$ such that the sequence $z_n=f^n_c(z)$ *does not* converge to $\infty$. More generally, the Julia set of a function $g:\hat{\mathbb{C}}\rightarrow\hat{\mathbb{C}}$ is the set of all $z$ such that $g^n(z)$ does not converge to $\infty$.

For quadratic Julia sets, we can prove an interesting property that is useful for rendering them. Suppose $|c| < 2$ and $|z| > 2$, then
$$|f_c(z)| = |z^2+c| \geq |z|^2-|c| = |z|(|z|-\frac{|c|}{|z|})$$
By the assumptions on $|c|$ and $|z|$, $|z|-\frac{|c|}{|z|} > 1$. So, $|f_c(z)| > |z|$. This means that if there exists an $N$ such that $|f^N_c(z)| > 2$ then the sequence $f^n_c(z)$ converges to $\infty$.

This is precisely how the quadratic Julia sets are rendered! For each $z$ (whose real and imaginary parts correspond to the coordinates of the pixel), apply $f_c$ up to $M$ times (for fixed $M\in\mathbb{N}$) and find the smallest $N\in\mathbb{N}$ such that $|f^N_c(z)| > 2$. If such and $M$ is found, that pixel escapes to infinity and is colored black. If it is not found, I color the pixel based on where $f^N_c(z)$ is.

The **Mandelbrot set** (pictured in black-and-white below all the Julia sets) is defined similary; it is the set of all $c\in\mathbb{C}$ such that the sequence $c_n=f^n_c(0)$ does not converge to $\infty$. Suppose that $|c| < 2$ and $\exists N\in\mathbb{N}$ such that $|c_N| > 2$, then
$$|c_{N+1}|=|f_c(c_N)|=|c_N^2 + c| \geq |c_N|^2-|c|=|c_N|(|c_N|-\frac{c}{c_N})$$
By the assumptions on $|c_N|$ and $|c|$, $|c_N|-\frac{c}{c_N} > 1$. So, $|c_{N+1}| > |c_N|$. Thus, by induction, we see that if $c_n$ ever falls outside the disk of radius 2, it must converge to $\infty$. This result is similar to the one we derived for Julia sets and can be used for rendering the Mandelbrot set in a a similar way.

There are a lot of interesting geometrical properties of both the Mandelbrot set and the quadratic Julia sets. There are also very interesting ways in which they relate to each other. For example, you might have noticed while playing with the above demo that the Julia set of $f_c$ for $c$ inside the Mandelbrot set is always connected, and the Julia set for a parameter outside the Mandelbrot set is always disconnected. There is a lot of interesting theory behind this fact, having to do with the study of *branch coverings*, and I encourage you to investigate it.

Relating back to the intuition provided by the video at the top of the page, if the $c$ value which we translate by it outside the Mandelbrot set then each time the evolving Julia set gets reflected, twice the number of components are born. This means that if we keep iterating to infinity with a parameter outside the Mandelbrot set, we will in fact get the Cantor set.