주 콘텐츠로 건너뛰기

불확정성 탐구하기

이 Qiskit in Classrooms 모듈을 진행하려면 학생들의 Python 환경에 다음 패키지가 설치되어 있어야 합니다:

  • qiskit v2.1.0 이상
  • qiskit-ibm-runtime v0.40.1 이상
  • qiskit-aer v0.17.0 이상
  • qiskit.visualization
  • numpy
  • pylatexenc

위 패키지의 설치 및 환경 설정은 Qiskit 설치 가이드를 참조하세요. 실제 양자 컴퓨터에서 작업을 실행하려면, IBM Cloud 계정 설정 가이드의 단계를 따라 IBM Quantum® 계정을 만들어야 합니다.

이 모듈은 테스트 결과 QPU 사용 시간이 약 8분 소요되었습니다. 이는 어디까지나 예상치이며 실제 사용량은 달라질 수 있습니다. 시간이 많이 걸리는 계산 두 가지는 헤더 주석에 표시되어 있으며, QPU 시간이 부족한 경우 시뮬레이터로 대체할 수 있습니다. 해당 계산을 제외하면 모듈 전체의 QPU 사용 시간은 약 30초에 불과합니다.

# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-aer qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'

아래에서 Dr. Katie McCormick의 모듈 설명 영상을 시청하거나, 여기를 클릭해 YouTube에서 시청하세요.


소개

불확정성 원리는 물리학 수업 밖에서도 한 번쯤 들어보셨을 것입니다. 불확정성을 일상적으로 풀어 표현하면 "무언가를 관찰하면 그것에 영향을 준다"라고 할 수 있습니다. 물론 그것도 맞는 말입니다. 하지만 물리학적으로 더 정확하게 설명하자면, 특정 물리적 관측량들은 서로 양립 불가능한 성질이 있어서 두 관측량을 동시에 임의의 정밀도로 알 수 없다는 것입니다. 많은 학생들이 처음 만나는 양립 불가능한 변수 쌍은 xxpxp_x, 즉 xx축 방향의 위치와 그 방향의 선형 운동량입니다. 이 변수들에 대한 불확정성 제약은 다음과 같이 표현됩니다. ΔxΔpx2.\Delta x \Delta p_x \geq \frac{\hbar}{2}. 여기서 Δx\Delta x는 "xx의 불확정도"라고 하며, 통계학의 표준편차와 같은 의미로 다음과 같이 정의됩니다. Δx=x2x2.\Delta x = \sqrt{\langle x^2 \rangle - \langle x \rangle^2}. Δpx\Delta p_x도 같은 방식으로 정의됩니다. 이 불확정성 관계의 유도는 다루지 않겠지만, 이것이 고전 파동에 대한 우리의 이해와 일관됨을 짚어보겠습니다. 진정으로 하나의 완벽한 진동수 ff와 파장 λ\lambda를 가진 파동은 완벽한 사인 곡선으로 영원히 이어집니다. 양자역학적으로 이는 드브로이의 가설 λ=h/p\lambda = h/p에 따라 운동량을 완벽하게 아는 것에 해당합니다. 그러나 파동적 입자의 위치를 알려면, 그 입자를 기술하는 파동이 공간상에서 매우 좁게 집중되어야 합니다(예를 들어 매우 좁은 가우시안 형태). 이러한 날카롭게 집중된 파동 함수를 포함한 임의의 연속 함수는 다양한 파장의 사인 함수들로 이루어진 푸리에 급수로 표현할 수 있음을 우리는 알고 있습니다. 그러나 파동 함수가 더 날카롭게 집중될수록(위치를 더 잘 알게 될수록) 푸리에 급수에 더 많은 항이 필요하고, 이는 더 많은 파장(즉, 양자역학적으로 더 많은 운동량 값)이 혼합됨을 의미합니다.

더 간단히 말하면, 운동량이 잘 정의된 상태(공간상에서 완벽한 사인 곡선)는 위치가 매우 불확정합니다. 위치가 잘 정의된 상태(디랙 델타 분포와 같은)는 운동량이 매우 불확정합니다.

이러한 양립 불가능성을 보이는 변수들은 더 있습니다. 예를 들어, 입자의 스핀은 한 축 방향으로 잘 정의된 사영값을 가질 수 있지만, 직교하는 축에 대한 사영값은 전혀 알 수 없게 됩니다. 예컨대 0|0\rangle \sim |\uparrow\rangle 상태(Qubit 또는 스핀-1/2 입자의 경우)는 zz축 방향으로 확정된 사영값을 가집니다(Qubit 맥락에서는 1, 스핀-1/2 입자 맥락에서는 /2\hbar/2). 하지만 이 상태는 xx축 방향으로 잘 정의된 사영값을 가지는 두 상태의 중첩으로 쓸 수 있습니다: 0=12(+x+x)|0\rangle = \frac{1}{\sqrt{2}}(|+\rangle_x+|-\rangle_x) 또는 동등하게 (10)=12[12(11)+12(11)].\begin{pmatrix} 1 \\ 0\end{pmatrix} = \frac{1}{\sqrt{2}}\left[\frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ 1\end{pmatrix}+\frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ -1\end{pmatrix}\right]. +x|+\rangle_xxx에 대한 사영값이 잘 정의되어 있고, x|-\rangle_x도 마찬가지입니다. 따라서 xx축 방향의 사영값을 지정하면 zz축 방향의 사영값은 알 수 없게 됩니다. 반대로 zz축 방향의 사영값을 지정하면 xx 방향의 사영값을 알 수 없습니다. 스핀과 Qubit의 맥락에서 논할 때 세부적인 차이가 있지만, 일반적으로 파울리 행렬의 고유 상태들은 탐구할 만한 흥미로운 관계를 가지고 있습니다. 이 강의 전반에 걸쳐, 우리는 이러한 양립 불가능한 변수들의 불확정도에 대한 직관을 실험적으로 검증하고, IBM® 양자 컴퓨터에서 불확정성 관계가 성립하는지 확인합니다.

직관의 간단한 검증

이 첫 번째 실험과 모듈 전반에 걸쳐, 우리는 "Qiskit 패턴"이라는 양자 컴퓨팅 프레임워크를 사용합니다. 이 프레임워크는 워크플로를 다음 단계로 나눕니다:

  • Step 1: 고전적 입력을 양자 문제로 매핑
  • Step 2: 양자 실행을 위한 문제 최적화
  • Step 3: Qiskit Runtime Primitives를 사용하여 실행
  • Step 4: 후처리 및 고전적 분석

