ajout de tous les cours et TP préparés cet été

This commit is contained in:
2026-01-17 23:10:49 +01:00
parent ed9415bc81
commit 301cf5a98f
125 changed files with 21614 additions and 542 deletions

View File

@@ -0,0 +1,212 @@
# Corrigé des Exercices sur les Graphes
---
## Exercice 1 : Réseau social (README.md)
### Rappel du graphe
```
A --- B
/|\ |
/ | \ |
C | D--+
\ | /|
\|/ |
E--F
```
Avec :
- A ami avec B, C, D
- B ami avec A, D
- C ami avec A, E, D
- D ami avec A, B, C, E, F
- E ami avec C, D, F
- F ami avec E, D
### 1°) Degré des sommets
| Sommet | Voisins | Degré |
|--------|---------|-------|
| A | B, C, D | 3 |
| B | A, D | 2 |
| C | A, E, D | 3 |
| D | A, B, C, E, F | 5 |
| E | C, D, F | 3 |
| F | E, D | 2 |
**Vérification** : Somme des degrés = 3+2+3+5+3+2 = 18 = 2 × 9 arêtes ✓
### 2°) Ordre du graphe
L'ordre du graphe est **6** (il y a 6 sommets : A, B, C, D, E, F).
### 3°) Ce graphe est-il complet ?
**Non**, ce graphe n'est pas complet.
Dans un graphe complet d'ordre 6, chaque sommet serait de degré 5 (relié à tous les autres).
Contre-exemples :
- A n'est pas relié à E et F
- B n'est pas relié à C, E et F
---
## Exercice 2 : Matrice d'adjacence du réseau social
En numérotant les sommets dans l'ordre alphabétique (A, B, C, D, E, F) :
| | A | B | C | D | E | F |
|---|---|---|---|---|---|---|
| A | 0 | 1 | 1 | 1 | 0 | 0 |
| B | 1 | 0 | 0 | 1 | 0 | 0 |
| C | 1 | 0 | 0 | 1 | 1 | 0 |
| D | 1 | 1 | 1 | 0 | 1 | 1 |
| E | 0 | 0 | 1 | 1 | 0 | 1 |
| F | 0 | 0 | 0 | 1 | 1 | 0 |
**En Python :**
```python
M = [
[0, 1, 1, 1, 0, 0],
[1, 0, 0, 1, 0, 0],
[1, 0, 0, 1, 1, 0],
[1, 1, 1, 0, 1, 1],
[0, 0, 1, 1, 0, 1],
[0, 0, 0, 1, 1, 0]
]
```
**Remarque** : La matrice est symétrique car le graphe est non orienté.
---
## Exercice 3 : Réseau social d'Arthur (EXERCICES.md)
### Graphe
```
Arthur ---- Benoit ---- Coralie
| / |
| / |
Elodie ---- Franck ---- David
```
### Représentation par dictionnaire
```python
G = {
'Arthur': ['Benoit', 'Elodie'],
'Benoit': ['Arthur', 'Coralie'],
'Coralie': ['Benoit', 'Franck', 'David'],
'David': ['Coralie', 'Franck', 'Elodie'],
'Elodie': ['Arthur', 'David', 'Franck'],
'Franck': ['Coralie', 'David', 'Elodie']
}
```
### Matrice d'adjacence
En ordre alphabétique : Arthur, Benoit, Coralie, David, Elodie, Franck
| | Arthur | Benoit | Coralie | David | Elodie | Franck |
|---------|--------|--------|---------|-------|--------|--------|
| Arthur | 0 | 1 | 0 | 0 | 1 | 0 |
| Benoit | 1 | 0 | 1 | 0 | 0 | 0 |
| Coralie | 0 | 1 | 0 | 1 | 0 | 1 |
| David | 0 | 0 | 1 | 0 | 1 | 1 |
| Elodie | 1 | 0 | 0 | 1 | 0 | 1 |
| Franck | 0 | 0 | 1 | 1 | 1 | 0 |
---
## Exercice 4 : Village d'Eva (graphe orienté pondéré)
### Graphe
```
École
/ | \
3↓ 4↑ 6↕
/ | \
Boulangerie ←─── Mairie Salle des fêtes
↓ ↕2 ↕7 ↕5
4↓ Bureau Église Boucherie
↓ de poste
Boucherie
```
**Sommets** : Boulangerie, Bureau de poste, École, Boucherie, Église, Mairie, Salle des fêtes
**Arêtes orientées avec poids** :
- Boulangerie ↔ Bureau de poste : 2 min (double sens)
- École → Boulangerie : 3 min (sens unique)
- Boulangerie → Boucherie : 4 min (sens unique)
- École → Église : 3 min (sens unique)
- Mairie → École : 4 min (sens unique)
- École ↔ Salle des fêtes : 6 min (double sens)
- Boucherie ↔ Salle des fêtes : 5 min (double sens)
- Mairie ↔ Église : 7 min (double sens)
---
## Exercice 5 : Ordre et degrés (img2.PNG)
*(Réponse basée sur l'image du fichier)*
Pour déterminer l'ordre : compter le nombre de sommets.
Pour déterminer le degré de chaque sommet : compter le nombre d'arêtes incidentes.
**Méthode générale :**
```python
def ordre(graphe):
return len(graphe)
def degre(graphe, sommet):
return len(graphe[sommet])
def degres(graphe):
return {s: len(v) for s, v in graphe.items()}
```
---
## Exercice 6 : Dictionnaire et matrice (img3.PNG)
*(Réponse basée sur l'image du fichier)*
**Méthode pour créer le dictionnaire :**
```python
# Lire les sommets et leurs voisins depuis le graphe
G = {}
# Pour chaque sommet, lister ses voisins
# G['A'] = ['B', 'C', ...]
```
**Méthode pour créer la matrice d'adjacence :**
```python
def creer_matrice(graphe):
sommets = list(graphe.keys())
n = len(sommets)
matrice = [[0] * n for _ in range(n)]
for i, s1 in enumerate(sommets):
for j, s2 in enumerate(sommets):
if s2 in graphe[s1]:
matrice[i][j] = 1
return matrice
```
---
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

View File

@@ -6,14 +6,14 @@ Construire un graphe non orienté du réseau social à partir des informations s
- **Benoit** est ami avec **Arthur** et **Coralie** ;
- **Coralie** est amie avec **Benoit**, **Franck** et **David** ;
- **David** est ami avec **Coralie**, **Franck** et **Elodie** ;
- **Elodie** est ami avec **Arthur**, **David** et **Franck** ;
- **Elodie** est amie avec **Arthur**, **David** et **Franck** ;
- **Franck** est ami avec **Coralie**, **David** et **Elodie**.
---
Eva décide de faire un graphe orienté représentant les différentes ruelles de son village. On y trouve une boulangerie, une école, un bureau de poste, une boucherie, une mairie, une église et une salle des fêtes. Certaines ruelles sont à double sens et d'autres à sens unique.
Eva décide de donner pour chacune des arêtes de son graphe une valeur qui correpond au temps qu'elle met pour traverser la ruelle à pied (chaque arête représente un sens de circulation).
Eva décide de donner pour chacune des arêtes de son graphe une valeur qui correspond au temps qu'elle met pour traverser la ruelle à pied (chaque arête représente un sens de circulation).
Voici ses données :
@@ -40,3 +40,10 @@ Voici ses données :
![graphe](assets/img3.PNG)
---
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

View File

@@ -1,4 +1,4 @@
## Graphes et POO
# Graphes et POO
> Tout comme les arbres, il nous est possible de représenter les graphes sous la forme d'une classe Python.
@@ -67,4 +67,12 @@ class Graphe:
Merci à [Gilles Lassus](https://glassus.github.io/terminale_nsi/T1_Structures_de_donnees/1.4_Graphes/cours/#3-creation-dune-classe-graphe) pour la source.
Merci à [Gilles Lassus](https://glassus.github.io/terminale_nsi/T1_Structures_de_donnees/1.4_Graphes/cours/#3-creation-dune-classe-graphe) pour la source.
---
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

View File

@@ -1,9 +1,7 @@
## Les Graphes
# Les Graphes
>
------
### Le programme
@@ -12,7 +10,7 @@
---------
### Quest-quun graphe?
### Qu'est-ce qu'un graphe ?
Imaginez un réseau social ayant 6 abonnés (A, B, C, D, E et F) où :
* A est ami avec B, C et D
* B est ami avec A et D
@@ -24,7 +22,7 @@ Imaginez un réseau social ayant 6 abonnés (A, B, C, D, E et F) où :
On peut représenter ce réseau social par un schéma où :
* Chaque abonné est représenté par un cercle avec son nom.
* Chaque relation "X est ami avec Y" par un segment de droite reliant X et Y ("X est amiavec Y" et "Y est ami avec X" étant représenté par le même segment de droite).
* Chaque relation "X est ami avec Y" par un segment de droite reliant X et Y ("X est ami avec Y" et "Y est ami avec X" étant représenté par le même segment de droite).
Voici ce que cela donne avec le réseau social décrit ci-dessus :
@@ -34,13 +32,13 @@ Voici ce que cela donne avec le réseau social décrit ci-dessus :
Ce genre de figure sappelle un graphe. Les graphes sont des objets mathématiquestrès utilisés, notamment en informatique.Les cercles sont appelés des sommets et les segments de droites des arêtes.
Ce genre de figure s'appelle un graphe. Les graphes sont des objets mathématiques très utilisés, notamment en informatique. Les cercles sont appelés des **sommets** et les segments de droites des **arêtes**.
### Définitions et terminologie
On appelle **graphe** un ensemble de points appelés **sommets** associés à un ensemble de lignes appelées **arrêtes** qui relient certains sommets entre eux.
On appelle **graphe** un ensemble de points appelés **sommets** associés à un ensemble de lignes appelées **arêtes** qui relient certains sommets entre eux.
**Ordre dun graphe :**
Lordre dun graphe est le nombre de sommets du graphe.
@@ -103,7 +101,7 @@ Chaque sommet est de degré 3
Un graphe paut être **orienté** ou **non-orienté**.
Un graphe peut être **orienté** ou **non-orienté**.
@@ -193,7 +191,7 @@ Ecrire la matrice d'adjacence du réseau social de l'introduction
### Chaine et cycle
**Définition:**
On appelle **chaîne** toute succession darêtes dont lextrémité de lune (sauf la dernière) estlorigine de la suivante.
On appelle **chaîne** toute succession d'arêtes dont l'extrémité de l'une (sauf la dernière) est l'origine de la suivante.
* Le nombre darêtes qui composent une chaîne est appelé **longueur de la chaîne**.
* On appelle **chaîne fermée** toute chaîne dont lorigine et lextrémité coïncident.
@@ -201,7 +199,7 @@ On appelle **chaîne** toute succession darêtes dont lextrémité de l
**Exemple:**
Dans le graphe ci-dessous:
E-A-C-B est un chaîne de longueur 3.
E-A-C-B est une chaîne de longueur 3.
E-A-C-B-A-E est une chaîne fermée de longueur 5. Ce nest pas un cycle car larête A-E est parcourue deux fois.
@@ -209,5 +207,34 @@ D-B-A-C-D est un cycle de longueur 4.
<img src="assets/graphe_8.png" alt="graphe_8" style="zoom:67%;" />
---
## Pour aller plus loin
Les graphes sont une structure fondamentale en informatique. Dans les cours suivants, nous verrons :
- **Les parcours de graphes** (BFS et DFS) → voir [PARCOURS.md](PARCOURS.md)
- **L'implémentation en POO** → voir [POO.md](POO.md)
- **Les algorithmes de plus court chemin** (Dijkstra, Bellman-Ford) → voir le chapitre Routage
---
## Résumé
| Notion | Définition |
|--------|------------|
| **Graphe** | Ensemble de sommets reliés par des arêtes |
| **Ordre** | Nombre de sommets |
| **Degré** | Nombre d'arêtes issues d'un sommet |
| **Adjacents** | Deux sommets reliés par une arête |
| **Chaîne** | Succession d'arêtes consécutives |
| **Cycle** | Chaîne fermée sans répétition d'arêtes |
| **Matrice d'adjacence** | Représentation matricielle du graphe |
---
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

334
Graphes/TP_KevinBacon.md Normal file
View File

@@ -0,0 +1,334 @@
# TP : Les 6 degrés de Kevin Bacon — Le petit monde des réseaux
> **Thème** : Parcours de graphes et théorie des réseaux sociaux
---
## Contexte
En 2026, les réseaux sociaux connectent des milliards de personnes. TikTok, Instagram, LinkedIn... Mais saviez-vous que vous êtes probablement relié(e) à n'importe quelle célébrité par seulement **6 intermédiaires** ?
C'est la théorie des **"Six degrés de séparation"**, popularisée par le jeu **"Six Degrees of Kevin Bacon"** : tout acteur d'Hollywood peut être relié à Kevin Bacon en moins de 6 films.
Dans ce TP, vous allez explorer cette théorie en utilisant les **algorithmes de parcours de graphes**.
---
## Partie 1 : Comprendre le problème
### Le nombre de Bacon
Le **nombre de Bacon** d'un acteur est la distance minimale (en nombre de films) qui le sépare de Kevin Bacon.
- Kevin Bacon a un nombre de Bacon de **0**
- Un acteur qui a joué avec Kevin Bacon a un nombre de Bacon de **1**
- Un acteur qui a joué avec quelqu'un qui a joué avec Kevin Bacon a un nombre de Bacon de **2**
- Et ainsi de suite...
### Exemple
```
Tom Hanks ──[Apollo 13]── Kevin Bacon
→ Nombre de Bacon = 1
Natalie Portman ──[Heat]── Robert De Niro ──[Sleepers]── Kevin Bacon
→ Nombre de Bacon = 2
```
### Questions préliminaires
1. Si un acteur A a joué avec un acteur B, quelle est la relation entre eux dans un graphe ?
2. Quel algorithme de parcours permet de trouver le **plus court chemin** entre deux sommets ?
3. Pourquoi BFS est-il préférable à DFS pour ce problème ?
---
## Partie 2 : Modélisation du problème
### Le graphe des acteurs
Nous allons modéliser Hollywood comme un graphe où :
- Chaque **sommet** représente un acteur
- Chaque **arête** relie deux acteurs qui ont joué dans le même film
### Mini-base de données
Voici une petite base de données de films :
```python
films = {
"Apollo 13": ["Tom Hanks", "Kevin Bacon", "Bill Paxton"],
"Forrest Gump": ["Tom Hanks", "Robin Wright", "Gary Sinise"],
"The Dark Knight": ["Christian Bale", "Heath Ledger", "Gary Oldman"],
"Inception": ["Leonardo DiCaprio", "Tom Hardy", "Marion Cotillard"],
"Interstellar": ["Matthew McConaughey", "Anne Hathaway", "Jessica Chastain"],
"Mystic River": ["Sean Penn", "Kevin Bacon", "Tim Robbins"],
"X-Men First Class": ["James McAvoy", "Michael Fassbender", "Kevin Bacon"],
"The Shawshank Redemption": ["Tim Robbins", "Morgan Freeman"],
"Se7en": ["Morgan Freeman", "Brad Pitt", "Kevin Spacey"],
"Fight Club": ["Brad Pitt", "Edward Norton", "Helena Bonham Carter"],
"Harry Potter": ["Daniel Radcliffe", "Emma Watson", "Gary Oldman"],
"Batman Begins": ["Christian Bale", "Liam Neeson", "Gary Oldman"],
"Taken": ["Liam Neeson", "Maggie Grace"],
"Lost in Translation": ["Bill Murray", "Scarlett Johansson"],
"The Avengers": ["Scarlett Johansson", "Robert Downey Jr", "Chris Evans"],
"Captain America": ["Chris Evans", "Sebastian Stan", "Robert Downey Jr"]
}
```
### Exercice 1 : Construire le graphe
Complétez la fonction suivante qui construit le graphe des acteurs à partir de la base de films :
```python
def construire_graphe_acteurs(films):
"""
Construit un graphe où chaque acteur est un sommet
et deux acteurs sont reliés s'ils ont joué dans le même film.
Paramètre:
films (dict): dictionnaire {nom_film: [liste_acteurs]}
Retourne:
dict: graphe sous forme de dictionnaire d'adjacence
"""
graphe = {}
for film, acteurs in films.items():
# Pour chaque paire d'acteurs dans le film, créer une arête
# À compléter...
pass
return graphe
```
**Indice** : Utilisez `itertools.combinations(acteurs, 2)` pour obtenir toutes les paires d'acteurs.
---
## Partie 3 : Algorithme BFS pour le nombre de Bacon
### Rappel : Parcours en largeur (BFS)
Le BFS explore le graphe **niveau par niveau**. Il est idéal pour trouver le plus court chemin dans un graphe non pondéré.
### Exercice 2 : Implémenter le calcul du nombre de Bacon
Complétez la fonction suivante :
```python
from collections import deque
def nombre_de_bacon(graphe, acteur, bacon="Kevin Bacon"):
"""
Calcule le nombre de Bacon d'un acteur.
Paramètres:
graphe (dict): graphe des acteurs
acteur (str): nom de l'acteur
bacon (str): nom de la référence (Kevin Bacon par défaut)
Retourne:
int: le nombre de Bacon, ou -1 si non connecté
"""
if acteur == bacon:
return 0
if acteur not in graphe or bacon not in graphe:
return -1
# BFS
file = deque([(bacon, 0)]) # (sommet, distance)
visite = {bacon}
while file:
# À compléter...
pass
return -1 # Non trouvé
```
### Exercice 3 : Trouver le chemin
Modifiez l'algorithme pour retourner non seulement la distance, mais aussi le **chemin** (la liste des acteurs intermédiaires) :
```python
def chemin_vers_bacon(graphe, acteur, bacon="Kevin Bacon"):
"""
Trouve le plus court chemin entre un acteur et Kevin Bacon.
Retourne:
list: liste des acteurs formant le chemin, ou None si non connecté
"""
# À compléter...
pass
```
---
## Partie 4 : Analyse du réseau
### Exercice 4 : Statistiques globales
Écrivez des fonctions pour calculer les statistiques suivantes :
```python
def nombre_bacon_moyen(graphe, bacon="Kevin Bacon"):
"""Calcule le nombre de Bacon moyen de tous les acteurs."""
# À compléter...
pass
def acteur_le_plus_eloigne(graphe, bacon="Kevin Bacon"):
"""Trouve l'acteur avec le plus grand nombre de Bacon."""
# À compléter...
pass
def acteurs_non_connectes(graphe, bacon="Kevin Bacon"):
"""Liste les acteurs qui ne sont pas connectés à Kevin Bacon."""
# À compléter...
pass
```
### Exercice 5 : Visualisation
Utilisez la bibliothèque `networkx` pour visualiser le graphe :
```python
import networkx as nx
import matplotlib.pyplot as plt
def visualiser_graphe(graphe, acteur_central="Kevin Bacon"):
"""
Affiche le graphe avec des couleurs selon la distance à l'acteur central.
"""
G = nx.Graph(graphe)
# Calculer les distances
distances = nx.single_source_shortest_path_length(G, acteur_central)
# Couleurs selon la distance
couleurs = [distances.get(node, -1) for node in G.nodes()]
# Affichage
plt.figure(figsize=(12, 8))
pos = nx.spring_layout(G, seed=42)
nx.draw(G, pos, with_labels=True, node_color=couleurs,
cmap=plt.cm.RdYlGn_r, node_size=500, font_size=8)
plt.title(f"Graphe des acteurs (distance à {acteur_central})")
plt.show()
```
---
## Partie 5 : Extension — Votre propre réseau
### Exercice 6 : Réseau social de la classe
Créez un graphe représentant les relations d'amitié dans votre classe (ou un réseau fictif) et calculez :
1. Qui est le "Kevin Bacon" de la classe (la personne la plus centrale) ?
2. Quel est le diamètre du graphe (la plus grande distance entre deux personnes) ?
3. Y a-t-il des personnes isolées ?
```python
def centralite(graphe):
"""
Trouve la personne la plus centrale du graphe
(celle qui minimise la somme des distances aux autres).
"""
# À compléter...
pass
def diametre(graphe):
"""
Calcule le diamètre du graphe
(la plus grande distance entre deux sommets connectés).
"""
# À compléter...
pass
```
---
## Partie 6 : Réflexion
### Questions de synthèse
1. **Six degrés de séparation** : Pourquoi pensez-vous que le nombre 6 revient souvent dans les réseaux sociaux réels ?
2. **Croissance des connexions** : Si chaque personne connaît en moyenne 100 personnes, combien de personnes peut-on atteindre en 2, 3, puis 6 étapes ? (Ordre de grandeur)
3. **Limites du modèle** : Notre graphe est non pondéré. Comment pourrait-on le modifier pour tenir compte de la "force" des liens (amis proches vs simples connaissances) ?
4. **Application réelle** : Citez une application concrète de ces algorithmes dans un réseau social moderne (LinkedIn, Facebook, etc.).
### Débat : La centralité du pouvoir
Dans un réseau social, les personnes très centrales ont un "pouvoir" particulier : elles peuvent diffuser rapidement une information à tout le réseau.
- Est-ce un avantage ou un danger pour la société ?
- Comment les plateformes comme TikTok ou Instagram utilisent-elles cette notion de centralité ?
---
## Bonus : Oracle de Bacon en ligne
Le site [The Oracle of Bacon](https://oracleofbacon.org/) permet de calculer le nombre de Bacon de n'importe quel acteur dans une base de données de millions de films.
Testez avec vos acteurs préférés !
**Question bonus** : L'acteur moyen a un nombre de Bacon d'environ 2.9. Qu'est-ce que cela nous dit sur la structure du réseau des acteurs d'Hollywood ?
---
## Résumé des notions
| Concept | Application dans ce TP |
|---------|------------------------|
| Graphe non orienté | Réseau d'acteurs |
| Sommet | Un acteur |
| Arête | Deux acteurs ont joué ensemble |
| BFS | Calcul du plus court chemin |
| Distance | Nombre de Bacon |
| Centralité | L'acteur le plus "connecté" |
| Diamètre | La plus grande distance dans le graphe |
---
## Annexe : Solution de l'exercice 1
<details>
<summary>Cliquez pour afficher</summary>
```python
from itertools import combinations
def construire_graphe_acteurs(films):
graphe = {}
for film, acteurs in films.items():
# Créer les sommets si nécessaire
for acteur in acteurs:
if acteur not in graphe:
graphe[acteur] = set()
# Créer les arêtes (toutes les paires d'acteurs)
for a1, a2 in combinations(acteurs, 2):
graphe[a1].add(a2)
graphe[a2].add(a1)
# Convertir les sets en listes
return {k: list(v) for k, v in graphe.items()}
```
</details>
---
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.