**Parallel Fractal Image Generation**

*The Mandelbrot Set*
Fractals are generated by calculating certain formulas over and over again, feeding the results of one step back into the next step. For example, the Mandelbrot set, the most well-known fractal object first described by Benoit Mandelbrot, is created by iterating a simple formula over complex numbers.

A complex number *C* consists of two components – a "real" part Re *C*, and an "imaginary" part Im *C*. The imaginary part is multiplied by the constant *i*, defined as the square root of –1:

Although complex numbers look like an abstract mathematical contraption that has no connection with the real world, they are as realistic as the real number space that we are used to. In fact, complex numbers are routinely used by electrical engineers to design the devices we use every day, so they are indeed a valid means of describing the world. To make complex numbers a bit easier to grasp, we can visualize them as points with the coordinates (*x*, *yi*) on a plane, as shown in Figure 1:

**Figure 1: The complex plane**

The magnitude of a complex number, |*C*|, ist defined as that point's distance from the origin of the complex plane and calculated as

Now, to start creating a fractal image, we choose an arbitrary point *C* from the complex plane and plug it into the following simple iteration formula:

This is the formula Benoit Mandelbrot first described. It takes the current point *Z*_{n} (for the first iteration, this is *Z*_{0}, the origin), squares it, adds the constant *C* we chose before, and so arrives at a new point *Z*_{n+1}. This point is again squared, *C* is added, and so on. We perform this iteration several times and see how the values of *Z* develop.

For example, if we choose *C* = –1.0 + 0.5*i*, we get the series of values of *Z* shown in Table 1:

*n* |
Re *Z*_{n} |
Im *Z*_{n} |
|*Z*_{n}| |

0 |
0.0000000000000 |
0.0000000000000 |
0.00000000000000 |

1 |
-1.0000000000000 |
0.5000000000000 |
1.11803398874990 |

2 |
-0.2500000000000 |
-0.5000000000000 |
0.55901699437495 |

3 |
-1.1875000000000 |
0.7500000000000 |
1.40451281589030 |

4 |
-0.1523437500000 |
-1.2812500000000 |
1.29027523446130 |

5 |
-2.6183929443359 |
0.8903808593750 |
2.76563910980620 |

6 |
5.0632035362069 |
-4.1627339199185 |
6.55472224713590 |

7 |
7.3076763610173 |
-41.6535382072400 |
42.28970771924700 |

8 |
-1682.6151113846000 |
-608.2811530195500 |
1789.18964175920000 |

9 |
2461186.6519410000000 |
2047006.6200823000000 |
3201199.12507070000000 |

10 |
1867203633030.9000000000000 |
10076130739563.0000000000000 |
1024767583835.30000000000000 |

... |
... |
... |
... |

**Table 1: Iteration approaching infinity with ***C* = –1.0 + 0.5*i*

We observe that *Z* moves out towards infinity within very few iterations. Somehow, this is what we might expect since we are constantly squaring and adding numbers.

However, if we try a different choice of *C*, for example *C* = 0.25 – 0.25*i*, we get the results in Table 2:

*n* |
Re *Z*_{n} |
Im *Z*_{n} |
|*Z*_{n}| |

0 |
0.000000000000000 |
0.00000000000000 |
0.00000000000000 |

1 |
0.250000000000000 |
-0.25000000000000 |
0.35355339059327 |

2 |
0.250000000000000 |
-0.37500000000000 |
0.45069390943300 |

3 |
0.171875000000000 |
-0.43750000000000 |
0.47005027989035 |

4 |
0.088134765625000 |
-0.40039062500000 |
0.40997608405816 |

5 |
0.097455084323883 |
-0.32057666778564 |
0.33506252161220 |

6 |
0.156728093532030 |
-0.31248365238264 |
0.34958508021450 |

7 |
0.176917662295790 |
-0.34794993419571 |
0.39034473986338 |

8 |
0.160230702525410 |
-0.37311697790776 |
0.40606669062459 |

9 |
0.136457598828770 |
-0.36956959098863 |
0.39395730588684 |

10 |
0.132038993694610 |
-0.35086115797288 |
0.37488377936362 |

... |
... |
... |
... |

**Table 2: Beginning iteration with ***C* = 0.25 – 0.25*i*

Surprisingly, *Z* stays within close range of the origin. If we iterate some more, we find that *Z* actually converges to a certain point (Table 3):

*n* |
Re *Z*_{n} |
Im *Z*_{n} |
|*Z*_{n}| |

... |
... |
... |
... |

114 |
0.14644660940674 |
-0.35355339059328 |
0.38268343236510 |

115 |
0.14644660940673 |
-0.35355339059328 |
0.38268343236510 |

116 |
0.14644660940672 |
-0.35355339059328 |
0.38268343236509 |

117 |
0.14644660940672 |
-0.35355339059327 |
0.38268343236509 |

118 |
0.14644660940673 |
-0.35355339059327 |
0.38268343236509 |

119 |
0.14644660940673 |
-0.35355339059327 |
0.38268343236509 |

120 |
0.14644660940673 |
-0.35355339059328 |
0.38268343236509 |

121 |
0.14644660940673 |
-0.35355339059328 |
0.38268343236509 |

122 |
0.14644660940672 |
-0.35355339059327 |
0.38268343236509 |

123 |
0.14644660940673 |
-0.35355339059327 |
0.38268343236509 |

124 |
0.14644660940673 |
-0.35355339059327 |
0.38268343236509 |

125 |
0.14644660940673 |
-0.35355339059327 |
0.38268343236509 |

... |
... |
... |
... |

**Table 3: Converging iteration with ***C* = 0.25 – 0.25*i*

Obviously, *Z* shows very different behaviour (converging vs. escaping to infinity) depending on our initial choice of *C*. To see how the two are related, we apply the iteration formula to every point *C* on the complex plane and color it according to the behavior if the iteration – if *Z* converges, we mark *C* black, and if *Z* escapes to infinity, we leave *C* white. The result is the graph shown in Figure 2:

**Figure 2: The Mandelbrot set**

We have plotted the Mandelbrot set – the set of all points for which the iteration formula does not escape to infinity after a certain maximum number of iterations. It is a fractal with a solid interior, but an extremely convoluted edge that shows infinite detail and self-similarity when we look at it more closely.

< Introduction | Fractal Image Characteristics >