Přeskočit na hlavní obsah

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 nn-qubitovou pozorovatelnou veličinu OO na kvantovém počítači, musíš ji vyjádřit jako součet tenzorových součinů Pauliho operátorů, tedy

O=k=1KαkPk,  Pk{I,X,Y,Z}n,  αkR,O = \sum_{k=1}^K \alpha_k P_k,~~ P_k \in \{I, X, Y, Z\}^{\otimes n},~~ \alpha_k \in \mathbb{R},

kde

I=(1001)  X=(0110)  Y=(0ii0)  Z=(1001)I = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} ~~ X = \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix} ~~ Y = \begin{pmatrix} 0 & -i \\ i & 0 \end{pmatrix} ~~ Z = \begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}

a přitom využíváš skutečnosti, že pozorovatelná veličina je hermitovská, tedy O=OO^\dagger = O. Pokud OO není hermitovská, lze ji stále rozložit jako součet Pauliho operátorů, ale koeficient αk\alpha_k 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

H=i,jZiZji=1nXi,H = \sum_{\langle i, j\rangle} Z_i Z_j - \sum_{i=1}^n X_i,

kde indexy i,j\langle i, j\rangle procházejí přes interagující spiny a spiny jsou vystaveny transverzálnímu poli v XX. Dolní index označuje, na který Qubit Pauliho operátor působí, tj. XiX_i aplikuje operátor XX na Qubit ii 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 ZZ pomocí pozorovatelné veličiny

O=1ni=1ZiO = \frac{1}{n} \sum_{i=1} Z_i

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 2n×2n2^n \times 2^n. Pozorovatelnou veličinu OO rozvineme jako

O=P{I,X,Y,Z}nTr(OP)P,O = \sum_{P \in \{I, X, Y, Z\}^{\otimes n}} \mathrm{Tr}(O P) P,

kde součet probíhá přes všechny možné nn-qubitové Pauliho členy a Tr()\mathrm{Tr}(\cdot) 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 O=Z1+0.5X2+Y2Y1O = -Z_1 + 0.5 X_2 + Y_2 Y_1.

poznámka

Pamatuj, že pořadí tenzorového součinu se zobrazuje na qubity jako qnqn1q1q_n \otimes q_{n-1} \otimes \cdots \otimes q_1.

poznámka

Pokud je pozorovatelná veličina hermitovská (tedy O=OO^\dagger = O), 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 {0,1}\{|0\rangle, |1\rangle\}. 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ů II a ZZ. Měření libovolných Pauliho členů proto vyžaduje změnu báze za účelem jejich diagonalizace. K tomu proveď následující transformace:

XZ=HXHYZ=HSYSH,\begin{aligned} X &\rightarrow Z = H X H \\ Y &\rightarrow Z = H S^\dagger Y S H, \end{aligned}

kde HH je Hadamardův Gate a S=ZS = \sqrt{Z} 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")

Output of the previous code cell

Další kroky

Doporučení