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.3.0
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 Gate-uri 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 Gate-uri 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 — 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>
Re-sintetizarea pentru optimizarea Circuit-urilor
Uneori este avantajos să re-sintetizezi o serie lungă de Gate-uri pe unul sau doi qubiți, dacă lungimea poate fi redusă. De exemplu, următorul Circuit folosește trei Gate-uri 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, sunt necesare doar un singur Gate CX. (Aici folosim metoda QuantumCircuit.decompose() pentru a vizualiza mai bine Gate-urile 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: 6.2071
┌───────────────┐ ┌────────────────┐
q_0: ─┤ U(π/2,π/2,-π) ├────■────┤ U(π/2,-π,-π/2) ├─
┌┴───────────────┴─┐┌─┴─┐┌─┴────────────────┴┐
q_1: ┤ U(1.7229,π/2,-π) ├┤ X ├┤ U(π/2,0.15207,-π) ├
└──────────────────┘└───┘└───────────────────┘
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.