Lecture 1

Today we talked about the history of computation. After Goedel's theorem (1930) showing there were unprovable and provable theorems, four papers appeared (1936) showing there were computable and uncomputable functions. These contained four different definitions of computation [Church/Kleene/Turing/Post], three of which looked very different, but all of which were equivalent. This led to the Church-Turing thesis, which nowadays is usually phrased as

All computable functions can be computed by a Turing machine.
If this is intended as a definition of computable functions, it's a tautology. If computable functions is defined via the lambda calculus or recursively enumerable functions, this is a theorem. If computable is left undefined, then it's a thesis, and it is really at bottom a statement about physics.

We then talked about efficiently computable functions and the complexity classes P (polynomial-time computable), NP (polynomial-time verifiable), and PSPACE (polynomial-space computable). There is an extension of the Church-Turing thesis, given various names, which says that the class P remains the same on all reasonable machines. This is (probably) violated by quantum computation. [I say probably because nobody has actually proved that P ≠ PSPACE, and polynomial-time quantum computation is sandwiched in between these complexity classes.]

Then we talked about the circuit model of computation. For universal computation, besides the AND and NOT gates that everybody knows about, there's one assumed gate that nobody talks about: FANOUT (or COPY). This gate becomes much more important when talking about quantum computation.

I then talked about reversible computation, which will be essential for quantum computing, since quantum mechanics is reversible. The well-known gates mentioned above cannot provide reversible universal computation. All one- and two-bit reversible gates are linear Boolean functions. For reversible universal computation, you need a three-bit gate. We mentioned the Toffoli gate, which passes the first two qubits unchanged and does a controlled controlled NOT to the third.

[x, y, z] → [x, y, z ⊕ (x∧y)]
where ⊕ is XOR and ∧ is AND. Next lecture, we will talk much more about the Toffoli gate.