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