So I hope that pretty much all of you had heard about the P vs NP question.

Before you enrolled in this class. But if you haven't, you can pretty much

guess what that question is. I've defined for you, both of these

classes of problems. P is the class of problems that are

polynomial times solvable Solvable. Whereas the problems in NP have the

property that, at least given the solution, you can quickly verify that it

is, indeed a correct solution. It's why the conjecture that P is not

equal to NP, that is, merely the ability to efficiently verify purported

solutions, is not sufficient, to guarantee Polynomial time solvability.

Indeed, Edmonds, back in 1965, before we even had the vocabulary NP, remember that

came along only in '71. Edmonds already in '65, was, essentially

conjecturing that P is not equal to NP. In the, form that he was conjecturing,

there's no polynomial time algorithm, that solved the traveling salesman

problem. But let me emphasize we genuinely do not

know the answer to this question, there is no proof of this conjecture.

P vs NP question is arguably the open question in computer science, it's also

certainly one of the most important and deep, deepest open questions in all of

mathematics. For example, in 2000 The Clay mathematics

Institute published a list of 7 millennium.

prize problems. The P vs NP question, is 1 of those 7

problems. All of these problems, are extremely

difficult, and extremely important. The only one that's been solved to date,

is the [UNKNOWN] conjecture. The Remount hypothesis, is another

example, on that list. And they're not called the millennium

prize problems for nothing, if you solve 1 of these mathematical problems, you get

a cash prize of 1 million dollars. Now, while a million dollars is obviously

nothing to sneeze at, I think it sort of understates the importance of a

mathematical question like P versus NP, and the advance in our knowledge that a

solution to the question would provide, I think, would be much more significant

than a price check. So how come so many people thing that P

is not equal to NP, rather than the opposite, P=NP? Well, I think the

dominant reason is sort of a psychological reason, namely that if it

were the case that P=NP, then all you'd have to do, remember, is exhibit a

polynomial time algorithm for just 1, np complete problem.

And there are tons of np complete problems.

And a lot of extremely smart people, have had np complete problems that they've

really cared about, and either on purpose or accidentally, they've been trying to

develop efficent algorithms for them. Noone has ever succeeded in over 1/2

century of serious computational work. The second reason is sort of

philosophical, P=NP just doesn't seem to jive with the

way the world works. Think about it, for example, when you do

a homework problem in a class like this one.

And consider 2 different tasks. The first task is I give you question,

and I asked you to come up with a correct solution, say a proof of some

mathematical statement. The second task would be just grade

somebody else's suggest proof. Well, generally it's a lot harder to come

up with the correct argument from scratch,

compared to just, verifying a correct solution, provided by, somebody else.

And yet, P equals NP would be saying, that these two tasks, have exactly the

same complexity. It's just as easy, to solve homework

problems, as it is, to just read, and verify, the correct solution.

So I don't know about you, but it's always seemed to me to be be a lot harder

to come up with a mathematical argument from scratch as opposed to simply grading

somebody else's solution. So now it seems to require a degree of

creativity, to pluck out from this exponentially big space of proofs, a

correct one for the statement at hand. Yet, P = NP would suggest that, that

creativity could be efficiently automated.

But of course, you know, P versus NP being a mathematical question.

We'd really like some mathematical evidence, of which way it goes.

For example, if P is not = N P. And here we really know shockingly

little. There just isn't that much concrete

evidence at this point, that, for example, P is not = to NP.

Now, maybe it seems bizarre to you, that we're struggling to prove that P is not

equal to NP. Maybe it just seems sort of obvious that

there is no way that you can always construct proofs, in time, polynomial, in

what you need to verify proofs. But, the reason this is so hard to prove

mathematically, is because of the insane richness of the space of polynomial time

algorithms. And indeed, it's this richness that we've

been exploiting all along in these design and analyses of algorithms classes.

Think for example about matrix multiplication.

Had I not shown you Strauss's algorithm, I probably could have convinced you more

or less, that there was no way to solve matrix multiplication faster than cubic

time. You just look at the definition of the

problem and it seems like you have to do cubic work.

Yet, Strauss's algorithm and other follow ups show you can do.

Fundamentally better, than, the naive cubic running time algorithm, for matrix

multiplication. So there really are, some quite

counter-intuitive, and hard to discover, unusually efficient algorithms, within

the landscape of polynomial time solutions.

And who's to say that there aren't some, more exotic species, in this landscape of

polynomial time solvability, that have yet to be discovered, which can make.

In-roads even on empty complete problems. At this point, we really don't know.

At the very least our currently primitive understanding of the fauna within the

complexity class P, is an intimidating obstruction to a proof that P is not

equal to NP. I should also mention that, as an

interesting counterpoint to Edman's Conjecture in '65, was a conjecture by

Gödel. This is the same logician Kurt Gödel,

Gödel's completeness and incompleteness theorems.

He wrote a letter to John von Neumann in 1956, where he actually conjectured the

opposite, the P is = to NP,so who knows.

So I've tried to highlight for you, the most important things that an algorithm

designer, and serious programmer should know, about NP problems, and NP

completeness. One thing I haven't explained, which you

might be wondering about, is, what on earth does NP stand for anyways?.

A common guess would be not polynomial but this is not what it stands for.

The answer's going to be a little bit more obscured in deed it's a bit of an

acronym-ism nondeterministic polynomial So this is referring to a different but

mathematically equivalent way to define the complexity class NP in terms of an

abstract machine model known as nondeterministic turing machines.

But, generally, for some of those thinking about algorithms, generally for

the programmer I would advise against, thinking about problems in NP, in terms

of this original definition, with this abstract machine model.

And I'd instead, strongly encourage you, to think about the definition I gave you,

in terms of the efficient recognition, the efficient verification, of purported

solutions. Again, they're mathematically equivalent,

and I think, efficient verification makes more sense It's in the algorithm design.

Maybe you're thinking that N P is a perhaps not that good, and somewhat

inscrutable definition for what's a super important concept.

But it's not for lack of discussion and effort on the communities part.

So very soon after the work of Cook and Carp, it was clear to everyone working in

the west on algorithms and computation that this was a super important concept,

and people needed to straighten up their vocabulary asap.

Don Knuth ran a poll amongst members of the community.

He reported on the results in his SIGACT news article from 1974, "A Terminological

Proposal," and NP Completeness was the winner, and that was then adopted in the

landmark book "Design and Analysis of Algorithms" by Hopcroft and Ullman,

and that's the way it's been ever since. There is one suggestion that was passed

over, which I find quite amusing, let me tell you about Suggestion was pet PET.

So, what is PET acronym for? Well, it's flexible so initially the interpretation

would be possible exponential time. In problem.

Now suppose its some day people prove that P is not equal to NP, then the

meaning would change to provably exponential time.

So now its not the time to nit pick with the suggestion that you could prove P not

equal to NP without actually proving an exponential lower bound merely a super

polynomial bound. Lets leave objects like that of side and

ask what would happen if P actually turned out to be equal to NP, well then,

you could call PET previously exponential time problems.

But of course, at this point PET is nothing more than an amusing historical

footnote. NP-complete is the phrase that you got to

know.