Vai al contenuto principale

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 nn qubit, questa trasformazione Γ¨ descritta da una matrice complessa UU di dimensione 2nΓ—2n2^n \times 2^n il cui aggiunto Γ¨ uguale all'inverso, ovvero U†U=1U^\dagger U = \mathbb{1}.

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.

nota

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")

Output della cella di codice precedente

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​

Raccomandazioni