Określanie obserwabli w bazie Pauliego
Wersje pakietów
Kod na tej stronie został opracowany przy użyciu poniższych wymagań. Zalecamy używanie tych wersji lub nowszych.
qiskit[all]~=2.4.0
W mechanice kwantowej obserwable odpowiadają właściwościom fizycznym, które można mierzyć. Rozważając na przykład układ spinów, możesz być zainteresowany pomiarem energii systemu lub uzyskaniem informacji o wyrównaniu spinów, takich jak namagnesowanie lub korelacje między spinami.
Aby zmierzyć -qubitową obserwablę na komputerze kwantowym, musisz przedstawić ją jako sumę iloczynów tensorowych operatorów Pauliego, to znaczy
gdzie
i korzystasz z faktu, że obserwabla jest hermitowska, tzn. . Jeśli nie jest hermitowska, nadal można ją rozłożyć jako sumę Paulich, ale współczynnik staje się zespolony.
W wielu przypadkach obserwabla jest naturalnie określona w tej reprezentacji po odwzorowaniu badanego układu na Qubity. Na przykład układ spinów 1/2 można odwzorować na hamiltoniana Isinga
gdzie indeksy biegną po oddziałujących spinach, a spiny podlegają poprzecznemu polu w . Indeks dolny wskazuje, na który qubit działa operator Pauliego, tzn. stosuje operator na Qubicie , pozostawiając resztę bez zmian.
W Qiskit SDK ten hamiltoniana można skonstruować następującym kodem.
# 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])
Jeśli chcemy zmierzyć energię, obserwablą jest sam hamiltoniana. Alternatywnie możemy być zainteresowani pomiarem właściwości systemu, takich jak średnie namagnesowanie, poprzez liczenie spinów wyrównanych w kierunku za pomocą obserwabli
Dla obserwabli, które nie są podane w kategoriach operatorów Pauliego, lecz w postaci macierzowej, musimy najpierw sformułować je w bazie Pauliego, aby ocenić je na komputerze kwantowym. Zawsze jesteśmy w stanie znaleźć taką reprezentację, ponieważ macierze Pauliego tworzą bazę dla hermitowskich macierzy . Rozwijamy obserwablę jako
gdzie suma przebiega po wszystkich możliwych -qubitowych składowych Pauliego, a jest śladem macierzy, który pełni rolę iloczynu skalarnego.
Tę dekompozycję z macierzy na składowe Pauliego możesz zaimplementować za pomocą metody SparsePauliOp.from_operator, jak poniżej:
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])
Oznacza to, że macierz można zapisać jako składowe Pauliego jako .
Pamiętaj, że kolejność iloczynu tensorowego odwzorowuje się na Qubity jako .
Jeśli obserwabla jest hermitowska (tzn. ), współczynniki Pauliego są liczbami rzeczywistymi. Możemy jednak również rozłożyć dowolną inną macierz zespoloną na składowe Pauliego, jeśli dopuścimy zespolone współczynniki.
Pomiar w bazach Pauliego
Pomiar rzutuje stan Qubitu na bazę obliczeniową . Oznacza to, że możesz mierzyć tylko obserwable diagonalne w tej bazie, takie jak Paulie składające się wyłącznie ze składowych i . Mierzenie dowolnych składowych Pauliego wymaga zatem zmiany bazy w celu ich diagonalizacji. Aby to zrobić, wykonaj następujące przekształcenia:
gdzie jest bramką Hadamarda, a jest czasami nazywana bramką fazową. Jeśli używasz Estimator do obliczania wartości oczekiwanych, przekształcenia bazy są wykonywane automatycznie.
Poniżej znajduje się przykład demonstrujący, jak przygotować Circuit kwantowy i ręcznie mierzyć qubit 0 w bazie X, qubit 1 w bazie Y i qubit 2 w bazie Z. Stosujemy przekształcenia pokazane w poprzednim równaniu i uzyskujemy następujący 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")
Kolejne kroki
- Przeczytaj dokumentację API SparsePauliOp.