In this course, we will study how randomness helps in designing algorithms and how randomness can be removed from algorithms.
We will start by formalizing computation in terms of algorithms and circuits. We will see an example of randomized algorithms, identity testing, and prove that eliminating randomness would require proving hardness results. We then prove a hardness result for the problem of parity using randomized methods. We construct certain graphs called expanders that are useful in reducing randomness in algorithms. These lead to a surprising logarithmic-space algorithm for checking connectivity in graphs.
We show that if there is hardness in nature then randomness cannot exist! This we prove by developing pseudo-random generators and error-correcting codes. We show how to extract randomness from a weakly random source by using extractors. Finally, we show how to probabilistically check proofs (PCP) and prove the hardness of approximating some NP-hard problems.
• Computational Complexity: A Modern Approach (Sanjeev Arora and Boaz Barak) http://www.cs.princeton.edu/theory/complexity/
• Research papers.