일반적으로 이 단계들을 따르되, 항상 명시적으로 표시하지는 않을 수도 있습니다.

Runtime Primitives를 포함한 필요한 패키지를 불러오는 것부터 시작하겠습니다. 사용 가능한 양자 컴퓨터 중 가장 여유 있는 것도 선택합니다.

아래에 처음 사용 시 자격 증명을 저장하는 코드가 있습니다. 자격 증명을 환경에 저장한 후에는 반드시 해당 정보를 노트북에서 삭제하여, 노트북을 공유할 때 자격 증명이 실수로 노출되지 않도록 하세요. 자세한 내용은 IBM Cloud 계정 설정신뢰할 수 없는 환경에서 서비스 초기화를 참조하세요.

from numpy import pi

# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService

# Syntax for first saving your token. Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform', instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')

# Load saved credentials
service = QiskitRuntimeService()
# Load the Runtime primitive and session
from qiskit_ibm_runtime import (
Batch,
SamplerV2 as Sampler,
EstimatorV2 as Estimator,
)

# Use the least busy backend
backend = service.least_busy(min_num_qubits=127)
print(backend.name)
ibm_sherbrooke

강의 중 양자 컴퓨팅 시간이 소진된 경우, 아래 코드의 주석을 해제하여 위에서 선택한 양자 컴퓨터의 노이즈 특성을 일부 모방하는 시뮬레이터를 설정할 수 있습니다.

# Import an estimator, this time from qiskit (we will import from Runtime for real hardware)
from qiskit_aer.primitives import SamplerV2, EstimatorV2
from qiskit_aer.noise import NoiseModel

# Generate the noise model from the backend properties
noise_model = NoiseModel.from_backend(backend)

noisy_sampler = SamplerV2(options={"backend_options": {"noise_model": noise_model}})
noisy_estimator = EstimatorV2(options={"backend_options": {"noise_model": noise_model}})

연산자 Z의 고유 상태가 다른 연산자 X의 고유 상태가 아님을 기억하실 것입니다. 이제 xx축과 zz축 방향의 측정을 통해 이를 실험적으로 확인해 보겠습니다. zz 방향 측정은 단순히 qc.measure()를 사용합니다. IBM 양자 컴퓨터는 zz 방향으로 측정하도록 구성되어 있기 때문입니다. 그러나 xx 방향으로 측정하려면, 측정 방향에 해당하는 xx축이 위로 오도록 시스템을 회전시켜야 합니다. 이는 Hadamard Gate로 수행됩니다. yy 방향 측정에도 유사한 단계가 필요합니다. 필요한 단계를 편의를 위해 여기에 정리합니다:

  • zz 방향 측정: qc.measure()
  • xx 방향 측정: qc.h()qc.measure()
  • yy 방향 측정: qc.sdg(), qc.h(), qc.sqc.measure()

Step 1: Map classical inputs to a quantum problem

이 경우, 매핑 단계는 위에서 설명한 측정과 회전을 양자 Circuit으로 표현하는 것에 불과합니다:

# Step 1: Map

# Import some general packages
from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)

# Add a first measurement
qc.measure(qr, cr[0])
qc.barrier()

# Change basis so that measurements made on quantum computer which normally tell us about z, now tell us about x.
qc.h(qr)

# Add a second measurement
qc.measure(qr, cr[1])

qc.draw("mpl")

이전 코드 셀의 출력

Step 2: Optimize problem for quantum execution

이 단계에서는 수행하려는 연산을 특정 양자 컴퓨터의 기능으로 표현하고, 문제를 양자 컴퓨터의 레이아웃에 매핑합니다.

# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)

qc_isa = pm.run(qc)

Step 3: Execute using Qiskit Runtime primitives

Sampler를 사용하여 측정에 대한 통계를 수집할 수 있습니다. mode = backend를 사용하여 실제 양자 컴퓨터에서 실행되도록 Sampler 프리미티브를 구성합니다. 다른 워크플로우를 위한 다른 모드도 있으며, 아래에서 하나를 사용할 것입니다. Sampler는 "PUB"(Primitive Unified Bloc) 목록을 인수로 하는 run() 메서드를 호출하여 사용합니다. 각 PUB에는 Estimator가 완료할 작업 단위를 함께 정의하는 최대 세 가지 값, 즉 Circuit, 관측값(observables), 파라미터가 포함됩니다. Circuit 목록, 관측값 목록, 파라미터 목록을 제공할 수도 있습니다. 자세한 내용은 PUB 개요를 참고하세요.

실제 양자 물리학 실험을 수행하기 위해 실제 양자 컴퓨터에서 실행하려고 합니다. 실제 양자 컴퓨터에서 할당된 시간을 모두 소진한 경우, 아래 양자 컴퓨터용 코드를 주석 처리하고 시뮬레이터에서 실행하는 코드의 주석을 해제할 수 있습니다.

# Step 3: Run the job on a real quantum computer

sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs)
res = job.result()

counts = res[0].data.c.get_counts()

# Run the job on the Aer simulator with noise model from real backend

# job = noisy_sampler.run([qc_isa])
# res=job.result()
# counts=res[0].data.c.get_counts()

Step 4: Post-processing

이것은 단순히 카운트를 시각화하는 아주 간단한 후처리 사례입니다.

Qiskit은 Qubit, 측정 및 기타 항목을 가장 낮은 번호의 항목을 마지막/오른쪽에 나열하는 순서로 정렬합니다. 이 규칙을 "리틀 엔디언(little-endian)"이라고 합니다. 즉, 아래에서 "10"으로 표시된 열은 첫 번째 측정값이 "0"이고 두 번째 측정값이 "1"인 카운트를 의미합니다.

# Step 4: Post-process

from qiskit.visualization import plot_histogram

plot_histogram(counts)

이전 코드 셀의 출력

이 규칙이 마음에 들지 않는다면 marginal_counts를 사용하여 각 측정 결과를 별도로 시각화할 수 있습니다:

from qiskit.result import marginal_counts

plot_histogram(
marginal_counts(counts, indices=[0]), title="Counts after first measurement"
)

이전 코드 셀의 출력

