LYCÉE → PRÉPA · L23

Module L23 · Partie J · Vers la recherche

Ce que les ordinateurs ne peuvent pas faire.

Avant le premier ordinateur, Turing, Church et Gödel avaient déjà tracé les limites du calcul : des problèmes qu’aucun programme ne résoudra jamais, et d’autres qu’on ne sait résoudre qu’en temps astronomique. Ce module construit ces objets — automates, machines de Turing, réductions — et arrive aux questions ouvertes les plus célèbres (P = NP ?) qui structurent la recherche en informatique et en cryptographie.

Durée : 3 séances · Prérequis : L04, L05, L09, L17. Objectifs : automates finis et expressions régulières (et leurs limites), grammaires et automates à pile, machine de Turing (implémentée), thèse de Church-Turing, indécidabilité (problème de l’arrêt, théorème de Rice), classes P, NP, NP-complet, réductions (SAT → 3-SAT → clique → …), coNP et hiérarchie, calcul quantique (idées), et pourquoi tout cela compte pour un ingénieur.

Ce que vous saurez faire à la fin
  • Construire un automate pour un langage régulier et prouver qu’un langage ne l’est pas (lemme de l’étoile).
  • Simuler une machine de Turing et expliquer pourquoi elle capture « tout ce qui est calculable ».
  • Rédiger la preuve d’indécidabilité de l’arrêt et une réduction polynomiale.
  • Situer un problème (facile, NP-complet, indécidable) et adapter sa stratégie (exact, approché, heuristique).

Références : Introduction to the Theory of Computation (Sipser), programme MPI (« automates », « décidabilité et complexité »), Computational Complexity (Arora & Barak, gratuit), cours de Scott Aaronson « Quantum Computing Since Democritus ».

Fiche de cours · Définitions

Informatique théorique : définitions

Définition (alphabet, mot, langage). Σ un ensemble fini de symboles ; Σ* l’ensemble des mots finis (dont le mot vide ε) ; un langage L ⊆ Σ*. Un problème de décision est un langage : les instances dont la réponse est « oui ».
Définition (automate fini déterministe). (Q, Σ, δ, q₀, F) : états, alphabet, transition δ : Q × Σ → Q, état initial, états acceptants. Le mot w est accepté si δ*(q₀, w) ∈ F. Un langage est régulier s’il est reconnu par un AFD (équivalent : AFN, expression régulière — théorème de Kleene).
Définition (grammaire algébrique, automate à pile). Règles A → α (A non-terminal, α suite de terminaux et non-terminaux) ; langage engendré = mots dérivables depuis l’axiome. Reconnus par les automates à pile. Contient les langages réguliers strictement (aⁿbⁿ).
Définition (machine de Turing, calculabilité). Ruban infini, tête, états, table (état, symbole) → (état, symbole, déplacement). Un langage est décidable si une MT s’arrête sur toute entrée en acceptant ou rejetant ; semi-décidable (récursivement énumérable) si elle accepte exactement L (peut boucler ailleurs). Thèse de Church-Turing : tout ce qui est calculable l’est par une MT.
Définition (classes P, NP, NP-complet). P : décidable en temps polynomial. NP : vérifiable en temps polynomial avec un certificat. Réduction polynomiale A ≤p B : f calculable en temps polynomial avec x ∈ A ⇔ f(x) ∈ B. B est NP-difficile si tout A ∈ NP se réduit à B ; NP-complet si de plus B ∈ NP. coNP : complémentaires de NP. PSPACE : espace polynomial. P ⊆ NP ⊆ PSPACE ⊆ EXPTIME, avec P ≠ EXPTIME et le reste ouvert.
Définition (réduction de Turing, oracle). A ≤T B si A est décidable par une MT disposant d’un oracle pour B. Plus faible que ≤p ; sert aux preuves d’indécidabilité.

Fiche de cours · Formules

Résultats et tableaux à connaître

Classe (Chomsky)MachineExempleAppartenanceFermeture
RéguliersAutomate fini(ab)*, nombres pairsO(n)∪, ∩, complément, *, concaténation
AlgébriquesAutomate à pileaⁿbⁿ, parenthèsesO(n³) (CYK), O(n) pour LR(k)∪, *, concaténation ; pas ∩ ni complément
ContextuelsMT linéairement bornéeaⁿbⁿcⁿPSPACE-complet∪, ∩, complément
Récursivement énumérablesMachine de TuringARRÊTSemi-décidable∪, ∩ ; pas complément
Lemme de pompage (réguliers) : ∃p, tout w ∈ L avec |w| ≥ p s’écrit w = xyz, |xy| ≤ p, |y| ≥ 1, et xyiz ∈ L pour tout i ≥ 0
Myhill-Nerode : L régulier ⇔ la relation « u ~ v ssi ∀z, uz ∈ L ⇔ vz ∈ L » a un nombre fini de classes (= nombre d’états de l’AFD minimal)
Déterminisation : un AFN à n états donne un AFD à ≤ 2ⁿ états (construction des sous-ensembles), borne atteinte
Cook-Levin : SAT est NP-complet ; 3-SAT aussi ; puis CLIQUE, COUVERTURE PAR SOMMETS, ENSEMBLE INDÉPENDANT, 3-COLORATION, CIRCUIT HAMILTONIEN, SOUS-SOMME, SAC À DOS…
Théorème de Rice : toute propriété sémantique non triviale des programmes est indécidable
Hiérarchie en temps : si f(n) log f(n) = o(g(n)), TIME(f) ⊊ TIME(g) ; donc P ⊊ EXPTIME
Savitch : NSPACE(f) ⊆ SPACE(f²) ⇒ NPSPACE = PSPACE

