But long after that course in NP theory was over, the astonishment of a different aspect of the book remains.
One course assignment was the development of 15 polynomial reduction proofs (proving the computational complexity equivalence of pairs of NP problems). Part of these proofs can be simple geometric shapes, locations and connecting lines, which are defined as elements in the 2 problems. Because the elements are rigorously defined, the resulting geometric pictures model rigorous proofs of equivalence.
I was astounded at the power of such abstractions (which most programmers perhaps wouldn't even recognize as legitimate proofs). This experience underlined the fact that rigorous logical proof may take many outer forms, whether mathematical equations, formal symbolic logic proofs such as the Irving Copi notation, or simple geometric drawings.
Many veins of rich ore may be mined from this work, and only 1 of them is NP theory. But the reader must be ready to do battle with some difficult ideas, and mathematical notation which can obscure the creativity of the material covered. (For astounding creativity, examine Cooke's Theorem proving that the Satisfiability problem is NP-Complete!)
A first well written and systematic account on
the hardness of this problems is the 1979 book on
the theory of NP completeness by Michael R. Garey
and David S. Johnson: Computers and
Intractability, A Guide to the Theory of
NP-Completeness (W.H. Freeman and Company, San
Francisco). It is amazing how, after all these
years, this book remains a fundamental one to be
introduced on what can be effectively and
efficiently solved by computers and above all on
what it seems not efficiently solvable,
independently of the advances of technology.
Other texts have been published after that one,
as for example the recent clear and complete
overview on what has been done and extensively
researched since then that has been given by
Christos H. Papadimitriou in his book
Computational Complexity (Addison-Wesley, 1994).
Nevertheless, the Garey-Johnson book---as it is
often familiarly called---remains the fundamental
book for a clear introduction to this central
problem of what is tractable by computers.
Starting from a very clear introduction to the
technical term "NP-Complete," and to how this
term gained importance for the description of the
algorithmic tractability of certain problems in
the early 70s, the book clearly defines, both in
an intuitive and then in a formal way, what it is
meant by the complexity of a problem. More than
that, this complexity is directly related to the
effective methods for solving problems
(algorithms) and thus to computers themselves.
The basic of the theory of NP-Completeness is
completely covered in the first 5 chapters,
beginning from a low-level introduction to some
of the central notions of computational
complexity and finally providing detailed
definitions describing proof techniques to prove
the hardness of certain problems. The remaining
two chapters provide an overview on two
alternative directions for further study. (The
both of them have been extensively investigated
in the following years.) Finally, the appendix
contains more than 300 main entries on
NP-Complete and NP-Hard problems, and this last
part of the book is continuously referenced in
journal and conference papers on the subject.
The first chapter is definitely accessible also
to those that doesn't know so much mathematics,
or computers related stuff, and thus the book is
recommendable to those that are simply curious
about the things that can be solved with