plot_histogram(
marginal_counts(counts, indices=[1]), title="Counts after second measurement"
)

이전 코드 셀의 출력

기본적으로 Qiskit의 상태는 0|0\rangle 상태로 초기화됩니다. 따라서 첫 번째 측정의 거의 모든 결과가 0|0\rangle을 산출한 것은 놀라운 일이 아닙니다. 그러나 두 번째 측정(xx에 대한 상태 투영 정보를 제공하는 측정)에서는 거의 균등하게 나뉘었음을 주목하세요. zz 방향 측정에서 매우 예측 가능한 결과를 주는 이 상태가, xx 방향 측정에서는 매우 예측 불가능한 결과를 낳는 것으로 보입니다. 이를 더 탐구해 봅시다.

측정 순서를 반대로 하면 어떻게 될까요? Hadamard Gate를 사용하여 0|0\rangle±x|\pm\rangle_x에서 측정될 확률에 대한 통계를 먼저 얻을 수 있습니다. 그런 다음 두 번째 측정에서는 두 번째 Hadamard Gate를 사용하여 zz 기저로 다시 전환합니다.

# Step 1:

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(2, "c")
qc = QuantumCircuit(qr, cr)

# Change basis to measure along x.
qc.h(qr)
qc.measure(qr, cr[0])
qc.barrier()

# Change our basis back to z and make a second measurement
qc.h(qr)
qc.measure(qr, cr[1])

qc.draw("mpl")

이전 코드 셀의 출력

# Step 2: Transpile the circuit for running on a quantum computer

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
# Step 3: Run the job on a real quantum computer

sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs)
res = job.result()
counts = res[0].data.c.get_counts()

# Run the job on the Aer simulator with noise model from real backend
# job = noisy_sampler.run([qc_isa])
# res=job.result()
# counts=res[0].data.c.get_counts()
# Step 4: Post-process
from qiskit.visualization import plot_histogram

plot_histogram(counts)

이전 코드 셀의 출력

이번에는 예측 가능성이 더욱 낮아 보입니다! 이전에는 최소한 첫 번째 측정 결과를 알 수 있었지만, 이제는 가능한 모든 상태에 걸쳐 꽤 균등하게 분포되어 있습니다. 이런 결과가 나온 이유를 어렵지 않게 이해할 수 있습니다. 우리는 0|0\rangle에서 시작했는데, 이 상태는 다음 식에 따라 +x|+\rangle_xx|-\rangle_x의 50-50 혼합입니다: 0=12(+x+x)|0\rangle=\frac{1}{\sqrt{2}}(|+\rangle_x+|-\rangle_x) 따라서 첫 번째 측정에서 + 또는 - 상태(그래프에서 0과 1로 매핑)를 얻을 확률이 동일해야 함은 분명합니다. xx 방향 측정은 상태를 고유 상태 +x|+\rangle_x 또는 x|-\rangle_x 중 하나로 붕괴시킵니다. 각 상태는 다음 식에 따라 0|0\rangle1|1\rangle의 50-50 혼합입니다: +x=12(0+1)|+\rangle_x = \frac{1}{\sqrt{2}}(|0\rangle+|1\rangle) x=12(01)|-\rangle_x = \frac{1}{\sqrt{2}}(|0\rangle-|1\rangle) 따라서 시스템이 xx의 고유 상태에 놓이면, zz 방향 측정은 0|0\rangle1|1\rangle 모두를 산출하며, 그 확률은 거의 동일합니다.

즉, 첫 번째 예시에서는 일부 측정에서 매우 예측 가능한 결과를 내지만 다른 측정에서는 예측 불가능한 결과를 내는 상태가 있음을 보여주었습니다. 현재 예시는 이보다 더 나쁜 결과가 가능함을 보여줍니다. 측정 순서만 바꾸더라도 두 측정 모두에서 예측 불가능한 결과를 주는 상태가 있습니다. 이제 주어진 상태에서 어떤 물리량이 얼마나 확실한지 또는 불확실한지를 조사해 봅시다.

불확실성 계산

이를 불확실성(uncertainty) 또는 분산(variance)을 사용하여 정량화할 수 있습니다. "불확실성"은 흔히 분포의 "분산"의 제곱근으로 정의됩니다. 즉, 어떤 관측량 SS에 대한 불확실성은 ΔS\Delta S로 표기하며 다음과 같이 주어집니다.

(ΔS)2(SS)2(ΔS)2=S22SS+S2(ΔS)2=S2S2\begin{aligned} (\Delta S)^2 & \equiv \langle (S - \langle S \rangle)^2 \rangle\\ (\Delta S)^2 & = \langle S^2 - 2 S \langle S \rangle +\langle S \rangle^2 \rangle\\ (\Delta S)^2 & = \langle S^2 \rangle - \langle S \rangle^2 \end{aligned}

S2=IS^2 = I인 파울리 행렬의 경우, 이는 다음과 같이 됩니다.

(ΔS)2=1S2(\Delta S)^2 = 1 - \langle S \rangle^2

구체적인 예를 들어 적용해 보겠습니다. 상태 ψ=+y=12(1i)|\psi\rangle = |+\rangle_y = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ i \end{pmatrix}에서 시작하여, 해당 상태에서 관측량 XX의 불확실성을 구해 보겠습니다.

이해도 확인

아래 문제를 읽고, 답을 생각해 본 다음, 삼각형을 클릭하여 해답을 확인하세요.

상태 +y=+i|+\rangle_y = |+i\rangle에서 XX의 불확실성을 손으로 직접 계산하세요.

정답:

ΔX=+iX2+i+iX+i2\Delta X =\sqrt{\langle+i| X^2 |+i\rangle - \langle+i| X |+i\rangle^2}

주어진 상태에서 계산하면 다음과 같습니다.