Fiche de cours · Théorèmes et démonstrations

Démonstrations à savoir refaire (1/2)

Théorème 1 (lemme de pompage et application : aⁿbⁿ n’est pas régulier).
Lemme. Soit un AFD à p états reconnaissant L. Pour w ∈ L de longueur ≥ p, le calcul sur les p premières lettres visite p + 1 états : deux sont égaux (principe des tiroirs), disons après les préfixes x et xy (|y| ≥ 1, |xy| ≤ p). La boucle sur y peut être parcourue i fois pour tout i ≥ 0 sans changer l’état atteint : xyiz est accepté. Application. Supposons L = {aⁿbⁿ} régulier, de constante p. w = apbp ∈ L. Toute décomposition a |xy| ≤ p, donc y = ak avec k ≥ 1. Alors xy²z = ap+kbp ∉ L. Contradiction. Même méthode pour les palindromes, {a}, {ap, p premier}. Remarque : le lemme est une condition nécessaire, pas suffisante (des langages non réguliers le vérifient) ; Myhill-Nerode est une caractérisation exacte : ici ai et aj (i ≠ j) sont dans des classes différentes (aibi ∈ L, ajbi ∉ L), d’où une infinité de classes.
Théorème 2 (indécidabilité de l’arrêt). Il n’existe pas de programme H(P, x) qui décide, pour tout programme P et toute entrée x, si P(x) s’arrête.
Par l’absurde, supposons H. Construisons D(P) : « si H(P, P) dit “s’arrête”, boucler indéfiniment ; sinon s’arrêter ». D est un programme, appliquons-le à lui-même. Si D(D) s’arrête, alors H(D, D) a dit « s’arrête », donc D(D) boucle — contradiction. Si D(D) boucle, alors H(D, D) a dit « boucle », donc D(D) s’arrête — contradiction. Donc H n’existe pas. C’est l’argument diagonal de Cantor (L09) appliqué aux programmes : D diffère de tout programme P sur l’entrée P. Conséquence pratique : aucun outil ne peut détecter toutes les boucles infinies ; les analyseurs statiques sont incomplets (faux positifs) ou incorrects.

Fiche de cours · Théorèmes et démonstrations

Démonstrations à savoir refaire (2/2)

Théorème 3 (théorème de Rice). Soit S un ensemble de langages semi-décidables, non vide et différent de l’ensemble de tous. Alors {⟨M⟩ : L(M) ∈ S} est indécidable.
Quitte à passer au complément, supposons ∅ ∉ S, et soit L₀ ∈ S reconnu par M₀. Réduisons ARRÊT : à (P, x), associons la machine MP,x qui, sur une entrée w, exécute d’abord P(x), puis (si cela termine) exécute M₀ sur w. Si P(x) s’arrête, L(MP,x) = L₀ ∈ S ; sinon L(MP,x) = ∅ ∉ S. La construction de ⟨MP,x⟩ est calculable. Un décideur de S déciderait ARRÊT. Conséquences : « ce programme renvoie-t-il toujours 0 ? », « accepte-t-il le mot vide ? », « est-il équivalent à celui-là ? », « est-il exempt de division par zéro ? » sont tous indécidables — toute vérification automatique exacte de comportement l’est ; on se rabat sur des approximations sûres (typage, interprétation abstraite) ou des tests.
Théorème 4 (transitivité des réductions et propagation de la NP-complétude). Si A ≤p B et B ≤p C alors A ≤p C. Si B est NP-complet, B ≤p C et C ∈ NP, alors C est NP-complet. Si un problème NP-complet est dans P, alors P = NP.
Composition de deux fonctions polynomiales : g∘f est calculable en temps polynomial (la taille de f(x) est polynomiale en |x|, et un polynôme d’un polynôme est un polynôme) et x ∈ A ⇔ f(x) ∈ B ⇔ g(f(x)) ∈ C. Pour la NP-complétude de C : tout A ∈ NP vérifie A ≤p B ≤p C. Si B NP-complet ∈ P : tout A ∈ NP se résout en calculant f(x) (polynomial) puis en décidant B (polynomial) : A ∈ P. C’est pourquoi une seule réduction depuis un problème connu suffit — et pourquoi un algorithme polynomial pour le TSP briserait toute la cryptographie moderne.
Théorème 5 (SAT ≤p 3-SAT). Toute formule CNF se transforme en temps polynomial en une formule 3-CNF équisatisfiable.
Clause à 1 littéral (l) : remplacer par (l ∨ y ∨ z)(l ∨ ¬y ∨ z)(l ∨ y ∨ ¬z)(l ∨ ¬y ∨ ¬z) avec y, z nouvelles. À 2 littéraux : (l₁ ∨ l₂ ∨ y)(l₁ ∨ l₂ ∨ ¬y). À k ≥ 4 littéraux (l₁ ∨ … ∨ lk) : (l₁ ∨ l₂ ∨ y₁)(¬y₁ ∨ l₃ ∨ y₂)…(¬yk−3 ∨ lk−1 ∨ lk) avec k − 3 variables nouvelles. Équisatisfiabilité : si un li est vrai, poser yj = vrai pour j < i − 1 et faux après satisfait toutes les clauses ; réciproquement, si tous les li sont faux, la chaîne force y₁ vrai, puis y₂ vrai, …, et la dernière clause est fausse. La taille est multipliée par une constante : polynomial. (2-SAT, lui, est dans P : graphe d’implications et composantes fortement connexes.)

