This course introduces the mathematical foundations that support advanced studies in computer science. More specifically, this course is all about developing a student's reasoning, analytical, and communication skills in computer science. This includes reasoning about the correctness of algorithms, writing clear and rigorous proofs, analyzing properties of algorithms such as running time or other resource requirements, mapping computer science problems to more general/abstract mathematical structures, and working with these mathematical structures. Throughout the course students are exposed to some core computer science topics which are also covered in other courses, but our focus in this class will be on the analysis and reasoning skills around these topics rather than a full exploration of the topic itself.