ΔX=12(1i)(0110)(0110)12(1i)(12(1i)(0110)12(1i))2ΔX=12(1i)(1001)(1i)(12(1i)(i1))2ΔX=12(1i)(1i)(12(0)))2ΔX=12(2)=1\begin{aligned} \Delta X & =\sqrt{\frac{1}{\sqrt{2}}\begin{pmatrix}1 & -i\end{pmatrix} \begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix} \begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix} \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ i\end{pmatrix} - \left(\frac{1}{\sqrt{2}}\begin{pmatrix}1 & -i\end{pmatrix} \begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix} \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ i\end{pmatrix}\right)^2}\\ \Delta X & =\sqrt{\frac{1}{2}\begin{pmatrix}1 & -i\end{pmatrix} \begin{pmatrix}1 & 0 \\ 0 & 1\end{pmatrix} \begin{pmatrix}1 \\ i\end{pmatrix} - \left(\frac{1}{2}\begin{pmatrix}1 & -i\end{pmatrix} \begin{pmatrix}i \\ 1\end{pmatrix}\right)^2}\\ \Delta X & =\sqrt{\frac{1}{2}\begin{pmatrix}1 & -i\end{pmatrix} \begin{pmatrix}1 \\ i\end{pmatrix} - \left(\frac{1}{2}(0))\right)^2}\\ \Delta X & =\sqrt{\frac{1}{2}(2)} = 1 \end{aligned}

qc.initialize()를 사용하여 임의의 초기 상태를 만들 수 있습니다. 여기서 허수 단위의 구문은 1j1j입니다.

# Step 1: Map the problem into a quantum circuit

from qiskit.quantum_info import SparsePauliOp
import numpy as np

obs = SparsePauliOp("X")

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Initialize the state
qc.initialize([1, 1j] / np.sqrt(2))

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs_isa = obs.apply_layout(layout=qc_isa.layout)

# Step 3: Run the circuit on a real quantum computer

estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run([[qc_isa, obs_isa]])
res = job.result()

# Run the job on the Aer simulator with noise model from real backend
# job = noisy_estimator.run([[qc_isa,obs_isa]])
# res=job.result()

# Step 4: Return the result in classical form, and analyze.

print(res[0].data.evs)
-0.02408454165642664

위의 방정식에 따르면, (ΔX)2=1X2=1(0.0015...)2ΔX=0.999...(\Delta X)^2 = 1 - \langle X \rangle^2 = 1-(0.0015...)^2 \rightarrow \Delta X = 0.999... 동일한 상태를 유지하면서 이번에는 ZZ의 기댓값을 구해 보겠습니다.

# Step 1: Map the problem into a quantum circuit

obs = SparsePauliOp("Z")

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Initialize the state to |+>_y
qc.initialize([1, 1j] / np.sqrt(2))

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs_isa = obs.apply_layout(layout=qc_isa.layout)

# Step 3: Run the circuit on a real quantum computer

estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run(pubs)
res = job.result()

# Run the job on the Aer simulator with noise model from real backend
# job = noisy_estimator.run([[qc_isa,obs_isa]])
# res=job.result()

# Step 4: Return the result in classical form, and analyze.

print(res[0].data.evs)
0.04958271968581247

이전과 동일한 계산을 수행할 수 있지만, 분산 역시 1.0에 매우 근접함을 알 수 있습니다. ΔXΔZ1.0\Delta X \Delta Z \approx 1.0이라는 결론을 내릴 수 있습니다. 실제로 이는 우리가 선택한 상태에 대해 근사적으로 성립합니다. 그런데 더 좋은 결과를, 또는 더 나쁜 결과를 얻을 수 있을까요?

위치 xx와 운동량 pxp_x 사이에는 불확실성 관계가 있다는 것을 떠올려 보세요. 이 두 변수에 대해 가장 친숙한 형태는 아마도 다음일 것입니다. ΔxΔpx/2\Delta x \Delta p_x \geq \hbar/2 이것만 기억하고 있다면, ΔX\Delta XΔZ\Delta Z에도 불확실성에 대한 근본적인 하한이 있다고 생각하고 싶을 수 있습니다. 어쩌면 곱 ΔXΔZ\Delta X \Delta Z가 절대로 0에 도달할 수 없는 것은 아닐까요? 다른 상태를 시도해서 이것이 성립하는지 확인해 봅시다. 이번에는 ψ=12(11)|\psi\rangle = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ 1 \end{pmatrix}를 사용하겠습니다. 어떤 결과가 나오는지 살펴봅시다. 아래 코드에서 Estimator는 동일한 작업 제출 안에서 두 쌍의 Circuit과 관측량을 받을 수 있습니다.

# Step 1: Map the problem into a quantum circuit

obs1 = SparsePauliOp("X")
obs2 = SparsePauliOp("Z")

# Define registers

qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Initialize the state
qc.initialize([1, 1] / np.sqrt(2))

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs1_isa = obs1.apply_layout(layout=qc_isa.layout)
obs2_isa = obs2.apply_layout(layout=qc_isa.layout)

# Step 3: Run the circuit on a real quantum computer

with Batch(backend=backend) as batch:
estimator = Estimator(mode=batch)
pubs = [(qc_isa, obs1_isa), (qc_isa, obs2_isa)]
job = estimator.run(pubs)
res = job.result()
batch.close()

# Run the job on the Aer simulator with noise model from real backend

# job = noisy_estimator.run([[qc,obs1],[qc,obs2]])
# res=job.result()

# Step 4: Return the result in classical form, and analyze.

print("The expectation value of the first observable is: ", res[0].data.evs)
print("The expectation value of the second observable is: ", res[1].data.evs)
The expectation value of the first observable is:  1.0011036174126302
The expectation value of the second observable is: 0.0029429797670141016

XX의 기댓값은 1.0에 근접해야 하지만, 1.0을 초과해서는 안 됩니다. 매우 작은 양만큼 1.0을 초과하더라도 걱정하지 마세요. 이는 노이즈 및/또는 읽기 오류와 같은 요인으로 인한 것입니다. 이는 매우 중요한 주제이지만, 지금은 무시해도 됩니다.

XX의 기댓값이 1.0에 매우 근접함을 확인했으며(XX의 분산이 매우 낮음에 해당), 이는 두 분산의 곱을 상당히 낮게 만듭니다.

ΔXΔZ=1(0.9853)2×1(0.00195)2=0.171.\Delta X \Delta Z = \sqrt{1-(0.9853)^2} \times \sqrt{1-(-0.00195)^2} = 0.171.

이 값이 정확히 0은 아니지만, 파울리 연산자의 고유값(±1\pm 1)에 비해 작아지고 있습니다. 선형 위치와 운동량 사이의 불확실성 관계는 연산자 xxpxp_x 사이의 교환자를 명시적으로 사용하여 다르게 쓸 수 있다는 것을 기억할 것입니다.