Fiche de cours · Méthodes

Méthodes et pièges

Méthode — montrer qu’un langage est régulier / ne l’est pas. Régulier : donner un AFD, un AFN ou une expression régulière ; ou l’obtenir par fermeture (∩, ∪, complément) de langages réguliers. Non régulier : pompage (choisir un mot w ∈ L de longueur ≥ p bien choisi — les premières p lettres doivent être « rigides ») ou Myhill-Nerode (exhiber une infinité de préfixes deux à deux distinguables).
Méthode — prouver une indécidabilité. Réduire depuis ARRÊT (ou un autre indécidable) : « si je savais décider X, je saurais décider ARRÊT » ; ou appliquer Rice si la propriété porte sur le comportement (le langage accepté), pas sur le texte (« a-t-il plus de 100 instructions ? » est décidable).
Méthode — prouver une NP-complétude. (1) Certificat polynomial ⇒ ∈ NP. (2) Choisir un problème source proche. (3) Construire les gadgets ; les tester sur des petits cas par force brute (module). (4) Les deux sens. Réflexe : un problème « choisir un sous-ensemble sous contraintes » est souvent NP-complet ; « parcours/plus court chemin/couplage/flot » souvent dans P.
Méthode — face à un problème NP-difficile en pratique. Instances petites → force brute ou PD pseudo-polynomiale ; structure particulière (arbres, largeur bornée) → algorithme polynomial spécifique ; sinon solveur SAT/ILP, approximation avec garantie (ex. 2-approximation de la couverture par sommets), ou heuristique (recuit simulé, recherche locale) avec évaluation expérimentale.

Pièges : réduire dans le mauvais sens (montrer X ≤p SAT prouve seulement X ∈ NP) ; oublier le sens (⇐) ; croire que NP signifie « non polynomial » (c’est « non déterministe polynomial ») ; confondre indécidable et « pas encore résolu » ; utiliser le pompage avec un mauvais mot (ap/2bp/2 ne marche pas toujours) ; « exponentiel » ne signifie pas « infaisable » pour n = 30.

Fiche de cours · Exercices corrigés

Exercices corrigés

Exercice 1. Le langage L = {w ∈ {a, b}* : w contient autant de a que de b} est-il régulier ? Algébrique ? Justifier.
Correction. Non régulier : Myhill-Nerode — les préfixes ai (i ≥ 0) sont deux à deux distinguables (aibi ∈ L mais ajbi ∉ L pour j ≠ i) : infinité de classes. (Pompage : w = apbp, y = ak, xy²z a trop de a.) Algébrique : grammaire S → ε | aSbS | bSaS (tout mot équilibré commence par a, dont le b « partenaire » est le premier endroit où le compte revient à 0, ou symétriquement) ; ou automate à pile qui empile a, dépile sur b (et l’inverse), acceptant sur pile vide. Le compteur non borné est exactement ce qu’un automate fini ne peut pas faire et qu’une pile permet.
Exercice 2. Montrer que le problème « le programme P s’arrête-t-il sur au moins une entrée ? » est semi-décidable mais indécidable, et que « P s’arrête sur toute entrée ? » n’est même pas semi-décidable.
Correction. Semi-décidable : simuler P sur toutes les entrées en parallèle par « dovetailing » (à l’étape k, exécuter k pas de P sur chacune des k premières entrées) ; si une exécution s’arrête, répondre oui. Indécidable : par Rice (propriété sémantique « L(P) ≠ ∅ », non triviale), ou par réduction depuis ARRÊT : P′ ignore son entrée et exécute P(x). Non semi-décidable pour « toute entrée » : si c’était semi-décidable, alors comme son complément (« il existe une entrée sur laquelle P boucle ») … n’est pas semi-décidable non plus, on ne conclut pas directement ; argument standard : ARRÊT-complément (P(x) boucle) se réduit à « P s’arrête sur toute entrée » via P″(n) = « exécuter P(x) pendant n pas ; s’arrêter si ce n’est pas fini, boucler si fini » — P″ s’arrête sur toute entrée ⇔ P(x) ne s’arrête jamais. Or le complément d’ARRÊT n’est pas semi-décidable (sinon ARRÊT serait décidable en lançant les deux semi-décisions en parallèle). Donc « toute entrée » ne l’est pas non plus (Π₂ dans la hiérarchie arithmétique).
Exercice 3. Montrer que CLIQUE (existe-t-il k sommets deux à deux adjacents ?) est NP-complet, en partant de 3-SAT.
Correction. ∈ NP : certificat = les k sommets, vérifier C(k, 2) arêtes. Réduction : formule à m clauses de 3 littéraux. Graphe : un sommet par occurrence de littéral (3m sommets) ; arête entre deux sommets s’ils sont dans des clauses différentes et ne sont pas contradictoires (pas x et ¬x). k = m. (⇒) Une affectation satisfaisante choisit un littéral vrai par clause : ces m sommets sont dans des clauses différentes et non contradictoires (tous vrais) : clique de taille m. (⇐) Une clique de taille m contient au plus un sommet par clause (pas d’arête intra-clause), donc exactement un ; ses littéraux sont compatibles ; les rendre vrais (et compléter arbitrairement) satisfait chaque clause. Taille du graphe O(m²) : polynomial. Puis ENSEMBLE INDÉPENDANT par complément du graphe, COUVERTURE PAR SOMMETS par complément de l’ensemble (module).

