diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5c8b9652893e41a3f428c6bee2597401f5eeb1a7
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,59 @@
+image: omalaspinas/pandoc:latest
+
+variables:
+  GIT_SUBMODULE_STRATEGY: recursive
+
+
+before_script:
+   ##
+   ## Install ssh-agent if not already installed, it is required by Docker.
+   ## (change apt-get to yum if you use an RPM-based image)
+   ##
+   - 'which ssh-agent || (pacman -S --noconfirm openssh)'
+   - 'which rsync || (pacman -S --noconfirm rsync)'
+
+
+   ##
+   ## Run ssh-agent (inside the build environment)
+   ##
+   - eval $(ssh-agent -s)
+
+   ##
+   ## Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
+   ## We're using tr to fix line endings which makes ed25519 keys work
+   ## without extra base64 encoding.
+   ## https://gitlab.com/gitlab-examples/ssh-private-key/issues/1#note_48526556
+   ##
+   - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
+
+   ##
+   ## Create the SSH directory and give it the right permissions
+   ##
+   - mkdir -p ~/.ssh
+   - chmod 700 ~/.ssh
+
+   ##
+   ## Add host id to known_hosts
+   ##
+   - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
+   - chmod 644 ~/.ssh/known_hosts
+
+
+
+build_only:
+  script:
+    - cd slides
+    - make
+    - make deploy
+    - rsync -avz algo_cours ur1bg_malas@ur1bg.ftp.infomaniak.com:web/malaspinas/
+
+build_artifacts:
+  script:
+    - cd slides
+    - make
+  artifacts:
+    paths:
+      - "*.pdf"
+      - "*.html"
+  only:
+    - tags
diff --git a/slides/cours_2.md b/slides/cours_2.md
index e3fedbff96822d5446149d11753c305eaf1196ec..e90017455e1156a57c5abcf013bfd89bf3e208e4 100644
--- a/slides/cours_2.md
+++ b/slides/cours_2.md
@@ -59,7 +59,7 @@ int main() {
 - Initialisation, addition et multiplication de matrices
 - Couverture de la reine
 
-# Le calcul du PPCM (1/6)
+# Le calcul du PPCM (1/5)
 
 ## Définition
 
@@ -86,14 +86,15 @@ $$
 $$
 On garde tous les premiers à la puissance la plus élevée
 $$
-PPCM(36, 45)=2^2\cdot 3^2\cdot 5=180.
+PPCM(36, 90)=2^2\cdot 3^2\cdot 5=180.
 $$
 
-# Le calcul du PPCM (2/6)
+# Le calcul du PPCM (2/5)
 
 ## Exemple d'algorithme
 
 ```C
+PPCM(36, 90):
 36  < 90  // 36  + 36
 72  < 90  // 72  + 36
 108 > 90  // 90  + 90
@@ -112,10 +113,8 @@ $$
 
 ## et codez-le!
 
-. . .
-
 
-# Le calcul du PPCM (3/6)
+# Le calcul du PPCM (3/5)
 
 ## Tentative de correction
 
@@ -134,15 +133,17 @@ int main() {
 }
 ```
 
-Combien d'additions / comparaisons au pire?
+. . .
+
+* Combien d'additions / comparaisons au pire?
 
-# Le calcul du PPCM (4/6)
+# Le calcul du PPCM (4/5)
 
-## Comment décrire une fonction qui ferait ce calcul (arguments, sorties)?
+## Réusinage: Comment décrire une fonction qui ferait ce calcul (arguments, sorties)?
 
 . . .
 
-En `C` on pourrait le décrire comme
+En `C` on pourrait la décrire comme
 
 ```C
 int ppcm(int a, int b); // La **signature** de cette fonction
@@ -154,34 +155,12 @@ int ppcm(int a, int b); // La **signature** de cette fonction
 
 Par groupe de 3:
 
-* réfléchissez à un algorithme donnant le PPCM de deux nombres;
+* réfléchissez à un algorithme alternatif donnant le PPCM de deux nombres;
 * écrivez l'algorithme en pseudo-code.
 
-# Le calcul du PPCM (5/6)
+# Le calcul du PPCM (5/5)
 
-Si un nombre, `p`, est multiple de `a` et de `b` alors il peut s'écrire `p = a
-* i = b * j`  ou encore `p / a = i` et `p / b = j`.
-
-<!-- Si un nombre, $p$, est multiple de $a$ et de $b$ alors il peut s'écrire -->
-<!-- $$ -->
-<!-- p = a \cdot i = b \cdot j, -->
-<!-- $$ -->
-<!-- ou encore $p / a = i$ et $p / b = j$. -->
-
-## Pseudo-code
-
-```C
-int ppcm(int a, int b) {
-    for (i in [1, b]) {
-        if a * i is divisible by b {
-            return a * i
-        }
-    }
-}
-```
-
-
-# Le calcul du PPCM (6/6)
+## Indication
 
 Si un nombre, `p`, est multiple de `a` et de `b` alors il peut s'écrire `p = a
 * i = b * j`  ou encore `p / a = i` et `p / b = j`.
@@ -192,6 +171,8 @@ Si un nombre, `p`, est multiple de `a` et de `b` alors il peut s'écrire `p = a
 <!-- $$ -->
 <!-- ou encore $p / a = i$ et $p / b = j$. -->
 
+. . .
+
 ## Pseudo-code
 
 ```C
@@ -218,7 +199,7 @@ int ppcm(int a, int b) {
 #include <stdlib.h> 
 
 int main() { 
-   int n = 15,m = 12;
+   int n = 15, m = 12;
    int i = 1;
    while (n * i % m != 0) {
       i++;
@@ -247,34 +228,152 @@ int main() {
 }
 ```
 
-# Le PGCD
+# Le calcul du PGCD (1/N)
+
+## Définition
+
+Le plus grand commun diviseur (PGCD) de deux nombres entiers non nuls est le
+plus grand entier qui les divise en même temps. 
+
+## Exemples:
 
 ```C
-#include <stdio.h>
-void main() {
-   int n = 90;
-   int m = 78;
-   printf("n = %d et m = %d\n", n, m);
+PGCD(3, 4) = 1,
+PGCD(4, 6) = 2,
+PGCD(5, 15) = 5.
+```
+
+. . .
+
+## Mathématiquement
+
+Décomposition en nombres premiers:
+
+$$
+36 = 2^2\cdot 3^2,\quad 90=2\cdot 5\cdot 3^2,
+$$
+On garde tous les premiers à la puissance la plus basse
+$$
+PGCD(36, 90)=2^{\min{1,2}}\cdot 3^{\min{2,2}}\cdot 5^{\min{0,1}}=18.
+$$
+
+# Le calcul du PGCD (2/6)
+
+## Algorithme
+
+Par groupe de 3:
+
+* réfléchissez à un algorithme alternatif donnant le PPCM de deux nombres;
+* écrivez l'algorithme en pseudo-code.
 
-   // algorithme naif
+. . .
+
+## Exemple d'algorithme
+
+```C
+PGCD(36, 90):
+90 % 36 != 0 // otherwise 36 would be PGCD
+90 % 35 != 0 // otherwise 35 would be PGCD
+90 % 34 != 0 // otherwise 34 would be PGCD
+...
+90 % 19 != 0 // otherwise 19 would be PGCD
+90 % 18 == 0 // The end!
+```
+
+* 18 modulos, 18 assignations, et 18 comparaisons.
+
+# Le calcul du PGCD (3/6)
+
+## Transcrivez cet exemple en algorithme (groupe de 3) et codez-le!
+
+. . .
+
+## Optimisation
+
+* Combien d'additions / comparaisons au pire?
+* Un moyen de le rendre plus efficace?
+
+. . .
+
+## Tentative de correction
+
+```C
+void main() {
+   int n = 90, m = 78;
    int gcd = 1;
-   for (int div = n; div >= 2; div--) {
+   for (int div = n; div >= 2; div--) { // div = m, sqrt(n)
       if (n % div == 0 && m % div == 0) {
          gcd = div;
          break;
       }
    }
-   printf("Le pgcd de %d et %d est %d\n",n,m,gcd);
+   printf("Le pgcd de %d et %d est %d\n", n, m, gcd);
+}
+```
 
-   // algorithme d'Euclide
+# Le calcul du PGCD (4/6)
+
+## Réusinage: l'algorithme d'Euclide
+
+`Dividende = Diviseur * Quotient + Reste`
+
+```C
+PGCD(35, 60):
+35 = 60 * 0 + 35 // 60 -> 35, 35 -> 60
+60 = 35 * 1 + 25 // 35 -> 60, 25 -> 35
+35 = 25 * 1 + 10 // 25 -> 35, 20 -> 25
+25 = 10 * 2 +  5 // 10 -> 25, 5  -> 10
+10 =  5 * 2 +  0 // PGCD = 5!
+```
+
+. . .
+
+## Algorithme
+
+Par groupe de 3:
+
+* analysez l'exemple ci-dessus;
+* transcrivez le en pseudo-code.
+
+# Le calcul du PGCD (5/6)
+
+## Pseudo-code
+
+```C
+int pgcd(int a, int b) {
+    tmp_n = n
+    tmp_m = m
+    while (tmp_m does not divide tmp_n) {
+        tmp   = tmp_n
+        tmp_n = tmp_m
+        tmp_m = tmp modulo tmp_m
+    }
+    return tmp_m
+}
+```
+
+# Le code du PGCD de 2 nombres
+
+## Implémentez le pseudo-code et postez le code sur matrix.
+
+. . .
+
+## Un corrigé possible
+
+```C
+#include <stdio.h>
+void main() {
+   int n = 90;
+   int m = 78;
+   printf("n = %d et m = %d\n", n, m);
    int tmp_n = n;
    int tmp_m = m;
-   while (tmp_n % tmp_m > 0) {
+   while (tmp_n%tmp_m > 0) {
       int tmp = tmp_n;
       tmp_n = tmp_m;
       tmp_m = tmp%tmp_m;
    }
    printf("Le pgcd de %d et %d est %d\n", n, m, tmp_m);
 }
-   
 ```
+