WikiPrépaLivrets

ENS Informatique MP PC 2008Sujet

Pas encore noté

Téléchargements

  • Corrigé : pas encore disponible
  • Rapport du jury : non disponible

Ces sujets peuvent vous intéresser

Pas encore de corrigé pour ce sujet : voici des sujets proches corrigés.

Lecture du sujet en ligne

L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.
Afficher ou masquer la section

Filière MP (groupe I)

Épreuve commune aux ENS de Paris, Lyon et CachanFilière PC (groupe I)Épreuve commune aux ENS de Paris et Lyon

INFORMATIQUE

Durée : 4 heures
L'usage de calculatrices électroniques de poche à alimentation autonome, non imprimantes et sans document d'accompagnement, est autorisé. Cependant, une seule calculatrice à la fois est admise sur la table ou le poste de travail, et aucun échange n'est autorisé entre les candidats.
Ce problème s'intéresse à la structure cyclique de certains graphes. La première partie porte sur le calcul d'un arbre couvrant et des cycles fondamentaux d'un graphe non orienté. La seconde partie étudie plusieurs algorithmes de calcul d'une base minimale de l'espace des cycles d'un graphe non orienté et pondéré. La seconde partie pourra être largement abordée même si la première n'a pas été complètement résolue.

Préliminaires

Pseudo-programmes, structures de données et algorithmes. Pour les questions demandant d'écrire un pseudo-programme, on utilisera un langage ou pseudo-langage au choix, avec les structures de données (tableaux uni- et multi-dimensionnels, listes, files, piles, etc.) et de contrôle (si, tant que, pour, etc.) usuelles. Les indices d'un tableau tab de taille t vont de 1 à t, et ses éléments seront notés tab[1], …, tab[t]. Les déclarations de variables ne sont pas imposées. Les questions demandant de donner un algorithme n'imposent pas un pseudo-programme mais une description concise et précise, en français, de l'algorithme. Dans les deux cas, la qualité de la rédaction ainsi que les justifications (correction, coût) seront des éléments d'appréciation.
Estimations de coût. Le coût d'un algorithme ou d'un pseudo-programme est le nombre d'opérations élémentaires qu'il effectue dans le cas le pire : lecture ou écriture dans une variable ou une case de tableau, opération arithmétique (notamment : comparaison, addition, soustraction, multiplication) sur des entiers ou sur des éléments d'un corps, test, ajout ou suppression en tête de liste, empilement ou dépilement dans une pile, etc. On ne cherchera pas à calculer les coûts demandés exactement. Ils seront seulement estimés en ordre de grandeur, avec des expressions du type O(m + n), O(mn^2 logn), etc., où m, n, … sont par exemple des paramètres en entrée de l'algorithme ou du pseudo-programme.
Autres conventions. On note ℕ l'ensemble des entiers naturels. Si x est un nombre réel alors ⌊x⌋ désigne le plus grand entier inférieur ou égal à x. Pour j ∈ ℕ et k ∈ ℕ∖{0}, l'entier naturel égal à j − ⌊j/k⌋k sera noté jmodk. Pour un corps K , on note K^(p × q) l'ensemble des matrices à p lignes et q colonnes, dont les éléments sont dans K . Ces matrices pourront être représentées par des tableaux bidimensionnels.

Définitions et notations

