Angenommen, ich habe eine boolesche Schaltung , die eine Funktion berechnet . Angenommen, die Schaltung besteht aus UND-, ODER- und NICHT-Gattern mit höchstens Fan-In und Fan-Out 2.f : { 0 , 1 } n → { 0 , 1 }
Sei eine gegebene Eingabe. Wenn und , möchte ich an den Eingängen auswerten , die sich von in einer einzelnen Bitposition unterscheiden, dh um die Werte zu berechnen wobei dasselbe ist wie außer dass sein tes Bit umgedreht wird. C x C n x n C ( x 1 ) , C ( x 2 ) , … , C ( x n ) x i x i
Gibt es eine effizientere Möglichkeit, als mal an den verschiedenen Eingängen unabhängig auszuwerten ?n n
Angenommen, enthält Tore. Die unabhängige Auswertung von an allen Eingängen dauert dann . Gibt es eine Möglichkeit, in Zeit zu berechnen ?m C n O ( m n ) C ( x 1 ) , C ( x 2 ) , … , C ( x n ) o ( m n )
Optionaler Kontext: Wenn wir eine arithmetische Schaltung (deren Gatter Multiplikation, Addition und Negation sind) über , wäre es möglich, die n Richtungsableitungen ∂ f zu berechneninZeit. Grundsätzlich könnten wir Standardmethoden zur Berechnung des Gradienten (Rückausbreitung / Kettenregel) in. Das funktioniert, weil die entsprechende Funktion stetig und differenzierbar ist. Ich frage mich, ob etwas Ähnliches für boolesche Schaltungen getan werden kann. Boolesche Schaltkreise sind nicht kontinuierlich und differenzierbar, daher können Sie nicht denselben Trick ausführen, aber vielleicht gibt es eine andere clevere Technik, die Sie verwenden können? Vielleicht eine Art Fourier-Trick oder so?
(Variantenfrage: Wenn wir boolesche Gates mit unbegrenztem Fan-In und begrenztem Fan-Out haben, können Sie dies asymptotisch besser machen als die Bewertung von n -Zeiten?)
Antworten:
Ich halte es für unwahrscheinlich, dass ein solcher Trick leicht zu finden ist und / oder Ihnen erhebliche Vorteile bringt, da er nicht triviale Erfüllbarkeitsalgorithmen liefert. Hier ist wie:
Erstens, obwohl es scheinbar einfacher ist, kann Ihr Problem tatsächlich das allgemeinere Problem lösen, bei gegebener Schaltung und N Eingängen x 0 , … , x N - 1 C an allen Eingängen schneller als ˜ O ( N ⋅ | zu bewerten) C | ) Zeit. Der Grund ist, dass wir C in eine Schaltung C ' der Größe | optimieren können C | + ˜ O ( N n ) welche bei Eingabe iC. N. x0, …,xN- 1 C. O~(N⋅ |C| ) C. C.' |C| +O~(Nn ) gibt C ( x i ) aus . Grundsätzlich erstellen wir nur eine kleine Nachschlagetabelle, die 0 i 10 N - 1 - i an x i sendet, und verdrahten sie mit C.0ich10N.- 1 - i C.( xich) 0ich10N.- 1 - i xich C. .
Nichttriviale Algorithmen zur Batch-Bewertung von Booleschen Schaltkreisen können dann verwendet werden, um schnelle Erfüllbarkeitsalgorithmen zu erstellen. Hier ist ein Beispiel in dem einfachen Fall, in dem wir annehmen, dass wir einen Algorithmus haben, der die Auswertung in der Zeit für jede Konstante ϵ durchführt > 0 . Bei der Eingabe einer Schaltung C können wir die Erfüllbarkeit entscheiden, indem wir C in eine Schaltung C erweiternÖ~( | C.|2 - ϵ+ ((N⋅ | C.| )1 - ϵ / 2+ N.2 - ϵ) ϵ > 0 C. C. Größe 2 n / 2 ⋅ | C | Dies ist nur das ODER über alle möglichen Auswahlmöglichkeiten der ersten n / 2 Eingänge für C (wobei die anderen Eingänge frei bleiben). Wir bewerten dann C ' an allen seinen 2 n / 2 Eingängenchargenweise. Das Endergebnis ist, dass wir eine zufriedenstellende Zuordnung zu C 'finden, wenn C erfüllbar ist. Die Laufzeit beträgt ˜ O ( 2 ( n / 2 ) ( 2 - ϵ)C.' 2n / 2⋅ | C.| n / 2 C. C.' 2n / 2 C.' C. .Ö~( 2( n / 2 ) ( 2 - ϵ )⋅ | C.|2 - ϵ) = O.~( 2n ( 1 - ϵ / 2 )⋅ Poly ( | C.| ))
quelle