Synteza operacji unitarnych
Wersje pakietów
Kod na tej stronie opracowano z użyciem następujących wersji pakietów. Zalecamy korzystanie z tych lub nowszych wersji.
qiskit[all]~=2.6.1
Operacja unitarna opisuje zachowującą normę zmianę układu kwantowego. Dla kubitów ta zmiana jest opisana przez zespoloną macierz o wymiarach , której sprzężenie hermitowskie równa się odwrotności, to znaczy .
Synteza konkretnych operacji unitarnych na zestaw bramek kwantowych jest podstawowym zadaniem stosowanym, na przykład, w projektowaniu i zastosowaniu algorytmów kwantowych lub podczas kompilacji obwodów 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 — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "qiskit": "qiskit"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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 0x7559e07824d0>
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: 15π/8
┌───────────────┐ ┌────────────────┐
q_0: ┤ U(π/2,π/2,-π) ├───■──┤ U(π/2,-π,-π/2) ├
├───────────────┴┐┌─┴─┐├───────────────┬┘
q_1: ┤ U(3π/4,π/2,-π) ├┤ X ├┤ U(π/2,π/4,-π) ├─
└────────────────┘└───┘└───────────────┘
Funkcja transpile Qiskita automatycznie wykonuje tę ponowną syntezę przy wystarczająco wysokim poziomie optymalizacji.
Następne kroki
- Zobacz przykład dekompozycji Circuit w samouczku Algorytm Grovera.
- Więcej informacji o Transpilerze Qiskit znajdziesz w sekcji Transpile.