01 / Automates

Automates finis : la machine la plus simple, et son langage

Régulier = fini

Les langages reconnus par automates finis sont exactement ceux décrits par les expressions régulières (Kleene) : votre re.match(r"^(0|1)*$") est compilé en automate. Un AFD lit chaque caractère une fois, en O(1) par caractère, avec une mémoire fixe : idéal pour un microcontrôleur (analyse d’une trame, module L22, ou d’un protocole : la machine à états de la séance 28 est un automate). Limite : pas de comptage non borné ; un langage avec des parenthèses équilibrées n’est pas régulier — il faut une pile.

01 / Automates

Des expressions régulières à l’automate : construction et déterminisation

L’explosion possible en 2ⁿ états est la raison pour laquelle certains moteurs d’expressions régulières (par retour arrière, comme celui de Python) peuvent être exponentiellement lents sur certaines entrées — les attaques « ReDoS » — tandis que ceux qui simulent l’AFN par ensembles (RE2, Rust regex) garantissent un temps linéaire. Un bel exemple où la théorie décide d’une propriété de sécurité.

02 / Calculabilité

La machine de Turing : le modèle universel du calcul

Pourquoi ce modèle absurde est le bon

Turing (1936) cherchait à définir « procédure mécanique ». Sa machine est minimale (un ruban, une tête, une table finie) mais peut simuler n’importe quel ordinateur — et réciproquement. Le lambda-calcul de Church, les fonctions récursives de Gödel-Kleene, Python, C, un jeu de la vie de Conway, un automate cellulaire à une dimension (règle 110) : tous équivalents. La thèse de Church-Turing affirme que tout ce qui est « effectivement calculable » l’est par une machine de Turing : ce n’est pas un théorème (on ne peut pas prouver quelque chose sur une notion informelle) mais une hypothèse jamais démentie. La machine universelle — une MT qui lit la description d’une autre MT et la simule — est l’ancêtre conceptuel de l’ordinateur à programme enregistré, et c’est aussi ce que fait MachineDeTuring.executer.

02 / Calculabilité

Le problème de l’arrêt : une preuve en 15 lignes de Python

La diagonale de Cantor, partout

L’argument est celui de Cantor (les réels ne sont pas dénombrables) et de Gödel (une proposition qui dit « je ne suis pas prouvable ») : construire un objet qui se réfère à lui-même pour le mettre en contradiction. Autres indécidables : le 10e problème de Hilbert (existence de solutions entières d’un polynôme, Matiyasevich 1970), le problème de correspondance de Post, le pavage du plan par un jeu de tuiles, l’égalité de deux expressions régulières avec intersection et complément… et, en physique, le « gap spectral » d’un matériau (Cubitt et al., 2015). Réduction : pour montrer qu’un problème X est indécidable, on montre qu’un décideur de X permettrait de décider l’arrêt.

03 / Complexité

P, NP, et la question à un million de dollars

Les définitions précises
  • P : les problèmes de décision résolubles en O(nk) sur une machine de Turing déterministe. Tri, plus court chemin, primalité (AKS, 2002), programmation linéaire.
  • NP : ceux dont une solution (« certificat ») se vérifie en temps polynomial. SAT, sous-somme, voyageur de commerce (version décision), coloration, sudoku n×n.
  • NP-difficile : au moins aussi dur que tout problème de NP (tout NP s’y réduit en temps polynomial). NP-complet : NP-difficile et dans NP.
  • P ⊆ NP évidemment. P = NP ? est ouvert depuis 1971 ; c’est l’un des sept problèmes du millénaire. Presque tout le monde pense P ≠ NP, sans preuve. Si P = NP avec un algorithme pratique : plus de cryptographie à clé publique, et la découverte de preuves mathématiques devient mécanique.

03 / Complexité

