Pauli 기저로 관측량 지정하기
Package versions
이 페이지의 코드는 다음 요구 사항으로 개발되었어요. 이 버전 이상을 사용하는 것을 권장해요.
qiskit[all]~=2.5.2
양자역학에서 관측량(observable)은 측정할 수 있는 물리적 특성에 해당해요. 예를 들어 스핀 시스템을 고려할 때, 시스템의 에너지를 측정하거나 자화(magnetization)나 스핀 간 상관관계와 같은 스핀 정렬에 대한 정보를 얻는 데 관심이 있을 수 있어요.
양자 컴퓨터에서 -Qubit 관측량 를 측정하려면, 이를 Pauli 연산자의 텐서 곱의 합으로 표현해야 합니다. 즉,
여기서
이고, 관측량이 에르미트(Hermitian)라는 사실, 즉 를 이용합니다. 가 에르미트가 아닌 경우에도 Pauli의 합으로 분해할 수 있지만, 계수 가 복소수가 됩니다.
많은 경우, 관측량은 관심 있는 시스템을 Qubit에 매핑한 후 자연스럽게 이 표현으로 지정됩니다. 예를 들어, 스핀-1/2 시스템은 이징 해밀토니안(Ising Hamiltonian)으로 매핑될 수 있습니다.
여기서 인덱스 는 상호작용하는 스핀들을 나타내며, 스핀들은 방향의 횡방향 자기장(transverse field)에 놓여 있습니다. 아래 첨자 인덱스는 어떤 Qubit에 Pauli 연산자가 작용하는지를 나타냅니다. 즉, 는 qubit 에 연산자를 적용하고 나머지는 변경하지 않습니다.
Qiskit SDK에서는 다음 코드로 이 해밀토니안을 구성할 수 있습니다.
# 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])
에너지를 측정하고자 한다면 관측량은 해밀토니안 자체예요. 또는 다음 관측량으로 방향으로 정렬된 스핀의 수를 세어 평균 자화와 같은 시스템 속성을 측정할 수도 있어요.
Pauli 연산자로 주어지지 않고 행렬 형태로 주어진 관측량의 경우, 양자 컴퓨터에서 평가하기 위해 먼저 Pauli 기저로 재표현해야 합니다. Pauli 행렬이 에르미트 행렬의 기저를 이루기 때문에, 우리는 항상 이러한 표현을 찾을 수 있습니다. 관측량 를 다음과 같이 전개합니다.
여기서 합산은 가능한 모든 -Qubit Pauli 항에 대해 이루어지며, 는 내적으로 작용하는 행렬의 대각합(trace)입니다. 인수 은 -Qubit Pauli 문자열의 Hilbert--Schmidt 정규화를 나타냅니다.
SparsePauliOp.from_operator 메서드를 사용하면 행렬에서 Pauli 항으로의 이 분해를 다음과 같이 구현할 수 있습니다.
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])
이는 해당 행렬이 Pauli 항으로 과 같이 표현될 수 있음을 의미해요.
텐서 곱 순서는 Qubit에 으로 매핑된다는 점을 기억하세요.
관측량이 에르미트()인 경우, Pauli 계수는 실수입니다. 그러나 복소수 값의 계수를 허용하면 다른 복소수 행렬도 Pauli로 분해할 수 있습니다.
Pauli 기저에서 측정하기
측정은 qubit 상태를 계산 기저 로 사영해요. 이는 및 항으로만 구성된 Pauli와 같이 이 기저에서 대각인 관측량만 측정할 수 있다는 뜻이에요. 따라서 임의의 Pauli 항을 측정하려면 이를 대각화하기 위한 기저 변환이 필요해요. 이를 위해 다음 변환을 수행해요.
여기서 는 아다마르(Hadamard) Gate이고 는 위상(phase) Gate라고도 합니다. 기댓값을 계산하기 위해 Estimator를 사용하는 경우, 기저 변환은 자동으로 수행됩니다.
아래는 양자 Circuit을 준비하고 qubit 0은 X 기저, qubit 1은 Y 기저, qubit 2는 Z 기저에서 수동으로 측정하는 방법을 보여주는 예제입니다. 앞의 수식에 표시된 변환을 적용하면 다음과 같은 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")
다음 단계
- SparsePauliOp API 레퍼런스를 읽어보세요.