W4236: Introduction to Computational Complexity
Spring 2010

Instructor: Rocco Servedio (517 CSB, office hours Wed 9-11) Email: rocco at cs dot columbia dot etcetera.
Teaching Assistant: Li-Yang Tan. Email: liyang at cs dot columbia dot youknowtherest. Office hours: Tues/Thurs 12:10-1:10.
Course website: http://www.cs.columbia.edu/~rocco/Teaching/S10/cs4236/

## Introduction

Many computational problems (such as multiplying two numbers, or sorting a list of numbers) are known to be "easy" in the sense that we have efficient algorithms for them. Unfortunately, many other computational problems of great practical importance (such as factoring large numbers, or finding the shortest tour that passes through all the cities on a map) seem to be difficult, in the sense that no efficient algorithms are known. Are these problems really inherently difficult -- do no efficient algorithms exist? -- or do we just need to come up with cleverer algorithms that can solve these problems efficiently?

Questions such as these lie at the heart of computational complexity, which is the study of the fundamental abilities and limitations of efficient computation. Over the past few decades, computational complexity has emerged as one of the most dynamic, interesting and important areas in computer science; indeed, the core question of computational complexity theory ("does P equal NP?") is now widely viewed as one of the most famous and important open questions in all of computer science and mathematics.

Computational complexity has given us more than just questions, though; it has made fundamental contributions to our understanding of many central ideas and topics in computer science. To give a few examples, our understanding of many interesting and practically important optimization problems was revolutionized by the theory of NP-completeness several decades ago. More recently, the use of randomness as a tool for designing efficient algorithms was pioneered in computational complexity. Even the notion of mathematical proof has undergone a revolution as a consequence of interactive proofs and probabilistically checkable proofs (PCPs) in complexity theory! We'll study all these topics, and more, in this class.

## List of Topics

This is a preliminary list; we may cover more or less material depending on how the semester progresses.
• Basic resources for computation (time, space, nondeterminism) and their associated complexity classes (P, NP, PSPACE and more)
• Relationships among resources (P versus NP, time versus space, and more)
• Reductions & completeness (NP completeness, PSPACE completeness, and more)
• Counting problems, #P
• Randomness as a computational resource; associated complexity classes
• Nonuniform models of computation; circuit complexity; lower bounds
• Communication complexity
• Interactive proofs & IP=PSPACE
• Probabilistically checkable proofs (PCP) and inapproximability

## Prerequisites

The prerequisite for this course is an introductory course on theory of computation, i.e. W3261 (or the equivalent at another university), with a good grade (B+ or higher).  If you do not formally meet this requirement but still wish to take this course, you must come to my office hours to discuss your background.  A prior course in algorithms such as W3139 or W4231 is also helpful but is not required.

More concretely, you should be familiar with the following topics:

• Important: Big-O notation and basic analysis of algorithms. Chapter 3 in "Introduction to Algorithms" by Cormen, Leicerson, Rivest and Stein is more than sufficient.
• Important: Basic discrete math. The course Computer Science 3203 and the "Mathematical Background" section (Appendix VIII) of CLRS are good sources here.
• Important: You should be comfortable with reading and writing proofs. Chapter 0 of Sipser's book "Introduction to the Theory of Computation" is a good source here.
• Important: You should be comfortable with the basics of Turing machines and computability theory. Chapters 3, 4 and 5 of Sipser's book are good sources here.
Ideally you will have had some exposure to the material in Chapter 7 of Sipser's book, but this is not required. Prior acquaintance with P, NP-completeness and the like is also helpful but definitely not required. General mathematical maturity (e.g. comfort with proofs) will be assumed.

The requirements of the course are as follows:
• Biweekly problem sets (70% of grade). Your solutions must be typed and printed. You should submit a hard copy to the TA at the start of class; if you cannot submit a hard copy, you may use the "Drop Box" in Courseworks ( click here for more information on this).
• Take-home final exam (30% of grade).
The biweekly problem sets will be due on Thursdays at 1:10pm (at the start of class). You are allowed six late days for the semester. Each late day is exactly 24 hours. Late days cannot be subdivided -- five minutes late counts as one late day, and turning one problem in late makes the whole set late.   For an exception, you must have your undergraduate advisor (for undergrads) or your graduate advisor (for graduate students) contact me. Late days cannot be used for the take-home final. If you exceed the 6 allocated late days, each additional late day you take will result in a 15% penalty in the score for that entire assignment.

The problem sets will require you to do proofs. Some problems will be quite challenging; you are advised to start the problem sets early.  You are encouraged to discuss the course material and the homework problems with each other in small groups (2-3 people), as long as you list all discussion partners on your problem set. Discussion of homework problems may include brainstorming and verbally walking through possible solutions, but should not include one person telling the others how to solve the problem.  In addition, each person must write up their solutions entirely on their own;  you may not look at another student's written solutions.

You may consult outside materials, but you may not consult solutions to previous years' assignments, whether they are official course solutions or student solutions. All materials you consult must be appropriately acknowledged.

Please consult me if you have any questions about this policy. When in doubt play it safe. If I suspect that you have turned in a homework assignment which you don't understand, you may be asked to orally defend your solutions. If you turn in a homework assignment in violation of the above policies, the highest grade you will receive on that assignment is 0, and you may receive a negative grade.

Students are expected to adhere to the Academic Honesty policy of the Computer Science Department; this policy can be found in full here. Please contact the instructor with any questions.

The required text for this course is:
• C.H. Papadimitriou.  Computational Complexity.  This book is available on-line and at the Columbia University bookstore. This is an excellent introduction to complexity theory.  However, much of the material from the the second half of the course is not covered in this book, so it is crucial that you attend lectures.
The following books may also be useful. In addition to these books, additional references for advanced topics may be given later in the course.
• M.J. Sipser.  Introduction to the Theory of Computation. This is a more introductory book than Papadimitriou; it has very clear explanations but doesn't cover very much of the material we'll be doing in this course.
• S. Arora and B. Barak. Computational Complexity: A Modern Approach. Good book for a sophisticated reader; detailed coverage of many topics, including currently active research areas.
• M. R. Garey & D. S. Johnson.  Computers and Intractability: A Guide to the Theory of NP-completeness. The classic work on NP-completeness.
• D. Z. Du and K. Ko.  Theory of Computational Complexity. An advanced book with lots of details about many topics.
• J..E. Hopcroft and J.D. Ullman.  Introduction to Automata Theory, Languages, and Computation. Somewhat terse, but a good reference for much of the material we'll be covering early in the course.