## Course Meeting Times

Lectures: 2 sessions / week, 1.5 hours / session

Recitations: 1 session / week, 1 hour / session

## Course Description

This course provides a challenging introduction to some of the central ideas of theoretical computer science. It attempts to present a vision of “computer science beyond computers”: that is, CS as a set of mathematical tools for understanding complex systems such as universes and minds. Beginning in antiquity, with Euclid’s algorithm and other ancient examples of computational thinking, the course will progress rapidly through finite automata, Turing machines and computability, decision trees and other concrete computational models, efficient algorithms and reducibility, NP-completeness, the P versus NP problem, the power of randomness, cryptography and one-way functions, computational learning theory, interactive proofs, and quantum computing and the physical limits of computation. Class participation is important, as the class will include discussion and debate about many of these topics.

## Prerequisites

We assume that you have taken
*6.042 Mathematics for Computer Science*
, or have equivalent mathematical preparation. In particular, we will assume you have basic “mathematical maturity”: i.e., that you are comfortable both reading and writing mathematical proofs.

## Textbook

There is no required textbook for the course. However, there are three recommended books:

Moore, Cristopher, and Stephan Mertens. *The Nature of Computation*. Oxford University Press, 2011. ISBN: 9780199233212.

Sipser, Michael. *Introduction to the Theory of Computation*. Course Technology, 2005. ISBN: 9780534950972. Covers most material from the first half of the course.

Arora, Sanjeev, and Boaz Barak.
*Computational Complexity: A Modern Approach*
. Cambridge University Press, 2009. ISBN: 9780521424264. Covers most material from the second half (as well as more advanced material that won’t be covered in this course).

## Problem Sets

There will be 6-7 problem sets, which will generally be due a week and a half after being assigned. Late problem sets will receive half credit, except in special circumstances such as illness or family emergency.

Problem set problems will often ask you to prove theorems, but we’re looking for clarity of understanding rather than “rigor for rigor’s sake.” So for example, a brief verbal description of an algorithm is better than complicated spaghetti code; and a clear explanation of how you tried to solve a problem and failed will earn partial credit, while obvious nonsense won’t!

## Collaboration Policy

You are welcome to collaborate on problem sets, provided that (1) you write up your solutions individually, and (2) you list the names of all collaborators.

## Grading

Students taking 6.045 will be graded on the following basis:

ACTIVITIES | PERCENTAGES |
---|---|

Problem sets | 40% |

Midterm exam | 20% |

Final exam | 30% |

Class participation | 10% |

## List of Topics

### Logic, Math, and Machines

- Ancient computational thinking (Euclid et al.)
- Finite automata
- Turing machines and the halting problem
- Oracles and computability
- Gödel’s completeness and incompleteness theorems
- Philosophical considerations (Penrose and “strong AI”)

### Computational Complexity

- Decision trees and circuits
- Polynomial time and its justification
- Nontrivial examples of polynomial-time algorithms
- The concept of a reduction
- P, NP, and NP-completeness; the Cook-Levin Theorem
- The P versus NP problem and why it’s hard

### Randomness, Adversaries, and the Physical World

- The power of probabilistic algorithms
- Private-key cryptography and one-way functions
- Public-key cryptography and trapdoor functions
- Pseudorandom number generators
- Does randomness really help? The P versus BPP question
- Zero-knowledge proofs
- Computational learning theory
- Quantum computing
- The ultimate physical limits of computation