Réductions : montrer qu’un problème est aussi dur qu’un autre

La carte des réductions

SAT → 3-SAT → {CLIQUE, COUVERTURE PAR SOMMETS, ENSEMBLE INDÉPENDANT} → … ; 3-SAT → 3-COLORATION ; 3-SAT → SOUS-SOMME → SAC À DOS → PARTITION ; CIRCUIT HAMILTONIEN → VOYAGEUR DE COMMERCE. Karp (1972) en a donné 21 ; on en connaît des milliers, dans tous les domaines (planification de robots, repliement de protéines, sudoku, Tetris, Super Mario). Reconnaître qu’un problème est NP-complet est utile : on arrête de chercher l’algorithme exact polynomial et on passe à la bonne stratégie : instances petites (backtracking, SAT solver, module L17), cas particuliers polynomiaux (2-SAT, module L05), approximation garantie (2-approximation de la couverture par sommets), heuristiques (2-opt, module L04), ou paramétrage (FPT).

03 / Complexité

Au-delà de NP : espace, hiérarchie, et le calcul quantique

Ce que le quantique change, et ne change pas

BQP (calculable efficacement par ordinateur quantique) contient P et l’on pense qu’il ne contient pas NP : les ordinateurs quantiques ne résoudront probablement pas SAT ou le voyageur de commerce en temps polynomial. Ils battent le classique sur des problèmes de structure : factorisation et logarithme discret (Shor, 1994 : exponentiel → polynomial, d’où la cryptographie post-quantique), recherche non structurée (Grover : √N au lieu de N), simulation de systèmes quantiques (chimie, matériaux — l’application la plus prometteuse). Les machines actuelles (100-1000 qubits bruités) n’ont pas encore d’avantage pratique prouvé ; la correction d’erreurs quantique est le verrou. Autres classes : PSPACE (mémoire polynomiale : jeux à deux joueurs généralisés, échecs n×n), EXPTIME, et la hiérarchie polynomiale. On sait P ≠ EXPTIME, mais pas P ≠ PSPACE.

04 / Pour l’ingénieur

Pourquoi la théorie compte quand on construit des robots

Résultat théoriqueConséquence pratique
Problème de l’arrêt indécidableAucun outil ne prouvera automatiquement que votre firmware ne bloque jamais ; on fournit variants et invariants (L09), on restreint le langage (MISRA, pas de récursion), on met un watchdog (L18).
Théorème de RiceLes analyseurs statiques ont des faux positifs ou des faux négatifs, par nécessité ; choisissez ceux qui sont sûrs (jamais de faux négatif) pour le critique.
Langages réguliers en O(n)Un protocole analysable par automate fini est rapide et sûr sur microcontrôleur ; un format qui exige une pile (JSON imbriqué) demande de borner la profondeur.
NP-complétude de la planificationLe planificateur de tâches d’un robot peut exploser : bornez l’horizon, utilisez des heuristiques, acceptez le sous-optimal.
RéductionsAvant d’optimiser un nouvel algorithme, chercher si le problème est un classique déguisé — et si oui, prendre le solveur existant (SAT, MILP, OR-Tools).
Théorie de l’information (Shannon)Capacité d’un canal : le débit de votre lien radio a une limite physique ; les codes correcteurs (L22) s’en approchent.
Limites de l’apprentissage (no free lunch, VC)Aucun modèle n’est bon partout ; la quantité de données nécessaire dépend de la complexité du modèle (L13).

Un ingénieur qui connaît ces limites ne perd pas six mois à chercher un algorithme qui ne peut pas exister, et sait quand un problème « impossible » a en fait une instance facile.

Cours

Cours 1 — Langages formels : la hiérarchie de Chomsky et ce qu’elle dit des programmes

ClasseGrammaireMachineExempleCe qu’on peut décider
Réguliers (type 3)A → aB, A → aAutomate finiNombres, identifiants, protocoles simplesTout : appartenance, vacuité, équivalence, inclusion
Algébriques / hors-contexte (type 2)A → α (α quelconque)Automate à pileParenthèses, syntaxe des langages de programmation, aⁿbⁿAppartenance (O(n³), O(n) pour LR) ; équivalence indécidable
Contextuels (type 1)αAβ → αγβAutomate linéairement bornéaⁿbⁿcⁿAppartenance (PSPACE-complet)
Récursivement énumérables (type 0)QuelconqueMachine de TuringTout ce qu’un programme accepteAppartenance semi-décidable seulement

Pourquoi ça compte pour un programmeur. Un analyseur lexical (découper en tokens) est un automate fini ; un analyseur syntaxique (construire l’arbre) est un automate à pile — d’où la structure en deux étapes de tout compilateur. Un langage de configuration doit rester régulier ou algébrique simple pour être analysable sûrement ; JSON est algébrique (imbrication), une regex ne peut pas le valider (essayez : impossible d’équilibrer les accolades). Et « ce programme accepte-t-il exactement les mêmes entrées que celui-là ? » est indécidable dès le niveau algébrique — c’est pourquoi on teste.

Cours

