Pauli 기저로 관측값 지정하기
패키지 버전
이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다. 아래 버전 이상을 사용하길 권장합니다.
qiskit[all]~=2.3.0
양자역학에서 관측값(observable)은 측정 가능한 물리적 성질에 해당합니다. 예를 들어 스핀 시스템을 고려할 때, 시스템의 에너지를 측정하거나 자기화(magnetization) 또는 스핀 간의 상관관계와 같이 스핀의 정렬에 관한 정보를 얻고자 할 수 있습니다.
양자 컴퓨터에서 -Qubit 관측값 를 측정하려면, 이를 Pauli 연산자의 텐서 곱의 합으로 표현해야 합니다. 즉,
여기서
이고, 관측값이 에르미트(Hermitian)라는 사실, 즉 를 이용합니다. 가 에르미트가 아닌 경우에도 Pauli의 합으로 분해할 수 있지만, 계수 가 복소수가 됩니다.
많은 경우, 관측값은 관심 있는 시스템을 Qubit에 매핑한 후 자연스럽게 이 표현으로 지정됩니다. 예를 들어, 스핀-1/2 시스템은 이징 해밀토니안(Ising Hamiltonian)으로 매핑될 수 있습니다.
여기서 인덱스 는 상호작용하는 스핀들을 나타내며, 스핀들은 방향의 횡방향 자기장(transversal field)에 놓여 있습니다. 아래 첨자 인덱스는 어떤 Qubit에 Pauli 연산자가 작용하는지를 나타냅니다. 즉, 는 Qubit 에 연산자를 적용하고 나머지는 변경하지 않습니다.
Qiskit SDK에서는 다음 코드로 이 해밀토니안을 구성할 수 있습니다.
# 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])
에너지를 측정하고자 한다면 관측값은 해밀토니안 자체가 됩니다. 또는 다음 관측값으로 방향으로 정렬된 스핀의 수를 세어 평균 자기화와 같은 시스템 속성을 측정할 수도 있습니다.
Pauli 연산자로 주어지지 않고 행렬 형태로 주어진 관측값의 경우, 양자 컴퓨터에서 평가하기 위해 먼저 Pauli 기저로 재표현해야 합니다. Pauli 행렬이 에르미트 행렬의 기저를 이루기 때문에, 우리는 항상 이러한 표현을 찾을 수 있습니다. 관측값 를 다음과 같이 전개합니다.
여기서 합산은 가능한 모든 -Qubit Pauli 항에 대해 이루어지며, 는 내적으로 작용하는 행렬의 대각합(trace)입니다.
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 레퍼런스를 읽어보세요.