Jak mogę wdrożyć n-bitową bramę Toffoli?

17

Chcę utworzyć bramę Toffoli kontrolowaną przez n kubitów i zaimplementować ją w QISKit. Czy można to zrobić? Jeśli tak to jak?

Ali Javadi
źródło
Dzięki za pytania i odpowiedzi. Dobrze cię tu widzieć Ali!
James Wootton

Odpowiedzi:

19

Prosty sposób na to zilustrowano na rysunku 4.10 Nielsen & Chuang. n-

Gdzie U może oznaczać dowolny obrót kubitowy (w tym przypadku bramka X).

Ten obwód działa w następujący sposób: Chcemy zastosować U do docelowego kubita tylko wtedy, gdy AND wszystkich kubitów kontrolnych wynosi 1. Normalny Toffoli daje nam AND 2 kubitów. Zatem łącząc kilka Toffolis, możemy uzyskać c1.c2.c3.c4.c5, z zastrzeżeniem, że wprowadzono niektóre kubity „robocze” (lub ancilla) do przechowywania wyników pośrednich. Po zastosowaniu ostatecznej CU otrzymujemy ostateczny wynik w celu. Teraz możemy wyczyścić pośrednie kubity robocze, cofając ich obliczenia i przywracając je do stanu | 0>. Ten model obliczeń odwracalnych jest znany jako metoda „oblicz-kopiuj-nieobliczaj” i został po raz pierwszy zaproponowany przez Charliego Bennetta w 1973 r .

Oto kod QISKit do budowy obwodu i wizualizacji:

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)

Wydajność:

obwód generowany przez qiskit

Ali Javadi
źródło
8

Chcę dodać metodę, która nie korzysta z kubitów ancilla, ale wymaga bram bardziej skomplikowanych niż tylko kontrolowane-nie. Wierzę, że ta metoda została po raz pierwszy zaprezentowana przez Barenco i in. glin. w tym artykule , Lemma 7.5: wprowadź opis zdjęcia tutaj

V.2)=UV.2)=X

V.=12)(1+ja1-ja1-ja1+ja) .

Jest to definicja rekurencyjna, więc brama sterująca qubit jest zdefiniowana w kategoriach kontrolnej bramki kubit n-1. Trwało to do momentu dotarcia do dwóch bramek qOTIT CNOT.

Ta implementacja jest trochę trudna, jednak istnieje prostsza, jeśli nie ma nic przeciwko zebraniu fazy względnej (patrz Lemat 7.9 tego samego artykułu).

Aby wdrożyć bramę, taką jak V.w QISKIT będziesz musiał użyć zaawansowanych pojedynczych bramek kubitowych.

maor
źródło
Czy ktoś pracował nad wdrożeniem tej bramy w Cirq?
Enrique Segura
5

QuantumCircuit firmy Qiskit ma metodę mct do budowy wielopunktowej bramy Toffoli z kilkoma trybami: podstawowa, podstawowa-brudna-ancilla, zaawansowana, noancilla. Na przykład brama Toffoli z 3 kubitami kontrolnymi:

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)

Wynik:

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 ├
           └───┘        └───┘└───┘       └───┘└───┘        └───┘└───┘       └───┘└───┘        └───┘└───┘       └───┘└───┘        └───┘
iUrii
źródło