Les graphes considérés dans ce problème sont finis et non orientés. Pour n ∈ ℕ∖{0} et m ∈ ℕ, un graphe (fini, non orienté) à n sommets et m arêtes est un couple ( S, A ) où S, l'ensemble des sommets du graphe, est identifié à {1, 2, …, n}, et où A, l'ensemble de ses arêtes, est un sous-ensemble de {{s, t} : s ∈ S, t ∈ S, s ≠ t} de cardinal m. Une arête {s, t} ∈ A sera notée indistinctement ( s, t ) ou ( t, s ); on dira que s est un voisin de t dans le graphe et que t est un voisin de s dans le graphe.
On appelle chaîne de longueur λ reliant s à t dans le graphe ( S, A ) toute suite (s_0, s_1, s_2, …, s_λ) de sommets du graphe tels que s_0 = s, s_λ = t et (s_(i − 1), s_i) ∈ A pour 1 ≤ i ≤ λ. Un graphe est connexe si pour chaque paire {s, t} de sommets il existe au moins une chaîne reliant s à t dans ce graphe. On dira qu'une chaîne est élémentaire si de plus s_0, s_1, …, s_λ sont distincts deux à deux.
Une chaîne (s_0, s_1, s_2, …, s_λ) dans le graphe forme un cycle élémentaire du graphe si s_0 = s_λ, λ ≥ 3 et s_1, s_2, …, s_λ sont distincts deux à deux. Soient (s_i)_(0 ≤ i ≤ λ) et (s_i^′)_(0 ≤ i ≤ λ) deux chaînes de même longueur et formant chacune un cycle élémentaire du graphe; s'il existe j ∈ ℕ tel que, pour 1 ≤ i ≤ λ, s_i^′ = s_((i + j)modλ) alors on dira que ces deux chaînes forment le même cycle élémentaire.
Soit G = (S, A) un graphe connexe. On appelle arbre couvrant de G tout graphe ( S^′, A^′ ) connexe, sans cycle élémentaire, et tel que S^′ = S et A^′ ⊆ A. Étant donnés un arbre couvrant T = (S, A^′) de G et une arête a = (s, t) ∈ A∖A^′ (si elle existe), le
cycle fondamental de G par rapport à a, noté φ_a, est le cycle élémentaire de G obtenu en "fermant" avec l'arête a la chaîne élémentaire reliant s à t dans T. L'ensemble des cycles fondamentaux de G par rapport à T est φ(G, T) = {φ_a : a ∈ A∖A^′}.
Dans toute la suite, G désigne un graphe connexe à n sommets et m arêtes. On supposera de plus que G est donné par sa structure d'adjacence, c'est-à-dire par un tableau Adj de n listes d'entiers tel que, pour s ∈ {1, …, n}, Adj[s] est la liste (dans un ordre arbitraire) des voisins de s dans G. Les pseudo-programmes et les algorithmes demandés pourront exploiter toutes ces hypothèses sur G.

Partie 1. Arbres couvrants et cycles fondamentaux

Question 1.1.

  1. (a) Montrer que le nombre de cycles élémentaires de G est fini.
    (b) Montrer que G admet au moins un arbre couvrant.
  2. Montrer que tout arbre couvrant de G a exactement n − 1 arêtes.
  3. Écrire un pseudo-programme SansCycleElem qui, étant donné G, détermine si G ne contient aucun cycle élémentaire. Pourquoi est-il correct et quel est son coût ?

Question 1.2.

  1. Donner la structure d'adjacence d'un arbre couvrant de G = (S, A) pour S = {1, 2, 3, 4, 5} et A = {(1, 2), (1, 3), (1, 4), (2, 3), (3, 4), (3, 5), (4, 5)}.
  2. Écrire un pseudo-programme ArbreCouvrant qui, étant donné G, calcule la structure d'adjacence d'un arbre couvrant de G. Pourquoi est-il correct et quel est son coût ?