Cours 2 — Exemple travaillé : prouver qu’un problème est indécidable par réduction

Énoncé. Le problème « le programme P s’arrête-t-il sur l’entrée vide ? » (ARRÊT-VIDE) est indécidable.

Preuve par réduction depuis ARRÊT. Supposons un décideur D pour ARRÊT-VIDE. Construisons un décideur pour ARRÊT (P, x) : fabriquer le programme P′ = « ignorer l’entrée ; exécuter P sur x » (une transformation purement syntaxique, calculable). Alors P′ s’arrête sur l’entrée vide ⇔ P s’arrête sur x. Donc D(P′) décide ARRÊT — contradiction avec Turing. ∎

Théorème de Rice (énoncé et idée). Toute propriété sémantique non triviale des programmes (qui dépend du comportement, pas du texte, et qui n’est ni toujours vraie ni toujours fausse) est indécidable. Idée : soit Q une telle propriété, supposons que le programme « boucle toujours » ne la vérifie pas (sinon prendre le complément) et soit R un programme qui la vérifie. Pour décider si P s’arrête sur x : construire P″ = « exécuter P sur x ; puis se comporter comme R ». Si P s’arrête sur x, P″ ≡ R (vérifie Q) ; sinon P″ boucle (ne vérifie pas Q). Un décideur de Q déciderait ARRÊT. ∎

Cours

Cours 3 — Prouver la NP-complétude d’un problème : la recette en quatre étapes

  1. Montrer que X ∈ NP : décrire le certificat (une solution proposée) et vérifier en temps polynomial qu’il est valide. Exemple pour 3-COLORATION : le certificat est la couleur de chaque sommet ; vérifier chaque arête coûte O(|A|).
  2. Choisir un problème Y NP-complet connu proche (3-SAT, CLIQUE, COUVERTURE PAR SOMMETS, CIRCUIT HAMILTONIEN, SOUS-SOMME, 3-COLORATION…).
  3. Construire une réduction polynomiale Y ≤p X : une fonction f calculable en temps polynomial telle que y ∈ Y ⇔ f(y) ∈ X. C’est la partie créative : des gadgets qui traduisent chaque contrainte de Y en structure de X.
  4. Prouver les deux sens : (⇒) une solution de y donne une solution de f(y) ; (⇐) une solution de f(y) donne une solution de y. Oublier (⇐) est l’erreur classique.

Exemple : COUVERTURE PAR SOMMETS (VC) est NP-complet, depuis ENSEMBLE INDÉPENDANT (IS). Dans un graphe G à n sommets, S est un ensemble indépendant ⇔ V ∖ S est une couverture par sommets (toute arête a au moins une extrémité hors de S, donc dans V ∖ S). Réduction : (G, k) ∈ IS ⇔ (G, n − k) ∈ VC. Les deux sens sont immédiats et f est triviale. ∎ Et IS vient de CLIQUE par passage au complémentaire du graphe.

TP guidé

TP — Écrire un petit compilateur, puis explorer la frontière P / NP (sur PC, 4 h)

Exercices

Exercices auto-corrigés — automates et machines

Exercice 1 — Un AFD depuis une description, et son produit

Écrivez la classe AFD2(table, initial, finaux) (table : {(état, lettre): état}) avec une méthode accepte(mot), puis produit(A1, A2, op) qui construit l’automate reconnaissant L(A1) ∩ L(A2) (op = "et") ou L(A1) ∪ L(A2) (op = "ou") par construction produit. Testez : « nombre pair de a » ∩ « se termine par b ».

Correction
class AFD2:
    def __init__(self, table, initial, finaux): self.t, self.q0, self.F = table, initial, set(finaux)
    def accepte(self, mot):
        q = self.q0
        for c in mot:
            if (q, c) not in self.t: return False
            q = self.t[(q, c)]
        return q in self.F
def produit(A1, A2, op):
    etats1 = {q for q, _ in A1.t} | set(A1.t.values()); etats2 = {q for q, _ in A2.t} | set(A2.t.values())
    lettres = {c for _, c in A1.t} | {c for _, c in A2.t}; table = {}
    for p in etats1:
        for q in etats2:
            for c in lettres:
                if (p, c) in A1.t and (q, c) in A2.t: table[((p, q), c)] = (A1.t[(p, c)], A2.t[(q, c)])
    ok = (lambda p, q: p in A1.F and q in A2.F) if op == "et" else (lambda p, q: p in A1.F or q in A2.F)
    return AFD2(table, (A1.q0, A2.q0), {(p, q) for p in etats1 for q in etats2 if ok(p, q)})

Exercice 2 — Machine de Turing : le complément à deux et la copie

Avec la classe MachineDeTuring du cours, écrivez les tables de : a) NOT (inverser chaque bit, s’arrêter sur le blanc) ; b) DOUBLE qui transforme 1ⁿ en 1²ⁿ (unaire ; indice : marquer chaque 1 en X, écrire deux 1 à droite, revenir, puis remettre les X en 1 — ou plus simple : pour chaque 1 lu, ajouter un 1 à la fin). Vérifiez sur plusieurs entrées et comptez les pas : quelle est la complexité de DOUBLE en fonction de n ?

