diff --git a/slides/cours_21.md b/slides/cours_21.md
index e30a97edb41536171440d903f5b47082115fb8af..8afc677bad2b73ec786e55e06ea0e3c4b4015250 100644
--- a/slides/cours_21.md
+++ b/slides/cours_21.md
@@ -375,8 +375,6 @@ rien iteration_temporelle(étoiles, dt)
 +--------+-------+-------+-----------+
 |    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      |
@@ -384,7 +382,7 @@ rien iteration_temporelle(étoiles, dt)
 |  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.
@@ -483,7 +481,7 @@ rien iteration_temporelle(étoiles, dt)
     * 2: ID
     * 3: SG
 
-# Algorithme d'insertion
+# Exemple d'insertion
 
 ::: columns
 
@@ -497,7 +495,7 @@ rien iteration_temporelle(étoiles, dt)
 
 :::: {.column width=50%}
 
-## Arbre
+## Arbre, niveau 1
 
 ![](figs/arbre1.png){width=100%}
 
@@ -508,7 +506,7 @@ rien iteration_temporelle(étoiles, dt)
 
 :::
 
-# Algorithme d'insertion
+# Exemple d'insertion
 
 ::: columns
 
@@ -522,7 +520,7 @@ rien iteration_temporelle(étoiles, dt)
 
 :::: {.column width=50%}
 
-## Arbre
+## Arbre, niveau 1
 
 ![](figs/arbre2.png){width=100%}
 
@@ -533,7 +531,7 @@ rien iteration_temporelle(étoiles, dt)
 
 :::
 
-# Algorithme d'insertion
+# Exemple d'insertion
 
 ::: columns
 
@@ -547,7 +545,7 @@ rien iteration_temporelle(étoiles, dt)
 
 :::: {.column width=50%}
 
-## Arbre
+## Arbre, niveau 1
 
 ![](figs/arbre3_1.png){width=100%}
 
@@ -558,7 +556,7 @@ rien iteration_temporelle(étoiles, dt)
 
 :::
 
-# Algorithme d'insertion
+# Exemple d'insertion
 
 ::: columns
 
@@ -572,7 +570,7 @@ rien iteration_temporelle(étoiles, dt)
 
 :::: {.column width=50%}
 
-## Arbre
+## Arbre, niveau 2
 
 ![](figs/arbre3_2.png){width=100%}
 
@@ -584,7 +582,7 @@ rien iteration_temporelle(étoiles, dt)
 
 :::
 
-# Algorithme d'insertion
+# Exemple d'insertion
 
 ::: columns
 
@@ -598,7 +596,7 @@ rien iteration_temporelle(étoiles, dt)
 
 :::: {.column width=50%}
 
-## Arbre
+## Arbre, niveau 3
 
 ![](figs/arbre3_3.png){width=100%}
 
@@ -610,7 +608,11 @@ rien iteration_temporelle(étoiles, dt)
 
 :::
 
-# Algorithme d'insertion
+# Exemple d'insertion
+
+::: columns
+
+:::: {.column width=50%}
 
 ## Que fait-on avec les noeuds intérieurs?
 
@@ -618,6 +620,161 @@ rien iteration_temporelle(étoiles, dt)
     * stocker la masse totale;
     * stocker le centre de masse.
 
