Suponha que eu tenha um circuito booleano que calcule alguma função f : { 0 , 1 } n → { 0 , 1 } . Suponha que o circuito seja composto de portas AND, OR e NOT com entrada e saída de ventilador no máximo 2.
Vamos ser um dado de entrada. Dados C e x , quero avaliar C nas n entradas que diferem de x em uma única posição de bit, ou seja, para calcular os valores n C ( x 1 ) , C ( x 2 ) , … , C ( x n ) onde x i é o mesmo que x, exceto que seu io bit é invertido.
Existe uma maneira de fazer isso que seja mais eficiente que avaliar independentemente n vezes nas n entradas diferentes?
Suponha contém m portões. A avaliação independente de C em todas as n entradas levará tempo O ( m n ) . Existe uma maneira de calcular C ( x 1 ) , C ( x 2 ) , … , C ( x n ) em o ( m n ) tempo?
Contexto opcional: se tivéssemos um circuito aritmético (cujas portas são multiplicação, adição e negação) sobre , seria possível calcular as n derivadas direcionais ∂ femS(m)o tempo. Basicamente, poderíamos usar métodos padrão para o cálculo do gradiente (retropropagação / regra da cadeia), emO(m)tempo. Isso funciona porque a função correspondente é contínua e diferenciável. Gostaria de saber se algo semelhante pode ser feito para circuitos booleanos. Os circuitos booleanos não são contínuos e diferenciáveis, então você não pode fazer o mesmo truque, mas talvez haja alguma outra técnica inteligente que se possa usar? Talvez algum tipo de truque de Fourier, ou algo assim?
(Pergunta variante: se tivermos portões booleanos com fan-in ilimitado e fan-out limitado, você pode se sair assintoticamente melhor do que avaliar n vezes?)
Respostas:
Eu consideraria improvável que esse truque seja fácil de encontrar e / ou lhe traga ganhos significativos, pois daria algoritmos de satisfação não triviais. Aqui está como:
fonte