Chcę utworzyć bramę Toffoli kontrolowaną przez n kubitów i zaimplementować ją w QISKit. Czy można to zrobić? Jeśli tak to jak?
Chcę utworzyć bramę Toffoli kontrolowaną przez n kubitów i zaimplementować ją w QISKit. Czy można to zrobić? Jeśli tak to jak?
Odpowiedzi:
Prosty sposób na to zilustrowano na rysunku 4.10 Nielsen & Chuang.
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ść:
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:
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 w QISKIT będziesz musiał użyć zaawansowanych pojedynczych bramek kubitowych.
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 ├
└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘└───┘ └───┘