Pages: p. 2

When and if the statement in the title is proved, the person who proves it will win a million dollars and become an instant megastar. He or she will certainly appear on the front page of *The New York Times* and should expect invitations from late-night talk shows and to be the subject of a PBS *Nova* special. For a long time—a very long time—this fundamental open question about the relationship between *P* and *NP* has been the large white hippo blocking the main hallway of the Academy of Complexity Theory. Efforts to settle the question have generated entire fields of research along with a whole new lexicon of terminology. But, ignoring all that work and just stating it briefly (and without precision), we'll say that *P* is the class of problems that can be solved in a number of steps that grows like a polynomial in the size of the input, whereas *NP* problems are those that can be solved in polynomial time using *nondeterministic* algorithms.

The definition of nondeterministic algorithm goes back at least as far as Robert Floyd's 1967 paper of that title in the *Journal of the ACM*. Floyd's abstract introduced the reader to the idea of nondeterministic algorithms by quoting Robert Frost:

Two roads diverged in a yellow wood,

And sorry I could not travel both

And be one traveler, long I stood

And looked down one as far as I could

To where it bent in the undergrowth…

When using a nondeterministic algorithm, you need not be sorry because you *can* travel both—sort of. In fact, at every divergence, you can take both paths; if any sequence of choices leads to a solution, then you will be "charged" only the cost of that sequence. It's as if a backtrack algorithm could execute without any cost due to the backtracks.

The set *NP* is unique in having a "hardest" problem or, rather, an equivalence class of hardest problems. A problem in *NP* is said to be *NP complete* if finding a polynomial-time *deterministic* algorithm to solve it would provide polynomial-time solutions for all problems in *NP*. In other words, if some problem *Q* is *NP* complete, then every other problem in *NP* can be expressed as a special case of *Q*. Several *NP* complete problems are obviously relevant to computational science, including multiprocessor scheduling and finding maximum independent subsets of graphs.

Floyd's main purpose was to develop a clear language for expressing backtrack algorithms, without having to specify the details of the backtrack. He made a point of explaining that algorithms are nondeterministic not in the sense of being random, but in the sense of having free will. I don't pretend to understand what he meant by this, but it doesn't matter, because as far as I can tell, the research community thinks of nondeterministic as the same as random. Moreover, I suspect that much of the world associates randomness with free will.

There is, of course, no definition of randomness that is both rigorous and accepted by the whole scientific community, and perhaps there can be none. For if there were such a definition, it would certainly be expected to explain the nondeterminism built into quantum mechanics. Maybe when faced with an *NP* complete problem we should just take the advice attributed to Richard Feynman: "Shut up and calculate." But if we do, we'll have to remember that so far nobody can prove that Feynman ever said that!