Especificar observáveis na base de Pauli
Package versions
O código nesta página foi desenvolvido usando os seguintes requisitos. Recomendamos usar essas versões ou mais recentes.
qiskit[all]~=2.5.2
Na mecânica quântica, os observáveis correspondem a propriedades físicas que podem ser medidas. Ao considerar um sistema de spins, por exemplo, você pode estar interessado em medir a energia do sistema ou obter informações sobre o alinhamento dos spins, como a magnetização ou as correlações entre spins.
Para medir um observável de qubits em um computador quântico, você deve representá-lo como uma soma de produtos tensoriais de operadores de Pauli, ou seja
onde
e você utiliza o fato de que um observável é hermitiano, isto é, . Se não for hermitiano, ainda é possível decompô-lo como uma soma de Paulis, mas o coeficiente se torna complexo.
Em muitos casos, o observável é naturalmente especificado nessa representação após mapear o sistema de interesse para qubits. Por exemplo, um sistema de spin-1/2 pode ser mapeado para um Hamiltoniano de Ising
onde os índices percorrem os spins em interação e os spins estão sujeitos a um campo transverso em . O índice subscrito indica em qual qubit o operador de Pauli atua, ou seja, aplica um operador no qubit e deixa os demais inalterados.
No Qiskit SDK, este Hamiltoniano pode ser construído com o seguinte código.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "qiskit": "qiskit"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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])
Se quisermos medir a energia, o observável é o próprio Hamiltoniano. Alternativamente, podemos estar interessados em medir propriedades do sistema, como a magnetização média, contando o número de spins alinhados na direção com o observável
Para observáveis que não são dados em termos de operadores de Pauli, mas na forma de matriz, precisamos primeiro reformulá-los na base de Pauli para avaliá-los em um computador quântico. Podemos sempre encontrar tal representação, pois as matrizes de Pauli formam uma base para as matrizes hermitianas . Expandimos o observável como
onde a soma percorre todos os possíveis termos de Pauli de qubits e é o traço de uma matriz, que atua como um produto interno. O fator leva em conta a normalização de Hilbert-Schmidt de strings de Pauli de qubits.
Você pode implementar essa decomposição de uma matriz para termos de Pauli usando o método SparsePauliOp.from_operator, da seguinte forma:
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])
Isso significa que a matriz pode ser escrita em termos de Pauli como .
Lembre-se de que a ordem do produto tensorial mapeia para os qubits como .
Se o observável for hermitiano (ou seja, ), os coeficientes de Pauli são números reais. No entanto, também podemos decompor qualquer outra matriz complexa em termos de Paulis, se permitirmos coeficientes de valor complexo.
Medir nas bases de Pauli
Uma medição projeta o estado do qubit na base computacional . Isso implica que você só pode medir observáveis que são diagonais nessa base, como Paulis compostos apenas por termos e . Medir termos de Pauli arbitrários requer, portanto, uma mudança de base para diagonalizá-los. Para isso, realize as seguintes transformações,
onde é a porta Hadamard e é às vezes referida como a porta de fase. Se você estiver usando um Estimator para calcular valores esperados, as transformações de base são realizadas automaticamente.
A seguir há um exemplo que demonstra como preparar um circuito quântico e medir manualmente o qubit 0 na base X, o qubit 1 na base Y e o qubit 2 na base Z. Aplicamos as transformações mostradas na equação anterior e obtemos o seguinte 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")
Próximos passos
- Leia a referência da API SparsePauliOp.