Zadání pozorovatelných veličin v Pauliho bázi
Verze balíčků
Kód na této stránce byl vyvinut s použitím následujících požadavků. Doporučujeme použít tyto verze nebo novější.
qiskit[all]~=2.3.0
V kvantové mechanice odpovídají pozorovatelné veličiny fyzikálním vlastnostem, které lze měřit. Při uvažování systému spinů tě může zajímat například měření energie systému nebo získání informací o uspořádání spinů, jako je magnetizace nebo korelace mezi spiny.
Chceš-li změřit -qubitovou pozorovatelnou veličinu na kvantovém počítači, musíš ji vyjádřit jako součet tenzorových součinů Pauliho operátorů, tedy
kde
a přitom využíváš skutečnosti, že pozorovatelná veličina je hermitovská, tedy . Pokud není hermitovská, lze ji stále rozložit jako součet Pauliho operátorů, ale koeficient se stane komplexním číslem.
V mnoha případech je pozorovatelná veličina přirozeně zadána v tomto vyjádření po zobrazení zkoumaného systému na qubity. Například systém se spinem 1/2 lze zobrazit na Isingův hamiltonián
kde indexy procházejí přes interagující spiny a spiny jsou vystaveny transverzálnímu poli v . Dolní index označuje, na který Qubit Pauliho operátor působí, tj. aplikuje operátor na Qubit a ostatní ponechá nezměněné.
V Qiskit SDK lze tento hamiltonián sestavit následujícím kódem.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
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)
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])
Pokud chceme měřit energii, pozorovatelnou veličinou je samotný hamiltonián. Alternativně nás může zajímat měření vlastností systému, jako je průměrná magnetizace, kdy počítáme počet spinů zarovnaných ve směru pomocí pozorovatelné veličiny
Pro pozorovatelné veličiny, které nejsou zadány pomocí Pauliho operátorů, ale v maticové formě, je třeba je nejprve přeformulovat do Pauliho báze, abychom je mohli vyhodnotit na kvantovém počítači. Takové vyjádření vždy existuje, protože Pauliho matice tvoří bázi hermitovských matic . Pozorovatelnou veličinu rozvineme jako
kde součet probíhá přes všechny možné -qubitové Pauliho členy a je stopa matice, která slouží jako skalární součin.
Tento rozklad z matice na Pauliho členy lze implementovat pomocí metody SparsePauliOp.from_operator, například takto:
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)
SparsePauliOp(['IZ', 'XI', 'YY'],
coeffs=[-1. +0.j, 0.5+0.j, 1. -0.j])
To znamená, že matici lze zapsat pomocí Pauliho členů jako .
Pamatuj, že pořadí tenzorového součinu se zobrazuje na qubity jako .
Pokud je pozorovatelná veličina hermitovská (tedy ), jsou Pauliho koeficienty reálná čísla. Libovolnou komplexní matici však lze rozložit na Pauliho operátory i tehdy, pokud připustíme komplexní koeficienty.
Měření v Pauliho bázích
Měření promítne stav Qubitu do počítací báze . To znamená, že lze měřit pouze pozorovatelné veličiny, které jsou v této bázi diagonální, jako jsou Pauliho operátory složené pouze z členů a . Měření libovolných Pauliho členů proto vyžaduje změnu báze za účelem jejich diagonalizace. K tomu proveď následující transformace:
kde je Hadamardův Gate a se někdy označuje jako fázový Gate. Pokud používáš Estimator pro výpočet střední hodnoty, jsou transformace báze prováděny automaticky.
Níže je příklad, který ukazuje, jak připravit kvantový Circuit a ručně změřit Qubit 0 v bázi X, Qubit 1 v bázi Y a Qubit 2 v bázi Z. Aplikujeme transformace uvedené v předchozí rovnici a získáme následující Circuit:
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")
Další kroky
- Přečti si referenci SparsePauliOp API.