Question 1.3.

  1. Vérifier l'existence et l'unicité de la chaîne élémentaire utilisée à la fin de la partie Définitions et notations pour définir le cycle fondamental φ_a.
  2. Étant donné T un arbre couvrant de G, on note L_T la somme des longueurs des éléments de φ(G, T).
    (a) Majorer L_T en fonction de n.
    (b) On suppose ici que m = 1/2n(n − 1). En calculant la valeur de L_T pour deux arbres couvrants de G, montrer que l'ordre de grandeur de L_T dépend de T.
  3. (a) Écrire un pseudo-programme Phi qui, étant donné G, calcule un ensemble de cycles fondamentaux de G (c'est-à-dire φ(G, T) pour T un arbre couvrant quelconque de G ). Pourquoi est-il correct ?
    (b) Exprimer, en le justifiant, le coût de Phi en fonction de m et de la somme des longueurs des cycles fondamentaux calculés.

Partie 2. Bases minimales de l'espace des cycles

Dans cette partie, on suppose que G possède au moins un cycle élémentaire et qu'il est de plus pondéré. Un graphe est pondéré si à chaque arête a est associé un réel positif ou nul, noté w(a) et appelé poids de l'arête a. Dans un graphe pondéré, le poids w(σ) d'une chaîne σ = (s_i)_(0 ≤ i ≤ λ) est nul si λ = 0, et égal à ∑_(i = 1)^λ w((s_(i − 1), s_i)) si λ ≥ 1. De plus, pour deux sommets s et t d'un graphe pondéré, on définit δ(s, t) de la façon suivante : s'il n'existe pas de chaîne reliant s à t dans le graphe alors δ(s, t) = + ∞; sinon,
δ(s, t) = min{w(σ) : σ est une chaîne reliant s à t dans le graphe }.
On note K le corps fini à deux éléments, 0 et 1 . On suppose connu T = (S, A^′) un arbre couvrant de G = (S, A), et on numérote les arêtes de G de sorte que A = {a_1, a_2, …, a_m} et A∖A^′ = {a_1, a_2, …, a_N} avec N = m − n + 1. On appelle support tout sous-ensemble non vide de A∖A^′. Soit E l'ensemble de tous les sous-ensembles de A; en particulier, E contient A et l'ensemble vide, noté }. On appelle vecteur d'incidence d'un élément e de E l'unique vecteur v = (v_i)_(1 ≤ i ≤ m) de K^m tel que, pour 1 ≤ i ≤ m, v_i = 1 si a_i ∈ e et v_i = 0 sinon. On identifiera E au K -espace vectoriel K^m en identifiant chaque élément de E à son vecteur d'incidence. Pour e ∈ E et f ∈ E, on notera ⟨e, f⟩ leur produit scalaire dans la base canonique {{a_1}, {a_2}, …, {a_m}} : si e = ∑_(i = 1)^m e_i{a_i} et f = ∑_(i = 1)^m f_i{a_i} avec e_i ∈ K et f_i ∈ K pour 1 ≤ i ≤ m, alors ⟨e, f⟩ = ∑_(i = 1)^m e_i f_i ∈ K.
Si C = (s_i)_(0 ≤ i ≤ λ) est un cycle élémentaire de G, on le considère dans cette partie représenté par ses arêtes et on écrira C = {(s_(i − 1), s_i)}_(1 ≤ i ≤ λ) ∈ E. On appelle cycle de G un cycle élémentaire de G ou une union de cycles élémentaires de G disjoints deux à deux. L'espace des cycles de G, noté C(G), est le K -sous-espace vectoriel de E engendré par l'ensemble des cycles de G. Le poids d'un cycle C de G est w(C) = ∑_(a ∈ C)w(a), la somme des poids des arêtes qui composent ce cycle; le poids d'une base B de C(G) est w(B) = ∑_(C ∈ B)w(C), la somme des poids des cycles qui composent cette base. Une base minimale de l'espace des cycles de G est une base de C(G) de poids minimal parmi toutes les bases de C(G).

Question 2.1.

  1. Soient e ∈ E et f ∈ E.
    (a) Soit α ∈ K. Quel sous-ensemble de A chacune des trois expressions αe, − e, e + f représente-t-elle?
    (b) Caractériser en termes d'arêtes communes le fait que ⟨e, f⟩ = 1.
  2. Soit S un support. Montrer qu'il existe C ∈ C(G) tel que ⟨C, S⟩ = 1.
  3. Montrer que φ(G, T) est une base de C(G).
On appelle BaseMinimale1 l'algorithme décrit ci-dessous en encadré :
pour i de 1 à N faire
    Si \leftarrow un support tel que }\langle\mp@subsup{C}{k}{},\mp@subsup{S}{i}{}\rangle=0,1\leqk\leqi-
    Ci \leftarrow un cycle de G de poids minimal tel que }\langle\mp@subsup{C}{i}{},\mp@subsup{S}{i}{}\rangle=
