## COURSE DESCRIPTION

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, if time allows, we discuss how to probabilistically check proofs (PCP) and prove the hardness of approximating some NP-hard problems.

**Prerequisites:** Theory of Computation, Algebra.

**Text Book:** Sanjeev
Arora and Boaz Barak, Computational Complexity: A Modern
Approach, http://www.cs.princeton.edu/theory/complexity/

## RECENT UPDATE

**[15-Nov-18]**EndSem due on 20-Nov (day-end).

[13-Sep-18]

**MidSem due on 18-Sep (day-end).**

[26-Jul-18] Course begins on Mon, 30-Jul-18.