Supponiamo di avere un circuito booleano che calcola alcune funzioni f : { 0 , 1 } n → { 0 , 1 } . Supponiamo che il circuito sia composto da AND, OR e NOT gate con fan-in e fan-out al massimo 2.
Sia un dato input. Dati C e x , voglio valutare C sugli n ingressi che differiscono da x in una posizione a singolo bit, ovvero calcolare i valori n C ( x 1 ) , C ( x 2 ) , … , C ( x n ) dove x i è uguale a x tranne che è iil bit viene capovolto.
C'è un modo per farlo che è più efficiente che valutare in modo indipendente n volte su n diversi input?
Assumere contiene m cancelli. Quindi la valutazione indipendente di C su tutti gli n ingressi richiederà tempo O ( m n ) . C'è un modo per calcolare C ( x 1 ) , C ( x 2 ) , … , C ( x n ) in o ( m n ) tempo?
Contesto facoltativo: se avessimo un circuito aritmetico (le cui porte sono moltiplicazione, addizione e negazione) su , allora sarebbe possibile calcolare le n derivate direzionali ∂ finO(m)tempo. Fondamentalmente, potremmo usare metodi standard per il calcolo del gradiente (back-propagation / chain rule), inO(m)time. Funziona perché la funzione corrispondente è continua e differenziabile. Mi chiedo se si possa fare qualcosa di simile per i circuiti booleani. I circuiti booleani non sono continui e differenziabili, quindi non puoi fare lo stesso trucco, ma forse c'è qualche altra tecnica intelligente che puoi usare? Forse una specie di trucco di Fourier o qualcosa del genere?
(Domanda variante: se abbiamo porte booleane con fan-in illimitato e fan-out limitato, puoi fare asintoticamente meglio che valutare n volte?)