fin pour
Dans toute la suite et à l'exception de la question 2.5, S_i et C_i sont spécifiés comme à l'itération i de BaseMinimale1.

Question 2.2.

Dans cette question, on suppose que S_1, …, S_N et C_1, …, C_N ont pu être trouvés par BaseMinimale1 et on étudie certaines propriétés des C_i.
  1. Pour 2 ≤ i ≤ N, montrer que C_i est linéairement indépendant de C_1, …, C_(i − 1).
  2. Montrer que {C_1, …, C_N} est une base minimale de C(G).

Question 2.3.

On s'intéresse dans cette question au coût du calcul de S_1, …, S_N indépendamment de C_1, …, C_N. (On ignorera donc le coût du calcul de C_1, …, C_N dans toute cette question.)
  1. (a) Soit i ∈ {2, …, N} fixé. Écrire un pseudo-programme Support qui, étant donnés les vecteurs d'incidence des cycles C_1, …, C_(i − 1) de G, calcule le vecteur d'incidence d'un support S_i tel que ⟨C_k, S_i⟩ = 0 pour 1 ≤ k ≤ i − 1.
    (b) Donner en le justifiant le coût de Support. Quel coût total (en fonction de m) obtient-on alors pour {S_i}_(1 ≤ i ≤ N) avec cette méthode?
  2. (a) Montrer comment calculer {S_i}_(1 ≤ i ≤ N) en introduisant pour 1 ≤ i ≤ N des ensembles de supports {R_j^((i))}_(i ≤ j ≤ N) qui vérifient les deux conditions suivantes :
  • pour 1 ≤ i ≤ N, R_i^((i)), …, R_N^((i)) sont linéairement indépendants;
  • ⟨C_k, R_j^((i))⟩ = 0 pour 1 ≤ k < i ≤ j ≤ N et 2 ≤ i ≤ N.
    (b) Réécrire l'algorithme BaseMinimale1 de façon à ce que l'itération i calcule S_i, C_i et, si i < N, R_(i + 1)^((i + 1)), …, R_N^((i + 1)). Quel nouveau coût total (en fonction de m ) obtient-on pour {S_i}_(1 ≤ i ≤ N) ?

Question 2.4.

Soit i ∈ {1, …, N} fixé. Dans cette question, on associe à G = (S, A) et à S_i le graphe signé G_i défini de la façon suivante. Le graphe G_i a 2n sommets distincts, obtenus en dupliquant les n sommets de G : pour s ∈ S, on notera s^+et s^−les deux sommets de G_i correspondants; de plus, pour toute arête (s, t) de G :
  • si (s, t) ∉ S_i alors G_i possède les deux arêtes (s^+, t^+)et (s^−, t^−), chacune de poids w((s, t));
  • si (s, t) ∈ S_i alors G_i possède les deux arêtes (s^+, t^−)et (s^−, t^+), chacune de poids w((s, t)).
  1. Soit G = (S, A) où S = {1, 2, 3, 4, 5} et A = {(2, 3), (4, 5), (1, 2), (1, 3), (1, 4), (1, 5)}. On suppose de plus que w(a) = 0 pour tout a ∈ A. Dessiner les sommets et les arêtes de G et G_i pour S_i = {(2, 3), (4, 5)}.
  2. Pour s ∈ S donné, soit σ = (s_j)_(0 ≤ j ≤ λ) une chaîne reliant s_0 = s^+à s_λ = s^−dans G_i.
    (a) Montrer qu'à σ correspond un cycle de G, qu'on notera C, tel que w(C) ≤ w(σ) et ⟨C, S_i⟩ = 1.
    (b) On suppose que σ est représenté de façon partielle par un tableau chaine d'entiers tel que, pour 1 ≤ j ≤ λ, chaine [j] = k si s_(j − 1) = s^α, s_j = t^β, (s, t) = a_k et α, β ∈ { +, − }. Écrire un pseudo-programme qui calcule le vecteur d'incidence de C à partir de chaine. Quel est son coût ?
    (c) Montrer que si w(σ) = min{δ(t^+, t^−) : t ∈ S} alors w(C) = min{w(D) : D ∈ C(G) et ⟨D, S_i⟩ = 1}.
  3. On suppose disposer d'un algorithme PlusCourteChaine de coût O(m + nlogn) qui, à partir de G, de S_i et d'un sommet s de G, calcule le couple (distance, chaine) où distance = δ(s^+, s^−)et où chaine est la représentation partielle (définie à la question 2.4.2.(b)) d'une chaîne σ reliant s^+à s^−dans G_i et telle que w(σ) = δ(s^+, s^−).
    (a) Écrire un pseudo-programme calculant le vecteur d'incidence de C_i à partir de G et S_i. Quel est son coût ?
    (b) Conclure en exprimant le coût de l'algorithme BaseMinimale1 en fonction de m et n.

