Bonjour,
Dans notre leçon précédente, nous avons établi les fondations de la théorie de la complexité en définissant les classes P, NP, et la notion de NP-complétude. Nous avons vu que les problèmes NP-complets sont les problèmes les plus difficiles de la classe NP, et que le théorème de Cook-Levin nous a fourni un point de départ en prouvant que SAT est NP-complet.
Aujourd'hui, nous allons nous approprier l'outil le plus puissant pour naviguer dans ce paysage de la complexité : la réduction polynomiale. L'objectif est de maîtriser son fonctionnement pratique pour prouver la NP-complétude d'autres problèmes. Nous allons décortiquer l'un des exemples les plus classiques et fondamentaux : la réduction de SAT au problème 3-SAT. Cette technique est non seulement essentielle pour le concours, mais elle illustre une méthode de pensée algorithmique d'une grande élégance.
1. La Réduction Polynomiale : Formalisme
Nous avons effleuré ce concept la dernière fois. Une réduction polynomiale d'un problème A à un problème B est un algorithme qui transforme, en temps polynomial, toute instance de A en une instance de B, tout en préservant la réponse : est une instance "oui" de A si et seulement si est une instance "oui" de B.

Cette relation, notée , signifie que B est au moins aussi difficile que A. Si l'on disposait d'un algorithme efficace pour B (un "porc sifflant", pour reprendre une analogie classique), on en déduirait un algorithme efficace pour A (un "cheval volant").
Pour une définition formelle et rigoureuse de ce concept, je vous invite à étudier le texte suivant, qui est une référence en la matière.
Ce chapitre du livre 'Introduction to Theoretical Computer Science' de Boaz Barak formalise la notion de réduction polynomiale. Il est crucial de bien en maîtriser la définition et les implications.
Lisez la section intitulée 'Polynomial-time reductions'. Concentrez-vous sur la définition formelle de F ≤p G et la preuve que si G est dans P, alors F l'est aussi. Comprenez bien la propriété de transitivité.
2. Prouver la NP-complétude par Réduction
Rappelons la stratégie en deux temps pour prouver qu'un problème B est NP-complet :
- Montrer que B est dans NP. En général, cela consiste à montrer qu'une solution candidate ("certificat") peut être vérifiée en temps polynomial.
- Montrer que B est NP-difficile. Pour cela, on choisit un problème A que l'on sait déjà NP-complet (par exemple, SAT) et on prouve que .
Par transitivité, si tout problème de NP se réduit à A, et que A se réduit à B, alors tout problème de NP se réduit à B.

