Synteza operacji unitarnych
Wersje pakietów
Kod na tej stronie został opracowany przy użyciu poniższych wymagań. Zalecamy korzystanie z tych lub nowszych wersji.
qiskit[all]~=2.3.0
Operacja unitarna opisuje zachowującą normę zmianę układu kwantowego. Dla Qubitów ta zmiana jest opisana przez macierz -wymiarową, zespoloną macierz , której sprzężenie hermitowskie równa się odwrotności, to znaczy .
Synteza konkretnych operacji unitarnych w zestaw Gate kwantowych jest podstawowym zadaniem stosowanym, na przykład, w projektowaniu i zastosowaniu algorytmów kwantowych lub podczas kompilacji Circuit kwantowych.
Choć efektywna synteza jest możliwa dla pewnych klas macierzy unitarnych — takich jak te złożone z Gate Clifforda lub mające strukturę iloczynu tensorowego — większość macierzy unitarnych nie należy do tych kategorii. Dla ogólnych macierzy unitarnych synteza jest złożonym zadaniem, którego koszty obliczeniowe rosną wykładniczo wraz z liczbą Qubitów. Dlatego, jeśli znasz efektywną dekompozycję macierzy unitarnej, którą chcesz zaimplementować, prawdopodobnie będzie ona lepsza niż synteza ogólna.
Jeśli żadna dekompozycja nie jest dostępna, Qiskit SDK dostarcza narzędzi do jej znalezienia. Należy jednak pamiętać, że generalnie generuje to głębokie Circuit, które mogą być nieodpowiednie do uruchamiania na zaszumionych komputerach kwantowych.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
import numpy as np
from qiskit import QuantumCircuit
U = 0.5 * np.array(
[[1, 1, 1, 1], [-1, 1, -1, 1], [-1, -1, 1, 1], [-1, 1, 1, -1]]
)
circuit = QuantumCircuit(2)
circuit.unitary(U, circuit.qubits)
<qiskit.circuit.instructionset.InstructionSet at 0x7fedb83e7a90>
Ponowna synteza w celu optymalizacji Circuit
Czasem korzystne jest ponowne zsyntetyzowanie długiej serii jednoQubitowych i dwuQubitowych Gate, jeśli można zmniejszyć ich liczbę. Na przykład poniższy Circuit używa trzech dwuQubitowych Gate.
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
qreg_q = QuantumRegister(2, "q")
creg_c = ClassicalRegister(4, "c")
circuit = QuantumCircuit(qreg_q, creg_c)
circuit.h(qreg_q[0])
circuit.cx(qreg_q[0], qreg_q[1])
circuit.sx(qreg_q[1])
circuit.cz(qreg_q[0], qreg_q[1])
circuit.x(qreg_q[1])
circuit.x(qreg_q[0])
circuit.cx(qreg_q[0], qreg_q[1])
circuit.h(qreg_q[0])
circuit.draw("mpl")
Jednak po ponownej syntezie z użyciem poniższego kodu potrzebuje jedynie pojedynczej Gate CX. (Tutaj używamy metody QuantumCircuit.decompose(), aby lepiej wizualizować Gate użyte do ponownej syntezy macierzy unitarnej.)
from qiskit.quantum_info import Operator
# compute unitary matrix of circuit
U = Operator(circuit)
# re-synthesize
better_circuit = QuantumCircuit(2)
better_circuit.unitary(U, range(2))
better_circuit.decompose().draw()
global phase: 6.2071
┌───────────────┐ ┌────────────────┐
q_0: ─┤ U(π/2,π/2,-π) ├────■────┤ U(π/2,-π,-π/2) ├─
┌┴───────────────┴─┐┌─┴─┐┌─┴────────────────┴┐
q_1: ┤ U(1.7229,π/2,-π) ├┤ X ├┤ U(π/2,0.15207,-π) ├
└──────────────────┘└───┘└───────────────────┘
Funkcja transpile Qiskita automatycznie wykonuje tę ponowną syntezę dla wystarczająco wysokiego poziomu optymalizacji.
Następne kroki
- Zobacz przykład dekompozycji Circuit w samouczku Algorytm Grovera.
- Więcej informacji o Transpilerze Qiskit znajdziesz w sekcji Transpile.