# Course overview

This course is different from many CS courses; especially beginning level courses. We do not require any programming (indeed, it is rarely discussed). Rather, this course has the flavor of a university-level mathematics course.

## Skills

Throughout the course we will focus on

- Definitions
- clear descriptions of terms. For the most part, all of the words we use will have crisp definitions
- Proofs
- arguments; sequences of logical steps, starting from agreed upon facts or assumptions and leading to a desired conclusion.

These skills are critical in many areas of computer science. Clear definitions are very similar to specifications of functions, classes, or programs. Writing and working with definitions will help you write good specifications.

The ability to write proofs and reason logically is critical for writing code that works. It is also critical for reasoning about programs more generally. Reading and writing proofs will also make you communicate more clearly, and will help you evaluate evidence and come to solid conclusions.

## Structures

The lecture schedule outlines the topics we will cover. In addition to providing lots of practice and examples for the skills listed above, they are all useful in various areas of computer science:

- Basic tools— sets, functions, and relations
- These basic objects are useful for modeling a large variety of problems. Sets are simply collections of objects, be they the set of pages on a website, a set of users, or more abstract objects like the set of possible traces through a program. Functions model input/output relationships, and can be used to represent programs and data structures. Relations model more general kinds of relationships between objects, such as the "friend" relationship in a social network.
- Number theory
- We will study properties of the integers, as well as a new kind of number-like object called a modular number. modular numbers are useful for reasoning about remainders; we will see applications to hashing and cryptography. Modular numbers also have applications in digital circuits, for example to implement error correcting codes.
- Automata
- Automata are simple models of computers. After giving formal definitions, we will study the limits of computation, and will also show how the computational power of automata can be described with the high level language of regular expressions. Automata have applications in compilers, networks, and in the theoretical study of the limits of computation. Regular expressions are also useful for text processing.
- Combinatorics
- Combinatorics is the art of counting things without listing them. It is useful for the analysis of algorithms.
- Probability
- Probability allows reasoning about uncertain events, and assigning likelihoods to various outcomes. Probability has applications in artificial intelligence, systems, and the design of randomized algorithms.
- Metalogic
- We will apply the logical tools we've used all semester to study logic itself. Metalogic has applications in program verification and security, as well as in programming language design.