ΔxΔpx12[x,px]\Delta x \Delta p_x \geq \frac{1}{2}|\langle [x,p_x] \rangle|

여기서

[x,px]=xpxpxx[x,p_x] = xp_x-p_xx

xxpxp_x의 교환자입니다.

이것이 파울리 연산자로 가장 쉽게 확장할 수 있는 형태입니다. 일반적으로 두 연산자 AABB에 대해,

ΔAΔB12[A,B].\Delta A \Delta B \geq \frac{1}{2}|\langle [A,B] \rangle|.

파울리 행렬 XXZZ의 경우,

ΔXΔZ12[X,Z]\Delta X \Delta Z \geq \frac{1}{2}|\langle [X,Z] \rangle|

을 계산하기 위해 [X,Z][X,Z]가 필요합니다. 다음을 보여 드리며, 비슷한 계산은 연습 문제로 독자에게 맡깁니다.

[X,Z]=XZZX=(0110)(1001)(1001)(0110)[X,Z] = XZ-ZX = \begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix}\begin{pmatrix}1 & 0 \\ 0 & -1\end{pmatrix}-\begin{pmatrix}1 & 0 \\ 0 & -1\end{pmatrix}\begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix} [X,Z]=(0110)(0110)=2(0110)[X,Z] = \begin{pmatrix}0 & -1 \\ 1 & 0\end{pmatrix}-\begin{pmatrix}0 & 1 \\ -1 & 0\end{pmatrix} = 2\begin{pmatrix}0 & -1 \\ 1 & 0\end{pmatrix}

이것도 완전히 유효한 답이지만, 한 단계 더 나아가면

[X,Z]=2i(0ii0)=2iY[X,Z] = -2i\begin{pmatrix}0 & -i \\ i & 0\end{pmatrix}=-2iY

따라서 불확실성 관계는 다음과 같이 됩니다.

ΔXΔZY.\Delta X \Delta Z \geq |\langle Y \rangle|.

이해도 확인

아래 문제를 읽고, 답을 생각해 본 다음, 삼각형을 클릭하여 해답을 확인하세요.

[X,Y][X,Y][Y,Z][Y,Z]를 구하세요. 이를 이용하여 XXYY, YYZZ 사이의 불확실성 관계를 써 보세요.

정답:

[X,Y]=XYYX=(0110)(0ii0)(0ii0)(0110)=2(i00i)=2iZ[X,Y] = XY-YX = \begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix}\begin{pmatrix}0 & -i \\ i & 0\end{pmatrix}-\begin{pmatrix}0 & -i \\ i & 0\end{pmatrix}\begin{pmatrix}0 & 1 \\ 1 & 0\end{pmatrix} = 2 \begin{pmatrix}i & 0 \\ 0 & -i\end{pmatrix}=2iZ[Y,Z]=YZZY=(0ii0)(1001)(1001)(0ii0)=2(0ii0)=2iX[Y,Z] = YZ-ZY = \begin{pmatrix}0 & -i \\ i & 0\end{pmatrix}\begin{pmatrix}1 & 0 \\ 0 & -1\end{pmatrix}-\begin{pmatrix}1 & 0 \\ 0 & -1\end{pmatrix}\begin{pmatrix}0 & -i \\ i & 0\end{pmatrix} = 2 \begin{pmatrix}0 & i \\ i & 0\end{pmatrix}=2iX

일반 불확실성 관계와 결합하면,

ΔXΔYZ,\Delta X \Delta Y \geq |\langle Z \rangle|,ΔYΔZX.\Delta Y \Delta Z \geq |\langle X \rangle|.

일관성 검증

계속 진행하기 전에, 이 결과가 이전의 발견과 일관되는지 확인해 봅시다. 우리는 상태 ψ=12(11)|\psi\rangle = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ 1 \end{pmatrix}를 사용했고, ΔXΔZ=0.171\Delta X \Delta Z = 0.171임을 확인했습니다. 이제 이 곱은 다음 값 이상이어야 함을 알 수 있습니다.

Y=12(11)(0ii0)12(11)|\langle Y \rangle|=\frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1 \end{pmatrix}\begin{pmatrix}0 & -i \\ i & 0\end{pmatrix}\frac{1}{\sqrt{2}}\begin{pmatrix} 1 \\ 1 \end{pmatrix} Y=12(11)(ii)=12(i+i)=0.|\langle Y \rangle| = \frac{1}{2}\begin{pmatrix} 1 & 1 \end{pmatrix}\begin{pmatrix} -i \\ i \end{pmatrix} = \frac{1}{2}(-i+i) = 0.

따라서 실제로 ΔXΔZ=0.171Y=0\Delta X \Delta Z = 0.171 \geq |\langle Y \rangle|=0이 성립합니다. 아래 문제들을 풀며 이 결과에 대한 직관을 쌓아보세요.

이해도 확인

아래 문제들을 읽고 답을 생각해 본 뒤, 삼각형을 클릭하여 해답을 확인하세요.

다음 항목들을 하나의 묶음으로 함께 답하세요.

(a) XX에 대한 불확정도가 0이 되는 상태는 무엇이라고 예상하나요?

(b) ZZ에 대한 불확정도가 0이 되는 상태는 무엇이라고 예상하나요?

(c) 기댓값 Y\langle Y \rangle가 0이 되는 상태는 무엇인가요?

(d) 위 문항들의 답은 ΔXΔZY\Delta X \Delta Z \geq |\langle Y \rangle|와 일관성이 있나요?

(e) Estimator를 사용하여 이를 명시적으로 확인하는 코드를 작성하세요.

답:

(a) XX 연산자의 고유상태가 XX에 대한 불확정도 0을 가질 것으로 예상할 수 있습니다. 실제로 ψ=+x|\psi\rangle = |+\rangle_x를 사용하면, ΔX=1X2=112=0.\Delta X = \sqrt{1-\langle X \rangle^2} = \sqrt{1-1^2} = 0.

(b) ZZ 연산자의 고유상태가 ZZ에 대한 불확정도 0을 가질 것으로 예상할 수 있습니다. 실제로 ψ=1|\psi\rangle = |1\rangle을 사용하면, ΔZ=1Z2=1(1)2=0.\Delta Z = \sqrt{1-\langle Z \rangle^2} = \sqrt{1-(-1)^2} = 0.

