The main question in this couse is : "What can we do with a computer? (and what cannot we do?)" To address these questions, we will present a very simple model for a computer: the **Turing Machine**. We will also present less powerful models (**finite automata** & **pushdown automata**) which can only simulate simple automatism. In a second time, we will turn our interest on ressources (time and memory) that are needed to solve a given task. We will define **complexity classes**, especially the classes **P** and **NP**. We will see that some tasks, although feasible, in theory, by a computer, may need a crippling amount of ressources in practice. Finally, we will show that, in some cases, using //randomness// can facilitate computation.