Fractal images can be spectacularly complex and raise some aesthetic feelings, which is why it has attracted the attention of non-mathematicians. However the beauty of the images is gained by their complex regularity, recognized as self-similarity. This is only a reflection of their mathematical complexity, that is often the result of the non-linearity, and of the iterative processes that create the curves and images. It is amazing to discover that this mazing complexity is generated by the iteration of sometimes surprisingly simple mappings that describe the dynamical system.

A careful analysis to unravel the complexity requires some mathematical abstraction and topological concepts that are not always very intuitive, or at least deviate drastically from familiar linear approximations. The butterfly effect has popularized the idea of the extreme sensitivity of such systems to their initial conditions in a very clear way. The difficulty to forecasting the weather is the standard example of such a system. These dynamical systems can create remarkable mathematical objects such as Mandelbrot sets and Sierpinski gaskets, or they can generate very realistic images of plants, clouds, or mountains. The theory of these systems has been thought through and has now been reduced to a subject that can be taught at even an undergraduate level to students with some interest in mathematics.

This book is a good example of what is possible as an introduction to this broad material of chaos, dynamical systems, fractals, tilings, substitutions, and many other related aspects. To bring all this in one volume and at a moderate mathematical level is an ambitious plan but these notes are the result of many years of teaching experience and with over 400 pages, something an be achieved.

Part of the trick to make the material accessible is by starting with one-dimensional dynamics, even if these are placed in a context of metric spaces, the many examples are still unsophisticated, simple iterations. So the first chapters are mainly used to introduce terminology (iteration, orbit, cycle, fix point, stability, attractor, chaos) and elementary examples (Newton iteration, logistic maps, tent family,...). Yet in chapter 3, there is an introduction to the Sarkovsky theorem (one of the highlight of the book) with a proof of a special case but the general proof follows only in chapter 12 where it takes about the complete chapter to prove it. Sarkovsky's theorem basically states that a system with a 3-cycle is much more complex and chaotic than a system with only a 2-cycle.

With those introductory teasers in mind, the student is introduced in the next chapters to more abstraction like metric spaces (which is a simple version of a topological space to be introduced later), and other topological concepts like the conjugacy of dynamical systems. These are needed to give a proper definition of what chaos is and to prove that some of the systems that were introduced are indeed chaotic. In some sense two systems are called conjugate if they behave similarly, and thus one can prove that a system is chaotic by showing that it is conjugate with another, perhaps simpler, chaotic system.

At this point the reader is ready to be introduced to fractals, the self-similarity of fractals and to fractal dimension, which is illustrated with several classical examples of Newton's method on quadratic and cubic equations and other examples like the Henon map. Most of what has been discussed to far involved real numbers and much was referring to mappings defined on real intervals. The next step is to move to complex numbers. Of course, this is where the Mandelbrot, Julia, and Fatou sets are introduced. Another fractal generating technique is a dynamical system that can be described by substitutions. This is what generates for example a Koch curve, and such curves can be described by strings (which can be interpreted as the expansion of a number in a particular basis). In a more abstract setting (Morse substitution), one chooses an alphabet (which may for example consist of the atoms 0 and 1) and a transform (for example 0 to 10 and 1 to 01) and these transforms are iterated on the growing strings that are the result of these repeated substitutions. This can be given a graphical interpretation of curves or two-dimensional tilings.

These substitutions trigger taking another rung up on the ladder of abstraction with the introduction of compact metric spaces and topological dynamics. The simple concepts of the early chapters can be repeated in this more abstract setting, so that a proper framework is created to deal with spaces of strings (or sequences) which can be interpreted as words in a (formal) language. Sturmian sequences (aperiodic sequences of minimal complexity) is another concept that can be studied in this context. In a concluding chapter, one of the `three pearls of number theory', the van der Waerden theorem, is proved. It says that if the integers are partitioned in a finite number of subsets, then one of these subsets must contain a sequence of arbitrary length where the numbers differ by a constant (i.e. a sequence with arithmetic progression).

From this brief and incomplete summary of the contents, it is clear that a lot of material is covered. The chapters are relatively short and focus each time on a coherent new concept that Goodson wants to introduce. These chapters are sliced into smaller sections that are loaded wit many simple but appealing examples, each time followed by a set of exercises. These numerous little challenges are essential stimulations to keep the student alert and to grind the material down to full understanding. Definitions and theorems are clearly indicated by typography and the proofs are fully included. The extraordinary combination of abstraction linked to simple yet appealing examples is the secret ingredient that is mastered wonderfully in this text. It is a textbook that is accessible for students that have some mathematical background. Some experience with topology and (functional) analysis would certainly help, but it is not necessary since everything is gradually introduced and there are some appendices with extras that are assumed known, but without previous exposure to these subjects it will be harder to assimilate the more abstract material. Clearly, covering everything in one course may be too much, but it is possible to skip some chapters. A clear dependency graph is provided in the introduction, but a teacher can of course make his or her own selection. One could for example skip the substitutions, or skip the chapters at the end that are more abstract, etc. Finally I should mention that mathematica code is provided at the resources for this book at the publisher's website. There you can also find an (already long) list of typos.