Sintetizzare operazioni unitarie
Versioni dei pacchetti
Il codice in questa pagina Γ¨ stato sviluppato utilizzando i seguenti requisiti. Si consiglia di usare queste versioni o versioni piΓΉ recenti.
qiskit[all]~=2.3.0
Un'operazione unitaria descrive una trasformazione che conserva la norma di un sistema quantistico. Per qubit, questa trasformazione Γ¨ descritta da una matrice complessa di dimensione il cui aggiunto Γ¨ uguale all'inverso, ovvero .
La sintesi di operazioni unitarie specifiche in un insieme di gate quantistici Γ¨ un'attivitΓ fondamentale, utilizzata ad esempio nella progettazione e nell'applicazione di algoritmi quantistici o nella compilazione di circuiti quantistici.
Sebbene una sintesi efficiente sia possibile per certe classi di unitarie β come quelle composte da gate di Clifford o con una struttura a prodotto tensoriale β la maggior parte delle unitarie non rientra in queste categorie. Per le matrici unitarie generali, la sintesi Γ¨ un'operazione complessa i cui costi computazionali crescono esponenzialmente con il numero di qubit. Pertanto, se conosci una decomposizione efficiente per l'unitaria che vuoi implementare, Γ¨ probabile che sia migliore di una sintesi generica.
Se non Γ¨ disponibile alcuna decomposizione, il Qiskit SDK ti fornisce gli strumenti per trovarne una. Tieni perΓ² presente che questo genera generalmente circuiti profondi che potrebbero non essere adatti all'esecuzione su computer quantistici rumorosi.
# 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>
Ri-sintesi per l'ottimizzazione del circuitoβ
A volte Γ¨ vantaggioso ri-sintetizzare una lunga serie di gate a uno e due qubit, se Γ¨ possibile ridurne la lunghezza. Ad esempio, il circuito seguente utilizza tre gate a due qubit.
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")
Tuttavia, dopo la ri-sintesi con il codice seguente, Γ¨ sufficiente un singolo gate CX. (Qui usiamo il metodo QuantumCircuit.decompose() per visualizzare meglio i gate usati nella ri-sintesi dell'unitaria.)
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,-Ο) β
β βββββββββββββββββββββββββββββββββββββββββββββ
La funzione transpile di Qiskit esegue automaticamente questa ri-sintesi per un livello di ottimizzazione sufficientemente alto.
Passi successiviβ
- Guarda un esempio di decomposizione di circuiti nel tutorial Algoritmo di Grover.
- Per ulteriori informazioni sul transpiler di Qiskit, visita la sezione Transpile.