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
Fiche de cours · Formules
Résultats et tableaux à connaître
| Classe (Chomsky) | Machine | Exemple | Appartenance | Fermeture |
|---|---|---|---|---|
| Réguliers | Automate fini | (ab)*, nombres pairs | O(n) | ∪, ∩, complément, *, concaténation |
| Algébriques | Automate à pile | aⁿbⁿ, parenthèses | O(n³) (CYK), O(n) pour LR(k) | ∪, *, concaténation ; pas ∩ ni complément |
| Contextuels | MT linéairement bornée | aⁿbⁿcⁿ | PSPACE-complet | ∪, ∩, complément |
| Récursivement énumérables | Machine de Turing | ARRÊT | Semi-décidable | ∪, ∩ ; pas complément |
Fiche de cours · Théorèmes et démonstrations
Démonstrations à savoir refaire (1/2)
Fiche de cours · Théorèmes et démonstrations
Démonstrations à savoir refaire (2/2)
Fiche de cours · Méthodes
Méthodes et pièges
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
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éorique | Conséquence pratique |
|---|---|
| Problème de l’arrêt indécidable | Aucun 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 Rice | Les 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 planification | Le planificateur de tâches d’un robot peut exploser : bornez l’horizon, utilisez des heuristiques, acceptez le sous-optimal. |
| Réductions | Avant 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
| Classe | Grammaire | Machine | Exemple | Ce qu’on peut décider |
|---|---|---|---|---|
| Réguliers (type 3) | A → aB, A → a | Automate fini | Nombres, identifiants, protocoles simples | Tout : appartenance, vacuité, équivalence, inclusion |
| Algébriques / hors-contexte (type 2) | A → α (α quelconque) | Automate à pile | Parenthè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) | Quelconque | Machine de Turing | Tout ce qu’un programme accepte | Appartenance 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
- 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|).
- Choisir un problème Y NP-complet connu proche (3-SAT, CLIQUE, COUVERTURE PAR SOMMETS, CIRCUIT HAMILTONIEN, SOUS-SOMME, 3-COLORATION…).
- 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.
- 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)
- Lexeur et parseur. Un mini-langage impératif (variables entières,
si/sinon,tantque,afficher, expressions arithmétiques et booléennes). Lexeur = automate fini (oure), parseur = descente récursive vers un arbre syntaxique (dataclasses, L02). Tests : 15 programmes valides et 10 invalides avec le message d’erreur attendu (ligne, colonne). - Interpréteur et compilateur. (a) Interpréteur de l’arbre. (b) Compilateur vers un code à pile (PUSH, ADD, JMPZ…) et une machine virtuelle qui l’exécute ; (c) optionnel : génération de C, compilé par gcc. Comparez les temps sur une boucle de 10⁷ itérations : interprète Python de l’arbre / VM / C. Facteur ?
- Turing-complétude. Écrivez en votre langage un interpréteur de Brainfuck (8 instructions), et faites-lui exécuter un programme Brainfuck qui calcule les nombres de Fibonacci. Votre langage est Turing-complet (il simule un modèle universel). Discutez : que manque-t-il à une regex, à SQL sans récursion, à un tableur sans macros ?
- Le seuil de 3-SAT. Avec votre DPLL (L17) puis pysat : pour n = 50, 100, 150 variables, temps médian de résolution en fonction du ratio clauses/variables de 3 à 6 (20 instances par point). Tracez : le pic à 4,26 et sa croissance exponentielle en n. Ajoutez la fraction d’instances satisfiables : la transition de phase.
- Réductions exécutables. Implémentez 3-SAT → 3-COLORATION (gadget : un triangle {V, F, N} + un triangle par variable + gadget « OU » par clause) et testez : pour 50 formules aléatoires, la formule est satisfiable ⇔ le graphe est 3-coloriable (résolu par votre CSP, L17). C’est la preuve de NP-complétude de 3-COLORATION, vérifiée expérimentalement.
- Livrable. Dépôt : compilateur avec tests, mesures interprète/VM/C, interpréteur Brainfuck en votre langage, courbes 3-SAT, réduction vers 3-COLORATION avec ses tests, et une page : « ce que mon compilateur ne pourra jamais décider sur les programmes qu’il compile ».
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
| Mot | Définition |
|---|---|
| AFD / AFN | Automate fini déterministe / non déterministe ; même puissance. |
| Langage régulier | Reconnu par automate fini ; décrit par expression régulière. |
| Lemme de l’étoile | Outil pour prouver qu’un langage n’est pas régulier. |
| Automate à pile / grammaire | Niveau au-dessus : langages algébriques (parenthèses, syntaxe). |
| Machine de Turing | Modèle universel du calcul. |
| Thèse de Church-Turing | Tout ce qui est calculable l’est par une MT. |
| Indécidable | Aucun algorithme ne répond pour toutes les entrées (arrêt, Rice). |
| P / NP / NP-complet | Résoluble en polynomial / vérifiable en polynomial / les plus durs de NP. |
| Réduction | Transformer un problème en un autre en temps polynomial. |
| Cook-Levin | SAT est NP-complet. |
| BQP | Calculable 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
- Lire Sipser chapitres 1, 3, 4, 7 ; faire les exercices étoilés.
- Regarder « P vs NP and the Computational Complexity Zoo » (hackerdashery) puis lire l’article de survol de Fortnow (« The status of the P versus NP problem », 2009).
- Implémenter un interpréteur de lambda-calcul (ou de Brainfuck) et montrer qu’il est Turing-complet.