Mathematics">
TD08 Correction
TD08 Correction
TD08 Correction
2. Soit x une variable apparaissant dans une formule F de SAT-2. Trouver une formule équivalente
à F et dans laquelle la variable x n’apparaisse plus. En déduire un algorithme polynomial pour
SAT-2.
+ Soit x une variable d’un système de clauses F de SAT-2, on transforme F selon les cas de sorte que le système obtenu soit
satisfiable si et seulement si le système initial l’était :
— si x (ou x) n’apparaît qu’une seule fois, on supprime la clause dans laquelle il apparaît, car on est libre de mettre x (ou x), donc
toute la clause à vrai.
— si x (ou bien x) apparaît 2 fois dans une même clause, ou dans 2 clauses distinctes, on supprime la ou les clauses, pour la même
raison.
— si x et x apparaissent dans la même clause, on supprime la clause car elle est toujours à vrai.
— si x et x apparaissent dans 2 clauses distinctes, x ∨ C1 et x ∨ C2 , alors le système de clauses est satisfiable si et seulement si au
moins une des deux clauses C1 ou C2 peut être mise à vrai en même temps que les autres clauses (pour l’autre on choisit x pour
compléter), ainsi :
— → si C1 = C2 = ∅ alors le système n’est pas satisfiable.
— → sinon on remplace les 2 clauses par la nouvelle clause C1 ∨ C2 .
On a ainsi défini un algorithme en n étapes (où n est le nombre de littéraux), pour lequel on décide à chaque étape de la valeur d’un
littéral avec une complexité m (où m est le nombre de clauses) : on peut donc résoudre SAT-2 en O(nm).
1
2. Soient n = 2p un entier pair, et n entiers strictement positifs a1 , a2 , . . . , an . Existe-t-il une partition
de {1, 2, . . . n} en deux ensembles I et I 0 de même cardinal p et tels que ∑i∈ I ai = ∑i∈ I 0 ai ? + ∈
NP : trivial.
Instance I1 de départ : a1 , ...an de 2-partition.
Instance I2 créée : ( a1 + 1, ...an + 1, 1, ...1) de cardinal 2n.
Equivalence : Si ∑i∈ I ai = ∑i∈[1,n]\ I ai alors ∑i∈ I ( ai + 1) + (n − | I |) = ∑i∈[1,n]\ I ( ai + 1) + | I |.
Réciproquement, une solution est de la forme ∑i∈ I ( ai + 1) + (n − | I |) = ∑i∈[1,n]\ I ( ai + 1) + | I |. En effet il faut avoir n termes à droite et
à gauche donc il faut rajouter un (n − | I |) à gauche, et | I | ≤ n sinon au n’aurait jamais l’égalité, car tous les ai sont positifs. Ainsi on
a bien ∑i∈ I ai = ∑i∈[1,n]\ I ai
1 si xi apparaît dans Cj 1 si xi apparaît dans Cj
bij = et bij0 =
0 sinon 0 sinon
Pour mieux comprendre ce qu’on fait, on peut imaginer qu’on crée des (m + n)-upplets dont les n premières cases il n’y à que des
zéros sauf à un endroit i qui permet de savoir de quelle variable on parle, que ce soit xi ou xi , et les m suivants permettent de savoir
si la variable est dans les clauses correspondantes.
2
Entier n variables m clauses Commentaires
xn−1 xn−2 ... x0 Cm−1 Cm−2 ... C0
v0 00 . . . 1 ...1...1... 1 : clauses dans lesquelles x0 apparaît
v n −2 01 . . . 0 ...1... 1 : clauses dans lesquelles xn−2 apparaît
v00 0...1 ...1...1... 1 : clauses dans lesquelles x0 apparaît
vi0 . . . 010 . . . ...1...1... 1 : clauses dans lesquelles xi apparaît
s0 00 . . . 0 00 . . . 1 Uniquement 1 dans colonne C0
si 00 . . . 0 ...1... Uniquement 1 dans colonne Ci
s10 00 . . . 0 00 . . . 02 Uniquement 2 dans colonne C0
si0 00 . . . 0 . . . 020 . . . Uniquement 2 dans colonne Ci
t 11 . . . 1 44 . . . 4 Entier objectif
−1
Désormais on va sommer certains vi et certains vi0 , en fait on somme n entiers, un par littéral, T = ∑nk= 0
0 [ x k vk + (1 − x k ) vk ]. T est
un nombre qui commence par n "1" et est suivit de m chiffres compris entre 0 et 3 (comme on est parti de 3-SAT il y a au plus 3
variables par clause et ces m chiffres correspondent exactement au nombre de littéraux qui mettent cette clause à vrai). Si on part
d’une solution du problème 3-SAT, et qu’on prend vi si xi est vrai et vi0 si xi est faux, on remarque que ces m chiffres sont compris
entre 1 et 3.
A partir de là on se demande comment faire la différence entre les sous-ensembles donnant une somme qui contient un "0" de ceux
donnant une somme sans "0" qui sont exactement les sous-ensembles correspondant à un certificat du problème 3-SAT par la bijection
évidente vi ∈ S’ ↔ xi est vrai et vi0 ∈ S’ ↔ xi est vrai.
C’est à cela que servent les s j = 10 j et s0 j = 2.10 j . En prenant t = 1 . . . 14 . . . 4 et en ne réfléchissant que sur les m chiffres de droite de
T on voit que :
— à partir de 3 on peut avoir 4,3 + 1
— à partir de 2 on peut avoir 4,2 + 2
— à partir de 1 on peut avoir 4,1 + 1 + 2
— à partir de 0 on ne peut avoir 4.
(Cette réflection est la même qui si on considère les nombres comme des n + m-upplets)
Le problème 3-SAT est donc réduit en SUBSET-SUM avec S = {vi |1 ≤ i ≤ n − 1} ∪ {vi0 |1 ≤ i ≤ n − 1} ∪ {s j |1 ≤ j ≤ m − 1} ∪ {s j |1 ≤
j ≤ m − 1} et t = 1 . . . 14 . . . 4
On a ainsi que, si on trouve une solution du problème 3-SAT, on a une solution du problème SUBSET-SUM en prenant la bijection
précédente, et en complétant avec les s j = 10 j et s0 j = 2.10 j .
Réciproquement, si on trouve un sous-ensemble S’ de S tel que si ∑ x∈S0 ( x ) = t = 1 . . . 14 . . . 4, en prenant S̃ = S0 ∩ ({vi |1 ≤ i ≤
n − 1} ∪ {vi0 |1 ≤ i ≤ n − 1}) on a nécessairement T = ∑ x∈S̃ ( x ) qui est nombre commençant par n "1" et suivit de m chiffres compris
entre 1 et 3 (ni 0 ni 4 : au plus 3 peut venir des si et si0 , il y a nécessairement un 1 qui vient des vi ou vi0 ), ce qui montre que comme
aucun "0" n’apparaît, les instances de 3-SAT peuvent toutes êtres mises à vrai, trouvé à l’aide de la bijection citée plus haut, donc à
partir du certificat de ce problème SUBSET-SUM on retrouve un certificat du problème 3-SAT de départ.
La réduction précédente est polynomiale car on passe de n variables et m clauses à 2n + 2m entiers de m chiffres, SUBSET-SUM est donc NP-complet.
+ Remarque : On peut faire le même travail dans toutes les autres bases qui n’introduisent pas de problèmes dus aux phénomènes
de retenue.
+ Remarque : On peut aussi remplacer les "4" dans t par n’importe quel autre chiffre supérieur à 4, à condition de rajouter des "s"
en nombre suffisant.
+ Remarque : On peut aussi faire des s˜i = 10m+i sans changer t, ça remplace les variables pour lesquelles on peut choisir n’importe
que booléen.