3. Étude de Cas : La Réduction de SAT à 3-SAT
Armés de cette stratégie, attaquons notre objectif : prouver que 3-SAT est NP-complet.
- Le problème 3-SAT : Étant donné une formule booléenne en forme normale conjonctive (FNC) où chaque clause contient exactement trois littéraux, la formule est-elle satisfiable ?
Étape 1 : 3-SAT est dans NP
Ceci est direct. Si l'on nous donne une assignation des variables (le certificat), il suffit de parcourir la formule et de vérifier pour chaque clause si elle est évaluée à VRAI. Cette vérification est linéaire en la taille de la formule, donc polynomiale.
Étape 2 : 3-SAT est NP-difficile (via SAT 3-SAT)
C'est le cœur de la preuve. Nous devons construire un algorithme qui prend n'importe quelle formule de SAT (avec des clauses de n'importe quelle taille) et la transforme en une formule de 3-SAT, de sorte que est satisfiable si et seulement si l'est.
La difficulté est que la transformation doit être polynomiale. Une approche naïve utilisant les lois de distributivité pour convertir la formule en FNC peut entraîner une explosion exponentielle de la taille de la formule. Il faut une approche plus subtile.
La technique clé consiste à introduire des variables auxiliaires pour décomposer les clauses qui ne respectent pas la contrainte de taille.
Le document suivant, issu d'un cours de l'IRIF, détaille cette construction de manière exemplaire et correspond parfaitement au niveau d'exigence de l'Agrégation.
Cette section du cours de l'IRIF explique pas à pas la réduction de SAT à 3-SAT. Elle est fondamentale pour comprendre le mécanisme en jeu.
Lisez la section 'Réduction de SAT à 3-SAT'. Portez une attention particulière à la 'Troisième étape' qui détaille la transformation des clauses de taille différente de 3. C'est le point technique essentiel.
Synthétisons et analysons cette transformation pour une clause de de taille .
Transformation des clauses
-
Si : La clause est déjà au format 3-SAT. On la conserve telle quelle.
-
Si : La clause est . On la remplace par . Plus formellement, pour ne pas dépendre de la sémantique de la répétition, on introduit deux variables nouvelles et on la remplace par la conjonction de quatre clauses :
Cette nouvelle formule est satisfiable si et seulement si est VRAI. Une version plus simple, et suffisante, est , qui est une tautologie si on la considère seule, mais qui, dans la pratique, est souvent simplifiée à une technique de "padding" comme . La méthode la plus rigoureuse est la première, mais la plus commune dans les preuves est de répéter les littéraux.
-
Si : La clause est . On la remplace par ou, de manière plus formelle, .
-
Si : La clause est . C'est le cas le plus instructif. On la remplace par une conjonction de clauses de 3 littéraux en introduisant nouvelles variables .
La vidéo suivante illustre très bien ce processus de transformation.
Pour visualiser la transformation des clauses, cette vidéo de 'Easy Theory' est un excellent complément. Elle explique comment gérer les clauses de taille inférieure et supérieure à 3.
Regardez les segments de 09:25 à 10:59 (clauses de taille 1 et 2) et de 10:59 à 16:55 (clauses de taille > 3). Observez comment les variables auxiliaires 'chaînent' les littéraux de la clause originale.
Analyse de la transformation
Pourquoi cette transformation est-elle une réduction polynomiale valide ?
- Préservation de la satisfiabilité :
- Si est satisfiable, au moins un littéral dans chaque clause est vrai. On peut alors choisir des valeurs pour les variables qui satisfont la chaîne de clauses. Par exemple, si est vrai, on peut poser (satisfait la 1ère clause) et (la 2ème clause est satisfaite par ). On peut propager ces choix.
- Si est satisfiable, supposons par l'absurde que tous les d'une clause originale sont faux. Dans la nouvelle chaîne de clauses, pour que soit vraie, doit être VRAI. Pour que soit vraie, doit être VRAI. En propageant, on arrive à la dernière clause qui devient , une contradiction. Donc au moins un doit être vrai.
- Efficacité polynomiale : Pour chaque clause de , on crée un nombre de nouvelles clauses et de nouvelles variables qui est linéaire en la taille de la clause initiale. L'ensemble de l'algorithme s'exécute donc en temps polynomial par rapport à la taille de .
Puisque 3-SAT est dans NP et que nous avons montré SAT 3-SAT, nous pouvons conclure que 3-SAT est NP-complet.
4. L'Anatomie d'une Preuve par Réduction
La démonstration que nous venons de voir est un modèle pour de nombreuses autres preuves de NP-complétude. Il est utile de décomposer sa structure pour pouvoir la reproduire.
Pour consolider, je vous propose de lire cette section qui décompose une preuve de réduction en ses quatre composantes essentielles. Cela vous donnera une méthode systématique pour aborder de futurs problèmes.
Lisez la section 'Anatomy of a reduction'. Identifiez les quatre parties : description de l'algorithme, analyse de l'efficacité, preuve de complétude ('completeness') et preuve de robustesse ('soundness').
Toute preuve de réduction doit contenir ces quatre éléments :
- Description de l'algorithme : Description précise de la fonction de transformation qui mappe une instance de A vers une instance de B.
- Analyse de l'efficacité : Preuve que s'exécute en temps polynomial.
- Preuve de complétude (Completeness) : Démontrer que si une instance de A a une solution, alors l'instance transformée de B a aussi une solution.
- Preuve de robustesse (Soundness) : Démontrer que si l'instance transformée de B a une solution, alors l'instance originale de A avait aussi une solution.
En appliquant cela à notre exemple SAT 3-SAT :
- Algorithme : Remplacer chaque clause de taille par un ensemble équivalent de clauses de taille 3.
- Efficacité : La transformation est linéaire pour chaque clause, donc polynomiale au total.
- Complétude : Si une assignation satisfait la clause originale, nous avons montré comment assigner les variables auxiliaires pour satisfaire les nouvelles clauses.
- Robustesse : Si les nouvelles clauses sont satisfaites, nous avons montré par un argument en chaîne qu'au moins un des littéraux originaux doit être vrai.
Conclusion
Cette leçon vous a armé d'une méthode de preuve fondamentale en informatique théorique. La réduction polynomiale n'est pas seulement un artifice technique ; c'est une manière de raisonner sur la structure intrinsèque des problèmes.
Points clés à retenir :
- Une réduction polynomiale est un algorithme polynomial qui traduit les instances de A en instances de B tout en préservant la réponse. Elle prouve que B est au moins aussi difficile que A.
- Pour prouver qu'un problème B est NP-complet, la méthode standard est de prouver que et de trouver un problème A déjà connu comme NP-complet tel que .
- La réduction de SAT à 3-SAT est un exemple canonique qui utilise la technique puissante de l'introduction de variables auxiliaires pour restructurer les contraintes d'un problème.
- Une preuve de réduction rigoureuse comporte systématiquement quatre parties : description, efficacité, complétude et robustesse.
Dans notre prochaine leçon, nous changerons radicalement de sujet pour aborder le dernier module de notre programme de fondations. Nous délaisserons la théorie de la complexité pour nous plonger dans un nouveau paradigme de programmation avec l'introduction à la programmation fonctionnelle en OCaml. La maîtrise de plusieurs paradigmes étant une compétence clé pour l'Agrégation, cette transition est une étape logique de votre préparation.