Mathematical theory of computation