### Course Meeting Times

Lectures: 2 sessions / week, 1.5 hours / session

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 propositional logic, Turing machines and computability, finite automata, Gödel’s theorems, efficient algorithms and reducibility, NP-completeness, the P versus NP problem, decision trees and other concrete computational models, the power of randomness, cryptography and one-way functions, computational theories of learning, interactive proofs, and quantum computing and the physical limits of computation. Class participation is essential, as the class will include discussion and debate about the implications of many of these ideas.

### Pedagogy

Professor Aaronson’s teaching statement: (PDF)

### Requirements

Students taking 6.080 will be graded on the following basis:

FRACTIONS | ACTIVITIES |
---|---|

2/7 | Problem sets |

2/7 | Midterm |

2/7 | Final exam |

1/7 | Class participation |

Students taking 6.089 will be graded on the following basis:

FRACTIONS | ACTIVITIES |
---|---|

2/9 | Problem sets |

2/9 | Midterm |

2/9 | Final exam |

1/9 | Class participation |

2/9 | Scribe notes |

The only differences are that 6.089 includes a scribe notes requirement whereas 6.080 does not, and that 6.089 is 12-unit whereas 6.080 is 9-unit. Students should be aware that scribe notes are a nontrivial responsibility (basically a small project), requiring maturity and strong command of the material. Thus, the “default recommendation” is for underclassmen to take 6.080 and for upperclassmen to take 6.089.

### Textbooks

While the course will not closely follow any textbook, we will sometimes use *Complexity Theory: A Modern Approach* by Sanjeev Arora and Boaz Barak. A draft of this new book is available for free on the Web, and a printed version will be distributed in class. In addition, the following is highly recommended, though not required:

Sipser, Michael. *Introduction to the Theory of Computation*. 2nd ed. Boston, MA: Course Technology, 2005. ISBN: 9780534950972.

### Scribe Notes

Each student taking 6.089 is expected to prepare two scribe notes. A draft of the scribe notes will be due at midnight, one week after the class is given. Notes must be done in LaTeX; a template will be made available. Please email your draft to the TA, and set up a meeting to discuss them. A polished draft, on which you will be graded, is expected by the end of the course.

### Collaboration Policy

Students are welcome to collaborate on problem sets. However, if they do so, they must list the names of collaborators. Collaboration policy for scribe notes will depend on class enrollment.

### Prerequisites

This course is designed for undergraduates (both under- and upperclassmen) in computer science and related areas of science and engineering. Others are welcome to take the course but might wish to discuss with the instructor. There are no formal prerequisites. The only prerequisite is some facility with mathematical reasoning: that is, the ability to construct valid mathematical arguments (including proofs by contradiction, induction, etc.) and to recognize errors in invalid ones. Such facility might be gained, for example, by taking 6.042. Programming experience is helpful but not essential; the course has no programming assignments.

### Relation to Other Courses

There is significant overlap between 6.080 and 6.045 (Automata, Computability, and Complexity). The main difference is that 6.080 is an experimental course, which presents many ideas normally postponed until graduate courses, whereas 6.045 provides a more traditional introduction to computability, formal languages, and complexity theory. Students who seek a solid grounding in formal languages, suitable for further work in compilers and other areas, are advised to take 6.045, whereas those wishing to learn about recent insights in theoretical computer science might prefer 6.080. There is also significant overlap between 6.080 and 6.840 (Theory of Computation). However, as a graduate course, 6.840 is able to cover topics in much more mathematical depth. It is hoped that many students taking 6.080 will go on to take 6.840. The overlap between 6.080 and 6.006 (Introduction to Algorithms), or between 6.080 and 6.046 (Design and Analysis of Algorithms), is smaller.

### Organization

The course will consist of three units, lasting approximately one month each. These are:

- Logic, Math, and Machines
- Computational Complexity
- Randomness, Adversaries, and the Physical World

At the end of the first unit, there will be a quiz focusing on that unit only, and similarly at the end of the second unit. At the end of the third unit there will be a cumulative final exam.

### Topics

#### Logic, Math, and Machines

Ancient computational thinking (Euclid et al.)

Propositional and first-order logic

Finite automata

Turing machines and the halting problem

Oracles and computability

Basic set theory

Gödel’s completeness and incompleteness theorems

Philosophical considerations (Penrose and “strong AI”)

#### Computational Complexity

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

Decision trees and circuits

#### 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

Interactive proofs

Zero-knowledge proofs

Computational learning theory

Quantum computing

The ultimate physical limits of computation