Correction
NOT = {("s", "0"): ("s", "1", "D"), ("s", "1"): ("s", "0", "D"), ("s", "_"): ("f", "_", "S")}
etat_initial_not, finaux_not = "s", ["f"]
# DOUBLE : lire un 1 → le marquer X, aller à droite jusqu'au blanc, écrire 1, revenir au premier 1 non marqué ; à la fin, remplacer les X par 1
DOUBLE = {("s", "1"): ("d", "X", "D"), ("s", "Y"): ("s", "Y", "D"), ("s", "_"): ("r", "_", "G"),
          ("d", "1"): ("d", "1", "D"), ("d", "Y"): ("d", "Y", "D"), ("d", "_"): ("g", "Y", "G"),
          ("g", "1"): ("g", "1", "G"), ("g", "Y"): ("g", "Y", "G"), ("g", "X"): ("s", "X", "D"),
          ("r", "Y"): ("r", "1", "G"), ("r", "X"): ("r", "1", "G"), ("r", "_"): ("f", "_", "S")}
etat_initial_double, finaux_double = "s", ["f"]

Chaque 1 déclenche un aller-retour sur un ruban de longueur ≈ 2n : O(n) par 1, O(n²) au total. Une machine de Turing paie en temps ce que la RAM donne gratuitement (accès direct) — mais seulement polynomialement : c’est pourquoi P est le même pour tous les modèles raisonnables (thèse de Church-Turing étendue).

Exercices

Exercices auto-corrigés — réductions et complexité

Exercice 3 — Réduction PARTITION ≤p SOUS-SOMME, avec vérification

PARTITION : une liste d’entiers peut-elle être coupée en deux parts de même somme ? Écrivez partition_vers_sous_somme(liste) → (liste, cible) et vérifiez, par force brute sur des petites listes, que les réponses coïncident ; puis sous_somme_pd(liste, cible) (L04) et résolvez PARTITION pour une liste de 60 entiers < 1000 grâce à la réduction (pseudo-polynomial).

Correction
def partition_vers_sous_somme(L):
    s = sum(L); return (L, s // 2) if s % 2 == 0 else (L, -1)          # somme impaire : impossible → cible inatteignable
def partition_brute(L):
    s = sum(L); return s % 2 == 0 and any(sum(S) == s // 2 for r in range(len(L) + 1) for S in itertools.combinations(L, r))
def sous_somme_brute(L, c): return any(sum(S) == c for r in range(len(L) + 1) for S in itertools.combinations(L, r))
def sous_somme_pd(L, c):                      # tableau de booléens de taille c + 1 : O(n·c)
    if c < 0: return False
    atteignable = [False] * (c + 1); atteignable[0] = True
    for x in L:
        for s in range(c, x - 1, -1):
            if atteignable[s - x]: atteignable[s] = True
    return atteignable[c]

Exercice 4 — Mesurer une explosion combinatoire et la comparer aux classes

Pour SOUS-SOMME avec force brute (2ⁿ) et PD par tableau (n·cible), mesurez les temps pour n = 12 et 16 avec des nombres de taille croissante (cible ≈ n·20 puis n·2·10⁴). Remplissez conclusions : pour chaque ligne, quel algorithme gagne ("brute" ou "pd") — et expliquez en un commentaire pourquoi la PD n’est pas polynomiale au sens strict (taille de l’entrée = nombre de bits).

Correction
conclusions = {"(12, 20)": "pd", "(12, 20000)": "brute", "(16, 20)": "pd", "(16, 20000)": "brute"}

Avec de petits nombres, le tableau de la PD compte quelques centaines de cases et gagne largement ; avec des nombres de l’ordre de 10⁴, il dépasse 10⁵ cases à parcourir n fois et la force brute (4 096 ou 65 536 sous-ensembles) redevient plus rapide. La PD est en O(n·c) où c est la valeur de la cible ; en bits, c = 2|c| : exponentielle en la taille de l’entrée. Un problème résoluble en temps polynomial en la valeur des nombres est faiblement NP-complet ; les fortement NP-complets (3-SAT, TSP) n’ont pas même cela.

05 / Défis

Défi ★ — Automates et regex

Consigne

1) Construisez l’AFD qui reconnaît les nombres flottants « simples » (-?\d+(\.\d+)?([eE]-?\d+)?) et testez-le contre re.fullmatch sur 1000 chaînes aléatoires. 2) Écrivez l’automate qui décode les trames du module L22 (sync, longueur, charge, CRC) comme un AFD étendu par un compteur : pourquoi n’est-ce pas un AFD pur ? 3) Prouvez par le lemme de l’étoile que {aⁿbⁿ} et {palindromes} ne sont pas réguliers. 4) Minimisez un AFD (algorithme de Moore par raffinement de partitions) et vérifiez sur l’automate de la première slide.

Piste (minimisation)

