Course policies can be found on the website ecealgo.com.

#### Big Questions

This course is focused on answering three big questions:

- Given infinite time, how can we group problems by their “complexity” (Computability-theory)
- Given finite time, but a problem we know is computable, how fast can we solve the problem (Algorithmic design)
- Given a problem which is difficult to solve, can we infer how slow/fast we can solve it by comparing it to other known problems (Reductions)

#### Two types of complexity

Computational Complexity | Algorithmic Complexity |
---|---|

#### Why Languages?

Problems need to be represented as languages to be comparable. A language is a set of strings and each string represents and *instance* of the problem (a specific set of inputs and their corresponding output). For example, the problem of adding two numbers together can be represented by the language:

**Problem:** Multiplying two integers together

**Language:**
\(L_{MULT2} =
\begin{bmatrix}
1 \times 1|1, & 1 \times 2|2, & 1 \times 3|3, \ldots\\
2 \times 1|2, & 2 \times 2|4, & 2 \times 3|6, \ldots \\
\vdots & \vdots & \vdots \\
n \times 1|n, & n \times 2|2n, & n \times 3|3n, \ldots \\
\end{bmatrix}\)

#### Additional Resources

- Textbooks
- Erickson, Jeff.
*Algorithms* - Sipser, Michael.
*Introduction to the Theory of Computation*- Chapter 0 - Introduction - Mathematical Notation and Terminology

- Erickson, Jeff.
- Sariel’s Lecture 1
- Very cool use of induction with hydra problem