diff --git a/slides/cours_21.md b/slides/cours_21.md
index 4c8f400e3cf1b32dc4666139ec980cf36daa06d8..e30a97edb41536171440d903f5b47082115fb8af 100644
--- a/slides/cours_21.md
+++ b/slides/cours_21.md
@@ -56,8 +56,8 @@ graph TD;
 ```C
 arbre symétrie(arbre)
     si !est_feuille(arbre)
-        échanger(arbre.enfant[0], arbre.enfant[1])
-        échanger(arbre.enfant[2], arbre.enfant[3])
+        échanger(arbre.enfant[0], arbre.enfant[2])
+        échanger(arbre.enfant[1], arbre.enfant[4])
         pour i de 0 à 3
             symétrie(arbre.enfant[i])
     retourne arbre
@@ -103,10 +103,10 @@ arbre symétrie(arbre)
 ## Écrire le pseudo-code (5min, matrix)
 
 ```C
-rien compression_sans_perte(arbre)
+rien compression_sans_pertes(arbre)
     si !est_feuille(arbre)
         pour i de 0 à 3
-            compression_sans_perte(arbre.enfant[i])
+            compression_sans_pertes(arbre.enfant[i])
         si derniere_branche(arbre)
             valeur, toutes_égales = valeur_enfants(arbre)
             si toutes_egales