Question 2.5.

Dans cette question, ω désigne un nombre réel tel que 2 ≤ ω < 2.39, et on suppose disposer d'un algorithme MulMat de coût O(p^ω) pour multiplier deux matrices de K^(p × p).
  1. (a) Soient P ∈ K^(p × q) et Q ∈ K^(q × p) avec 1 ≤ p ≤ q. Donner un algorithme qui calcule le produit PQ et exprimer son coût en fonction de p, q et ω.
    (b) Soit P ∈ K^(p × p) triangulaire et inversible. Soit Q ∈ K^(p × p). Donner un algorithme qui calcule la matrice X ∈ K^(p × p) telle que PX = Q, et exprimer son coût en fonction de p et ω.
  2. Soient p et q dans ℕ tels que p + 2q ≤ N. Soient C_1, …, C_(p + q) des cycles de G, soient U_1, …, U_q, V_1, …, V_q des supports, et soit M ∈ K^(m × 2q) la matrice dont la colonne j est égale au vecteur d'incidence de U_j si 1 ≤ j ≤ q et à celui de V_(j − q) si q < j ≤ 2q. Pour 1 ≤ ℓ ≤ q, on suppose que les trois propriétés suivantes sont vérifiées :
  • ⟨C_k, U_ℓ⟩ = 0 pour 1 ≤ k ≤ p + ℓ − 1;
  • ⟨C_(p + ℓ), U_ℓ⟩ = 1;
  • ⟨C_k, V_ℓ⟩ = 0 pour 1 ≤ k ≤ p.
On suppose de plus que U_1, …, U_q et V_1, …, V_q sont tels que la matrice M a la structure suivante : pour 1 ≤ i ≤ m et 1 ≤ j ≤ 2q, l'élément situé sur la ligne i et la colonne j de M est nul si i > p + j et égal à 1 si i = p + j.
(a) Montrer, en introduisant un système linéaire de la forme PX = Q avec P et Q deux matrices de K^(q × q) dont on explicitera les éléments, que l'on peut transformer {V_ℓ}_(1 ≤ ℓ ≤ q) en un autre ensemble de supports, noté {W_ℓ}_(1 ≤ ℓ ≤ q) et tel que ⟨C_k, W_ℓ⟩ = 0 pour 1 ≤ k ≤ p + q et 1 ≤ ℓ ≤ q.
(b) Proposer un algorithme MiseAJour qui calcule les vecteurs d'incidence de W_1, …, W_q à partir de ceux de C_1, …, C_(p + q), U_1, …, U_q, V_1, …, V_q. Exprimer son coût en fonction de m, q et ω.
3. On suppose que N = 2^ν avec ν ∈ ℕ et on fait la même hypothèse qu'à la question 2.4.3.
(a) Proposer un algorithme BaseMinimale2 qui calcule les vecteurs d'incidence d'une base minimale {C_1, …, C_N} de C(G) à l'aide de MiseAJour.
(b) Montrer que le coût de BaseMinimale2 est O(m^2 n + mn^2 logn). Pourquoi cet algorithme est-il correct ?

Pas de description pour le moment