Algorithmes et structures de données avancés Cours 11 Patrick Reuter http://www.labri.fr/~preuter
Problèmes PARTITION TSP
TSP Logiciel Concorde http://www.tsp.gatech.edu/concorde.html A résolu un TSP de 15,112 villes http://www.tsp.gatech.edu/concorde.html
Théorie de la complexité Repose sur la définition de classes de complexité qui permettent de classer les problèmes en fonction de la complexité des algorithmes qui existent pour les résoudre.
Classes de complexité Parmi les classes les plus courantes, on distingue: Classe P (polynomial) Classe NP (Non déterministe Polynomial)
Classes de complexité Classe P (polynomial): un problème de décision est dans P s'il peut être décidé par un algorithme déterministe en un temps polynomial par rapport à la taille de l'instance.
Classes de complexité Classe NP (Non déterministe Polynomial) : c'est la classe des problèmes de décision pour lesquels la réponse oui peut être décidée par un algorithme non-déterministe en un temps polynomial par rapport à la taille de l'instance.
Non-déterminisme
La classe NP De manière intuitive, dire qu'un problème peut être décidé à l'aide d'un algorithme non-déterministe polynomial signifie qu'il est facile, pour une solution donnée, de vérifier en un temps polynomial si celle-ci répond au problème pour une instance donnée mais que le nombre de solutions à tester pour résoudre le problème est exponentiel par rapport à la taille de l'instance. Le non-déterminisme permet de masquer la taille exponentielle des solutions à tester tout en permettant à l'algorithme de rester polynomial.
Classes de complexité On a trivialement P NP, En revanche : NP P ? car un algorithme déterministe est un algorithme non déterministe particulier. En revanche : NP P ? que l'on résume généralement à P = NP ? est l'un des problèmes ouverts les plus fondamentaux et intéressants en informatique théorique. 1970 : le premier qui arrivera à décider si P et NP sont différents ou égaux recevra le prix Clay (plus de 1.000.000 $)
P = NP ??
Pourquoi c'est difficile de prouver ? (1 sur 2) Le problème de fond est que les algorithmes que l'on programme sont tous déterministes. Pour la bonne et simple raison que l'on ne sait pas construire de machine non déterministe. Ce qui fait que l'on ne peut que simuler un algorithme non déterministe par un algorithme déterministe
Pourquoi c'est difficile de prouver ? (2 sur 2) Or il est démontré qu'un algorithme déterministe qui simule un algorithme non-déterministe qui fonctionne en temps polynomial, fonctionne en temps exponentiel. Ce qui fait que pour de grandes entrées on ne peut pas résoudre le problème en pratique, quelle que soit la puissance de la machine.
Relation entre P et NP (supposé…) Si NP P NP P
NP difficile Un problème est NP difficile si ce problème est au moins aussi dur que tous les problèmes dans NP. (on utilise parfois la traduction incorrecte NP-dur)
Relation entre P,NP et NP difficile (supposé…) Si NP P NP difficile NP P
NP complet On dit qu'un problème est NP-complet si il est dans NP il est NP-difficile
NP complet On dit qu'un problème est NP-complet si il est dans NP (borne supérieure ..) il est NP-difficile (borne inférieure ..)
Relation entre P,NP, NP difficile, et NP complet (supposé…) Si NP P NP difficile NP NP complet P
NP complet Propriétés : Il n’y a pas un seul problème NP complet où il existe une preuve qu'il puisse fournir une réponse correcte en temps polynomial Si pour un problème NP complet on trouve une réponse correcte en temps polynomial, on peut trouver une réponse correcte en temps polynomial pour tous les problèmes en NP complet
Réduction Formellement on définit une notion de réduction : Soient p et q deux problèmes, une réduction de q à p est un algorithme transformant toute instance de q en une instance de p. Ainsi, si l'on a un algorithme pour résoudre p, on sait aussi résoudre q. p est donc au moins aussi difficile à résoudre que q. q est donc au plus aussi difficile à résoudre que p. On écrit aussi q ≤ p ou bien q est réductible à p
Réduction polynomiale Formellement on définit une notion de réduction polynomiale Soient p et q deux problèmes, avec le but d’utiliser la solution de p pour résoudre q une réduction de q à p est un algorithme en temps polynomial transformant toute instance de q en une instance de p. Ainsi, si l'on a un algorithme pour résoudre p, on sait aussi résoudre q. p est donc au moins aussi difficile à résoudre que q q est au plus aussi difficile à résoudre que p. On écrit aussi q ≤p p
Transitivité La réduction polynomiale est en fait une relation transitive Si q ≤p p et p ≤p o alors q ≤p o
« aussi dur » La réduction polynomiale est en fait une relation transitive Si q ≤p p, alors « q est au plus aussi difficile que p » Si aussi p ≤p q, alors « p est au plus aussi difficile que q » p et q sont « à peu près la même difficulté »
NP complet On dit qu'un problème est NP-complet si il est dans NP il est NP-difficile
Prouver si un problème p est NP complet On suppose p NP, et on argumente comment pour une solution sp donnée, elle peut être vérifié en un temps polynomial 2. q NP complet avec q ≤p p , et il existe une fonction f qui transforme une solution sq de q en solution f (sq) = sp de p 3. Expliquer pourquoi f est polynomial
EXEMPLE
TSP TSP – Traveling Salesman Problem (Problème du voyageur de commerce) étant donné - n sommets (des « villes ») - et les distances séparant chaque sommet, 3 variantes Variante 1 : Est-ce qu’il y a une chaîne de longueur totale minimale inférieur à B ? Variante 2 : Quel est la longueur totale minimale ? Variante 3 : Quelle est la chaîne de longueur totale minimale ? EXERCICE : à faire pour la prochaine fois, Prouver : 1. Si la variante 1 peut être résolu en temps polynomial avec un algorithme non déterministe, la variante 2 le peut aussi 2. Si la variante 2 peut être résolu en temps polynomial avec un algorithme non déterministe, la variante 3 le peut aussi
TSP Voici un énoncé plus formel du problème du voyageur de commerce sous forme de problème de décision. Données : un graphe complet G = (V,E,φ) avec V un ensemble de sommets, E un ensemble d'arêtes et φ une matrice de distances; un entier B Question : Existe-t-il un cycle passant une et une seule fois par chaque sommet tel que la somme des coûts des arcs utilisés soit inférieure à B
TSP est NP complet
Chemin Hamiltonien Le problème du Chemin Hamiltonien consiste, étant donné un graphe G, à décider s'il existe un chemin dans G passant par chaque sommet une et une seule fois.
Problème HAMILTONIAN
Circuit Hamiltonien Le problème du Circuit Hamiltonien est une variante où le chemin doit finir à son point de départ.
Exemple sur la réduction polynomiale Prouver par réduction polynomiale que le problème HAMILTONIAN est NP complet
CLIQUE Variante 1 (Problème de décision) Considérer le graphe G=(V,E) et un k N. Est-ce qu'il existe une clique de taille k dans G ? Variante 2 (Problème d'optimisation) Considérer le graphe G=(V,E). Déterminer le plus grand k tel que le graphe G contienne une k-clique. Variante 3 (Problème d'optimisation) Considérer le graphe G=(V,E). Déterminer une clique C dans G telle qu'aucune autre clique C' dans G contienne plus de sommets que C.
CLIQUE Variante 1 (Problème de décision) Considérer le graphe G=(V,E) et un k N. Est-ce qu'il existe une clique de taille k dans G ? Variante 2 (Problème d'optimisation) Considérer le graphe G=(V,E). Déterminer le plus grand k tel que le graphe G contienne une k-clique. Variante 3 (Problème d'optimisation) Considérer le graphe G=(V,E). Déterminer une clique C dans G telle qu'aucune autre clique C' dans G contienne plus de sommets que C.
CLIQUE La première variante du problème CLIQUE s'appele problème de décision pour les cliques, la deuxième et troisième variante sont des problème d'optimisation. Dans la deuxième variante, la valeur de l'optimisation est satisfaisante, tandis que la troisième variante demande de déterminer la solution optimale. Chaque algorithme pour la variante 3 résoud les variantes 2 et 1, et chaque algorithme pour la variante 2 résoud la variante 1.
CLIQUE Théorème 1 Preuve 1 Si la variante 1 du problème CLIQUE peut être résolu en temps polynomial par un algorithme non-déterministe, la variante 2 peut être résolu également en temps polynomial par un algorithme non-déterministe. Preuve 1 Nous considérons n=|V| différentes entrée pour la variante 1 du problème CLIQUE, avec le paramètre k de 1, .., n. Chaqu'un des n problèmes peut être résolu en temps polynomial par un algorithme non-déterministe. Le plus grand k pour lequel la réponse de la variante 1 est "oui", est la solution pour la variante 2 du problème CLIQUE. (Bien sur, nous pouvons utiliser la recherche binaire (dichotomique) au lieu de la recherche linéaire).
Algorithme pour preuve 1 La fonction existeCliqueVariante1(G,k) : boolean est une fonction pour la Variante 1 du problème CLIQUE. Elle retourne VRAI si le Graphe G contient une clique de taille k, et FAUX sinon. fonction taillePlusGrandeClique(G) : integer; début max = 0; k = 1; tant que k ≤ |V| faire si existeCliqueVariante1(G,k) alors max = k; fin si fin tant que fin
CLIQUE Théorème 2 Preuve 2 Si la variante 2 du problème CLIQUE peut être résolu en temps polynomial par un algorithme non-déterministe, la variante 3 peut être résolu également en temps polynomial par un algorithme non-déterministe. Preuve 2 Nous calculons d'abord la taille kopt de la plus grande CLIQUE de G avec la variante 2. Après, nous traitons les arêtes de E une après l'autre. Nous allons éliminer une première arête de G, et nous calculons la taille k'opt du graphe G' résultant. Si k'opt=kopt,nous avons plus besoin de cet arête. Si k'opt<kopt,nous avons besoin de cet arête pour une clique de taille kopt,et nous rajoutons cet arête à nouveau à G'. Après avoir traité tous les arêtes de cette manière, nous obtenons un graphe G' duquel les arêtes forment une CLIQUE de taille k.
Algorithme pour preuve 2 La fonction existeCliqueVariante1(G,k) est une fonction pour la Variante 1 du problème CLIQUE. Elle retourne VRAI si le Graphe G contient une clique de taille k, et FAUX sinon. fonction determinerGrandeClique(G) : graphe; début E' := E; V' := V; G' := (V',E'); kopt = taillePlusGrandeClique(G); pour chaque e E faire éliminer e de E' k'opt := taillePlusGrandeClique(G'); si k'opt < kopt alors rajouter e à E' fin si fin pour éliminer tous les sommets v V' avec dégré(v) = 0; retourner G' fin
Preuve par construction Ces deux preuves sont des preuves constructives, car nous avons donné algorithmes non-déterministe en temps polynomial. Ce sont les preuves les plus convaincantes.
CLIQUE Déterminer si pour une solution donnée si on peut vérifier en un temps polynomial si celle-ci répond au problème pour une instance donnée (dans ce cas-là, c'est équivalent à tester si un graphe est complet …) fonction estUneClique(G) : boolean début resultat := VRAI; pour chaque sommet v V faire pour chaque sommet w V faire si pas d'arête (v,w) alors resultat := FAUX; fin si fin pour fin
Problème du sac à dos (KNAPSACK, KP) Un randonneur possède un sac à dos pouvant contenir X kgs, et il dispose d'un ensemble I de N d'objets, chacun pesant un poids xi. Il souhaite savoir s'il existe un sous ensemble J, tel que la somme des poids des éléments de J soit exactement X. Mathématquement : Étant donné : x N, I={x1,x2,···,xi,···,xn}, trouver J tel que xi = X i J
Motivation X = 3288 I = {418,1479,579,290,1223,389,1357,593}
Problème du sac à dos (KNAPSACK, KP) il est possible de montrer que le problème du sac à dos est NP-complet dans le cas général
Séquences super-croissantes Il existe des instances du problème du sac-à-dos extrêmement faciles à résoudre, ce sont celles faisant intervenir les séquences super-croissantes : n-1 N 2,.., n, xn > xi i=1
I = {3,7,15,31,63,151,317,673}. X = 414
Séquences super-croissantes à la base de 2 Le problème du sac à dos est trivial lorsque l'on utilise une séquence super-croissante. Il est tout aussi clair qu'il n'a pas toujours de solution. Ainsi, si l'on choisit la base 2 comme séquence super-croissante, tout nombre pourra se décomposer sur cette base au sens du problème du sac à dos. I = (1,2,4,8,16,32,64,128, .., 2N)
Cryptographie Clés symetriques (ou clé sécrète) Clés asymetriques
Cryptographie Clés symetriques (ou clé sécrète) La clé de chiffrement est identique à la clé de déchiffrement C'est la même clé qui permet à l'éxpéditeur de chiffrer un message et qui permet au destinataire de le déchiffrer Avantage : - rapidité, facilement réalisable sur une puce Difficulté : - Transmission de la clé (seul moyen "sur" : rencontre physique - Grand nombre de clés nécessaire : Pour n utilisateur, n*(n-1) clés sont nécessaires - pas de signature électronique
Cryptographie Clés asymetriques Clé de chiffrement et déchiffrement sont distincts Nécessite une paire de clés : Clé publique pour le chiffrement Clé privée pour le déchiffrement
Clés asymetriques 1. Le destinataire du message génère une paire de clé (clé publique et clé privée) 2. Le destinataire du message transmet la clé publique (même via une voie non-sécurisé) 3. L'expéditeur chiffre son message avec la clé publique (même via une voie non-sécurisé) 4. Le message est transmis 5. Le destinataire déchiffre le message avec sa clé privée
ALICE BOB Clé publique Clé privée
Génération des clés Exigence : Avec la clé privée on peut générer des clés publiques Avec la clé publique on ne peut pas retrouver la clé privé ! "Fonctions à sens unique"
L'algorithme Merkle-Hellman L'algorithme Merkle-Hellman [MH78] est historiquement le premier algorithme montrant le fonctionnement d'un système à clé asymetrique. Il appartient à la famille des algorithmes de cryptage de type ``sac à dos'' (ou knapsack en anglais). [MH78] R.C. Merkle and M.E. Hellman. Hiding information and signatures in trapdoor knapsacks. IEEE transactions on information theory, 24:525--530, 1978.
L'algorithme Merkle-Hellman L'algorithme se décompose de la façon suivante : Choisir une séquence super-croissante {a1,a2,···,an} un nombre N avec N>a1+a2+···+an Choisir un nombre A<N tel que pgcd(A,N)=1 Calculer les bi = (A * ai ) MOD N La clé publique est ({b1,b2,···,bn}) La clé privée (N,A,{a1,a2,···,an}).
Principe Il suffit maintenant pour l'émetteur de récupérer la clef publique ({b1,b2,···,bn}), qui peut être transmise par n'importe quel canal, même non sûr, puis d'appliquer l'algorithme de cryptage (chiffrage) suivant :
Cryptage par l'algorithme de Merkle-Hellman Soit un message binaire composée de la suite de chiffre (d1d2 ··· dn), avec di=0 ou di=1. Alors, le message crypté c est : n c = di bi i =1
Décryptage par l'algorithme de Merkle-Hellman Soit le message cryptée c. Soit m = A-1c MOD N n Calculons les nombres binaires di' tel que m=i=1=di' ai. Alors di=di', où les di représentent les chiffres du message initial. L'algorithme de décryptage de Merkle-Hellman consiste à résoudre un problème de sac à dos, mais cette fois ci sur une instance super-croissante. INVERSE MODULO
Le Modulo inversé Le modulo inverse d'un entier A MOD N est l'entier A-1 tel que A * A-1 = 1 (mod N) Exemple : A=643, N = 1511 A-1 = 47 [1511]
Vérification On peut aisément vérifier que l'algorithme de décryptage est correct en raison de la propriété suivante : mod N
Sécurité … Supposons maintenant qu'un individu mal intentionné tente de décrypter le message c. Il est en possession de la séquence I={b1,b2,···,bn} et du nombre c. Il lui faut donc résoudre un problème de sac à dos, puisqu'il lui faut trouver le sous ensemble J de I tel que bj=c j J Or ce problème de sac à dos n'a a priori aucune structure particulière, puisque la séquence bi n'est pas super-croissante après l'application de la multiplication par A et du modulo N. Ce problème est donc a priori NP-complet. La sécurité est assuré par la NP complétude du problème du sac à dos !!
EXEMPLE Génération des clés : Nous allons prendre n=8, et {a1,a2,···,a8}={3,7,15,31,63,151,317,673}. Nous choisissons N=1511 et A=643. Nous calculons alors la séquence bi = (A * ai ) MOD N {b1,b2,···,b8}={418,1479,579,290,1223,389,1357,593}, et aussi A-1=47 [1511] 643-1=47 [1511]. Message à transmettre La seule information diffusée est la liste des bi. Message 10011010. Chiffrage Il suffit de calculer puis de transmettre c=418+290+1223+1357=3288. Déchiffrage Pour décrypter le message, nous calculons m=A-1 c [N]=47 × 3288 [1511]=414. Il nous suffit alors de résoudre le problème du sac à dos avec la séquence super-croissante ai et x=414=317+63+31+3, soit 10011010. Nous retrouvons bien le message initial.