Concours X-ENS 2025 - Informatique Théorique
📄 Partie 1 : Énoncé Officiel du Sujet
Section titled “📄 Partie 1 : Énoncé Officiel du Sujet”Le présent sujet comporte quatre parties indépendantes portant sur l’étude formelle des automates finis, la complexité algorithmique et la programmation dynamique. L’utilisation de langages fonctionnels ou impératifs (notamment en Python) est requise pour la traduction des algorithmes proposés.
Partie I : Propriétés algébriques et minimisation d’automates probabilistes
Section titled “Partie I : Propriétés algébriques et minimisation d’automates probabilistes”On considère un alphabet fini . Un automate probabiliste est défini par un ensemble fini d’états , un état initial représenté par un vecteur stochastique ligne , une famille de matrices de transition telles que pour tout , est une matrice stochastique à droite de dimension , et un ensemble d’états acceptants représenté par un vecteur colonne indicateur .
- Établir l’expression de la probabilité qu’un mot soit accepté par en fonction de , du produit des matrices et de .
- Proposer un algorithme en complexité temporelle polynomiale en la taille de l’automate permettant de décider si pour un mot donné de longueur .
- Démontrer que le problème de l’équivalence entre deux automates probabilistes généraux est indécidable par réduction depuis le problème de la correspondance de Post (PCP).
Partie II : Complexité paramétrée de la couverture de sommets
Section titled “Partie II : Complexité paramétrée de la couverture de sommets”Soit un graphe non orienté d’ordre et de taille . Une couverture de sommets est un sous-ensemble tel que pour toute arête , on a ou .
- Formuler le problème de décision associé sous forme de langage formel .
- Rappeler la définition de la complexité paramétrée par le paramètre et expliquer pourquoi l’algorithme naïf par force brute conduit à une complexité en , inadaptée pour les grands graphes.
- Concevoir un algorithme récursif par ramification (branching) résolvant en temps . Préciser l’arbre de récurrence associé.
Partie III : Programmation dynamique et alignement de séquences optimal
Section titled “Partie III : Programmation dynamique et alignement de séquences optimal”Soit et deux chaînes de caractères sur un alphabet . On souhaite calculer la distance d’édition (ou distance de Levenshtein) entre et , autorisant l’insertion, la suppression et la substitution de caractères avec des coûts respectifs .
- Définir formellement par récurrence la fonction de coût optimal représentant la distance d’édition entre les préfixes et .
- Écrire une fonction en langage Python
distance_levenshtein(X, Y, couts)implémentant cette approche par programmation dynamique de bas en haut (bottom-up). - Analyser la complexité en temps et en espace de votre algorithme. Proposer une optimisation spatiale réduisant l’espace mémoire à .
Partie IV : Analyse amortie et structures de données avancées
Section titled “Partie IV : Analyse amortie et structures de données avancées”On s’intéresse à une structure de données abstraite de type file de priorité implémentée sous forme de monceau binomial (binomial heap).
- Définir inductivement la structure d’un arbre binomial d’ordre . Démontrer que possède exactement n\oe uds et que sa hauteur maximale est .
- Énoncer le théorème de fusion de deux monceaux binomiaux et expliciter l’invariant de structure garantissant une complexité au pire en pour l’insertion et la suppression du minimum.
- Justifier par la méthode des potentiels (comptabilisation) que la complexité amortie d’une séquence de opérations d’insertion et de fusion est en par opération.
💡 Partie 2 : Indications du Concepteur & Pièges du Barème
Section titled “💡 Partie 2 : Indications du Concepteur & Pièges du Barème”Analyse générale de l’épreuve
Section titled “Analyse générale de l’épreuve”Ce sujet couvre l’ensemble des compétences fondamentales exigées en option informatique aux concours X-ENS. Il teste à la fois la rigueur mathématique (algébre linéaire, théorie des langages, complexité paramétrée) et l’ingénierie algorithmique (programmation dynamique, structures de données).
Pièges classiques et recommandations pour le correcteur :
Section titled “Pièges classiques et recommandations pour le correcteur :”- Partie I : Veillez à ce que les candidats n’oublient pas que le produit matriciel n’est pas commutatif. La formule correcte pour un mot est .
- Partie II : Pour l’algorithme de ramification, la distinction des cas basée sur le choix d’une arête non couverte et le test des deux branches ou est obligatoire pour obtenir l’arbre d’exploration binaire de profondeur .
- Partie III : Dans l’implémentation Python, l’initialisation des conditions aux limites (lignes et colonnes de la matrice de programmation dynamique) est source fréquente d’erreurs d’indices (Off-by-one errors).
- Partie IV : L’utilisation correcte de la fonction potential (nombre d’arbres binomiaux dans la forêt) est impérative pour valider la preuve par la méthode de Tarjan.
📋 Partie 3 : Correction Rédigée Pas à Pas
Section titled “📋 Partie 3 : Correction Rédigée Pas à Pas”Correction - Partie I : Propriétés algébriques et minimisation d’automates probabilistes
Section titled “Correction - Partie I : Propriétés algébriques et minimisation d’automates probabilistes”-
Expression de la probabilité d’acceptation : () Par définition de l’automate probabiliste, la distribution de probabilité sur les états après la lecture du préfixe vide est donnée par le vecteur . À chaque transition par le symbole , la distribution est multipliée à droite par la matrice stochastique . Ainsi, après la lecture complète du mot , le vecteur de probabilité des états est . La probabilité d’acceptation est obtenue en sommant les composantes des états acceptants, ce qui se traduit matriciellement par le produit scalaire avec le vecteur indicateur :
-
Algorithme de décision pour : () Il suffit d’évaluer séquentiellement le produit vectoriel-matrice en arithmétique exacte sur les nombres rationnels (ou à précision flottante contrôlée). On pose . Pour allant de à , on calcule . Enfin, on teste si le produit scalaire est nul. Complexité : Le calcul de chaque produit vecteur-matrice de dimension par requiert opérations arithmétiques. Pour un mot de longueur , la complexité temporelle totale est en , ce qui est polynomial en la taille de l’automate.
-
Indécidabilité de l’équivalence : () La preuve s’établit par réduction du problème de la correspondance de Post (PCP). Supposons par l’absurde qu’il existe un algorithme décidant si deux automates probabilistes acceptent exactement le même langage probabiliste (même fonction de distribution de probabilité). On peut encoder les suites de dominos de PCP sous forme de produits de matrices stochastiques. L’égalité des probabilités d’acceptation pour toutes les séquences de transitions permettrait de décider si l’intersection des langages de substitutions est vide, contredisant le théorème de récurrence de Post sur l’indécidabilité du PCP.
Correction - Partie II : Complexité paramétrée de la couverture de sommets
Section titled “Correction - Partie II : Complexité paramétrée de la couverture de sommets”-
Formulation formelle : ()
-
Limites de l’approche naïve : () La complexité paramétrée étudie la difficulté d’un problème en fonction d’un paramètre spécifique (ici la taille de la couverture) et non uniquement de la taille globale de l’instance. Tester tous les sous-ensembles de taille parmi sommets conduit à un nombre de combinaisons égal à . L’algorithme complet vérifiant si l’un de ces sous-ensembles est une couverture prend un temps , ce qui est exponentiel et inefficace dès que grandit.
-
Algorithme par ramification et complexité : () On sélectionne une arête non couverte . Toute couverture valide doit nécessairement contenir soit , soit (ou les deux). On génère donc deux branches récursives :
- Branche 1 : On ajoute à la couverture, on décrémente de , et on supprime ainsi que ses arêtes incidentes du graphe.
- Branche 2 : On ajoute à la couverture, on décrémente de , et on supprime ainsi que ses arêtes incidentes du graphe.
La relation de récurrence sur le temps d’exécution vérifie , ce qui, par application du théorème maître ou déploiement de l’arbre, donne une complexité temporelle globale en .
Correction - Partie III : Programmation dynamique et alignement de séquences optimal
Section titled “Correction - Partie III : Programmation dynamique et alignement de séquences optimal”-
Relation de récurrence de Levenshtein : () Soit la distance d’édition entre et . Les conditions initiales sont et . Pour et : où si et sinon.
-
Implémentation en Python : ()
def distance_levenshtein(X, Y, couts): m, n = len(X), len(Y) delta_ins, delta_sup, delta_sub = couts
# Initialisation de la matrice de programmation dynamique dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m + 1): dp[i][0] = i * delta_sup for j in range(n + 1): dp[0][j] = j * delta_ins
for i in range(1, m + 1): for j in range(1, n + 1): cout_sub = 0 if X[i-1] == Y[j-1] else delta_sub dp[i][j] = min( dp[i-1][j] + delta_sup, dp[i][j-1] + delta_ins, dp[i-1][j-1] + cout_sub )
return dp[m][n]- Analyse de complexité et optimisation spatiale : ()
- Complexité temporelle : Double boucle imbriquée parcourant une grille de taille , soit .
- Complexité spatiale initiale : pour stocker la matrice complète.
- Optimisation spatiale : L’examen de la récurrence montre que pour calculer la ligne , seuls les éléments de la ligne et de la ligne sont nécessaires. Il est donc possible de réduire l’espace mémoire à en ne conservant en mémoire que deux vecteurs successifs.
Correction - Partie IV : Analyse amortie et structures de données avancées
Section titled “Correction - Partie IV : Analyse amortie et structures de données avancées”-
Définition et propriétés de l’arbre binomial : ()
- Définition inductive : Un arbre binomial est un arbre réduit à un seul n\oe ud. Un arbre binomial (pour ) est constitué de deux arbres binomiaux dont la racine de l’un est attachée comme enfant direct de la racine de l’autre.
- Démonstration par récurrence du nombre de n\oe uds : Pour , le nombre de n\oe uds est . Supposons que possède n\oe uds. Puisque est formé de deux copies de , son nombre total de n\oe uds est .
- Hauteur maximale : Par construction, la racine de possède enfants qui sont respectivement les racines des arbres . La hauteur de est donc exactement .
-
Fusion de monceaux binomiaux et invariant : () Un monceau binomial est une collection d’arbres binomiaux satisfaisant la propriété de tas (la clé de chaque n\oe ud est supérieure ou égale à celle de son parent) et telle qu’il existe au plus un arbre binomial de chaque ordre. L’invariant structurel correspond à la représentation binaire du nombre total de n\oe uds . La fusion de deux monceaux s’opère par addition bit à bit semblable à l’addition binaire, combinant les arbres de même ordre par comparaison de leurs clés en temps .
-
Complexité amortie par la méthode des potentiels : () On définit la fonction potentiel d’un monceau comme étant le nombre d’arbres binomiaux présents dans la structure (ce qui correspond au nombre de bits à dans la représentation binaire de la taille du monceau).
- Pour une opération d’insertion d’un élément (qui équivaut à un arbre ), le coût réel est proportionnel au nombre de reports (carries), soit amorti.
- Formellement, le coût amorti . Lors de l’insertion créant une chaîne de fusions de arbres consécutifs, le coût réel est et la variation du potentiel est . Le coût amorti est donc . Par conséquent, la complexité amortie d’une séquence de opérations est en par opération.