(c) 측정 시 yy축 양의 방향 성분과 음의 방향 성분이 동일한 빈도로 나타나는 상태에서 Y=0\langle Y \rangle=0을 기대할 수 있습니다. 여기에는 XXZZ의 고유상태들이 포함됩니다.

(d) 그렇습니다. XX 또는 ZZ의 고유상태에서 불확정도의 곱 ΔXΔZ\Delta X \Delta Z는 매우 작은 값을 가질 것으로 예상됩니다: ΔXΔZ0.\Delta X \Delta Z \approx 0. 그러한 상태에서 Y=0\langle Y \rangle=0도 기대할 수 있으므로 불확정성 관계가 충족될 수 있습니다.

(e) 다음과 같은 코드로 이를 검증할 수 있습니다.

obs1 = SparsePauliOp.from_list(
[("X", 1.000)]
)
obs2 = SparsePauliOp.from_list(
[("Y", 1.000)]
)
obs3 = SparsePauliOp.from_list(
[("Z", 1.000)]
)
qc = QuantumCircuit(1,1)
qc.ry(pi/2,0)

job = estimator.run([(qc, [[obs1], [obs2], [obs3]])], precision=0.001)
res=job.result()

이 코드는 모든 기댓값을 반환합니다. 모든 기댓값을 가져와 불확정도를 계산하려면 다음을 사용할 수 있습니다.

xs=res[0].data.evs[0]
ys=abs(res[0].data.evs[1])
zs=res[0].data.evs[2]

import math
prodxz=((1-xs[i]*xs[i])**0.5)*(1-zs[i]*zs[i])**0.5

다음 항목들을 하나의 묶음으로 함께 답하세요.

(a) Y\langle Y \rangle의 기댓값이 크게 나오는 상태를 생각해 볼 수 있나요?

(b) 그 상태에서 XX의 불확정도는 크다고 예상하나요, 아니면 작다고 예상하나요?

(c) 그 상태에서 ZZ의 불확정도는 크다고 예상하나요, 아니면 작다고 예상하나요?

(d) 위 문항들의 답은 ΔXΔZY\Delta X \Delta Z \geq |\langle Y \rangle|와 일관성이 있나요?

(e) Estimator를 사용하여 이를 명시적으로 확인하는 코드를 작성하세요.

답:

(a) YY의 고유상태인 +y|+\rangle_y에서 Y1\langle Y \rangle\approx 1을 기대할 수 있습니다.

(b) 상태 +y|+\rangle_y에서 XX를 측정하면 양의 결과와 음의 결과가 동일한 빈도/확률로 나타나므로, XX의 불확정도가 클 것으로 예상됩니다.

(c) 상태 +y|+\rangle_y에서 ZZ를 측정하면 양의 결과와 음의 결과가 동일한 빈도/확률로 나타나므로, ZZ의 불확정도가 클 것으로 예상됩니다.

(d) 그렇습니다. YY의 고유상태, 특히 +y|+\rangle_y에서 불확정도의 곱 ΔXΔZ\Delta X \Delta Z는 큰 값을 가질 것으로 예상됩니다. 또한 그 상태에서 Y1\langle Y \rangle\approx 1도 기대할 수 있습니다. 따라서 Y\langle Y \rangleΔXΔZ\Delta X \Delta Z 모두 이 상태에서 상당히 크며, 불확정성 관계가 다시 충족될 수 있는 것은 충분히 타당합니다.

(e) 다음과 같은 코드로 이를 검증할 수 있습니다.

obs1 = SparsePauliOp.from_list(
[("X", 1.000)]
)
obs2 = SparsePauliOp.from_list(
[("Y", 1.000)]
)
obs3 = SparsePauliOp.from_list(
[("Z", 1.000)]
)
qc = QuantumCircuit(1,1)
qc.rx(-pi/2,0)

job = estimator.run([(qc, [[obs1], [obs2], [obs3]])], precision=0.001)
res=job.result()

이 코드는 모든 기댓값을 반환합니다. 모든 기댓값을 가져와 불확정도를 계산하려면 다음을 사용할 수 있습니다.

xs=res[0].data.evs[0]
ys=abs(res[0].data.evs[1])
zs=res[0].data.evs[2]

import math
prodxz=((1-xs[i]*xs[i])**0.5)*(1-zs[i]*zs[i])**0.5

불확정성 관계 검증

위의 검증은 단 하나의 상태 벡터 ψ=+x|\psi\rangle = |+\rangle_x에 대해서만 불확정성 관계가 성립함을 보여주었습니다. 이것이 실험적으로 일반적으로 성립한다는 것을 확인하기 위해, 다양한 상태 벡터를 선택하여 Estimator로 유사한 계산을 수행해 봅시다. 먼저 RY 게이트를 사용해 매개변수 θ\theta로 여러 초기 상태를 만들어 상태 벡터를 zz 축에서 회전시켜 보겠습니다.

# The calculation below uses approximately 3-4 minutes of QPU time.
# Step 1: Map the problem into a quantum circuit

from qiskit.circuit import Parameter
import numpy as np

# Specify observables
obs1 = SparsePauliOp("X")
obs2 = SparsePauliOp("Y")
obs3 = SparsePauliOp("Z")

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Rotate away from |0>
theta = Parameter("θ")
qc.ry(theta, 0)

params = np.linspace(0, 2, num=21)

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs1_isa = obs1.apply_layout(layout=qc_isa.layout)
obs2_isa = obs2.apply_layout(layout=qc_isa.layout)
obs3_isa = obs3.apply_layout(layout=qc_isa.layout)

# Step 3: Run the circuit on a real quantum computer

with Batch(backend=backend) as batch:
estimator = Estimator(mode=batch)
pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]], [params])]
job = estimator.run(pubs, precision=0.01)
res = job.result()

batch.close()

# Run the job on the Aer simulator with noise model from real backend

# job = noisy_estimator.run([(qc, [[obs1], [obs2], [obs3]], [params])])
# res=job.result()
# Step 4: Post-processing and classical analysis.
xs = res[0].data.evs[0]
ys = abs(res[0].data.evs[1])
zs = res[0].data.evs[2]

# Calculate uncertainties

delx = []
delz = []
prodxz = []
for i in range(len(xs)):
delx.append(abs((1 - xs[i] * xs[i])) ** 0.5)
delz.append(abs((1 - zs[i] * zs[i])) ** 0.5)
prodxz.append(delx[i] * delz[i])
# Here we can plot the results from this simulation.
import matplotlib.pyplot as plt

