So: last time, we talked about reductions in computer science. We certainly didn't exhaust the topic, but we at least got a definition on the board.
Now, there was one misleading thing that I didn't quite come out and say, but pretty strongly implied: I made it sound like the reason we would find a reduction of problem \(P\) to problem \(Q\), is that we have (or pretend we have for the purposes of proving something) a solution to problem \(Q\), and use that solution to give a solution to problem \(P\).
That is certainly one way to use a reduction. But, and this may come as a surprise, it's far more common to use reductions in another way: to show that problem \(Q\) is hard, because we can reduce problem \(P\) to problem \(Q\) and we somehow already know that \(P\) is hard to solve.
If this sounds like nonsense, I have a different way to describe this idea. The original explanation I gave can be thought of as saying
But one of the really annoying things about theoretical computer science is that a lot of problems lend themselves to having lower bounds proved about them in a very pretty, abstract way, while the way to show an upper bound is, basically, to write down the actual algorithm that achieves some upper bound on difficulty (again, whatever that word actually means).
Now, there was one misleading thing that I didn't quite come out and say, but pretty strongly implied: I made it sound like the reason we would find a reduction of problem \(P\) to problem \(Q\), is that we have (or pretend we have for the purposes of proving something) a solution to problem \(Q\), and use that solution to give a solution to problem \(P\).
That is certainly one way to use a reduction. But, and this may come as a surprise, it's far more common to use reductions in another way: to show that problem \(Q\) is hard, because we can reduce problem \(P\) to problem \(Q\) and we somehow already know that \(P\) is hard to solve.
If this sounds like nonsense, I have a different way to describe this idea. The original explanation I gave can be thought of as saying
if there's a reduction from problem \(P\) to problem \(Q\), then the difficulty of problem \(Q\) is an upper bound for the difficulty of problem \(P\)(whatever we precisely mean by "difficulty"). This new way of thinking about it then becomes
if there's a reduction from problem \(P\) to problem \(Q\), then the difficulty of problem \(P\) is a lower bound for the difficulty of problem \(Q\)So they really aren't different ideas.
But one of the really annoying things about theoretical computer science is that a lot of problems lend themselves to having lower bounds proved about them in a very pretty, abstract way, while the way to show an upper bound is, basically, to write down the actual algorithm that achieves some upper bound on difficulty (again, whatever that word actually means).