Sintetizarea operațiilor unitare
Versiuni de pachete
Codul de pe această pagină a fost dezvoltat folosind următoarele cerințe. Recomandăm utilizarea acestor versiuni sau a unora mai noi.
qiskit[all]~=2.6.1
O operație unitară descrie o modificare ce conservă norma unui sistem cuantic. Pentru qubiți, această modificare este descrisă de o matrice complexă de dimensiune , notată , al cărei adjunct este egal cu inversa sa, adică .
Sintetizarea unor operații unitare specifice într-un set de porți cuantice este o sarcină fundamentală, folosită, de exemplu, în proiectarea și aplicarea algoritmilor cuantici sau în compilarea Circuit-urilor cuantice.
Deși sinteza eficientă este posibilă pentru anumite clase de unitare — precum cele compuse din porți Clifford sau cu structură de produs tensorial — majoritatea unitarelor nu se încadrează în aceste categorii. Pentru matricele unitare generale, sinteza este o sarcină complexă, ale cărei costuri de calcul cresc exponențial cu numărul de qubiți. Prin urmare, dacă știi o descompunere eficientă pentru unitara pe care dorești să o implementezi, aceasta va fi probabil mai bună decât o sinteză generală.
Dacă nu este disponibilă nicio descompunere, Qiskit SDK îți pune la dispoziție instrumentele necesare pentru a găsi una. Reține, totuși, că aceasta generează în general Circuit-uri adânci, care pot fi nepotrivite pentru rularea pe calculatoare cuantice zgomotoase.
# 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>
Re-sintetizarea pentru optimizarea Circuit-urilor
Uneori este avantajos să re-sintetizezi o serie lungă de porți pe unul sau doi qubiți, dacă lungimea poate fi redusă. De exemplu, următorul Circuit folosește trei porți pe doi qubiți.
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")
Cu toate acestea, după re-sintetizare folosind codul de mai jos, este necesară doar o singură poartă CX. (Aici folosim metoda QuantumCircuit.decompose() pentru a vizualiza mai bine porțile utilizate la re-sintetizarea unitarei.)
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,-π) ├─
└────────────────┘└───┘└───────────────┘
Funcția transpile din Qiskit efectuează automat această re-sintetizare pentru un nivel de optimizare suficient de ridicat.
Pași următori
- Vezi un exemplu de descompunere a Circuit-urilor în tutorialul Algoritmul lui Grover.
- Pentru mai multe informații despre Transpiler-ul Qiskit, vizitează secțiunea Transpile.