The 20th century saw modular forms assume a central role in number theory. Beginning with the work of Hecke, they grew more and more important, becoming a recurring motif and fundamental tool. From the Langlands program to Wiles' proof of Fermat's Last Theorem, modular forms are now everywhere.

Among the many reasons for their importance is the fact that modular forms are in some sense *computable* objects. For example, the Modularity Conjecture for elliptic curves could be verified computationally for any specific curve. (The conjecture is now a theorem, thanks to Wiles, Taylor, Diamond, Conrad, and Breuil.) Similarly, if one could show an L-function came from a modular form, all sorts of facts became easy to prove. Conjectures about modular forms could often be checked numerically on the computer. (I have spent a lot of time doing just this!)

All that being said, however, the fact remained that doing the actual computations was sometimes quite difficult. As often happens, things that are "computable in principle" can be awfully hard to work out in a practical and efficient way. Some of the computations I did, for example, boiled down to using an explicit basis of a finite-dimensional vector space, then finding and diagonalizing the matrix of an explicit linear transformation. But the numbers involved were huge, the dimensions got large quickly, and doing integer arithmetic on the computer is far from easy.

Those who knew how to make the computer actually find things quickly became well known among people working in the field. They were the ones we went to when our simple-minded programming led to the computer running out of memory, took too long, or produced mysterious errors. William Stein was one such; his *Modular Forms, a Computational Approach* is an attempt to teach us all how to do it.

While the book does explain the basic theory, Stein warns the reader that the focus is really not on the underlying ideas and theorems. Indeed, readers will profit the most from this book if they already know the basics of the theory of modular forms and are ready to learn how to compute them explicitly. As the preface states, this required "turning formulas and constructions buried in obscure research papers into precise computational recipes" and then "testing these and eliminating inaccuracies." He does not mention making them more efficient; he does that too.

There is no other book like this one, so it is hardly necessary to say it is required reading for anyone who wants to work with modular forms. Stein writes clearly, and the algorithms are usefully laid out. For the most part, Stein uses his SAGE system, which is open source software. He has made many of his programs available on his web site, with the very appropriate URL modular.math.washington.edu.

Every mathematics library should have this book. Newcomers to number theory will be grateful for it, and old timers will wish they had it available years ago.

As of February 2009, this book can be downloaded for free from the author's web site.

Fernando Q. Gouvêa used to do computations with modular forms himself, but is now content to let others do them. He now prefers to write on the history of mathematics, but he would still like to understand where the slopes are.