@@ -207,8 +207,8 @@ bool last_value(node *qt, int *val) {
 * Avec l'écart-type
 
 \begin{equation*}
-\mu = \frac{1}{4}\sum_{i=0}^{3} p[i],\quad \sigma = \sqrt{\frac{1}{N}\sum_{i=0}^3 (\mu-p[i])
-^2}
+\mu = \frac{1}{4}\sum_{i=0}^{3} p[i],\quad \sigma = \sqrt{\frac{1}{4}\sum_{i=0}^3 (\mu-p[i])
+^2} = \sqrt{\frac{1}{4}\left(\sum_{i=0}^3p[i]^2\right)-\mu^2}
 \end{equation*}
 
 ## Que devient l'algorithme?
@@ -234,3 +234,390 @@ bool last_value(node *qt, int *val) {
 . . .
 
 ![Arbre compressé.](figs/quad_img_simple_comp_avg.svg)
+
+# Compression avec perte (6/N)
+
+## Modifications sur la structure de données?
+
+. . .
+
+* On stocke la moyenne, et le carré de la moyenne.
+
+```C
+struct noeud
+    flottant moyenne, moyenne_carre
+    node enfants[4]
+```
+
+* Comment on calcule `moyenne` et `moyenne_carre` sur chaque noeud (pseudo-code)?
+
+# Calcul de la moyenne
+
+## Pseudo-code (5min, matrix)
+
+. . .
+
+```C
+rien moyenne(arbre) {
+    si !est_feuille(arbre)
+        pour enfant dans arbre.enfants
+            moyenne(enfant)
+        pour enfant dans arbre.enfants
+            arbre.moyenne += enfant.moyenne
+            arbre.moyenne_carre += enfant.moyenne_carre
+        arbre.moyenne /= 4
+        arbre.moyenne_carre /= 4
+```
+
+# La compression avec pertes
+
+## Pseudo-code (5min, matrix)
+
+. . .
+
+```C
+rien compression_avec_pertes(arbre, theta)
+    si !est_feuille(arbre)
+        pour i de 0 à 3
+            compression_avec_pertes(arbre.enfant[i])
+        si derniere_branche(arbre)
+            si racine(arbre.moyenne*arbre.moyenne - arbre.moyenne_carre) < theta
+                detruire_enfants(arbre)
+```
+
+## Le code en entier
+
+```C
+arbre = matrice_à_arbre(matrice)
+moyenne(arbre)
+compression_sans_pertes(arbre)
+```
+
+# La dynamique des corps célestes
+
+## Slides très fortement inspirés du cours de J. Latt, Unige
+
+## Simulation du problème à $N$-corps
+
+* Prédiction du mouvement d'un grand nombre de corps célestes.
+* Modélisation:
+    * On se limite aux étoiles;
+    * Chaque étoile est caractérisée par un point (coordonnées) et une masse;
+    * On simule en deux dimensions.
+    * Interactions uniquement par les lois de la gravitation Newtonienne (oui-oui c'est de la **physique**!).
+
+
+# Les équations du mouvement
+
+## Mouvement de la $i$-ème étoile
+
+* Algorithme de Verlet ($t_{n+1}=t_n+\delta t$)
+
+    $$
+   \vec x_i(t_{n+1})= 2\vec x_i(t_n)-\vec x_i(t_{n-1})+\vec a_i(t_n)\delta t^2.
+   $$
+
+## Force de gravitation
+
+* $\vec a_i(t_n)=\vec F_i/m_i$.
+* Sur l'étoile $i$, la force résultante est donnée par
+
+    $$
+    \vec F_i=\sum_{j=1,j\neq i}^N \vec F_{ij}.
+    $$
+    avec
+    $$
+    \vec F_{ij}=\frac{G m_i m_j(\vec x_j-\vec x_i)}{||\vec x_j-\vec x_i||^3}.
+    $$
+
+# Algorithme du problème à $n$-corps
+
+## Pseudo-code: structure de données
+
+```C
+struct étoile
+    flottant m
+    vec x, x_precedent, f
+```
+
+## Pseudo-code: itération temporelle
+
+```C
+rien iteration_temporelle(étoiles, dt)
+    pour étoile_une dans étoiles
+        étoile_une.a = 0
+        pour étoile_deux dans étoiles
+            si (étoile_un != étoile_deux)
+                étoile_une.f += 
+                    force(étoile_une, étoile_deux)
+    pour étoile dans étoiles
+        étoile.x, étoile.x_precedent = 
+            verlet(étoile.x, étoile.x_precedent, 
+                   étoile.f / étoile.m, dt)
+```
+
+# Algorithme du problème à $n$-corps
+
+## Complexité
+
+* Complexité de chacune des parties?
+
+. . .
+
+* $\mathcal{O}(N^2)$, $\mathcal{O}(N)$.
+
+## En temps CPU pour **une itération**
+
+* Si temps pour $N=1$ on calcule en $1\mu s$:
+
++--------+-------+-------+-----------+
+|     N  |  N^2  | t [s] | t [réel]  |
++--------+-------+-------+-----------+
+|    10  |  10^2 | 1e-4  |           |
++--------+-------+-------+-----------+
+|  10^2  |  10^4 | 1e-2  |           |
++--------+-------+-------+-----------+
+|  10^4  |  10^8 | 1e+2  | ~1min     |
++--------+-------+-------+-----------+
+|  10^6  | 10^12 | 1e+6  | ~11j      |
++--------+-------+-------+-----------+
+|  10^9  | 10^18 | 1e+12 | ~30k ans  |
++--------+-------+-------+-----------+
+|  10^11 | 10^22 | 1e+16 | ~300M ans |
++--------+-------+-------+ ----------+
+
+* Typiquement il y a des milliers-millions d'itérations.
+* Il y a $10^{11}$ étoiles dans la galaxie.
+* Houston we have a problem.
+
+# Question
+
+## Comment faire mieux, des idées?
+
+. . .
+
+* Si un groupe d'étoiles est suffisamment loin, on le modélise comme un corps unique situé en son centre de masse.
+* Exemple: Si on simule plusieurs galaxies, on considère chaque galaxie comme un corps unique!
+* Un arbre quaternaire est une structure parfaite pour regrouper les étoiles.
+
+# Le cas à 10 corps
+
+::: columns
+
+:::: {.column width=50%}
+
+## Illustration: le cas à 10 corps
+
+![](figs/nbody_bare.png){width=60%}
+
+::::
+
+:::: {.column width=50%}
+
+## Problématique
+
+* On veut calculer la force sur $1$.
+
+::::
+
+:::
+
+. . .
+
+
+::: columns
+
+:::: {.column width=50%}
+
+## Illustration: le cas à 10 corps
+
+![](figs/nbody_n2.png){width=60%}
+
+
+::::
+
+:::: {.column width=50%}
+
+## Résultat
+
+* Calcul et somme des forces venant des $9$ autre corps.
+
+::::
+
+:::
+
+# Le cas à 10 corps
+
+::: columns
+
+:::: {.column width=50%}
+
+## Réduction d'un groupe à un seul corps
+
+![](figs/nbody_group.png){width=100%}
+
+::::
+
+:::: {.column width=50%}
+
+## Idée
+
+* On accélère le calcul en traitant un groupe comme un seul corps.
+* Fonctionne uniquement si le groupe est assez loin.
+* Autrement l'approximation est trop grossière.
+
+::::
+
+:::
+
+# Solution: l'arbre quaternaire
+
+## Corps célestes - arbre
+
+![](figs/nbody_qt_withtree.png)
+
+* On omet les noeuds vides pour éviter la surcharge.
+* La numérotation est:
+    * 0: ID
+    * 1: SD
+    * 2: ID
+    * 3: SG
+
+# Algorithme d'insertion
+
+::: columns
+
+:::: {.column width=50%}
+
+## Insertion corps 1
+
+![](figs/corps1.png){width=100%}
+
+::::
+
+:::: {.column width=50%}
+
+## Arbre
+
+![](figs/arbre1.png){width=100%}
+
+* Quadrant ID.
+* La feuille est vide, on insère.
+
+::::
+
+:::
+
+# Algorithme d'insertion
+
+::: columns
+
+:::: {.column width=50%}
+
+## Insertion corps 2
+
+![](figs/corps2.png){width=100%}
+
+::::
+
+:::: {.column width=50%}
+
+## Arbre
+
+![](figs/arbre2.png){width=100%}
+
+* Quadrant SD.
+* La feuille est vide, on insère.
+
+::::
+
+:::
+
+# Algorithme d'insertion
+
+::: columns
+
+:::: {.column width=50%}
+
+## Insertion corps 3 (1/N)
+
+![](figs/corps3_1.png){width=100%}
+
+::::
+
+:::: {.column width=50%}
+
+## Arbre
+
+![](figs/arbre3_1.png){width=100%}
+
+* Quadrant SD.
+* La feuille est prise par 2.
+
+::::
+
+:::
+
+# Algorithme d'insertion
+
+::: columns
+
+:::: {.column width=50%}
+
+## Insertion corps 3 (2/N)
+
+![](figs/corps3_2.png){width=100%}
+
+::::
+
+:::: {.column width=50%}
+
+## Arbre
+
+![](figs/arbre3_2.png){width=100%}
+
+* On crée un nouveau noeud.
+* Deux corps dans le noeud ID.
+* On crée un nouveau noeud.
+
+::::
+
+:::
+
+# Algorithme d'insertion
+
+::: columns
+
+:::: {.column width=50%}
+
+## Insertion corps 3 (3/N)
+
+![](figs/corps3_3.png){width=100%}
+
+::::
+
+:::: {.column width=50%}
+
+## Arbre
+
+![](figs/arbre3_3.png){width=100%}
+
+* 2 va dans ID.
+* 3 va dans SG.
+* C'est des feuilles vides, tout va bien.
+
+::::
+
+:::
+
+# Algorithme d'insertion
+
+## Que fait-on avec les noeuds intérieurs?
+
+* On les utilise pour:
+    * stocker la masse totale;
+    * stocker le centre de masse.
+
+## Les feuilles contiennent les étoiles.
+
+
diff --git a/slides/figs/arbre1.png b/slides/figs/arbre1.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d72a06adb936d7855a916895f22346c7bebb90b
Binary files /dev/null and b/slides/figs/arbre1.png differ
diff --git a/slides/figs/arbre2.png b/slides/figs/arbre2.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7a95bf99a5743250396e15705373189891f9b60
Binary files /dev/null and b/slides/figs/arbre2.png differ
diff --git a/slides/figs/arbre3_1.png b/slides/figs/arbre3_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..69487dde2226d1e2c44c4f58aff2a9a1c929b849
Binary files /dev/null and b/slides/figs/arbre3_1.png differ
diff --git a/slides/figs/arbre3_2.png b/slides/figs/arbre3_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..b3a1ecff789a6f5e86b949a49bfe2211e2048757
Binary files /dev/null and b/slides/figs/arbre3_2.png differ
diff --git a/slides/figs/arbre3_3.png b/slides/figs/arbre3_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..2fe706b28adc5d74086988257bb098a5e4e38129
Binary files /dev/null and b/slides/figs/arbre3_3.png differ
diff --git a/slides/figs/corps1.png b/slides/figs/corps1.png
new file mode 100644
index 0000000000000000000000000000000000000000..42cfc3c3ca0cb6457e7fec97cc2069e6bb5a0562
Binary files /dev/null and b/slides/figs/corps1.png differ
diff --git a/slides/figs/corps2.png b/slides/figs/corps2.png
new file mode 100644
index 0000000000000000000000000000000000000000..18a4b1d91e017078a48e600fab0e7b081936b141
Binary files /dev/null and b/slides/figs/corps2.png differ
diff --git a/slides/figs/corps3_1.png b/slides/figs/corps3_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..baae25fae36ee5c52dd9c12d91862fd67ab59750
Binary files /dev/null and b/slides/figs/corps3_1.png differ
diff --git a/slides/figs/corps3_2.png b/slides/figs/corps3_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..35d5aec9a13fd2b6502e15087ca4df033afe6806
Binary files /dev/null and b/slides/figs/corps3_2.png differ
diff --git a/slides/figs/corps3_3.png b/slides/figs/corps3_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..9b2676505189a1a046389d3bbfcc33695b77ec34
Binary files /dev/null and b/slides/figs/corps3_3.png differ
diff --git a/slides/figs/nbody_bare.png b/slides/figs/nbody_bare.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ec156a59cd82d80a03ec1ae4cb7ca5f76edf38c
Binary files /dev/null and b/slides/figs/nbody_bare.png differ
diff --git a/slides/figs/nbody_group.png b/slides/figs/nbody_group.png
new file mode 100644
index 0000000000000000000000000000000000000000..50ead198cf998d2a78092e4259ef6454ebccabaa
Binary files /dev/null and b/slides/figs/nbody_group.png differ
diff --git a/slides/figs/nbody_n2.png b/slides/figs/nbody_n2.png
new file mode 100644
index 0000000000000000000000000000000000000000..a56fbfaf77c2d3410ea62a2cacb69b6e2040504b
Binary files /dev/null and b/slides/figs/nbody_n2.png differ
diff --git a/slides/figs/nbody_qt.png b/slides/figs/nbody_qt.png
new file mode 100644
index 0000000000000000000000000000000000000000..dee26a7c232eabad134a8ce20c9828421f36a7cf
Binary files /dev/null and b/slides/figs/nbody_qt.png differ
diff --git a/slides/figs/nbody_qt_withtree.png b/slides/figs/nbody_qt_withtree.png
new file mode 100644
index 0000000000000000000000000000000000000000..fad251be9156e47ee2561f2e621da2ac09543dce
Binary files /dev/null and b/slides/figs/nbody_qt_withtree.png differ