Supongamos que tengo un circuito booleano que calcula alguna función f : { 0 , 1 } n → { 0 , 1 } . Suponga que el circuito se compone de AND, OR y NO compuertas con entrada y salida de ventilador como máximo 2.
Sea una entrada dada. Dado C y x , quiero evaluar C en las n entradas que difieren de x en una posición de un solo bit, es decir, para calcular los n valores C ( x 1 ) , C ( x 2 ) , ... , C ( x n ) donde x i es lo mismo que x excepto que es iEl bit está volteado.
¿Hay alguna manera de hacer esto que sea más eficiente que evaluar independientemente n veces en las n entradas diferentes?
Suponga que contiene m puertas. Luego, evaluar independientemente C en todas las n entradas llevará tiempo O ( m n ) . ¿Hay alguna manera de calcular C ( x 1 ) , C ( x 2 ) , ... , C ( x n ) en el tiempo o ( m n ) ?
Contexto opcional: si tuviéramos un circuito aritmético (cuyas puertas son multiplicación, suma y negación) sobre , entonces sería posible calcular las n derivadas direccionales ∂ fenO(m)tiempo. Básicamente, podríamos usar métodos estándar para el cálculo del gradiente (regla de propagación hacia atrás / cadena), en el tiempoO(m). Eso funciona porque la función correspondiente es continua y diferenciable. Me pregunto si se puede hacer algo similar para los circuitos booleanos. Los circuitos booleanos no son continuos y diferenciables, por lo que no puedes hacer el mismo truco, pero ¿quizás hay alguna otra técnica inteligente que puedas usar? ¿Tal vez algún tipo de truco de Fourier, o algo así?
(Pregunta variante: si tenemos puertas booleanas con entrada y salida sin límites, ¿puede hacerlo asintóticamente mejor que evaluar n veces?)
Respuestas:
Consideraría poco probable que tal truco sea fácil de encontrar y / o le brinde ganancias significativas, ya que daría algoritmos de satisfacción no triviales. Así es cómo:
fuente