Adloun

Corrigé X-ENS 2025 Informatique C MPI — Partie III (Q32 à Q33) : Couplages parfaits, méthode probabiliste

Sujet officiel du concours X-ENS, session 2025, épreuve Informatique C MPI. Corrigé rédigé par Ibrahim Alame.

Sujet officiel (PDF, site du concours)

Énoncé

Partie à composer en C, en réutilisant la partie II (read_sqmatrix, write_sqmatrix, determinant, en ). Un couplage parfait couvre tous les sommets. Un graphe non orienté de sommets est donné par sa matrice d'adjacence linéarisée ( si est une arête, sinon). Sa matrice de Tutte a pour coefficients si et est une arête, si et est une arête, sinon (en particulier sur la diagonale), les () étant des variables.

Théorème de Tutte : a un couplage parfait si et seulement si n'est pas le polynôme nul. Lemme de Schwartz--Zippel : si est un polynôme réel non nul de degré total , et si ses variables sont tirées uniformément et indépendamment dans un ensemble fini non vide , alors s'annule avec une probabilité au plus .

Fournis : int rand_range(int n), entier uniforme de en ; la déclaration int t[m]; en ; log2 de <math.h>.

Q32. Écrire int tirage_tutte(int n, int *A) : déterminant de où chaque est tiré au hasard dans , en .
Q33. Écrire bool parfait(int n, int *A, int p), qui décide si a un couplage parfait avec une probabilité d'erreur inférieure à (à justifier), en (à justifier).

Corrigé

Q32. On construit l'instanciation dans un tableau local de entiers (déclaration permise par le sujet), en tirant une seule valeur par arête , , recopiée avec le signe opposé en ; la matrice d'adjacence A n'est pas modifiée.


int tirage_tutte(int n, int *A) {
  int T[n * n];
  for (int i = 0; i < n; i++) {
    write_sqmatrix(n, T, i, i, 0);
    for (int j = i + 1; j < n; j++) {
      int x = 0;                       /* coefficient nul hors des arêtes */
      if (read_sqmatrix(n, A, i, j) != 0) {
        x = rand_range(n * n);         /* valeur de X_{i,j} */
      }
      write_sqmatrix(n, T, i, j, x);
      write_sqmatrix(n, T, j, i, -x);
    }
  }
  return determinant(n, T);
}

Chaque case de T est écrite exactement une fois : sur la diagonale, en et en pour une arête, sinon ; c'est bien évaluée en des uniformes et indépendants dans (rand_range(n * n)). Complexité : pour la déclaration et le remplissage, pour determinant (Q31) : . Ce que le correcteur attend : un seul tirage par paire (la matrice est antisymétrique), et A laissée intacte.

100 % gratuit

La suite du corrigé est sur Adloun

Le corrigé rédigé en entier, question par question, et le tuteur pour poser des questions sur ce sujet.

Voir le corrigé complet, gratuitement

Inscription gratuite en 30 secondes (e-mail, nom d'utilisateur, mot de passe, classe ou profil), sans carte bancaire : arrivée directe sur le corrigé.

Toutes les parties de l'épreuve

Corrigé complet gratuit →