Introduction to Theory of Computing 1