Misalkan saya memiliki sirkuit boolean yang menghitung beberapa fungsi f : { 0 , 1 } n → { 0 , 1 } . Asumsikan sirkuit terdiri dari AND, OR, dan NOT gerbang dengan fan-in dan fan-out paling banyak 2.
Biarkan menjadi input yang diberikan. Mengingat C dan x , saya ingin mengevaluasi C pada n input yang berbeda dari x dalam posisi bit tunggal, yaitu, untuk menghitung n nilai C ( x 1 ) , C ( x 2 ) , ... , C ( x n ) di mana x i sama dengan x kecuali bahwa ibit th dibalik.
Apakah ada cara untuk melakukan hal ini yang lebih efisien yang independen mengevaluasi n kali pada n yang berbeda input?
Asumsikan mengandung m gerbang. Kemudian mengevaluasi C secara independen pada semua n input akan memakan waktu O ( m n ) . Apakah ada cara untuk menghitung C ( x 1 ) , C ( x 2 ) , ... , C ( x n ) dalam waktu o ( m n ) ?
Konteks opsional: Jika kita memiliki sirkuit aritmatika (yang gandanya multiplikasi, penjumlahan, dan negasi) di atas , maka akan mungkin untuk menghitung n directional derivatives ∂ fdalam waktuO(m). Pada dasarnya, kita dapat menggunakan metode standar untuk perhitungan gradien (back-propagation / aturan rantai), dalam waktuO(m). Itu bekerja karena fungsi yang sesuai kontinu dan dapat dibedakan. Saya bertanya-tanya apakah hal serupa dapat dilakukan untuk sirkuit boolean. Sirkuit Boolean tidak kontinu dan dapat dibedakan, jadi Anda tidak dapat melakukan trik yang sama, tetapi mungkin ada beberapa teknik pintar lain yang dapat digunakan? Mungkin semacam trik Fourier, atau semacamnya?
(Varian pertanyaan: jika kita memiliki gerbang boolean dengan fan-in tanpa batas dan fan-out terikat, dapatkah Anda melakukan asymptotically dengan lebih baik daripada mengevaluasi n kali?)
Jawaban:
Saya menganggap itu tidak mungkin bahwa trik seperti itu mudah ditemukan dan / atau akan memberi Anda keuntungan yang signifikan, karena akan memberikan algoritma kepuasan yang tidak trivial. Begini caranya:
Pertama-tama, sementara tampaknya lebih mudah, masalah Anda sebenarnya dapat memecahkan masalah yang lebih umum, mengingat rangkaian dan N input x 0 , ... , x N - 1 , evaluasi C pada semua input lebih cepat daripada ˜ O ( N ⋅ | C | ) waktu. Alasannya adalah bahwa kita dapat men-tweak C menjadi sirkuit C ' ukuran | C | + ˜ O ( N n ) yang, pada input 0C N x0,…,xN−1 C O~(N⋅|C|) C C′ |C|+O~(Nn) , menghasilkan C ( x i ) . Pada dasarnya, kami hanya membuat tabel kecil yang mengirimkan 0 i 10 N - 1 - i untuk x i , dan kawat itu ke C .0i10N−1−i C(xi) 0i10N−1−i xi C
Algoritma nontrivial untuk evaluasi batch dari sirkuit boolean kemudian dapat digunakan untuk membuat algoritma kepuasan yang cepat. Berikut adalah contoh dalam kasus sederhana di mana kita mengira kita memiliki algoritma yang melakukan evaluasi dalam waktu untuk setiap konstanta ϵ > 0 . Pada input sirkuit C , kita dapat memutuskan kepuasan dengan memperluas C ke sirkuit CO~(|C|2−ϵ+(N⋅|C|)1−ϵ/2+N2−ϵ) ϵ>0 C C Ukuran 2 n / 2 ⋅ | C | yang hanya OR atas semua pilihan yang mungkin dariinput n / 2 pertamake C (membiarkan input lain bebas). Kami kemudian melakukan batch-evaluasi C ′ pada semuainput 2 n / 2-nya . Hasil akhirnya adalah bahwa kami menemukan tugas yang memuaskan untuk C ′ jika C memuaskan. Waktu berjalan adalah ˜ O ( 2 ( n / 2 ) ( 2 - ϵC′ 2n/2⋅|C| n/2 C C′ 2n/2 C′ C .O~(2(n/2)(2−ϵ)⋅|C|2−ϵ)=O~(2n(1−ϵ/2)⋅poly(|C|))
sumber