주 콘텐츠로 건너뛰기
이 프로젝트는 베타 단계입니다. 버그를 발견하셨나요? GitHub 이슈 만들기. 질문이나 아이디어가 있으신가요? Discussions에서 질문하기 — 피드백을 기다립니다!
이 페이지의 번역 품질은 어떻습니까?

Pauli 기저로 관측량 지정하기

Package versions

이 페이지의 코드는 다음 요구 사항으로 개발되었어요. 이 버전 이상을 사용하는 것을 권장해요.

qiskit[all]~=2.5.2

양자역학에서 관측량(observable)은 측정할 수 있는 물리적 특성에 해당해요. 예를 들어 스핀 시스템을 고려할 때, 시스템의 에너지를 측정하거나 자화(magnetization)나 스핀 간 상관관계와 같은 스핀 정렬에 대한 정보를 얻는 데 관심이 있을 수 있어요.

양자 컴퓨터에서 nn-Qubit 관측량 OO를 측정하려면, 이를 Pauli 연산자의 텐서 곱의 합으로 표현해야 합니다. 즉,

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

여기서

I=(1001)  X=(0110)  Y=(0−ii0)  Z=(100−1)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}

이고, 관측량이 에르미트(Hermitian)라는 사실, 즉 O†=OO^\dagger = O를 이용합니다. OO가 에르미트가 아닌 경우에도 Pauli의 합으로 분해할 수 있지만, 계수 αk\alpha_k가 복소수가 됩니다.

많은 경우, 관측량은 관심 있는 시스템을 Qubit에 매핑한 후 자연스럽게 이 표현으로 지정됩니다. 예를 들어, 스핀-1/2 시스템은 이징 해밀토니안(Ising Hamiltonian)으로 매핑될 수 있습니다.

H=∑⟨i,j⟩ZiZj−∑i=1nXi,H = \sum_{\langle i, j\rangle} Z_i Z_j - \sum_{i=1}^n X_i,

여기서 인덱스 ⟨i,j⟩\langle i, j\rangle는 상호작용하는 스핀들을 나타내며, 스핀들은 XX 방향의 횡방향 자기장(transverse field)에 놓여 있습니다. 아래 첨자 인덱스는 어떤 Qubit에 Pauli 연산자가 작용하는지를 나타냅니다. 즉, XiX_i는 qubit ii에 XX 연산자를 적용하고 나머지는 변경하지 않습니다.

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])

에너지를 측정하고자 한다면 관측량은 해밀토니안 자체예요. 또는 다음 관측량으로 ZZ 방향으로 정렬된 스핀의 수를 세어 평균 자화와 같은 시스템 속성을 측정할 수도 있어요.

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

Pauli 연산자로 주어지지 않고 행렬 형태로 주어진 관측량의 경우, 양자 컴퓨터에서 평가하기 위해 먼저 Pauli 기저로 재표현해야 합니다. Pauli 행렬이 에르미트 2n×2n2^n \times 2^n 행렬의 기저를 이루기 때문에, 우리는 항상 이러한 표현을 찾을 수 있습니다. 관측량 OO를 다음과 같이 전개합니다.

O=12n∑P∈{I,X,Y,Z}⊗nTr(OP)P,O = \frac{1}{2^n} \sum_{P \in \{I, X, Y, Z\}^{\otimes n}} \mathrm{Tr}(O P) P,

여기서 합산은 가능한 모든 nn-Qubit Pauli 항에 대해 이루어지며, Tr(⋅)\mathrm{Tr}(\cdot)는 내적으로 작용하는 행렬의 대각합(trace)입니다. 인수 1/2n1/2^n은 nn-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 항으로 O=−Z1+0.5X2+Y2Y1O = -Z_1 + 0.5 X_2 + Y_2 Y_1과 같이 표현될 수 있음을 의미해요.

참고

텐서 곱 순서는 Qubit에 qn⊗qn−1⊗⋯⊗q1q_n \otimes q_{n-1} \otimes \cdots \otimes q_1으로 매핑된다는 점을 기억하세요.

참고

관측량이 에르미트(O†=OO^\dagger = O)인 경우, Pauli 계수는 실수입니다. 그러나 복소수 값의 계수를 허용하면 다른 복소수 행렬도 Pauli로 분해할 수 있습니다.

Pauli 기저에서 측정하기​

측정은 qubit 상태를 계산 기저 {∣0⟩,∣1⟩}\{|0\rangle, |1\rangle\}로 사영해요. 이는 II 및 ZZ 항으로만 구성된 Pauli와 같이 이 기저에서 대각인 관측량만 측정할 수 있다는 뜻이에요. 따라서 임의의 Pauli 항을 측정하려면 이를 대각화하기 위한 기저 변환이 필요해요. 이를 위해 다음 변환을 수행해요.

X→Z=HXHY→Z=HS†YSH,\begin{aligned} X &\rightarrow Z = H X H \\ Y &\rightarrow Z = H S^\dagger Y S H, \end{aligned}

여기서 HH는 아다마르(Hadamard) Gate이고 S=ZS = \sqrt{Z}는 위상(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")

Output of the previous code cell

다음 단계​

권장 사항