Voglio creare un gate Toffoli controllato da n qubit e implementarlo in QISKit. Può essere fatto? Se é cosi, come?
Voglio creare un gate Toffoli controllato da n qubit e implementarlo in QISKit. Può essere fatto? Se é cosi, come?
Risposte:
Un modo semplice per farlo è illustrato nella Figura 4.10 di Nielsen & Chuang.
Dove U può essere una rotazione a qubit singolo (in questo caso, un gate X).
Questo circuito funziona così: Vogliamo applicare U al qubit target solo se il AND di tutti i qubit di controllo è 1. Un Toffoli normale ci dà il AND di 2 qubit. Quindi, concatenando alcuni Toffolis, possiamo ottenere c1.c2.c3.c4.c5, con la cattura che alcuni qubit "lavoro" (o ancilla) sono stati introdotti per memorizzare risultati intermedi. Dopo aver applicato la CU finale, otteniamo il risultato finale in target. Ora possiamo ripulire i qubit di lavoro intermedi annullando i loro calcoli, riportandoli allo stato | 0>. Questo modello di calcolo reversibile è noto come metodo "compute-copy-uncompute" ed è stato proposto per la prima volta da Charlie Bennett nel 1973 .
Ecco il codice QISKit per costruire il circuito e visualizzarlo:
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)
I rendimenti:
Voglio aggiungere un metodo che non usa i qubit ancilla, ma richiede gate più complicati del semplice non controllato. Credo che questo metodo sia stato presentato per la prima volta da Barenco et. al. in questo documento , Lemma 7.5:
Questa è una definizione ricorsiva, quindi il gate di controllo n qubit è definito in termini di gate di controllo n-1 qubit. Ciò continuerebbe fino a raggiungere il CNOT a due qubit gate.
Questa implementazione è un po 'difficile, tuttavia ne esiste una più semplice se non ci si preoccupa di raccogliere una fase relativa (vedere Lemma 7.9 dello stesso documento).
QuantumCircuit di Qiskit ha il metodo mct per costruire gate Toffoli a controllo multiplo con diverse modalità: basic, basic-dirty-ancilla, advanced, noancilla. Ad esempio cancello Toffoli con 3 qubit di controllo:
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)
Produzione:
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 ├
└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