Programmers are often prone to saying that mathematics is a waste of time for them. This is often the subject of some debate, but certainly for those working in any theoretical aspect of computer science (as opposed to software engineering and programming), mathematics is essential. Discrete mathematics plays a fundamental role in almost all facets of computer science, and continuous mathematics is used in many specific fields (graphics, modeling, and numerical methods, to name a few). It may be relatively easy for students of mathematics to transition into theoretical computer science,but for students whose background may be biased toward the practical, and whose education may well not have included a substantial mathematical component, a move toward the more theoretical side of computing may involve picking up a fair amount of both mathematical subject matter and the mathematical maturity needed to properly work in the field.

This book outlines the basics of much of the mathematics needed to work in theoretical computer science, and does so concisely and often elegantly. This volume (one of two) covers sets, graphs, numbers, algebraic structures (groups, rings, fields, and polynomials), vector spaces, logic, and languages. It includes (among other things) a construction of the natural numbers, and then constructions of the integers, rationals, reals (as equivalence classes of Cauchy sequences), and complex numbers, each as an extension of its simpler predecessor.

In many places, the book uses a (more or less) categorical approach. For example, the Cartesian product of two sets is defined using a universal mapping property, and the diagram given is categorical in nature. This is followed (on the next page) by the dual diagram defining the coproduct (disjoint sum). Given the importance that categorical notation seems to be gaining in theoretical computer science, this is a nice way to approach the problem, and, by introducing the notation (and ways of thinking) in small doses, the reader may be less likely to be intimidated by these very abstract methods.

The coverage of many topics is nicely formal, with care taken to avoid logical problems. For example, well-foundedness in sets is discussed carefully, but the notion of a non-well-founded set is also given (albeit with rather briefer coverage). All of the essential major theorems have proofs, with some corollaries left to the reader. (A few of the more difficult theorems are stated without proof, though pointers to appropriate sources are provided.)

There is also a Web site of companion material (http://math.ifi.unizh.ch), with extra coverage and detail (with several sections offering a variety of viewpoints on the same material), an online copy of the book, and Java applets.

Doing this in a single volume (about 350 pages of text) is impressive, and doing it with clarity is even more so. While this is certainly a strength of the book, and will please many mathematical readers, it may be the biggest problem for others. Much of the mathematics involved is difficult, and most of the proofs (and discussions) are concise and not very discursive. For those with a significant mathematical maturity, this is a good thing; working through the details is the best way to understand the process, and many of the proofs offered are elegant and informative. But for those lacking mathematical maturity, the proofs (and some of the other statements) might prove overwhelming. For example, on page 177, it is noted that the complex numbers are isomorphic to the quotient ring: *R*[*X*]/(*X*^{2} + 1). While this is followed by a brief explanation, and the construction was done more directly in an earlier section, some readers will undoubtedly find that explanation less than helpful. The Web pages on the companion Web site might help with this, but a reader could easily be swamped by the amount and richness of the material.

There are a few less substantive problems with the book. My copy has a number of pages that were not printed (in the middle of some of the most mathematical parts, discussing matrices). The index of symbols seems (at three-and-a-half two-column pages) to be quite complete, but the ordering of the entries eludes me completely, which makes locating any symbol in the index rather difficult. As an example, the entry for “cos” is two columns away from the entry for “codom(f)” (in italics). Remarks, theorems, definitions, and exercises are all numbered differently, which can make finding things by number a bit annoying. Finally, in the first chapter, a notation unfamiliar to me is introduced, and promptly never used again.

For moderately mathematically mature readers, this book will be an excellent refresher, and might introduce new topics, or cover topics in slightly different ways. It would be a nice addition to any serious computer scientist’s mathematical library.