Come posso implementare un gate Toffoli n-bit?


Risposte:


19

Un modo semplice per farlo è illustrato nella Figura 4.10 di Nielsen & Chuang. n-

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:

circuito generato da qiskit


8

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: inserisci qui la descrizione dell'immagine

V2=UV2=X

V=12(1+io1-io1-io1+io) .

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).

V


Qualcuno ha lavorato per implementare questo gate su Cirq?
Enrique Segura,

5

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 ├
           └───┘        └───┘└───┘       └───┘└───┘        └───┘└───┘       └───┘└───┘        └───┘└───┘       └───┘└───┘        └───┘
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.