P=NP ou P = NP - Département d`Informatique, UMONS
Transcription
P=NP ou P = NP - Département d`Informatique, UMONS
Le casse-tête numéro un de l’informatique : P=NP ou P 6= NP ? Jef Wijsen∗ Université de Mons-Hainaut, Académie Wallonie-Bruxelles [email protected], http://staff.umh.ac.be/Wijsen.Jef/ Abstract Les informaticiens sont convaincus qu’il faut un temps de calcul énorme (des heures, journées, années, siècles) pour résoudre certains problèmes dont l’énoncé est pourtant très simple. Cette conviction est à la base de la cryptographie moderne. Le problème est que personne n’arrive à prouver mathématiquement cette conviction. Pourtant, si quelqu’un trouve une telle preuve, il sera récompensé par un prix d’un million de dollars. . . 1 Le cauchemar d’une croissance exponentielle Thomas Robert Malthus (1766–1834) craignait de voir une population gagnant de vitesse par rapport à la production de subsistance. Cette crainte était basée sur l’hypothèse d’une croissance géométrique (e.g. 1, 2, 4, 8, 16, . . . ) de la population, tandis que la production alimentaire n’augmenterait que de façon arithmétique (e.g. 10, 20, 30, 40, 50, . . . ). Or toute suite géométrique “dépasse” à terme toute suite arithmétique. De manière plus générale, la fonction exponentielle 2x dépassera tout polynôme axk quand x tend vers l’infini. Pour k = 1, ce phénomène est nommé : “catastrophe malthusienne”. Une croissance exponentielle (ou plus qu’exponentielle) peut aussi être un cauchemar pour les informaticiens (à l’exception des cryptologues, voir section 8). Imaginez un démarcheur montois qui doit faire son tour à travers 18 villes, que l’on notera A, B, C, . . . , R. Il doit les traverser toutes une fois et une seule. Un tour pourrait être LIN F OM ARCHEJP DQKGB : partir de Mons vers L, de L vers I, de I vers N , . . . , de G vers B, puis finalement retourner de B vers Mons. Ce démarcheur souhaiterait connaı̂tre le tour le plus court. Pour 18 villes, il existe 18 × 17 × 16 × · · · × 3 × 2 × 1 tours différents. Un ordinateur qui calculerait la longueur de tous les tours, à raison d’un million de tours par seconde, aurait besoin d’un temps de calcul de plus de deux siècles. . . 2 Qu’est-ce qu’un problème ? Sans doute avez-vous déjà rencontré des ensembles définis par une propriété, par exemple {n ∈ N | n est premier} ou {(x, y, z) ∈ N3 | ∃n ∈ N(n ≥ 2 et xn + y n = z n )}. Chaque définition de la forme {o ∈ A | o objet possèdant la propriété A } soulève une question de calcul pertinente, à savoir : est-ce qu’il existe un programme d’ordinateur capable de vérifier en “peu de temps” si un objet o ∈ A possède la propriété A ? ∗ Remerciements à Raphaël Astier pour ses suggestions 1 Un problème est une paire (A, A ) : le premier composant A est un ensemble d’objets, le deuxième composant A est une propriété (caractéristique ou qualité) qui est vraie ou fausse pour chaque objet de l’ensemble. Notons qu’un problème ne se résume pas en une seule question générale : pour chaque objet o ∈ A, on peut se poser la question “est-ce que, oui ou non, l’objet o possède la propriété A ?”. Cette question pour un objet bien précis peut être appelée une instance du problème (A, A ). Néanmoins, dans beaucoup de documents (et ce texte n’est pas une exception), on confond souvent les termes “problème” et “instance du problème”. Voici cinq exemples de problèmes : 1. Nombres composés. Un nombre composé est un nombre entier qui est le produit de deux nombres entiers, chacun plus grand que un. Par exemple, 4, 6, 8, 9, 10 et 12 sont composés, mais 0, 1, 2, 3, 5, 7 et 11 ne le sont pas. Tout nombre entier supérieur ou égal à 2 est soit composé, soit nombre premier. Utilisons la lettre N pour désigner la propriété d’être composé, alors (N, N ) est un problème. 2. Voyageur de commerce (démarcheur). Soit M l’ensemble des tableaux triangulaires inférieurs, de taille quelconque, et donnant la distance entre paires de villes, par exemple : A B C D A 4 · · · · B 6 6 · C 3 5 5 · D 5 3 6 3 Ici, la distance entre A et B est de 6, la distance entre A et C est de 3, . . . La diagonale est utilisée pour indiquer la distance jusqu’à Mons : A est à une distance 4 de Mons, B à une distance 6,. . . Utilisons M pour la propriété : “il existe un tour qui traverse chaque ville une et une seule fois et qui a une longueur inférieure à 20”. Le tableau montré ci-dessus respecte M car le tour DBCA a une longueur de 18 : (3 de Mons à D) + (3 de D à B) + (5 de B à C) + (3 de C à A) + (4 de A à Mons). Par contre, le tableau suivant ne possède pas la propriété M (à vous de le vérifier) : A B C A B 7 · 4 5 10 8 C · · 3 Ainsi l’on voit que l’on se trouve face au problème (M, M ). 3. Colorations. Un graphe est un ensemble de “boules” reliées par des lignes. Soit G l’ensemble de tous les graphes. Soit G la propriété : “en utilisant trois couleurs, il est possible de donner une couleur à chaque boule sans que deux boules reliées aient la même couleur”. On obtient ainsi le problème (G, G ). Voici deux graphes; à vous de vérifier si, oui ou non, ils respectent la propriété G . n n PP P n n @ @ ³ ³ n n ³ n PP P n @ @ ³ ³ n n ³ 4. Équations diophantiennes. Une équation diophantienne est une équation de la forme P (x, y, z, . . . ) = 0 où P est un polynôme à coefficients entiers. Par exemple, x3 +y 3 = z 3 et 4xy 2 + 2xy 2 z 3 − 11x3 y 2 z 2 = −1164 sont des équations diophantiennes. Soit D 2 l’ensemble de toutes les équations diophantiennes et D la propriété : “admettre des solutions entières”. L’équation 4xy 2 + 2xy 2 z 3 − 11x3 y 2 z 2 = −1164 respecte D, parce que x = 3, y = 2, z = −1 est une solution entière. Par contre, le dernier théorème de Fermat récemment démontré, indique que x3 + y 3 = z 3 ne possède pas la propriété D (i.e. il n’existe pas d’entiers x, y, z solutions de l’équation). Ici on est face au problème (D, D). 5. Sapons. Appelons sapon une phrase sans ponctuation, et où les mots n’ont pas nécessairement une signification dans une langue. Soit S l’ensemble de tous les sapons. L’ensemble S contient, par exemple, ‘To Be or NOT to BE’ et ‘HÄ det să bra’. Chaque lettre peut apparaı̂tre en minuscule et en majuscule : a et A, ă et Ă, ä et Ä, b et B,. . . La distinction minuscule/majuscule et les accents sont significatifs : a, ă et ä sont trois lettres différentes; Be et BE sont deux mots distincts. Voici quelques propriétés qui peuvent être vraies ou fausses pour un sapon donné : • Propriété S1 : On peut trouver un ensemble de lettres, tel que chaque mot du sapon a une lettre (au moins) dans cet ensemble, et tel que dans cet ensemble on ne retrouve pas la même lettre sous forme majuscule et minuscule. • Propriété S2 : Le sapon contient (au moins) trois fois le même mot. • Propriété S3 : Le sapon contient un mot de cinq lettres ou plus. Le sapon ‘To Be or NOT to BE’ respecte la propriété S1 : l’ensemble {B,o,T} ne contient pas la minuscule et la majuscule d’une même lettre et chaque mot du sapon contient B ou o ou T. Ce n’est pas le seul choix possible : deux autres possibilités sont {B,e,N,o} et {B,N,o,r,T}. Par contre, ce sapon ne respecte ni S2 ni S3 . Ainsi l’on voit que l’on se trouve en présence de 3 problèmes : (S, S1 ), (S, S2 ) et (S, S3 ). 3 La complexité d’un problème La complexité d’un problème (A, A ) est le temps de calcul (plus précisément, le nombre d’instructions élémentaires) qu’il faut pour déterminer si un objet de A possède la propriété A . En général, ce temps de calcul dépend de la taille de l’objet que l’on regarde. Par exemple, déterminer si le sapon ‘To Be or NOT to BE’ respecte S1 prend moins de temps que de déterminer si le sapon suivant respecte la propriété S1 : ‘To Be or NOT to BE That iS THE Question Whether tIs nobler In ThE mind tO sufFER tHe SLiNgS anD arRoWs of OUtrAGeous fOrTUne’ Pour cette raison, on exprimera la complexité en terme de la taille de l’objet à tester. Pour le problème (S, S3 ), la complexité est facile à déterminer. Pour savoir si un sapon contient un mot d’au moins cinq lettres, il suffit de lire le sapon de gauche à droite jusqu’au moment où l’on rencontre un mot de cinq lettres ou plus. Dans le pire des cas, si le sapon ne respecte pas S3 , il faut lire tout le sapon.1 Le temps de lire entièrement un sapon est linéairement proportionnel à la taille du sapon : s’il faut t microsecondes pour lire un seul caractère, alors il faut n × t microsecondes pour lire un sapon de n caractères (inclus les espaces). La complexité du problème (S, S3 ) est donc linéaire en la taille du sapon à tester. Convenons d’utiliser la notation |s| pour la taille d’un sapon s (i.e. |s| = n). Il faut donc un temps |s| × t pour déterminer si un sapon s respecte la propriété S3 , temps linéaire en |s|, et l’on dit dans ce cas que la complexité du problème “est en O(|s|)”. En informatique, une “recette” pour résoudre un problème est appelée un algorithme. Un algorithme peut être encodé en un langage de programmation. Voici le programme pour vérifier si un sapon donné contient un mot de cinq lettres ou plus : 1 Pour les adeptes de Shakespeare, ce pire des cas pourrait être bien agréable. 3 @sapon = (’To’,’Be’,’or’,’NOT’,’to’,’BE’); $answer = ’no’; foreach $w (@sapon) {if (length($w) >= 5) {$answer = ’yes’}} print $answer; Quelle est la complexité du problème (S, S2 ) ? Comment peut-on déterminer si un sapon donné contient au moins trois fois le même mot ? Il ne suffit pas de lire le sapon une seule fois, parce que quand on a lu un mot (prenons le dix-neuvième mot tHe), on ne se souvient plus si, oui ou non, on a déjà rencontré ce mot antérieurement dans le sapon. Par contre, il suffit de lire le sapon une fois pour chaque mot du sapon. Pour le sapon ‘To Be or NOT to BE’, par exemple, on lit le sapon une première fois pour vérifier si le mot To apparaı̂t trois fois (ou plus), une deuxième lecture vérifiera si le mot Be apparaı̂t trois fois, une troisième lecture vérifiera si le mot or apparaı̂t trois fois,. . . Puisqu’un sapon s ne peut évidemment pas contenir plus que |s| mots, cette procédure ne lira pas plus que |s| fois le sapon s. Puisque chaque lecture de s nécessite un temps proportionnel à |s| (voir discussion ci-dessus), le temps pour lire |s| fois le sapon s est de |s| × |s| = |s|2 . Ceci montre qu’un temps proportionnel à |s|2 suffit pour déterminer si un sapon s respecte la propriété S2 .2 Voici un programme encodant l’algorithme proposé : @sapon = (’To’,’Be’,’or’,’NOT’,’to’,’BE’); $answer = ’no’; foreach $v (@sapon) { $count = 0; foreach $w (@sapon) {if ($v eq $w) {$count = $count +1}} if ($count >= 3) {$answer = ’yes’} } print $answer; Noter qu’une complexité en O(|s|) ou O(|s|2 ) ne dit rien sur le temps réel effectif en microsecondes. Tout est relatif : • Une complexité O(|s|), dite linéaire, signifie que s’il faut t microsecondes pour déterminer si un sapon respecte une propriété, alors il faut f × t microsecondes pour un sapon qui est f fois plus grand. • Une complexité O(|s|2 ), dite quadratique, veut dire que le temps de calcul nécessaire pour vérifier si un objet s respecte une propriété, est multiplié par f 2 pour un objet qui est f fois plus grand. Par exemple, si on double la taille de l’objet, le temps de calcul quadruplera. • Une complexité O(|s|3 ), dite cubique, veut dire que le temps de calcul se multiplie par f 3 pour un objet qui est f fois plus grand. • Etc. On définit P comme l’ensemble des problèmes (A, A ) pour lesquels un temps polynomial en |o| suffit pour déterminer si un objet o ∈ A respecte la propriété A . Autrement dit, c’est l’ensemble des problèmes en O(P (|o|)), avec P un polynôme. Puisque |s| et |s|2 sont des polynômes en |s|, les problèmes (S, S3 ) et (S, S2 ) sont dans P. En informatique, les problèmes dans P sont dits “faisables”, voire “faciles”. C’est certainement une appellation à nuancer, car un algorithme avec complexité en O(|o|1000 ) n’est certainement pas faisable. 2 Il existe une procédure plus efficace pour vérifier la propriété S . Néanmoins, dans le cadre de cet exposé, 2 un algorithme quadratique suffit. 4 Néanmoins, on constate en pratique que la plupart des problèmes quotidiens dans P sont de complexité au plus cubique. Est-ce que (S, S1 ) est aussi dans P ? Avant d’attaquer cette question, nous avons besoin de définir une autre classe de problèmes : les problèmes NP. 4 La classe NP Prenons le sapon : DrS Lgn sQK NfL Iea Dpe CRe jkH gAt AFK Jsn eho Bok eLO mea TID tGp IFA dim gbL ibS Jmg kTq Lkg AtS eMq liQ IoM eSh bmh Bjr QSE Lgq APQ ORD rCK pIO rbT Tno kNI GiQ Ken TLD MdJ fob ofc RjM SKN NGJ Elo bCm cKL pRd eIT fQE LCb fqh aqs JAs mEs bcQ rNA mOJ poa TaN Top soJ lnm PCk IqO eqs LRs Lng ojD eSr trK hDG gPJ Doc lHj iAe hiD FJG jpK rNd sIQ GQo TNp hLe OiM LbQ Imaginons un sorcier prétendant que ce sapon respecte la propriété S1 (i.e. on peut trouver un ensemble de lettres tel que tout mot du sapon a une lettre dans cet ensemble, et qui ne contient pas la même lettre sous forme majuscule et minuscule). Étant méfiant quant à la sorcellerie, vous demandez au sorcier de vous prouver qu’il a raison. Pour lui, c’est simple. Il vous donne la “preuve” sous forme d’un ensemble de caractères : {A,b,c,D,e,F,g,h,i,J,k,l,M,N,O,p,Q,r,s,T}. La preuve est plus courte que le sapon. Ensuite, il est facile de vérifier que la preuve ne contient pas la minuscule et la majuscule d’une même lettre, et que chaque mot du sapon contient au moins un caractère de la preuve. L’existence des preuves courtes qui sont faciles à vérifier caractérise la classe de problèmes que l’on appelle NP. La classe NP ne dit rien quant à la facilité de trouver une preuve s’il y en a une. La preuve pourrait être obtenue par sorcellerie ou au hasard; le seul élément qui compte pour classer un problème dans NP est la facilité avec laquelle une preuve peut être vérifiée. De manière plus précise, la classe NP est la classe qui contient tous les problèmes (A, A ) avec la caractéristique suivante : si un objet o ∈ A respecte la propriété A , alors il existe une preuve courte (que l’on appelle aussi “certificat” ou “témoin”) qui peut être vérifiée en temps polynomial. Ici, une preuve est dite “courte” si elle est de taille polynomiale en |o|. Dans la prochaine définition, l’ensemble C contient les certificats. Un problème (A, A ) est en NP si on peut y associer un k ∈ N et un problème (A × C, C ) dans P tel que pour tout o∈A: ½ |c| ≤ |o|k (preuve “courte”) o respecte A ⇐⇒ ∃c ∈ C (o, c) respecte C (“facile” à vérifier) Pour le problème (S, S1 ), l’ensemble C contient des ensembles de caractères et la propriété C exprime qu’un ensemble ne peut pas contenir la minuscule et la majuscule d’une même lettre et doit contenir un caractère de chaque mot du sapon. Il est clair que P ⊆ NP : si (A, A ) est dans P, au lieu de se demander si (o, c) respecte C , on vérifie en temps polynomial si o respecte A . On peut dire que la classe NP contient les problèmes dont les solutions peuvent être vite vérifiées, la classe P contient les problèmes qui peuvent être vite résolus. La différence entre P et NP est celle entre résoudre et vérifier , ou entre trouver une preuve et vérifier si une preuve proposée est correcte. Donc, la question “Est-ce que NP ⊆ P ?” peut être ainsi conçue : “Les solutions faciles à vérifier, sont-elles faciles à trouver ?”. Noter aussi une asymétrie importante : si un sapon respecte S1 , il y a une preuve courte de cela. Par contre, si un sapon ne respectait pas S1 , comment le sorcier pourrait-il vous en convaincre ? Prenons le sapon : BDF Abc AbC acD BcD AdG aCe AFg aCE ade adE BCf Bdf 5 Comment vous convaincre qu’il est impossible de choisir un caractère de chaque mot sans choisir la minuscule et la majuscule de la même lettre ? Le problème (S, S1 ) est donc dans NP. Question : lesquels des autres problèmes évoqués en section 2 sont dans NP ? 1. Nombres composés. Il est clair que (N, N ) est dans NP : si un nombre n possède la propriété N , un certificat consiste en deux nombres, chacun plus grand que un, dont le produit est n. Par exemple, Pierre de Fermat (1601-1665) conjecturait que le nombre 4294967297 n’était pas composé. En 1732, Euler a montré que 4294967297 est composé en donnant le certificat (641, 6700417). Il est facile à vérifier que 641 × 6700417 = 4294967297. Depuis 2002, on sait que (N, N ) est aussi dans P. 2. Voyageur de commerce. Il est aussi clair que (M, M ) est dans NP : si une matrice en M permet un tour avec longueur inférieur à 20, le certificat est une suite de villes, comme montrée dans la section 1. Par contre, si un tel tour n’existe pas, y a-t-il une preuve courte pour convaincre quelqu’un de l’inexistence d’un tel tour ? 3. Colorations. Ce problème est dans NP : un certificat écrit un numéro 1, 2, ou 3 dans chaque boule, de manière à ce que des boules reliées aient des numéros distincts. Par exemple, 2n @ @ 1n 3n PP 1n ³ ³ 3n 4. Équations diophantiennes. Le problème est subtil : on pourrait croire injustement que si une équation diophantienne admet des solutions entières, alors une telle solution est un certificat. Par exemple, il est facile à contrôler que x = 3, y = 2, z = −1 est une solution de 4xy 2 +2xy 2 z 3 −11x3 y 2 z 2 = −1164. Mais ce n’est pas toujours si simple : les solutions d’une équation diophantienne peuvent avoir une valeur extrêmement grande. Depuis le début des années 1970, on sait (par preuve) qu’il n’existe pas d’algorithme pour le problème (D, D)! A fortiori, ce problème ne peut pas être dans NP. Les réponses ont été résumées dans la figure 1. De nombreux problèmes pratiques que l’industrie rencontre, sont dans NP. Il serait donc bien de pouvoir résoudre ces problèmes NP en “peu de temps”, i.e. en un temps polynomial (en la taille des données d’entrée du problème). Le voyageur de commerce n’attendra pas deux siècles pour connaı̂tre le tour le plus court! Rappelez-vous que les problèmes solubles en un temps polynomial forment la classe P. Dès lors, résoudre les problèmes NP en un temps polynomial n’est possible que si NP ⊆ P. Ici apparaı̂t la grande question (à 1 million de dollars) “P versus NP” : personne ne sait ni si NP ⊆ P, ni si NP 6⊆ P. 5 Polynomial versus exponentiel Maintenant que l’on sait que le problème (S, S1 ) est dans NP, que peut-on en déduire sur le temps qu’il faut pour déterminer si un sapon s donné respecte S1 ? Comment tester s’il est possible de choisir un caractère de chaque mot sans jamais choisir la minuscule et la majuscule de la même lettre ? Pour chaque lettre qui apparaı̂t dans le sapon, on choisit ou bien la minuscule ou bien la majuscule. Ensuite, on vérifie en temps polynomial si l’ensemble de caractères choisis contient un caractère de chaque mot. De cette manière, on peut essayer tous les choix possibles. Si le sapon respecte S1 , notre procédure trouvera bien un certificat. Si l’on ne trouve pas de certificat, il est correct de conclure que le sapon ne respecte pas S1 . 6 NP ' P ' (N, N ) $ $ (G, G ) (D, D) (S, S3 ) (S, S2 ) & & (M, M ) % (S, S1 ) % Figure 1: La majorité des informaticiens pensent que P 6= NP. Quel est le nombre de choix à essayer ? Un sapon s ne contient pas plus de |s| caractères différents. Avec deux possibilités par caractère (pour les lettres minuscules et majuscules), on arrive à 2|s| possibilités. Ici surgit le cauchemar de l’exponentialité : 2|s| est exponentiel en |s|. . . En général, pour tout problème (A, A ) dans NP, pour déterminer si un objet o ∈ A respecte A , on pourrait vérifier tous les certificats possibles. Pour un certain k ∈ N, tout certificat a une taille inférieure à |o|k (voir section 4). Le nombre de certificats à tester est donc fini mais généralement exponentiel. . . La section 1 a déjà évoqué la problématique d’un temps exponentiel. Voici une autre façon de voir cette problématique. Supposons que j’utilise l’algorithme “naı̈f” qui prend un temps O(2|s| ) pour déterminer si un sapon s respecte la propriété S1 . J’autorise le programme à tourner pendant un certain temps, disons 5 minutes; dépassé ce délai, je perds ma patience et arrête le programme (Ctrl-Alt-Delete. . . ). Supposons que mon ordinateur d’aujourd’hui me permette de traiter dans ce délai des sapons jusqu’à une certaine taille n. Si demain j’achetais un ordinateur qui est un million fois plus rapide, les plus grands sapons que je saurais traiter dans le même délai de 5 minutes, sont de taille n + 19, 9 seulement. En fait, l’effet d’une meilleure technologie est seulement additif pour des algorithmes exponentiels, alors qu’il est multiplicatif pour des algorithmes polynomiaux. Voir le tableau ci-dessous. ordinateur 100× plus rapide 10.000× plus rapide 1.000.000× plus rapide complexité de l’algorithme |s| |s|2 2|s| 100 × n 10 × n n + 6, 6 10.000 × n 100 × n n + 13, 2 1.000.000 × n 1000 × n n + 19, 9 • n est la taille des sapons pour lesquels mon ordinateur actuel est capable de déterminer en un délai fixe (disons 5 minutes) s’ils possèdent la propriété S1 . • Une petite réflexion suffit pour voir que n + 19, 9 est la valeur x qui satisfait 1.000.000 × 2n = 2x . 6 NP-complet En 1971, Stephen A. Cook a prouvé que certains problèmes dans NP sont les plus “difficiles” de la classe NP; ces problèmes sont appelés NP-complets. Par exemple le problème (S, S1 ) est NP-complet. De manière précise, cela veut dire que pour tout autre problème (A, A ) dans NP, il existe une transformation f : A → S tel que pour tout o ∈ A, le sapon f (o) peut être construit en temps polynomial en |o| et 7 NP ' P ' (N, N ) $ NP-complet $ ' (G, G ) $ (D, D) (S, S3 ) (M, M ) (S, S2 ) & & (S, S1 ) % & % % Figure 2: Si un problème NP-complet est dans P, alors P = NP. o respecte A ⇐⇒ le sapon f (o) respecte S1 C’est un résultat tout à fait remarquable, reliant des problèmes portant sur des objets aussi différents que les nombres, les graphes ou les sapons. Ce résultat implique, par exemple, que tout graphe g peut être transformé en un sapon s de manière à ce que : on sait choisir un caractère de chaque les boules de g peuvent être colorées mot du sapon s sans jamais choisir la en trois couleurs sans que deux boules ⇐⇒ minuscule et la majuscule de la même reliées aient la même couleur lettre. En plus, cette transformation d’un graphe g en sapon ne prend qu’un temps polynomial en |g|. Le résultat ci-dessus implique aussi que : si (S, S1 ) est dans P, alors P=NP. En effet, dire que (S, S1 ) est dans P signifie qu’il existe un algorithme qui vérifie si un sapon s respecte S1 en un temps polynomial en |s|. Pour n’importe quel autre problème (A, A ) dans NP, pour vérifier si un objet o ∈ A possède la propriété A , on applique cet algorithme au sapon f (o), i.e. au résultat de la transformation de o en sapon. Pour prouver P = NP, il “suffit” donc de trouver un algorithme qui détermine si un sapon s respecte S1 en un temps polynomial en |s|. La majorité des informaticiens pensent cependant qu’un tel algorithme n’existe pas (et que donc P 6= NP), mais personne n’arrive à le prouver. Une preuve serait pourtant récompensée par un prix d’un million de dollars (voir http ://www.claymath.org/millennium/). Maintenant, il ne faut pas croire que les sapons sont des objets spéciaux, pas du tout—le mot “sapon” a juste été inventé pour cet exposé. La vérité est que le nombre des problèmes NP-complets est grand, et il n’est pas difficile de créer de nouvelles variantes. Le mot “variante” est tout à fait adapté, car de ce qui précède, il résulte que tous ces problèmes sont les mêmes à des transformations polynomiales près. Les problèmes (G, G ) et (M, M ) sont aussi NP-complets. Voir figure 2. Plus rares sont les problèmes naturels dans NP pour lesquels on ne sait ni s’ils sont dans P, ni s’ils sont NP-complets. Il est cependant connu que si P 6= NP, alors il existe des problèmes qui ne sont ni dans P, ni NP-complets. 7 La taille de l’input Jusqu’ici, on a sous-entendu que la taille d’un sapon est obtenu en comptant son nombre de caractères. Ceci demande une petite rectification. Regardons le problème (S, S1 ) qui est 8 NP-complet. Si l’on fixait l’alphabet à aAbBcC...zZ, alors le nombre de certificats possibles serait de 226 = 67108864, un nombre important soit, mais qui ne dépend pas de la taille des sapons que l’on examine. Dans ces conditions, le problème devient un problème dans P : pour chacun des 226 certificats possibles, tester en temps polynomial si le certificat contient un caractère de chaque mot du sapon. Exécuter 226 fois un algorithme polynomial ne prend qu’un temps polynomial. Il est donc important pour garder le caractère NP-complet du problème, de pouvoir ajouter de nouvelles lettres “à volonté” en utilisant des accents, par ♥ ♥ exemple a et A pour les sapons amoureux. Néanmoins, un ordinateur ne fonctionnera qu’avec un nombre fini de symboles (0 et 1). Donc même si l’on permet d’inventer des accents pour créer de nouvelles lettres, tous les sapons doivent finalement être encodés en utilisant l’alphabet fini de la machine. Pour un sapon, soit A = {m0 , m1 , . . . , mi , . . . } l’ensemble de ses lettres minuscules, et pour chaque i, soit Mi la majuscule de mi . On peut encoder m0 comme 00, m1 comme 01, m2 comme 010, m3 comme 011,. . . Les majuscules peuvent être encodées en changeant le premier zéro en un : M0 est donc encodé comme 10, M1 comme 11, M2 comme 110, M3 comme 111,. . . Les caractères d’un même mot sont séparés par #. Les mots apparaissent entre parenthèses. Par exemple, pour le sapon ‘To Be or NOT to BE’, on obtient A = {t, o, b, e, r, n} et les lettres sont encodées comme suit : t 00 o 01 b 010 e 011 r 0100 n 0101 T O B E R N 10 11 110 111 1100 1101 Donc, ‘To Be or NOT to BE’ est stocké comme suit : (10#01)(110#011)(01#0100)(1101#11#10)(00#01)(110#111) Ainsi la taille de ce qui représente l’entrée du problème augmente : si n est le nombre de lettres différentes dans le sapon original (n = 6 dans l’exemple), certains caractères du sapon occuperont dlog2 ne + 1 positions dans l’encodage. Néanmoins, cette augmentation de la taille des sapons ne changera pas la classification des problèmes (S, S1 ), (S, S2 ) et (S, S3 ) montrée dans la figure 2. 8 8.1 Et si P = NP ? Une bénédiction Beaucoup de tâches opérationnelles usuelles contiennent des problèmes NP-complets : fabrication des horaires, planning routier, remplissage des containers,. . . On se contente alors de solutions sous-optimales, car tous les algorithmes que l’on connaı̂t pour les solutions optimales prennent un temps exponentiel. Si P 6= NP, alors cette exponentialité apparaı̂t comme une loi de la nature dont on ne peut pas se défaire. Mais si un jour quelqu’un découvre un algorithme polynomial pour un problème NP-complet, prouvant par là que P = NP, alors des solutions optimales aux problèmes NP-complets usuels pourraient être obtenues en un temps raisonnable. 8.2 Un cauchemar Il y a au moins une discipline informatique qui serait en difficulté si P = NP : c’est la cryptographie. Certaines techniques en cryptographie sont basées sur l’hypothèse qu’il faut 9 un temps exponentiel pour déchiffrer certains codes. En particulier, ces techniques s’appuient sur deux propriétés : 1. Il est “facile” de tester si un nombre est premier (on a dit que le problème (N, N ) était dans P, et savoir répondre si un nombre est composé, c’est savoir répondre si un nombre est premier). 2. Il est “difficile” de retrouver les facteurs premiers d’un nombre composé (c’est peut-être “facile”, mais cela n’a jamais été prouvé). Un algorithme polynomial pour factoriser un nombre donnerait un coup mortel à ces techniques. Peut-être pensez-vous qu’il est facile de retrouver √ les diviseurs d’un nombre n : il suffit d’essayer de diviser par tout les entiers entre 1 et n. Rassurez-vous, ceci est une procédure exponentielle. Noter que la taille d’un nombre n (i.e. |n|) est de dlog10 ne (soit la partie entière de (log10 n) + 1) : nombres n taille |n| 0, 1, . . . , 9 1 10, 11, . . . , 99 2 100, 101, . . . , 999 3 1000, 1001, . . . , 9999 4 10000, 10001, . . . , 99999 5 √ |n| √ Puisque n ' ( 10) √ , (vérifiez ceci), il faut un temps exponentiel (en la taille de n, i.e. en |n|) pour effectuer n divisions. 10