Specificare gli osservabili nella base di Pauli
Il codice di questa pagina è stato sviluppato in base ai seguenti requisiti. Si consiglia di utilizzare queste versioni o versioni più recenti.
qiskit[all]~=2.5.2
Nella meccanica quantistica, le osservabili corrispondono a proprietà fisiche che possono essere misurate. Se si considera un sistema di spin, ad esempio, si potrebbe essere interessati a misurare l'energia del sistema o a ottenere informazioni sull'allineamento degli spin, come la magnetizzazione o le correlazioni tra gli spin.
Per misurare un'osservabile -qubit su un computer quantistico, è necessario rappresentarla come una somma di prodotti tensoriali di operatori di Pauli, cioè
Dove
e si utilizza il fatto che un'osservabile è ermitiana, come in . Se non è hermitiano, può ancora essere decomposto come una somma di Paulis, ma il coefficiente diventa complesso.
In molti casi, l'osservabile è naturalmente specificata in questa rappresentazione dopo aver mappato il sistema di interesse in qubit. Ad esempio, un sistema spin-1/2 può essere mappato su un'hamiltoniana di Ising
dove gli indici si applicano agli spin interagenti e gli spin sono soggetti a un campo trasversale in . L'indice in apice indica su quale qubit agisce l'operatore di Pauli; in altre parole, applica un operatore al qubit e lascia gli altri invariati.
Nell'SDK di Qiskit, questa hamiltoniana può essere costruita con il seguente codice.
from qiskit.quantum_info import SparsePauliOp
# define the number of qubits
n = 12
# define the single Pauli terms as ("Paulis", [indices], coefficient)
interactions = [
("ZZ", [i, i + 1], 1) for i in range(n - 1)
] # we assume spins on a 1D line
field = [("X", [i], -1) for i in range(n)]
# build the operator
hamiltonian = SparsePauliOp.from_sparse_list(
interactions + field, num_qubits=n
)
print(hamiltonian)Output:
SparsePauliOp(['IIIIIIIIIIZZ', 'IIIIIIIIIZZI', 'IIIIIIIIZZII', 'IIIIIIIZZIII', 'IIIIIIZZIIII', 'IIIIIZZIIIII', 'IIIIZZIIIIII', 'IIIZZIIIIIII', 'IIZZIIIIIIII', 'IZZIIIIIIIII', 'ZZIIIIIIIIII', 'IIIIIIIIIIIX', 'IIIIIIIIIIXI', 'IIIIIIIIIXII', 'IIIIIIIIXIII', 'IIIIIIIXIIII', 'IIIIIIXIIIII', 'IIIIIXIIIIII', 'IIIIXIIIIIII', 'IIIXIIIIIIII', 'IIXIIIIIIIII', 'IXIIIIIIIIII', 'XIIIIIIIIIII'],
coeffs=[ 1.+0.j, 1.+0.j, 1.+0.j, 1.+0.j, 1.+0.j, 1.+0.j, 1.+0.j, 1.+0.j,
1.+0.j, 1.+0.j, 1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j,
-1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j])
Se vogliamo misurare l'energia, l'osservabile è l'hamiltoniana stessa. In alternativa, potremmo essere misurare le proprietà del sistema, come la magnetizzazione media, contando il numero di spins allineati nella direzione con l'osservabile
Per le osservabili che non sono date in termini di operatori di Pauli ma in forma matriciale, dobbiamo prima riformularle in base Pauli per poterle valutare su un computer quantistico nella base di Pauli per poterli valutare su un computer quantistico. Siamo sempre in grado di trovare una rappresentazione di questo tipo, poiché le matrici di Pauli formano una base per le matrici Hermitiane . Espandiamo l'osservabile come
dove la somma si estende su tutti i possibili termini di Pauli a -qubit di tipo e è la traccia di una matrice, che funge da prodotto interno. Il fattore descrive la normalizzazione di Hilbert-Schmidt delle stringhe di Pauli a -qubit .
È possibile implementare questa scomposizione da una matrice in termini di Pauli utilizzando il SparsePauliOp.from_operator metodo, in questo modo:
import numpy as np
from qiskit.quantum_info import SparsePauliOp
matrix = np.array(
[[-1, 0, 0.5, -1], [0, 1, 1, 0.5], [0.5, 1, -1, 0], [-1, 0.5, 0, 1]]
)
observable = SparsePauliOp.from_operator(matrix)
print(observable)Output:
SparsePauliOp(['IZ', 'XI', 'YY'],
coeffs=[-1. +0.j, 0.5+0.j, 1. -0.j])
Ciò significa che la matrice può essere scritta in termini di Pauli come .
Ricordiamo che l'ordine del prodotto tensoriale mappa i qubit come .
Se l'osservabile è hermitiana (cioè ), i coefficienti di Pauli sono numeri reali. Tuttavia, possiamo anche decomporre qualsiasi altra matrice complessa in termini di Paulis, se ammettiamo coefficienti di valore complesso.
Misura nelle basi di Pauli
Una misura proietta lo stato del qubit nella base computazionale . Ciò implica che si possono misurare solo le osservabili che sono diagonali in questa base, come ad esempio la Paulis che consiste solo di termini e . La misurazione di termini di Pauli arbitrari richiede quindi un cambio di base per diagonalizzarli. A tal fine, eseguire le seguenti trasformazioni,
dove è il gate di Hadamard e è talvolta indicato come gate di fase. Se si utilizza un Estimator per calcolare i valori di aspettativa, le trasformazioni di base vengono eseguite automaticamente.
Di seguito è riportato un esempio che dimostra come preparare un circuito quantistico e misurare manualmente il qubit 0 nella base X, il qubit 1 nella base Y e il qubit 2 nella base Z. Applicando le trasformazioni indicate nell'equazione precedente, si ottiene il seguente circuito:
from qiskit.circuit import QuantumCircuit
# create a circuit, where we would like to measure
# q0 in the X basis, q1 in the Y basis and q2 in the Z basis
circuit = QuantumCircuit(3)
circuit.ry(0.8, 0)
circuit.cx(0, 1)
circuit.cx(1, 2)
circuit.barrier()
# diagonalize X with the Hadamard gate
circuit.h(0)
# diagonalize Y with Hadamard as S^\dagger
circuit.sdg(1)
circuit.h(1)
# the Z basis is the default, no action required here
# measure all qubits
circuit.measure_all()
circuit.draw("mpl")Output:
Passi successivi
- Leggete il riferimento all' API SparsePauliOp.