Course Outline and Links

[Note: this webpage last modified Friday, 04-Feb-2011 19:44:51 EST]

We will cover about half of the material in the Oded Goldreich text, but not necessarily the first half of the book. Below, I summarize what is covered in each third of the course as well as potential "special topics" students may choose to explore for their final projects. Do not be afraid if you are starting the course and do not understand the descriptions below; you will certainly understand them by the end of the course. ;) The first third of the course will be tested on the first exam, the second third on the second exam, and the final third of the material on the last exam.

Note: This page describes my best guess as to what we will cover this semester. In actuality, we may cover some topics not listed here, and some topics listed here we may not cover. I will not be updating this page as to what we actually cover in the course. But I will keep the Course Schedule and Links up to date with what we do cover.

P and NP

In the first part of the course, we introduce the biggest open problem in computer science (and perhaps in all of mathematics) - the P versus NP problem. We will explore some of the properties of P and NP, including complete problems for both. The fact that so many different problems are NP-complete is one of the good reason for the conjecture that P is not equal to NP (it seems like we should not "be allowed" to solve all these seemingly hard problems, which would be true if P=NP). Depending on the pace of the course, we may prove hierarchy theorems for the amount of time used by deterministic and nondeterministic Turing machines. Hierarchy theorems show "if you have more resources (time, memory space), you can do more", which is intuitive but nonetheless requires some work to formally prove. We may also discuss memory space complexity and prove results in this area. In this part of the course, we will study chapters 1-2 in the textbook, and may cover some topics from section 3.1 and chapters 4-5.

In the first weeks, as we introduce Turing machines, P, and NP, we will also review proof techniques as necessary depending on the background of most students.

Randomized Algorithms, Pseudorandom Generators

In the second part of the course, we focus on randomized algorithms. Perhaps surprisingly, the ability to have access to (many) random coin flips and allowing ourselves to compute a wrong answer with small probability, allows us to compute some functions efficiently that we do not know how to solve efficiently without randomness. We will introduce a few of these problems and discuss the properties of randomized algorithms. Depending on the pace of the course, we may discuss the complexity of computing counting functions (such as the number of cliques or vertex covers in a given graph). We will also define the notion of a pseudorandom generator, which can be used to "derandomize" a randomized algorithm, and prove the fascinating result that computationally hard problems can be used to construction pseudorandom generators. In this part of the course, we will cover material from chapters 6-8. We will also review material on probability theory (part of this is in appendix D).

Cryptography, Zero-Knowledge, Quantum Computing

In the last part of the course, we consider whether secure cryptography is possible, proving that computationally hard problems can be used for proveablly secure cryptography. We also show that hard problems can be used for so-called zero-knowledge protocols (which allow one party to prove a claim to another party without revealing any information in the process). Finally, we will make some remarks on quantum computing as it relates to cryptography (i.e., factoring can be solved efficiently by quantum computers, can we have secure cryptography anyway?). In this part of the course, we will cover material from chapters 7 and 9 and appendix C.

Additional Topics

I have allocated the last week of the course and the final exam period for final project presentations. Students will choose either recent research papers from a theory of computing conference or journal or material from a textbook that we have not covered in class, and the student will present the material to the class. Potential topics that we likely will not cover in class include (but are not limited to): space complexity, the polynomial hierarchy, counting complexity, average-case complexity, hardness of approximation, circuit lower bounds, communication complexity, decision tree complexity, ...