Saya ingin membuat gerbang Toffoli yang dikendalikan oleh n qubit, dan mengimplementasikannya di QISKit. Bisakah ini dilakukan? Jika ya, bagaimana caranya?
Saya ingin membuat gerbang Toffoli yang dikendalikan oleh n qubit, dan mengimplementasikannya di QISKit. Bisakah ini dilakukan? Jika ya, bagaimana caranya?
Jawaban:
Cara sederhana untuk melakukan ini diilustrasikan pada Gambar 4.10 dari Nielsen & Chuang.
Di mana U dapat berupa rotasi qubit tunggal (dalam hal ini, gerbang X).
Rangkaian ini berfungsi seperti ini: Kami ingin menerapkan U ke target qubit hanya jika AND dari semua qubit kontrol adalah 1. Toffoli normal memberi kita AND dari 2 qubit. Jadi dengan merantai beberapa Toffolis, kita bisa mendapatkan c1.c2.c3.c4.c5, dengan tangkapan bahwa beberapa qubit "kerja" (atau ancilla) telah diperkenalkan untuk menyimpan hasil antara. Setelah menerapkan CU akhir, kami mendapatkan hasil akhir sesuai target. Sekarang kita dapat membersihkan qubit kerja menengah dengan membatalkan perhitungannya, mengembalikannya ke status | 0>. Model perhitungan reversibel ini dikenal sebagai metode "compute-copy-uncompute", dan pertama kali diusulkan oleh Charlie Bennett pada tahun 1973 .
Berikut adalah kode QISKit untuk membangun sirkuit dan memvisualisasikannya:
from qiskit import QuantumRegister, QuantumCircuit
n = 5 # must be >= 2
ctrl = QuantumRegister(n, 'ctrl')
anc = QuantumRegister(n-1, 'anc')
tgt = QuantumRegister(1, 'tgt')
circ = QuantumCircuit(ctrl, anc, tgt)
# compute
circ.ccx(ctrl[0], ctrl[1], anc[0])
for i in range(2, n):
circ.ccx(ctrl[i], anc[i-2], anc[i-1])
# copy
circ.cx(anc[n-2], tgt[0])
# uncompute
for i in range(n-1, 1, -1):
circ.ccx(ctrl[i], anc[i-2], anc[i-1])
circ.ccx(ctrl[0], ctrl[1], anc[0])
from qiskit.tools.visualization import circuit_drawer
circuit_drawer(circ)
Hasil:
Saya ingin menambahkan metode yang tidak menggunakan ancilla qubits, tetapi memang membutuhkan gerbang yang lebih rumit daripada hanya dikendalikan-tidak. Saya percaya metode ini pertama kali dipresentasikan oleh Barenco et. Al. dalam tulisan ini , Lemma 7.5:
Ini adalah definisi rekursif, sehingga gerbang kontrol n qubit didefinisikan dalam hal gerbang kontrol n-1 qubit. Ini akan berlanjut sampai Anda mencapai dua gerbang qotit CNOT.
Implementasi ini sedikit sulit, namun, ada yang lebih sederhana jika seseorang tidak keberatan mengumpulkan fase relatif (lihat Lemma 7.9 dari makalah yang sama).
QuantumCircuit Qiskit memiliki metode mct untuk membangun gerbang Toffoli multi-kontrol dengan beberapa mode: dasar, dasar-kotor-ancilla, lanjutan, noancilla. Misalnya gerbang Toffoli dengan 3 qubit kontrol:
from qiskit import QuantumCircuit, QuantumRegister
controls = QuantumRegister(3, "c_qb")
target = QuantumRegister(1, "t_qb")
circuit = QuantumCircuit(controls, target)
circuit.mct(controls, target[0], None, mode='advanced')
print(circuit)
Keluaran:
c_qb_0: |0>──────■────────■────────────────■──────────────────────────────────■──────────────────────────────────■────────────────────
│ ┌─┴─┐ ┌─┴─┐ │ │
c_qb_1: |0>──────┼──────┤ X ├──────■─────┤ X ├──────■────────■────────────────┼─────────────────■────────────────┼────────────────────
│ └───┘ │ └───┘ │ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐
c_qb_2: |0>──────┼─────────────────┼────────────────┼──────┤ X ├──────■─────┤ X ├──────■──────┤ X ├──────■─────┤ X ├──────■───────────
┌───┐ │-pi/4 ┌───┐┌───┐ │pi/4 ┌───┐┌───┐ │-pi/4 ├───┤┌───┐ │pi/4 ├───┤┌───┐ │-pi/4 ├───┤┌───┐ │pi/4 ├───┤┌───┐ │-pi/4 ┌───┐
t_qb_0: |0>┤ H ├─■──────┤ H ├┤ H ├─■─────┤ H ├┤ H ├─■──────┤ H ├┤ H ├─■─────┤ H ├┤ H ├─■──────┤ H ├┤ H ├─■─────┤ H ├┤ H ├─■──────┤ H ├
└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