plt.plot(params, delx, label=r"$\Delta$ X")
plt.plot(params, ys, label=r"$\langle$ Y $\rangle$")
plt.plot(params, delz, label=r"$\Delta$ Z")
plt.plot(params, prodxz, label=r"$\Delta$X $\Delta$Z")
plt.xlabel(r"$\theta$")
plt.ylabel("Expectation/Uncertainty Values")
plt.legend()
plt.show()

이전 코드 셀의 출력

빨간색 곡선 (ΔXΔZ)(\Delta X \Delta Z)이 항상 주황색 곡선 Y\langle Y \rangle보다 위에 있음을 확인할 수 있습니다. 불확정성의 곱이 한계에 가까워지기도 하고 멀어지기도 하지만, 항상 불확정성 관계를 만족합니다.

물론, 이 경우 한계값인 Y\langle Y \rangle가 항상 0에 매우 가깝기 때문에 불확정성 관계의 가장 좋은 검증이라고 보기는 어렵습니다. YY의 고유 상태에 더 큰 투영을 갖는 양자 상태를 사용해 봅시다. 구체적으로, 여전히 다양한 각도로 0|0\ranglezz 축에서 아래로 회전시키되, 이번에는 그 결과 상태를 zz 축 주위로 어떤 각도(예: π/4\pi/4)만큼 추가로 회전시켜 어떤 일이 일어나는지 살펴보겠습니다.

# The calculation below uses approximately 3-4 minutes of QPU time.
from qiskit.circuit import Parameter
import numpy as np

# Step 1: Map the problem to a quantum circuit

# Specify observables
obs1 = SparsePauliOp("X")
obs2 = SparsePauliOp("Y")
obs3 = SparsePauliOp("Z")

# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Rotate away from |0> along one plane, and then along a transverse direction.
theta = Parameter("θ")
qc.ry(theta, 0)
qc.rz(pi / 4, 0)

params = np.linspace(0, 2, num=21)

# Step 2: Transpile the circuit

pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)

obs1_isa = obs1.apply_layout(layout=qc_isa.layout)
obs2_isa = obs2.apply_layout(layout=qc_isa.layout)
obs3_isa = obs3.apply_layout(layout=qc_isa.layout)

# Step 3: Run the circuit on a real quantum computer

with Batch(backend=backend) as batch:
estimator = Estimator(mode=batch)
pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]], [params])]
job = estimator.run(pubs, precision=0.01)
res = job.result()

batch.close()

# Run the job on the Aer simulator with noise model from real backend

# job = noisy_estimator.run([(qc, [[obs1], [obs2], [obs3]], [params])])
# res=job.result()
# Step 4: Post-processing and classical analysis.
xs = res[0].data.evs[0]
ys = abs(res[0].data.evs[1])
zs = res[0].data.evs[2]

# Calculate uncertainties

delx = []
delz = []
prodxz = []
for i in range(len(xs)):
delx.append(abs((1 - xs[i] * xs[i])) ** 0.5)
delz.append(abs((1 - zs[i] * zs[i])) ** 0.5)
prodxz.append(delx[i] * delz[i])
# Here we can plot the results from this simulation.
import matplotlib.pyplot as plt

plt.plot(params, delx, label=r"$\Delta$ X")
plt.plot(params, ys, label=r"$\langle$ Y $\rangle$")
plt.plot(params, delz, label=r"$\Delta$ Z")
plt.plot(params, prodxz, label=r"$\Delta$X $\Delta$Z")
plt.xlabel(r"$\theta$")
plt.ylabel("Expectation/Uncertainty Values")
plt.legend()
plt.show()

이전 코드 셀의 출력

이제 불확정성의 한계 (ΔXΔZ)(\Delta X \Delta Z)가 실제로 시험대에 오른 것을 볼 수 있습니다! 빨간색 곡선이 이전보다 주황색 곡선에 훨씬 더 가까워졌습니다. 실제로 잡음이 없다면, 불확정성 관계는 한 점에서 정확히 등호가 성립할 것입니다((ΔXΔZ)=Y(\Delta X \Delta Z) = \langle Y \rangle). 잡음과 측정 오류가 있는 경우, 가끔 (ΔXΔZ)(\Delta X \Delta Z)Y\langle Y \rangle보다 극소량 크게 나타나도 놀랄 필요는 없습니다. 이는 진정한 불확정성 위반이 아니라 단순히 오류가 존재하기 때문입니다.

이해 점검

아래 질문을 읽고 답을 생각한 후, 삼각형을 클릭하여 풀이를 확인하세요.

Y\langle Y \rangle를 최대한 크게 만들어 절대적인 한계에 도달하려면 어떻게 해야 할지 설명하세요.

답:

현재 코드에는 기본 초기 상태 0|0\rangle을 매개변수화된 각도 θ\theta만큼 zz 축에서 아래로 회전시키고, 그 후 zz 축 주위로 π/4\pi/4만큼 추가 회전하여 상태 벡터를 yy 축 방향으로 부분적으로 이동시키는 코드가 있습니다.

qc.ry(theta,0)

qc.rz(pi/4,0)

zz 축 회전을 π/4\pi/4에서 π/2\pi/2로 변경하면, YY의 고유 상태 방향으로 완전히 회전할 수 있습니다:

qc.ry(theta,0)

qc.rz(pi/2,0)

다른 변경은 필요하지 않습니다.

코드를 수정하거나 복사하여 Y의 기댓값이 최대화된 상태에서 불확정성 관계를 검증해 보세요. 불확정성 관계가 성립하나요?

답:

위의 예시 코드를 그대로 사용하되

qc.rz(pi/4,0)

대신

qc.rz(pi/2,0)

으로 교체하면 됩니다.

결과 그림은 아래와 같이 나타나야 하며, 불확정성 원리는 여전히 성립합니다.

Y 연산자의 최대 기댓값과 불확정성을 비교한 플롯.

위의 코드를 수정하여 양자 컴퓨터에서 얻은 측정값을 통해 ΔXΔY\Delta X \Delta Y의 곱이 적절히 동작함을 보여주는 유사한 그림을 만들어 보세요. 어떤 상태든 자유롭게 선택하세요.

답:

