Sebuah sirkuit boolean di TCS pada dasarnya adalah DAG terdiri dari Dan, Atau, Tidak gerbang, dan dengan apa yang diketahui adalah "kelengkapan fungsional" mereka dapat menghitung semua fungsi mungkin. misalnya ini adalah prinsip dasar dalam ALU .
Tantangan: buat sirkuit untuk menentukan apakah angka 8-biner-digit dapat dibagi oleh 3 dan entah bagaimana memvisualisasikan hasil Anda (yaitu dalam beberapa jenis gambar)
Kriteria penilaian untuk pemilih didasarkan pada apakah kode untuk menghasilkan rangkaian digeneralisasikan dengan baik ke angka ukuran yang sewenang-wenang, dan apakah visualisasi yang dibuat secara algoritmik kompak / seimbang tetapi masih dapat dibaca oleh manusia (yaitu visualisasi dengan pengaturan tangan tidak diperbolehkan). yaitu visualisasi hanya untuk n = 8 tetapi kode idealnya akan bekerja untuk semua 'n'. entri pemenang baru saja terpilih.
Pertanyaan serupa: Bangun mesin pengganda menggunakan gerbang logika NAND
gate-golf
? tag itu tidak ada. catatan untuk peserta: sebutkan bahasa / alat visualisasi apa yang Anda gunakan. jika orang lain ingin memasukkan komentar ttg. jika tidak, akan menerima tonite pemenang. Terima kasih banyak kepada responden sejauh ini "BTE" lebih baik dari yang diharapkan!Jawaban:
Grafik mempertahankan 3 boolean di setiap level i. Mereka mewakili fakta bahwa bit i tingkat tinggi dari angka tersebut sama dengan 0, 1, atau 2 mod 3. Pada setiap level kita menghitung tiga bit berikutnya berdasarkan pada tiga bit sebelumnya dan bit input berikutnya.
Inilah kode python yang menghasilkan grafik. Ubah saja N untuk mendapatkan jumlah bit yang berbeda, atau K untuk mendapatkan modulus yang berbeda. Jalankan output dari program python melalui titik untuk menghasilkan gambar.
sumber
Kedalaman: 7 (logaritmik), 18x AND, 6x OR, 7x XOR, 31 gerbang (linier)
Biarkan saya menghitung jumlah digit dalam basis empat, modulo tiga:
sirkuit digambar dalam Logisim
Generalisasi, secara formal (semoga agak mudah dibaca):
sekarang dalam bahasa Inggris:
Sementara ada lebih dari dua bit dalam angka, ambil dua pasang bit terendah dan jumlah mereka modulo 3, kemudian tambahkan hasilnya ke belakang angka, kemudian kembali jika pasangan terakhir adalah nol modulo 3. Jika ada yang aneh jumlah bit dalam jumlah, tambahkan bit nol ekstra ke atas, lalu poles dengan propagasi nilai konstan.
Menambahkan ke belakang alih-alih ke depan memastikan pohon tambahan adalah pohon seimbang daripada daftar tertaut. Ini, pada gilirannya, memastikan kedalaman logaritmik dalam jumlah bit: lima gerbang dan tiga tingkat untuk pembatalan pasangan, dan gerbang tambahan di ujungnya.
Tentu saja, jika perkiraan planaritas diinginkan, berikan pasangan atas yang tidak dimodifikasi ke lapisan berikutnya alih-alih membungkusnya ke depan. Namun ini lebih mudah diucapkan daripada diimplementasikan (bahkan dalam pseudocode). Jika jumlah bit dalam angka adalah kekuatan dua (seperti yang berlaku di sistem komputer modern apa pun pada Maret 2014), tidak ada pasangan bebas akan terjadi.
Jika tata letak mempertahankan lokalitas / melakukan minimalisasi panjang rute, itu harus membuat sirkuit terbaca.
Kode Ruby ini akan menghasilkan diagram sirkuit untuk sejumlah bit (bahkan satu bit). Untuk mencetak, buka di Logisim dan ekspor sebagai gambar:
akhirnya, ketika diminta untuk membuat output untuk 32 bit, layouter saya menghasilkan ini. Memang, ini tidak terlalu kompak untuk input yang sangat luas:
sumber
2 × 24 BUKAN, 2 × 10 + 5 DAN, 2 × 2 + 5 ATAU, 2 × 2 NOR
Ini sama sekali tidak berskala. Seperti tidak sama sekali. Mungkin saya akan berusaha memperbaikinya.
Saya memang menguji ini untuk angka hingga 30 dan itu bekerja dengan baik.
Kedua sirkuit besar tersebut menghitung jumlah input aktif:
Jika selisih dari angka-angka itu adalah
0
atau3
jumlahnya dapat dibagi dengan3
. Rangkaian kanan bawah pada dasarnya memetakan setiap kombinasi yang valid (4,4
,4,1
,3,3
,3,0
,2, 2
,1, 1
,0, 0
) ke dalam atau.Lingkaran kecil di tengah adalah LED yang menyala jika jumlahnya jika habis dibagi 3 dan mematikan sebaliknya.
sumber