Computational Complexity by Sanjeev Arora & Boaz Barak