주 콘텐츠로 건너뛰기

Pauli 기저로 관측값 지정하기

패키지 버전

이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다. 아래 버전 이상을 사용하길 권장합니다.

qiskit[all]~=2.3.0

양자역학에서 관측값(observable)은 측정 가능한 물리적 성질에 해당합니다. 예를 들어 스핀 시스템을 고려할 때, 시스템의 에너지를 측정하거나 자기화(magnetization) 또는 스핀 간의 상관관계와 같이 스핀의 정렬에 관한 정보를 얻고자 할 수 있습니다.

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

O=k=1KαkPk,  Pk{I,X,Y,Z}n,  αkR,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=(0ii0)  Z=(1001)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,jZiZji=1nXi,H = \sum_{\langle i, j\rangle} Z_i Z_j - \sum_{i=1}^n X_i,

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

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

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

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

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

O=P{I,X,Y,Z}nTr(OP)P,O = \sum_{P \in \{I, X, Y, Z\}^{\otimes n}} \mathrm{Tr}(O P) P,

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

참고

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

참고

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

Pauli 기저에서 측정하기

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

XZ=HXHYZ=HSYSH,\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

다음 단계

권장 사항