-## Les feuilles contiennent les étoiles.
+\begin{align}
+m&=m_2+m_3,\\
+\vec x &= \frac{m_2\vec x_2+m_3+\vec x_3}{m}.
+\end{align}
+
+## Chaque feuille contient **une étoile**
+
+::::
+
+:::: {.column width=50%}
+
+## Arbre
+
+![](figs/arbre3_3.png){width=100%}
+
+::::
+
+:::
+
+# Résumé
+
+* Insertion du corps `c` dans le noeud `n` en partant de la racine.
+* Si le noeud `n`
+    * ne contient pas de corps, on y dépose `c`,
+    * est interne, on met à jour masse et centre de masse. `c` est inséré récursivement dans le bon quadrant.
+    * est est externe, on subdivise `n`, on met à jour la masse et centre de masse, on insère récursivement les deux noeuds dans les quadrants appropriés.
+
+## Remarque
+
+* Il faut stocker les coordonnées des quadrants.
+* Un noeud a un comportement différent s'il est interne ou externe.
+
+# Algorithme d'insertion
+
+## Structure de données
+
+```C
+struct node
+    etoile e // externe: pour stocker 
+    etoile sup_etoile // interne: pour stocker m, x
+    quadrant q  // coordonnées du quadrant
+    node enfants[4]
+```
+
+## Remarque: 
+
+* On fait une simplification "moche": `sup_etoile` pourrait juste avoir une masse et une position.
+
+# Algorithme d'insertion
+
+\footnotesize
+
+## Algorithme d'insertion, pseudo-code (15min, matrix)
+
+. . .
+
+```C
+rien insertion_etoile(arbre, e)  
+    si (!est_vide(arbre) && dans_le_quadrant(arbre.q, e.x)) {
+        si (est_feuille(arbre))
+            si (est_vide(arbre))
+                arbre.e = e
+            sinon
+            // on crée enfants et arbre.sup_etoile est initialisée
+                subdivision_arbre(arbre, e) 
+                pour enfant dans arbre.enfants
+                    insertion_etoile(enfant, arbre.e)
+                pour enfant dans arbre.enfants
+                    insertion_etoile(enfant, e)
+                destruction(etoile)
+        sinon
+            maj_masse_cdm(arbre.sup_etoile, e)
+            pour enfant dans arbre.enfants
+                insertion_etoile(enfant, e)
+```
+
+# Utilisation de l'arbre
+
+* L'arbre est rempli: comment on calcule la force sur le corps 1?
+* Parcours de l'arbre: 
+    * si la distance entre 1 et le centre de masse est suffisante, on utilise la masse totale et centre de masse pour calculer la force.
+    * sinon, on continue le parcours
+
+# Calcul de la force
+
+## Calcul de la force sur `1`
+
+![](figs/force_1.png)
+
+* Le cadrant ID ne contient que `1`, rien à faire.
+
+# Calcul de la force
+
+## Calcul de la force sur `1`
+
+![](figs/force_2.png)
+
+* Le cadrant SG ne contient `5` corps.
+
+# Calcul de la force
+
+## Calcul de la force sur `1`
+
+![](figs/force_3.png)
+
+* La distance entre `1` et le centre de masse de SG est `d`.
+
+# Calcul de la force
+
+## Calcul de la force sur `1`
+
+![](figs/force_4.png)
+
+* La distance entre `1` et le centre de masse de SG est `d`.
+* Est-ce que `d` est assez grand?
+* On va comparer avec la distance `d` avec la taille du quadrant `s`.
+
+# Critère $\theta$
+
+* On compare $d=||\vec x_1-\vec x_{cm}||$ avec $s$ la taille du quadrant.
+* Le domain est assez éloigné si
+
+    $$
+    \frac{s}{d}<\theta,
+    $$
+* $\theta$ est la valeur de seuil.
+* Une valeur typique est $\theta=0.5$, donc la condition devient
+
+    $$
+    d>2s.
+    $$
+
+# Calcul de la force
+
+## Calcul de la force sur `1`
+
+![](figs/force_4.png)
+
+* Ici $d<2s$, domaine rejeté.
+* ON descend dans l'arbre.
+
+# Calcul de la force
+
+## Calcul de la force sur `1`
+
+![](figs/force_5.png)
+
+* `s` est plus petit, mais....
+* Cela ne suffit pas $d<2s$, domaine rejeté.
+
+# Calcul de la force
+
+## Calcul de la force sur `1`
 
+![](figs/force_6.png)
 
+* Les noeuds sont des feuilles, ils sont acceptés.
+* On ajoute la force qu'ils exercent sur `1`.
diff --git a/slides/figs/force_1.png b/slides/figs/force_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..e04dab8bf3fa363b2931a5625f752635021cef88
Binary files /dev/null and b/slides/figs/force_1.png differ
diff --git a/slides/figs/force_2.png b/slides/figs/force_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..9b9050c9c54c905d1a0b257b9acf5bb59d311c77
Binary files /dev/null and b/slides/figs/force_2.png differ
diff --git a/slides/figs/force_3.png b/slides/figs/force_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..e83e68e3440c1e8f261e67fa511693dc7d99a9bc
Binary files /dev/null and b/slides/figs/force_3.png differ
diff --git a/slides/figs/force_4.png b/slides/figs/force_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..d3582f03e43f7e591d28de4fcd3a6247390534c2
Binary files /dev/null and b/slides/figs/force_4.png differ
diff --git a/slides/figs/force_5.png b/slides/figs/force_5.png
new file mode 100644
index 0000000000000000000000000000000000000000..67f2a8c6ea47e40bf25f2f0f45c2ba4d9ee791d2
Binary files /dev/null and b/slides/figs/force_5.png differ
diff --git a/slides/figs/force_6.png b/slides/figs/force_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b6837fdeb3fd1dae92d73e11bac878dbf52d9a6
Binary files /dev/null and b/slides/figs/force_6.png differ