Introduction to the Theory of Computation

Michael Sipser