위의 예시 코드를 그대로 사용할 수 있으며, 실제로 위의 결과를 그대로 활용하되 기댓값을 이용해 다른 불확정성을 계산하면 됩니다. 예를 들어 다음과 같이 사용할 수 있습니다:

xs=res[0].data.evs[0]
ys=res[0].data.evs[1]
zs=abs(res[0].data.evs[2])
import math
delx = []
dely = []
prodxy=[]
for i in range(len(xs)):
delx.append((1-xs[i]*xs[i])**0.5)
dely.append((1-ys[i]*ys[i])**0.5)
prodxy.append(((1-xs[i]*xs[i])**0.5)*(1-ys[i]*ys[i])**0.5)

그리고 다음과 같이 플롯할 수 있습니다:

import matplotlib.pyplot as plt
plt.plot(params, delx, label=r'$\Delta$ X')
plt.plot(params, dely, label=r'$\langle$ Y $\rangle$')
plt.plot(params, zs, label=r'$\Delta$ Z')
plt.plot(params, prodxy, label=r'$\Delta$X $\Delta$Z')
plt.xlabel(r'$\theta$')
plt.ylabel('Expectation/Uncertainty Values')
plt.legend()
plt.show()

도전 과제: θ\theta의 다양한 값을 스캔했던 것처럼 ϕ\phi의 여러 값도 스캔하는 코드를 작성하고, 불확정성 관계가 절대 위반되지 않음을 보여주는 3D 플롯을 만들어 보세요. 관측값은 자유롭게 선택하세요.

질문

강사는 이 간단한 설문을 작성하여 노트북의 활용 방식을 알려주시면 정답 및 일반 교과 과정 배치 안내가 포함된 버전을 요청할 수 있습니다.

핵심 개념:

  • 위치와 선형 운동량, 스핀 성분 등 여러 물리적 관측량 쌍 사이에는 불확정성 관계가 존재합니다.
  • 파울리 행렬은 교환 불가능합니다. 이는 스핀의 모든 성분을 동시에 알거나 결정할 수 없다는 사실을 수학적으로 나타냅니다.
  • 양자 컴퓨팅은 파울리 연산자/행렬을 매우 많이 활용하므로, 파울리 연산자와 이와 밀접하게 관련된 스핀 연산자에 대한 불확정성 관계를 이해하는 것이 유용합니다.
  • 두 연산자 AABB에 대한 일반적인 불확정성 공식은 ΔAΔB12[A,B]\Delta A \Delta B \geq \frac{1}{2}|\langle [A,B] \rangle|입니다.
  • 어떤 연산자 AA의 고유 상태 a|a\rangle는 그 연산자에 연관된 물리적 관측량에 대해 불확정도가 0입니다. 실험적으로도 aAa0\langle a|A|a\rangle \approx 0입니다.
  • 어떤 연산자 AA의 고유 상태 a|a\rangleAA와 교환되지 않는 연산자 BB에 대해 더 큰 불확정도를 나타냅니다.
  • 실제 양자 컴퓨터를 사용한 실험 결과는 물리 연산자의 행렬 표현으로부터 얻은 직관을 뒷받침합니다.

참/거짓(T/F) 문제:

  1. T/F XXYY는 동시에 측정할 수 있지만 ZZ는 불가능하다.
  2. T/F XXZZ는 동시에 측정할 수 있지만 YY는 불가능하다.
  3. T/F 선형 위치 연산자와 선형 운동량 연산자는 교환되지 않는다.
  4. T/F IBM 양자 컴퓨터는 기본적으로 ZZ 방향으로 측정하므로, 다른 방향으로 측정하려면 회전이 필요하다.
  5. T/F 아래 Circuit은 ZZ를 먼저 측정한 후 XX를 측정하는 것과 동일한 효과를 낸다.

측정, Hadamard Gate, 그리고 또 다른 측정을 보여주는 Circuit 다이어그램.

객관식(MC) 문제:

  1. 아래 다이어그램은 다음 중 어떤 불확정성 관계를 나타내나요?

    • a. ΔXΔYZ\Delta X \Delta Y \geq |\langle Z \rangle|
    • b. ΔYΔZX\Delta Y \Delta Z \geq |\langle X \rangle|
    • c. ΔZΔXY\Delta Z \Delta X \geq |\langle Y \rangle|
    • d. 위 항목 모두 해당 없음

Y 연산자의 최대 기댓값과 불확정도를 비교하는 그래프.

  1. xx 방향으로 측정을 수행하기 위한 표준 순서는 무엇인가요?

    • a. qc.measure()만 사용
    • b. qc.h()qc.measure()
    • c. qc.h(), qc.h()qc.measure()
    • d. qc.h(), qc.s, qc.h()qc.measure()
    • e. qc.sdg(), qc.h(), qc.sqc.measure()
    • f. qc.sdg(), qc.h(), qc.s, qc.h()qc.measure()
  2. 다음 중 가장 큰 기댓값 X\langle X \rangle를 나타내는 상태는 무엇인가요?

    • a. +x|+\rangle_x
    • b. x|-\rangle_x
    • c. +y|+\rangle_y (+i|+i\rangle라고도 함)
    • d. y|-\rangle_y (i|-i\rangle라고도 함)
    • e. 0|0\rangle (|\uparrow\rangle라고도 함)
    • f. 1|1\rangle (|\downarrow\rangle라고도 함)
  3. 다음 중 가장 큰 불확정도 ΔX\Delta X를 나타내는 상태는 무엇인가요?

    • a. +x|+\rangle_x
    • b. +y|+\rangle_y (+i|+i\rangle라고도 함)
    • c. 0|0\rangle (|\uparrow\rangle라고도 함)
    • d. a와 b가 동률
    • e. b와 c가 동률
    • f. a, b, c 모두 동률

토론 문제:

  1. 이 불확정성의 개념은 카르테시안 공간에서 스핀을 벡터 화살표로 나타내는 개념과 어떤 방식으로든 충돌하나요? 블로흐 구(Bloch sphere)에서는 어떤가요?

  2. xx 축과 yy 축의 중간 방향으로 측정 장치를 배치한다고 가정해 보세요. 어떤 일이 일어날까요? 이 방향으로 측정이 가능한가요? 이것이 XXYY의 불확정성과 어떤 관련이 있나요?

  3. 여기서 얻은 결과를 더 확신하기 위해 어떤 추가 실험을 해보고 싶으신가요?