Informatik II Minimalpolynome und Implikanten Rainer Schrader Zentrum für Angewandte Informatik Köln 14. November 2008 2 / 41 1 / 41 Minimalpolynome Minimalpolynome Was bisher geschah: • jede Boolesche Funktion kann durch einfache Grundfunktionen Gliederung dargestellt werden • insbesondere lässt sich jede Funktion in disjunktiver Normalform • Implikanten und Primimplikanten • Algorithmus von Quine/McCluskey • dabei können sehr lange Ausdrücke enstehen, • weitere Reduktionen dargestellen die unter Umständen zu komplexen Bausteinen führen • wir wollen jetzt versuchen, kurze Ausdrücke zu erzeugen 3 / 41 4 / 41 Minimalpolynome Minimalpolynome Definition Beispiel: Sei f (x , y , z ) wiederum if x then y else z . (i) ein Literal ist ein Ausdruck der Form xi1 = xi bzw. xi0 = x i (ii) ein Monom ist eine Konjunktion von Literalen a a a (z. B.: x1 1 x2 2 x3 3 mit ai ∈ {0, 1}) f (x , y , z ) = x y z ∨ x yz ∨ xy z ∨ xyz = x (y ∨ y )z ∨ xy (z ∨ z ) = x z ∨ xy (iii) ein Polynom ist eine Disjunktion von Monomen (iv) die Länge eines Monoms ist die Anzahl seiner Literale, die Länge eines Polynoms ist die Summe der Längen seiner Monome • das ist die kürzeste Darstellung als Disjunktion von Produkten • wir wollen im Folgenden diese Verkürzung systematisch durchführen • und führen dazu eine in diesem Zusammenhang gebräuchliche Bemerkung Terminologie ein • disjunktive Normalformen sind Polynome • das Polynom f (x ) = x y z ∨ x y z ∨ x y z ∨ x yz ∨ xyz hat die Länge 15. 5 / 41 6 / 41 Minimalpolynome Minimalpolynome • zur Berechnung eines Monoms der Länge k sind k − 1 ∧-Bausteine • sei P ein Polynom für f ∈ Bn • P heißt Minimalpolynom, wenn kein Polynom für f geringere Länge nötig, • um l Monome mit ∨ zu verknüpfen, sind l − 1 Bausteine nötig. • d.h. # Bausteine = Länge −1. hat • sei p = m1 ∨ m2 ∨ . . . ∨ ml ein Polynom für f • dann gilt: Beispiel • sei f (x ) = x y z ∨ x y z ∨ x y z ∨ x yz ∨ xyz • f ist ein Polynom der Länge 15 mi (a) = 1 =⇒ p(a) = f (a) = 1 • es gilt aber: • ein Monom m heißt Implikante von f , wenn gilt xyz ∨ x y z = x (y ∨ y )z = x z x yz ∨ xyz = yz x y z ∨ xyz = xz m(a) = 1 =⇒ f (a) = 1 • bezeichne I(f ) die Menge der Implikanten von f • damit enthält jedes Polynom für f nur Implikanten von f • damit ist f (x ) = x z ∨ yz ∨ xz ein Polynom der Länge 6. 7 / 41 8 / 41 Minimalpolynome Minimalpolynome • Beobachtung: nach dem Umformungslemma gilt: • m ∈ I(f ) heißt Primimplikante von f , wenn keine echte Verkürzung von m Implikante ist x ∨ xy = x ∨ (x ∧ y ) • sei PI(f ) die Menge der Primimplikanten = (x ∨ x ) ∧ (x ∨ y ) • damit können wir zeigen: = x ∧ (x ∨ y ) =x • allgemeiner: seien m1 , m2 ∈ I(f ) • m2 eine Verlängerung von m1 , so gilt: Satz Jedes Minimalpolynom für f ist Disjunktion von Primimplikanten von f . • m2 = m1 ∧ m3 und m1 ∨ m2 = m1 ∨ (m1 ∧ m3 ) = m1 • d. h. m2 kann weggelassen werden. 2 Bleibt zu klären, wie man ein Minimalpolynom bestimmen kann. 10 / 41 9 / 41 Minimalpolynome Minimalpolynome Die Algorithmen zur Berechnung von Minimalpolynomen bestehen aus zwei Hauptschritten: Gliederung a) Berechnung der Primimplikanten • Implikanten und Primimplikanten • Algorithmus von Quine/McCluskey Im Allgemeinen ist das Polynom aller Primimplikanten nicht minimal. Daher folgt: • weitere Reduktionen b) weitere Reduktion der Primimplikanten 11 / 41 12 / 41 Minimalpolynome Minimalpolynome Lemma • offensichtlich bilden die Minterme Implikanten • damit kennen wir zumindest alle Implikanten maximaler Länge Sei m ein Monom das weder x noch x enthält. Dann ist m ∈ I(f ) ⇐⇒ mx ∈ I(f ) und mx ∈ I(f ). • wenn eine Implikante nicht minimal ist, enthält sie einen kürzeren Beweis: Ausdruck, der ebenfalls Implikante ist • sei m ∈ I(f ) • um zu testen, ob ein Monom m prim ist, müssten wir m∈I(f ) • ist mx (a) = 1 =⇒ m(a) = 1 =⇒ f (a) = 1. • entsprechend für mx e von m generieren • alle Verkürzungen m e eine Implikante ist • und testen, ob m • ein solches Vorgehen würde sehr lange dauern • seien umgekehrt beide Monome mx , mx ∈ I(f ) • ist m(a) = 1, so ist entweder mx (a) = 1 oder mx (a) = 1 • glücklicherweise gilt: =⇒ f (a) = 1, d. h. m ∈ I(f ). 2 14 / 41 13 / 41 Minimalpolynome Minimalpolynome Folgerung: Algorithmus zur Berechnung der Primimplikanten (1) sei m Implikante, aber nicht Primimplikante • berechne alle Implikanten Qk von f der Länge k • berechne alle Primimplikanten Pk der Länge k S • dann ist PI(f ) = Pi • nach dem letzten Lemma existiert dann ein Literal x , so dass e und • m = mx e ist eine Implikante • m • das Verfahren startet mit der Menge Qn = der Minterme ma mit a ∈ f −1 (1). (2) sei mx ∈ I(f ) und m ∈ I(f ) • allgemein wird aus Qi zunächst Qi −1 und Pi berechnet. • ist Qi = ∅, so sind nach dem vorigen Lemma Q1 , . . . , Qi −1 und • nach dem letzten Lemma ist dann auch mx ∈ I(f ) • d.h. das Entfernen nichtnegierter Literale reicht, um zu testen, ob eine P1 , . . . , Pi leer. Implikante prim ist 15 / 41 16 / 41 Minimalpolynome Sei f ∈ B4 durch ihre Minterme in Q4 definiert: Algorithmus von Quine / McCluskey Input: Output: Minimalpolynome Beispiel Funktionstabelle (a, f (a)) für a ∈ Bn PI(f ) Q4,4 = ∅ Q4,3 = {x 1 x 2 x3 x 4 , x 1 x2 x 3 x 4 } Q4,2 = {x 1 x 2 x3 x4 , x 1 x2 x 3 x4 , x1 x 2 x3 x 4 } (1) entnimm aus der Funktionstabelle die Menge Qn der Minterme ma Q4,1 = {x 1 x2 x3 x4 , x1 x 2 x3 x4 , x1 x2 x3 x 4 } setze i = n Q4,0 = {x1 x2 x3 x4 } (2) while Qi 6= ∅ i =i −1 Qi = {m : es existiert ein j mit xj , x j 6∈ m und mxj , mx j ∈ Qi +1 } Pi +1 = {m ∈ Qi +1 : es gibt keine Verkürzung von m in Qi } end while Q3,3 = ∅ Q3,2 = {x 1 x 2 x3 , x 2 x3 x 4 , x 1 x2 x 3 } Q3,1 = {x 1 x3 x4 , x 2 x3 x4 , x 1 x2 x4 , x1 x 2 x3 , x1 x3 x 4 } Q3,0 = {x2 x3 x4 , x1 x3 x4 , x1 x2 x3 } (3) PI(f ) = P0 ∪ . . . ∪ Pn P4 = ∅ (da alle Elemente angefasst wurden) 18 / 41 17 / 41 Minimalpolynome Minimalpolynome Q3,3 = ∅ Q3,2 = {x 1 x 2 x3 , x 2 x3 x 4 , x 1 x2 x 3 } Lemma Q3,1 = {x 1 x3 x4 , x 2 x3 x4 , x 1 x2 x4 , x1 x 2 x3 , x1 x3 x 4 } Das Verfahren von Quine/McCluskey berechnet alle Primimplikanten. Q3,0 = {x2 x3 x4 , x1 x3 x4 , x1 x2 x3 } P4 = ∅ (da alle Elemente angefasst wurden) Beweis: Q2,2 = ∅ • Qn ist die Menge der Implikanten der Länge n • die Menge Qi +1 der Implikanten der Länge i + 1 wird nach vorigem Q2,1 = {x 2 x3 } Q2,0 = {x3 x4 , x1 x3 } Lemma korrekt berechnet • hat eine Implikante der Länge i + 1 Verkürzungen, die ebenfalls P3 = {x 1 x2 x 3 , x 1 x2 x4 } (sind Primimplikanten) Implikanten sind: • nach dem Lemma hat sie auch eine solche der Länge i • d.h. Pi +1 enthält alle Primimplikanten der Länge i + 1. P2 = Q2 = {x 2 x3 , x3 x4 , x1 x3 } (sind Primimplikanten) PI(f ) = {x 1 x2 x 3 , x 1 x2 x4 , x1 x3 , x 2 x3 , x3 x4 } f (x1 , x2 , x3 , x4 ) = x 1 x2 x 3 ∨ x 1 x2 x4 ∨ x1 x3 ∨ x 2 x3 ∨ x3 x4 2 Länge: 12 19 / 41 20 / 41 Minimalpolynome Minimalpolynome Bemerkungen zur Laufzeit Bemerkungen zur Laufzeit Es gibt: ` ´ (1) ni Möglichkeiten, i Variable aus n auszuwählen (5) es gibt höchstens 3n Monome über n Variablen (2) jeweils 2i Möglichkeiten, diese Variablen positiv oder negativ zu setzen ` ´ (3) damit ni 2i Monome der Länge i (4) und somit höchstens ! n X n i 2 i = i =0 (6) Operationen wie „Suchen” und „Einfügen” lassen sich mit Hilfe von Heaps in O(log 3n )= O(n) Schritten ausführen (7) es ist sinnvoll, Qi +1 in Mengen (verkettete Listen) Qi +1,l , l = 0, . . . , i + 1, zu zerlegen, wobei Qi +1,l aus den Monomen besteht, die l negative Variablen haben. ! n X n i n−i 2 ·1 i (8) für m ∈ Qi +1,l und xk eine der i + 1 − l positiven Variablen sei m 0 ist die Verkürzung von m durch Weglassen von xk i =0 = (2 + 1)n = 3n (9) es ist dann ausreichend zu untersuchen, ob m 0 x k ∈ Qi +1,l +1 Monome über n Variablen. 22 / 41 21 / 41 Minimalpolynome Minimalpolynome Bemerkungen zur Laufzeit (10) D.h. für jede Implikante muss nach höchstens n anderen Implikanten gesucht werden (11) somit: Gliederung Laufzeit = Anzahl der Implikanten · Anzahl Suchoperationen · Suchzeit • Implikanten und Primimplikanten • Algorithmus von Quine/McCluskey = O(3n · n · n) = O(3n n 2 ). • weitere Reduktionen (12) Der Input hat die Länge N = 2n . (d.h. n = log N und 3n = N log 3 ) Satz Der Algorithmus von Quine / McCluskey berechnet PI(f ) in O(N log 3 · (log N )2 ) Schritten. 23 / 41 24 / 41 Minimalpolynome Minimalpolynome Beispiel: sei f ∈ B4 wie vorher • Ist dies die kürzeste Darstellung von f ? • Wir müssen möglichst „kurze“ Primimplikanten suchen, so dass für x 1 x2 x 3 x 1 x2 x4 x1 x3 x 2 x3 x3 x4 jedes a ∈ f −1 ({1}) eine Primimplikante p existiert mit p(a) = 1. • Eine Primimplikantentafel ist eine Matrix T : s1 0010 s2 0100 s3 0011 s4 0101 s5 1010 s6 0111 s7 1011 s8 1110 s9 1111 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 1 0 1 • die Zeilen entsprechen den Primimplikanten m1 , . . . , mk von f • die Spalten entsprechen den Eingaben a1 , . . . , al mit f (ai ) = 1 • wir suchen „kurze“ Zeilen, so dass jede Spalte in mindestens einer Zeile eine 1 hat • das Matrixelement Tij hat den Wert mi (aj ). • wir beschreiben im folgenden eine Heuristik, die eine zulässige, aber nicht notwendigerweise optimale (kostenminimale) Lösung des Problems liefert. 25 / 41 26 / 41 Minimalpolynome Minimalpolynome Regel 1: Spalten streichen • seien s und s 0 zwei Spalten mit s ≤ s 0 (komponentenweise) • s 0 kann gestrichen gestrichen werden, x 1 x2 x 3 x 1 x2 x4 x1 x3 x 2 x3 x3 x4 • denn jede Zeile, die s überdeckt, überdeckt auch s 0 x 1 x2 x 3 x 1 x2 x4 x1 x3 x 2 x3 x3 x4 s1 0010 0 0 0 1 0 s2 0100 1 0 0 0 0 s3 0011 0 0 0 1 1 s4 0101 1 1 0 0 0 s5 1010 0 0 1 1 0 s6 0111 0 1 0 0 1 s7 1011 0 0 1 1 1 s8 1110 0 0 1 0 0 s9 1111 0 0 1 0 1 • im Beispiel: s1 ≤ s3 , s2 ≤ s4 , s1 ≤ s5 , s1 ≤ s7 , s8 ≤ s9 . • streiche also die Spalten 3, 4, 5, 7 und 9. 27 / 41 s1 0010 0 0 0 1 0 s2 0100 1 0 0 0 0 s3 0011 0 0 0 1 1 s4 0101 1 1 0 0 0 s5 1010 0 0 1 1 0 s6 0111 0 1 0 0 1 s7 1011 0 0 1 1 1 s8 1110 0 0 1 0 0 s9 1111 0 0 1 0 1 Nach Streichen von Spalten: x 1 x2 x 3 x 1 x2 x4 x1 x3 x 2 x3 x3 x4 s1 0010 0 0 0 1 0 s2 0100 1 0 0 0 0 s6 0111 0 1 0 0 1 s8 1110 0 0 1 0 0 28 / 41 Minimalpolynome Minimalpolynome Regel 2: („Kernimplikanten”) • sei si eine Spalte, die nur eine „1” enthält • die zu einer solchen Spalte gehörige Zeile muss auf jeden Fall x 1 x2 x 3 x 1 x2 x4 x1 x3 x 2 x3 x3 x4 genommen werden (Kernimplikante) • danach kann man die Zeile (und – wenn nicht schon vorher geschehen – von ihr überdeckten Spalten streichen) x 1 x2 x 3 x 1 x2 x4 x1 x3 x 2 x3 x3 x4 s1 0010 0 0 0 1 0 s2 0100 1 0 0 0 0 s6 0111 0 1 0 0 1 s8 1110 0 0 1 0 0 s1 0010 0 0 0 1 0 s2 0100 1 0 0 0 0 s6 0111 0 1 0 0 1 s8 1110 0 0 1 0 0 Nach Fixieren von Kernimplikanten: x 1 x2 x4 x3 x4 s6 0111 1 1 • im Beispiel: Kernimplikanten sind s1 (x 2 x3 ), s2 (x 1 x2 x 3 ), s8 (x1 x3 ). 29 / 41 30 / 41 Minimalpolynome Minimalpolynome Regel 3: („Zeilen streichen”) • seien z und z ’ zwei Zeilen • mit z 0 ≤ z (komponentenweise) und Länge(z 0 ) ≥ Länge(z ), • so streiche z 0 • die reduzierte Implikantentafel können wir als Matrix auffassen • die verbliebenen Primimplikanten entsprechen den Zeilen • jeder Zeile sind Kosten ci zugeordnet Kosten (ci = b Länge der i-ten Primimplikante) • im Beispiel: nimm noch x3 x4 hinzu: • wir suchen eine Teilmenge von Zeilen,so dass f (x1 , x2 , x3 , x4 ) = x 1 x2 x 3 ∨ x1 x3 ∨ x 2 x3 ∨ x3 x4 • in jeder Spalte mindestens eine „1” steht • die Summe der zeilenkosten minimal ist • die nach Anwendung der Regeln 1-3 entstandene Matrix heißt reduzierte Primimplikantentafel • wähle in der reduzierten Primimplikantentafel eine „möglichst kurze” Teilmenge von Zeilen, so dass in jeder Spalte mindestens eine „1” steht 31 / 41 32 / 41 Minimalpolynome Minimalpolynome • sei E die Menge der Spaltenindices • jede Zeile entspricht einer Teilmenge von E Überdeckungsproblem Mengenüberdeckungsproblem: gegeben: gegeben: • eine {0, 1}-Matrix A mit k Zeilen und l Spalten • Kosten ci für die i-te Zeile • endliche Menge E • Familie M = {M1 , M2 , . . ., Mk } von Teilmengen von E • Abbildung c : M → R+ (Kosten) gesucht: • eine „billigste” Teilmenge von Zeilen, • so dass in jeder Spalte mindestens eine „1” steht gesucht: • Teilfamilie M∗ ⊆ M, die E überdeckt, d.h. [ • NP-schwer (; später in Vorlesung) • das Problem lässt sich auch mengentheoretisch formulieren: M =E M ∈M∗ • und c(M∗ ) = X c(M ) M ∈M∗ ist minimal unter allen Überdeckungen 33 / 41 Minimalpolynome 34 / 41 Minimalpolynome implizite Enumeration für das MÜP (prinzipielles Vorgehen) (1) erzeuge eine Liste L0 , die nur die leere Menge enthält (2) for i = 1, . . . , k do (3) kopiere die Liste Li −1 nach Li (4) für jede Menge A ∈ Li −1 (5) erzeuge die Menge A0 = A ∪ {Mi } (6) füge A0 zu Li hinzu, falls (7) c(A0 ) ist kleiner als der beste bisher bekannte Wert einer Überdeckung (8) A0 lässt sich mit Mengen aus {Mi +1 , . . . , Mk } zu einer Überdeckung fortsetzen (9) end falls (10) end für (11) end für implizite Enumeration für das MÜP • für das MÜP ist es unwahrscheinlich, dass ein effizienter (polynomieller) Algorithmus existiert • man behilft sich in der Praxis häufig mit „impliziter Enumeration” • das Vorgehen ist übertragbar auf viele andere Probleme 35 / 41 36 / 41 Minimalpolynome Minimalpolynome implizite Enumeration für das MÜP (prinzipielles Vorgehen) • der Algorithmus zählt im Prinzip alle 2k Mengen auf, die sich als Vereinigung von Mengen in M darstellen lassen implizite Enumeration für das MÜP (Tiefensuche) • eine solche Menge A wird nur dann nicht weiter betrachtet, wenn • bisher haben wir die Teilüberdeckungen erzeugt, indem wir: • ihre Kosten bereits größer sind als der beste bisher bekannte Wert einer Überdeckung • alle bereits generierten Lösungen kopiert haben und • oder sie sich nicht zu einer Überdeckung ergänzen lässt • zusätzlich jede dieser Lösungen um eine neue Mengen Mi erweitert haben • die Laufzeit hängt somit davon ab, wie schnell eine kostengünstige • wir ändern jetzt die Reihenfolge, in der wir die Lösungen erzeugen • und versuchen, möglichst schnell eine Überdeckung zu generieren Überdeckung gefunden wird • das vorige Verfahren erzeugt die Mengen in einer Art „Breitensuche“ • dabei wird u.U. erst sehr spät eine Überdeckung erzeugt • die nächste Variante versucht, durch „Tiefensuche“ möglichst früh, eine kostengünstige Überdeckung zu generieren 37 / 41 38 / 41 Minimalpolynome Minimalpolynome Variablen, Bezeichnungen, Datenstrukturen: • für N ⊆ M setze: c(N ) [ := X Algorithmus MÜP-IE c(M ) Eingabe: M ∈N N := [ M E = {e1 , e2 , . . ., en } M = {M1 , M2 , . . ., Mk }, Mi ⊆ E M ∈N c : M → R+ S OBdA gelte ki=1 Mi = E • sei Mi := {Mi +1 , Mi +2 , . . ., Mk } (1 ≤ i ≤ k ) • verwende stack für Tupel (N , i ) ∈ 2M × {0, 1, . . ., k }, wobei gilt: Ausgabe: billigste Überdeckung M∗ • N ⊆ Mi • N ist eine Teilüberdeckung • N muss nur noch durch Mengen aus Mi +1 erweitert werden 39 / 41 40 / 41 Minimalpolynome Minimalpolynome Algorithmus MÜP-IE M∗ = M Satz Der Algorithmus MÜP-IE berechnet eine billigste Überdeckung M∗ in Zeit O(2k · k · n). N =∅ i =0 push ((N , i ),stack) Beweis: while stack 6= leer do • die Korrektheit ist offensichtlich • Laufzeit: pro while-Durchlauf: O(k · n) Zeit • sei T (k ) die maximale Anzahl der Tupel (N , i ) auf dem Stapel • es gilt T (1) = 2, T (k ) = 2 · T (k − 1) ⇒ T (k ) = 2k . (N , i ) = pop(stack) if c(N ) < c(M∗ ) then do S if N = E then M∗ := N else if i < k then do push((N ∪ {Mi +1 }, i + 1),stack) S if N ∪ Mi +1 = E then push((N , i + 1),stack) • die Abschätzung ist für die Praxis oft sehr pessimistisch, • die if-Abfragen sparen oft viel Arbeit end if end if end while 41 / 41 42 / 41