Partition initiale {acceptants, non acceptants} ; raffiner : deux états restent dans le même bloc ssi, pour chaque lettre, leurs successeurs sont dans le même bloc ; itérer jusqu’au point fixe. Le nombre de blocs est le nombre d’états de l’AFD minimal (unique à renommage près, théorème de Myhill-Nerode).

05 / Défis

Défi ★★ — Machine de Turing universelle et castor affairé

Consigne

1) Écrivez une machine de Turing qui additionne deux nombres unaires (111+11 → 11111), puis une qui les multiplie. 2) Encodez la table d’une MT sur le ruban d’une autre et écrivez la simulation : votre executer en Python en est une ; l’exercice est de le faire en MT — au moins en décrire précisément les phases. 3) Le castor affairé BB(n) : le nombre maximal de pas d’une MT à n états (alphabet {0,1}) qui s’arrête depuis le ruban vide. Énumérez toutes les MT à 2 états, simulez-les avec un plafond de pas, et retrouvez BB(2) = 6. Pourquoi ne peut-on pas calculer BB(n) en général ? (BB(5) = 47 176 870 n’a été prouvé qu’en 2024 ; BB(6) > 10↑↑15.)

Piste

Une MT à 2 états et 2 symboles a (2 états × 2 symboles) transitions, chacune choisie parmi (état suivant ∈ {A, B, HALT}) × (symbole ∈ {0,1}) × (direction ∈ {G, D}) : 12⁴ = 20 736 machines. Simulez chacune avec un plafond de 100 pas ; celles qui s’arrêtent donnent leur nombre de pas ; le maximum est 6. Pour n = 5, le plafond ne suffit plus : il faut prouver que certaines machines ne s’arrêtent jamais — et pour n assez grand c’est indécidable (une MT peut encoder la conjecture de Goldbach : BB(27) décide Goldbach).

05 / Défis

Défi ★★★ — Esprit prépa : Cook-Levin, et un problème ouvert accessible

Consigne

1) Rédigez l’idée de la preuve de Cook-Levin : étant donné une MT polynomiale M et une entrée x, construire une formule SAT de taille polynomiale satisfiable ssi M accepte x (variables « la case i contient le symbole s au temps t », « l’état est q au temps t », clauses de cohérence locale). Implémentez-la pour la MT de 0ⁿ1ⁿ et une entrée courte, et résolvez avec le DPLL du module L17. 2) Réduction 3-SAT → 3-COLORATION : construisez le gadget et testez avec votre solveur CSP. 3) Choisissez un problème dont le statut est ouvert et accessible : isomorphisme de graphes (ni P connu ni NP-complet prouvé ; quasi-polynomial depuis Babai 2015), factorisation, ou « unique games ». Écrivez deux pages : énoncé, pourquoi c’est important, ce qu’on sait, une expérience que vous avez faite (par exemple : la taille des instances d’isomorphisme que votre backtracking avec invariants résout).

Piste (Cook-Levin, structure)

Pour une MT qui s’arrête en p(n) pas, le calcul est un tableau p(n) × p(n) (temps × ruban). Variables booléennes pour chaque case × symbole × temps et chaque état × temps. Clauses : (a) exactement un symbole par case et par temps ; (b) ligne 0 = entrée ; (c) chaque fenêtre 2×3 de cases consécutives évolue selon la table (les cases loin de la tête ne changent pas) ; (d) l’état acceptant apparaît. Taille O(p(n)²) : polynomiale. Toute instance de tout problème de NP se traduit ainsi en SAT — c’est ce que signifie « SAT est NP-complet ».

06 / Vérification

Un problème est dans NP si :

Deux questions supplémentaires

1. Pourquoi un automate fini ne peut-il pas reconnaître les parenthèses équilibrées ? Il faudrait compter la profondeur, non bornée, avec une mémoire finie.

2. Qu’implique une réduction polynomiale de SAT vers X ? Que X est au moins aussi difficile que SAT : un algorithme polynomial pour X en donnerait un pour SAT.

Référence

Les mots à retenir

MotDéfinition
AFD / AFNAutomate fini déterministe / non déterministe ; même puissance.
Langage régulierReconnu par automate fini ; décrit par expression régulière.
Lemme de l’étoileOutil pour prouver qu’un langage n’est pas régulier.
Automate à pile / grammaireNiveau au-dessus : langages algébriques (parenthèses, syntaxe).
Machine de TuringModèle universel du calcul.
Thèse de Church-TuringTout ce qui est calculable l’est par une MT.
IndécidableAucun algorithme ne répond pour toutes les entrées (arrêt, Rice).
P / NP / NP-completRésoluble en polynomial / vérifiable en polynomial / les plus durs de NP.
RéductionTransformer un problème en un autre en temps polynomial.
Cook-LevinSAT est NP-complet.
BQPCalculable efficacement par ordinateur quantique.
Castor affairéFonction non calculable qui croît plus vite que toute fonction calculable.

Pour continuer

Vous connaissez les limites

Dernier module : faire de la recherche — lire un article, reproduire un résultat, formuler une question, et les grandes questions ouvertes en informatique, IA et robotique ; plus la carte des concours et des parcours.

À faire chez soi

← L22SommaireL24 : Vers la recherche →