Chapitre 320 minIntermédiaire
Puissances de la matrice d'adjacence et chemins de longueur p
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- calculer M² et M³, et y lire le nombre de chemins de longueur p ;
- calculer une somme et un produit booléens de matrices ;
- distinguer puissance entière et puissance booléenne ;
- lister les chemins qui correspondent à un coefficient.
4 exercices corrigés1 schéma
Si M est la matrice d'adjacence d'un graphe, le coefficient ligne i, colonne j de la puissance entière Mᵖ = M × M × … × M est le nombre de chemins de longueur p qui vont du sommet i au sommet j. La puissance booléenne M^[p], calculée avec la règle 1 + 1 = 1, dit seulement s'il existe au moins un tel chemin (1) ou non (0). Ce chapitre explique pourquoi, montre comment calculer ces puissances à la main et à la machine, et comment les interpréter : c'est la question de matrices la plus fréquente des exercices de graphes de l'E3.
Rappel : le produit de deux matrices
Le produit de deux matrices carrées A et B de même taille n est la matrice C = A × B dont le coefficient ligne i, colonne j est le produit de la ligne i de A par la colonne j de B : on multiplie les coefficients deux à deux et on additionne.
cᵢⱼ = aᵢ₁ × b₁ⱼ + aᵢ₂ × b₂ⱼ + … + aᵢₙ × bₙⱼ
Par exemple, si la ligne i de A est (1 0 1) et la colonne j de B est (1 1 1) lue de haut en bas, alors cᵢⱼ = 1 × 1 + 0 × 1 + 1 × 1 = 2. Le produit de matrices n'est pas commutatif en général, mais les puissances d'une même matrice ne posent pas ce problème : M² = M × M, M³ = M² × M = M × M², etc. Le calcul matriciel complet est dans le cours de matrices.
Pourquoi M² compte les chemins de longueur 2
Prenons la matrice M du graphe G du ticket (sommets dans l'ordre A, B, C, D, E) :
| M | A | B | C | D | E |
|---|---|---|---|---|---|
| A | 0 | 1 | 0 | 0 | 1 |
| B | 1 | 0 | 1 | 0 | 0 |
| C | 0 | 0 | 1 | 1 | 0 |
| D | 0 | 0 | 1 | 0 | 1 |
| E | 0 | 0 | 0 | 0 | 0 |
Calculons le coefficient de M² à la ligne C, colonne C : la ligne C de M, (0 0 1 1 0), multipliée par la colonne C de M, (0 1 1 1 0).
(M²)_CC = 0 × 0 + 0 × 1 + 1 × 1 + 1 × 1 + 0 × 0 = 2.
Chaque terme correspond à un sommet intermédiaire k : le terme mₖ = m_Ck × m_kC vaut 1 exactement quand il y a un arc de C vers k et un arc de k vers C, c'est-à-dire quand (C, k, C) est un chemin de longueur 2. Ici, deux termes valent 1 : k = C (le chemin (C, C, C), deux fois la boucle) et k = D (le chemin (C, D, C)). La somme compte ces chemins.
En faisant ce calcul pour toutes les cases, on obtient M² :
| M² | A | B | C | D | E |
|---|---|---|---|---|---|
| A | 1 | 0 | 1 | 0 | 0 |
| B | 0 | 1 | 1 | 1 | 1 |
| C | 0 | 0 | 2 | 1 | 1 |
| D | 0 | 0 | 1 | 1 | 0 |
| E | 0 | 0 | 0 | 0 | 0 |
Lecture de quelques coefficients :
- (M²)_AA = 1 : un seul chemin de longueur 2 de A vers A, (A, B, A) ;
- (M²)_BE = 1 : un seul chemin de longueur 2 de B vers E, (B, A, E) ;
- (M²)_AE = 0 : aucun chemin de longueur 2 de A vers E (A → B → ? ne mène pas en E, et E n'a pas de successeur) ;
- la ligne E reste nulle : aucun chemin ne part de E.
Le théorème : Mᵖ compte les chemins de longueur p
Le raisonnement se prolonge : un chemin de longueur 3 de i vers j, c'est un chemin de longueur 2 de i vers un sommet k, suivi d'un arc de k vers j. Le coefficient (M³)ᵢⱼ = (M² × M)ᵢⱼ additionne, pour chaque k, le nombre de chemins de longueur 2 de i vers k multiplié par 1 ou 0 selon que l'arc (k, j) existe : il compte donc les chemins de longueur 3.
Pour le graphe G, M³ = M² × M donne :
| M³ | A | B | C | D | E |
|---|---|---|---|---|---|
| A | 0 | 1 | 1 | 1 | 1 |
| B | 1 | 0 | 3 | 1 | 1 |
| C | 0 | 0 | 3 | 2 | 1 |
| D | 0 | 0 | 2 | 1 | 1 |
| E | 0 | 0 | 0 | 0 | 0 |
Vérifions un coefficient à la main. (M³)_BC est le produit de la ligne B de M², (0 1 1 1 1), par la colonne C de M, (0 1 1 1 0) : 0 + 1 + 1 + 1 + 0 = 3. Il y a donc 3 chemins de longueur 3 de B vers C. Les voici : (B, A, B, C), (B, C, C, C) et (B, C, D, C).
Et (M³)_CC = 3 : trois circuits de longueur 3 passent par C, à savoir (C, C, C, C), (C, C, D, C) et (C, D, C, C).
Le calcul booléen
Souvent, on ne veut pas savoir combien de chemins existent, mais seulement s'il en existe. On calcule alors avec l'algèbre de Boole, où les seules valeurs sont 0 et 1 et où l'on utilise deux opérations :
| a | b | a ⊕ b (somme booléenne, « ou ») | a ⊗ b (produit booléen, « et ») |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 |
La seule différence avec le calcul ordinaire est 1 ⊕ 1 = 1 : « vrai ou vrai » reste vrai. Les manuels écrivent aussi + et ×, ou ∨ et ∧, en précisant qu'on calcule en booléen. C'est le calcul de la logique booléenne, appliqué aux matrices.
Somme booléenne de deux matrices. On fait la somme booléenne case par case : la case vaut 1 si l'une au moins des deux matrices a un 1 à cet endroit.
Produit booléen de deux matrices. On fait le produit ligne × colonne, mais avec ⊗ et ⊕ : la case (i, j) vaut 1 dès qu'au moins un terme aᵢₖ ⊗ bₖⱼ vaut 1.
Les puissances booléennes M^[p]
La puissance booléenne M^[p] est le produit booléen de p matrices égales à M. Son coefficient ligne i, colonne j vaut :
- 1 s'il existe au moins un chemin de longueur p de i vers j ;
- 0 s'il n'en existe aucun.
Pour le graphe G, M^[2] et M^[3] s'obtiennent en remplaçant par 1 les coefficients non nuls de M² et M³ :
| M^[2] | A | B | C | D | E |
|---|---|---|---|---|---|
| A | 1 | 0 | 1 | 0 | 0 |
| B | 0 | 1 | 1 | 1 | 1 |
| C | 0 | 0 | 1 | 1 | 1 |
| D | 0 | 0 | 1 | 1 | 0 |
| E | 0 | 0 | 0 | 0 | 0 |
| M^[3] | A | B | C | D | E |
|---|---|---|---|---|---|
| A | 0 | 1 | 1 | 1 | 1 |
| B | 1 | 0 | 1 | 1 | 1 |
| C | 0 | 0 | 1 | 1 | 1 |
| D | 0 | 0 | 1 | 1 | 1 |
| E | 0 | 0 | 0 | 0 | 0 |
La puissance booléenne perd une information (le nombre de chemins), mais elle se calcule plus vite et reste lisible même quand les nombres de chemins deviennent grands.
Lister les chemins de longueur p
La matrice dit combien de chemins existent, pas lesquels. Pour les écrire, on part du sommet de départ et on construit l'arbre des chemins : à chaque étape, on remplace chaque chemin par ses prolongements possibles, avec le tableau des successeurs.
Exemple : les chemins de longueur 3 qui partent de C (successeurs : A → B, E ; B → A, C ; C → C, D ; D → C, E ; E → aucun).
- Longueur 1 : (C, C), (C, D).
- Longueur 2 : (C, C, C), (C, C, D), (C, D, C), (C, D, E).
- Longueur 3 : (C, C, C, C), (C, C, C, D), (C, C, D, C), (C, C, D, E), (C, D, C, C), (C, D, C, D). Le chemin (C, D, E) ne se prolonge pas : E n'a pas de successeur.
On trouve 6 chemins de longueur 3 partant de C : 3 arrivent en C, 2 en D, 1 en E. C'est exactement la ligne C de M³, (0 0 3 2 1). Faire ce recoupement est la meilleure vérification de ton calcul matriciel.
C'est aussi l'algorithme que demande le programme pour « obtenir les chemins de longueur p » : on calcule les puissances successives M, M², …, Mᵖ (ou on prolonge les chemins un arc à la fois), en réutilisant à chaque étape le résultat de l'étape précédente.
Vérifier avec la calculatrice ou Python
Les calculatrices autorisées à l'examen (en mode examen) ont un éditeur de matrices : on saisit M une fois, puis on calcule M² ou M³ avec la touche de puissance, comme pour un nombre. Le résultat est la puissance entière ; pour la puissance booléenne, remplace toi-même chaque coefficient non nul par 1.
En Python, sans bibliothèque :
def produit(A, B):
"""Produit ordinaire de deux matrices carrées."""
n = len(A)
return [[sum(A[i][k] * B[k][j] for k in range(n)) for j in range(n)]
for i in range(n)]
def produit_booleen(A, B):
"""Produit booléen : 1 dès qu'un terme A[i][k] et B[k][j] vaut 1."""
n = len(A)
return [[1 if any(A[i][k] == 1 and B[k][j] == 1 for k in range(n)) else 0
for j in range(n)] for i in range(n)]
def puissance(M, p, produit=produit):
"""M à la puissance p (p >= 1), ordinaire ou booléenne."""
R = M
for _ in range(p - 1):
R = produit(R, M)
return R
M = [[0, 1, 0, 0, 1],
[1, 0, 1, 0, 0],
[0, 0, 1, 1, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 0, 0]]
print(puissance(M, 3)[1]) # [1, 0, 3, 1, 1] : ligne B de M³
print(puissance(M, 3, produit_booleen)[1]) # [1, 0, 1, 1, 1] : ligne B de M^[3]
Avec la bibliothèque NumPy, numpy.linalg.matrix_power(M, 3) calcule directement M³.
Ce que cela donne en informatique
- Réseaux sociaux : si M est la matrice « suit », (M²)ᵢⱼ compte les comptes que i suit et qui suivent j. C'est le principe des suggestions « suivi par des personnes que vous suivez ».
- Relais de messages : dans un réseau de relais, (Mᵖ)ᵢⱼ est le nombre d'acheminements possibles d'un message de i vers j en exactement p sauts.
- Analyse de liens web : les algorithmes de classement des pages s'appuient sur des produits répétés d'une matrice dérivée de la matrice d'adjacence du web.
- Bases de données : une jointure d'une table de relations avec elle-même calcule les liens de longueur 2, comme un produit de matrices.
Exercices
Exercice 1 sur 4 Puissances d'une matrice Réussi À revoir
On reprend le graphe H du chapitre 1, de matrice (sommets A, B, C, D) :
| A | B | C | D | |
|---|---|---|---|---|
| A | 0 | 1 | 1 | 0 |
| B | 0 | 0 | 0 | 1 |
| C | 0 | 1 | 0 | 1 |
| D | 1 | 0 | 0 | 0 |
- Calcule M².
- Combien y a-t-il de chemins de longueur 2 de A vers D ? Écris-les.
- Calcule M³. Combien de circuits de longueur 3 passent par A ? Écris-les.
Voir la réponseMasquer la réponse de l'exercice 1
- Par exemple, (M²)_AD est le produit de la ligne A, (0 1 1 0), par la colonne D lue de haut en bas, (0 1 1 0) : 0 × 0 + 1 × 1 + 1 × 1 + 0 × 0 = 2. En faisant de même pour chaque case :
| M² | A | B | C | D |
|---|---|---|---|---|
| A | 0 | 1 | 0 | 2 |
| B | 1 | 0 | 0 | 0 |
| C | 1 | 0 | 0 | 1 |
| D | 0 | 1 | 1 | 0 |
- (M²)_AD = 2 : deux chemins, (A, B, D) et (A, C, D).
- M³ = M² × M :
| M³ | A | B | C | D |
|---|---|---|---|---|
| A | 2 | 0 | 0 | 1 |
| B | 0 | 1 | 1 | 0 |
| C | 1 | 1 | 1 | 0 |
| D | 0 | 1 | 0 | 2 |
(M³)_AA = 2 : deux circuits de longueur 3 passent par A, (A, B, D, A) et (A, C, D, A).
Tu avais trouvé ?
Exercice 2 sur 4 Un seul coefficient Réussi À revoir
Sans calculer toute la matrice M⁴ du graphe H, détermine le nombre de chemins de longueur 4 de A vers A, et écris ce ou ces chemins.
Voir la réponseMasquer la réponse de l'exercice 2
(M⁴)_AA = (M³ × M)_AA = ligne A de M³, (2 0 0 1), multipliée par la colonne A de M, (0 0 0 1) : 2 × 0 + 0 × 0 + 0 × 0 + 1 × 1 = 1. Un seul chemin de longueur 4 de A vers A : le seul prédécesseur de A est D, et le seul chemin de longueur 3 de A vers D est (A, C, B, D), d'où (A, C, B, D, A). C'est un circuit hamiltonien de H.
Tu avais trouvé ?
Exercice 3 sur 4 Puissances booléennes Réussi À revoir
- Déduis de l'exercice précédent les matrices M^[2] et M^[3] du graphe H.
- Existe-t-il un chemin de longueur 2 de B vers C ? De longueur 3 ?
- Quels couples (i, j) ne sont reliés ni par un chemin de longueur 1, ni de longueur 2, ni de longueur 3 ?
Voir la réponseMasquer la réponse de l'exercice 3
- On remplace les coefficients non nuls par 1 :
| M^[2] | A | B | C | D |
|---|---|---|---|---|
| A | 0 | 1 | 0 | 1 |
| B | 1 | 0 | 0 | 0 |
| C | 1 | 0 | 0 | 1 |
| D | 0 | 1 | 1 | 0 |
| M^[3] | A | B | C | D |
|---|---|---|---|---|
| A | 1 | 0 | 0 | 1 |
| B | 0 | 1 | 1 | 0 |
| C | 1 | 1 | 1 | 0 |
| D | 0 | 1 | 0 | 1 |
- (M^[2])_BC = 0 : pas de chemin de longueur 2 de B vers C. (M^[3])_BC = 1 : il existe un chemin de longueur 3, c'est (B, D, A, C).
- On calcule la somme booléenne M ⊕ M^[2] ⊕ M^[3] et on cherche ses 0. Chaque case vaut 1 dans au moins une des trois matrices (par exemple (B, B) dans M^[3], (B, C) dans M^[3], (A, A) dans M^[3]) : la somme ne contient que des 1, donc aucun couple. Tout sommet de H atteint tout sommet, y compris lui-même, en au plus 3 arcs.
Tu avais trouvé ?
Exercice 4 sur 4 Interpréter dans un contexte Réussi À revoir
Quatre serveurs de messagerie P, Q, R, S se relaient les courriels. L'arc (x, y) signifie que x peut transmettre directement à y. La matrice M du réseau (ordre P, Q, R, S) et sa puissance troisième sont :
| M | P | Q | R | S |
|---|---|---|---|---|
| P | 0 | 1 | 1 | 0 |
| Q | 0 | 0 | 1 | 1 |
| R | 0 | 0 | 0 | 1 |
| S | 1 | 0 | 0 | 0 |
| M³ | P | Q | R | S |
|---|---|---|---|---|
| P | 2 | 0 | 0 | 1 |
| Q | 1 | 1 | 1 | 0 |
| R | 0 | 1 | 1 | 0 |
| S | 0 | 0 | 1 | 2 |
- Que signifie le coefficient 2 situé ligne P, colonne P de M³ ? Donne les acheminements correspondants.
- Un courriel peut-il aller de R à P en exactement 3 transmissions ? En exactement 2 ?
- Vérifie le coefficient ligne S, colonne R de M³ par un calcul.
Voir la réponseMasquer la réponse de l'exercice 4
- Il y a 2 façons, pour un courriel parti de P, d'y revenir en exactement 3 transmissions (2 circuits de longueur 3 passent par P) : (P, Q, S, P) et (P, R, S, P). Dans un vrai réseau, ce sont des boucles de routage à éviter.
- (M³)_RP = 0 : non, aucun acheminement en exactement 3 transmissions. En 2 transmissions, il faut un intermédiaire successeur de R et prédécesseur de P : R n'a qu'un successeur, S, et (S, P) est un arc. Oui, par (R, S, P).
- (M³)_SR est le produit de la ligne S de M² par la colonne R de M. Ligne S de M² : S n'a qu'un successeur, P, donc la ligne S de M² est la ligne P de M, (0 1 1 0). Colonne R de M : (1 1 0 0). Produit : 0 × 1 + 1 × 1 + 1 × 0 + 0 × 0 = 1. Le chemin est (S, P, Q, R).
Tu avais trouvé ?