Skip to main content
\(\newcommand{\set}[1]{\{1,2,\dotsc,#1\,\}} \newcommand{\ints}{\mathbb{Z}} \newcommand{\posints}{\mathbb{N}} \newcommand{\rats}{\mathbb{Q}} \newcommand{\reals}{\mathbb{R}} \newcommand{\complexes}{\mathbb{C}} \newcommand{\twospace}{\mathbb{R}^2} \newcommand{\threepace}{\mathbb{R}^3} \newcommand{\dspace}{\mathbb{R}^d} \newcommand{\nni}{\mathbb{N}_0} \newcommand{\nonnegints}{\mathbb{N}_0} \newcommand{\dom}{\operatorname{dom}} \newcommand{\ran}{\operatorname{ran}} \newcommand{\prob}{\operatorname{prob}} \newcommand{\Prob}{\operatorname{Prob}} \newcommand{\height}{\operatorname{height}} \newcommand{\width}{\operatorname{width}} \newcommand{\length}{\operatorname{length}} \newcommand{\crit}{\operatorname{crit}} \newcommand{\inc}{\operatorname{inc}} \newcommand{\HP}{\mathbf{H_P}} \newcommand{\HCP}{\mathbf{H^c_P}} \newcommand{\GP}{\mathbf{G_P}} \newcommand{\GQ}{\mathbf{G_Q}} \newcommand{\AG}{\mathbf{A_G}} \newcommand{\GCP}{\mathbf{G^c_P}} \newcommand{\PXP}{\mathbf{P}=(X,P)} \newcommand{\QYQ}{\mathbf{Q}=(Y,Q)} \newcommand{\GVE}{\mathbf{G}=(V,E)} \newcommand{\HWF}{\mathbf{H}=(W,F)} \newcommand{\bfC}{\mathbf{C}} \newcommand{\bfG}{\mathbf{G}} \newcommand{\bfH}{\mathbf{H}} \newcommand{\bfF}{\mathbf{F}} \newcommand{\bfI}{\mathbf{I}} \newcommand{\bfK}{\mathbf{K}} \newcommand{\bfP}{\mathbf{P}} \newcommand{\bfQ}{\mathbf{Q}} \newcommand{\bfR}{\mathbf{R}} \newcommand{\bfS}{\mathbf{S}} \newcommand{\bfT}{\mathbf{T}} \newcommand{\bfNP}{\mathbf{NP}} \newcommand{\bftwo}{\mathbf{2}} \newcommand{\cgA}{\mathcal{A}} \newcommand{\cgB}{\mathcal{B}} \newcommand{\cgC}{\mathcal{C}} \newcommand{\cgD}{\mathcal{D}} \newcommand{\cgE}{\mathcal{E}} \newcommand{\cgF}{\mathcal{F}} \newcommand{\cgG}{\mathcal{G}} \newcommand{\cgM}{\mathcal{M}} \newcommand{\cgN}{\mathcal{N}} \newcommand{\cgP}{\mathcal{P}} \newcommand{\cgR}{\mathcal{R}} \newcommand{\cgS}{\mathcal{S}} \newcommand{\bfn}{\mathbf{n}} \newcommand{\bfm}{\mathbf{m}} \newcommand{\bfk}{\mathbf{k}} \newcommand{\bfs}{\mathbf{s}} \newcommand{\bijection}{\xrightarrow[\text{onto}]{\text{$1$--$1$}}} \newcommand{\injection}{\xrightarrow[]{\text{$1$--$1$}}} \newcommand{\surjection}{\xrightarrow[\text{onto}]{}} \newcommand{\nin}{\not\in} \newcommand{\prufer}{\mbox{prüfer}} \DeclareMathOperator{\fix}{fix} \DeclareMathOperator{\stab}{stab} \DeclareMathOperator{\var}{var} \newcommand{\inv}{^{-1}} \newcommand{\lt}{<} \newcommand{\gt}{>} \newcommand{\amp}{&} \)

PrefacePreface to 2017 Edition

Because I (MTK) didn't have the chance to teach from this book during the 2016–2017 academic year, there were few opportunities to examine some of the areas where improvements are due in the text. That said, some changes suggested in the Preface to 2016 Edition did come to fruition in this edition. In particular, the numbering of many things in Chapter 8 will not match the 2016 Edition in a number of places because of the addition of Example 8.7 to address the coefficients on \(1/(1-x)^n\) in a way that doesn't require calculus. There is also one new exercise in Chapter 8, which has been placed at the end to retain consistency of numbering. Other than correcting errors, there have been no changes to the exercises, so faculty members teaching from the text may continue to assign the same exercise numbers with confidence that they are the same exercises they have been in the past.

The other notable update in this edition is the addition of a number of SageMathCells to Chapter 8 (including in the exercises), Section 9.6, and the Discussion that ends Chapter 9. The practice of vaguely referring readers to a generic computer algebra system but not providing any advice on how to use it had always been unsatisfying. I know there are places where further refinement is in order, but this edition starts a more coherent approach toward using technology for some of the unpleasant algebraic aspects of the text. Readers can edit the content of the SageMathCells in the body of the text in order to use them to tackle other problems, and those in the exercises are there for convenience more than anything and include only a bare skeleton of what might be useful for the exercise. Since SageMath is open source and can be run for free on CoCalc, this approach seems greatly preferable to targeting a commercial CAS. For those, like me, who are coming to SageMath with experience using a commercial CAS, SageMath does not do implied multiplication in input very well. When a result comes up that seems strange, my first step is always to make sure that I'm not missing a * in my code.

Of course, even in a text that's been in use for over a decade, there are typos. A number of small issues were resolved in this edition. The errata page lists the dozen mistakes corrected in this edition. Undoubtedly, there are other mistakes waiting to be found, and we welcome reports from readers. (Pull requests on GitHub are also welcome!)

What's next? We'd love to hear from readers with suggestions, but I anticipate that expanding Chapter 4 will be high on the list. If you're using SageMath (or Python) alongside our text, contributions of code snippets that would be worth including are also welcomed.

Mitchel T. Keller
Lexington, Virginia