양자 동전 — 중첩과 간섭에 관한 모듈
이 Qiskit in Classrooms 모듈을 진행하려면, 학생들의 Python 환경에 다음 패키지가 설치되어 있어야 합니다:
qiskitv2.1.0 이상qiskit-ibm-runtimev0.40.1 이상qiskit-aerv0.17.0 이상qiskit.visualizationnumpypylatexenc
위 패키지의 설치 및 설정 방법은 Qiskit 설치 가이드를 참고하세요. 실제 양자 컴퓨터에서 작업을 실행하려면, IBM Cloud 계정 설정 가이드의 단계를 따라 IBM Quantum® 계정을 만들어야 합니다.
이 모듈은 테스트 결과 47초의 QPU 시간이 사용되었습니다. 이는 추정치이며, 실제 사용량은 다를 수 있습니다.
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit 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에서 볼 수 있습니다.
소개
이 모듈에서는 양자 이론의 핵심 원리 중 하나인 중첩(superposition)을 탐구합니다. 우리의 일상적인 경험에서, 사물은 항상 명확한 속성을 지닙니다. 위치, 크기, 모양, 색상 등 모든 것이 관찰자가 아직 측정하지 않았더라도 이미 결정되어 있습니다. 그러나 양자 세계에서는 반드시 그렇지 않습니다. 양자 객체는 고전적으로 허용되는 여러 상태의 "중첩" 상태에 있을 수 있습니다. 중첩 상태를 측정하면, 그 상태들 중 하나로 무작위로 "붕괴"합니다.
어떤 면에서, 중첩 상태를 측정하는 것은 동전 던지기와 비슷합니다. 어느 면이 나올지 미리 알 방법이 없기 때문입니다. 이 근본적 인 비결정론은 아인슈타인조차 불편하게 여겼던 양자역학의 측면입니다. 그는 이 무작위성에 대해 "신은 주사위를 던지지 않는다"라고 말했습니다. 그러나 곧 보게 되겠지만, 신은 사실 주사위를 던지고 동전도 던집니다.
우리는 중첩 상태의 측정에 대한 유추로서 고전적인 동전 던지기를 생각해 볼 것입니다. 그리고 Qiskit과 IBM® 양자 프로세서의 Qubit을 사용해 "양자 동전"을 가지고 놀면서, 그 유추의 한계를 빠르게 발견하게 될 것입니다.
고전적 동전
고전적인 동전부터 시작해 봅시다. 동전을 던지면 앞면 또는 뒷면이 나오며, 각각 50%의 확률을 가집니다. 원칙적으로는 동전의 정확한 초기 조건과 던지는 힘/토크를 알면 어느 면이 나올지 계산할 수 있지만, 실제로는 어느 면이 나올지 사전에 알 방법이 없습니다. 그래서 동전 던지기를 고전적 확률 상태의 대표적인 예로 사용하며, 결과는 본질적으로 무작위입니다. 동전이 착지하기 전의 상태를 이 50/50 확률을 반영하여 다음과 같이 쓸 수 있습니다:
여기서 두 항은 던지기의 두 가지 가능한 결과를 나타내고, 계수는 각 결과의 확률을 나타냅니다. 일반적으로 ""("ket"이라고 알려진)은 양자 상태를 나타내는 데 사용되지만, 여기서는 고전적 확률 상태에 대해 이야기하고 있습니다. 고전 정보와 양자 정보를 표현하는 방법에 대해 더 알아보려면, 양자 정보 기초 강좌의 레슨 1: 단일 시스템을 참고하세요.
동전을 1000번 던지고 앞면/뒷면 횟수를 기록하면 다음과 같은 결과를 얻게 됩니다:
# import necessary packages:
import numpy as np
import matplotlib.pyplot as plt
import random
nflips = 1000
fliplist = [random.randint(0, 1) for f in range(nflips)]
# bar plots using get_gaussian_probs function
plt.hist(fliplist)
plt.show()
양자 동전
양자 컴퓨터의 Qubit을 사용하여 비슷한 확률 상태를 만들 수 있습니다. 동전 던지기처럼, Qubit도 두 가지 가능한 상태인 과 으로 측정될 수 있습니다. 상태에서 시작하여 Hadamard Gate를 적용하면 확률적인 "중 첩" 상태가 만들어집니다. 이는 Qubit을 과 의 동일한 중첩 상태로 만들어 줍니다. 이 중첩 상태가 처음에는 동전처럼 보이고 행동할 수 있지만, 곧 그보다 훨씬 더 많은 것이 있다는 것을 알게 됩니다. 이 모듈의 목표는 중첩이 고전적인 동전 던지기와 다르다는 것을 보여주는 것입니다.
따라서, Qubit이 0과 1의 동일한 중첩 상태에 있으므로, Qubit을 측정하면 을 측정할 확률이 50%, 을 측정할 확률이 50%입니다. 나중에 명확해질 이유로, 고전적 확률 경우와 약간 다르게 이 상태를 표현합니다:
여기서, 두 상태 각각을 측정할 확률은 위의 고전적 확률 상태에서와 달리 더 이상 계수와 같지 않습니다. 대신, 확률을 주는 것은 계수의 제곱이며, 이 계수들은 이제 복소수가 될 수 있어 실수부와 허수부를 모두 가질 수 있습니다.
이러한 차이에도 불구하고, 이 상태를 측정한 결과는 본질적으로 동전 던지기와 같습니다.
from qiskit import QuantumCircuit
qcoin = QuantumCircuit(1)
qcoin.h(0)
qcoin.measure_all()
qcoin.draw("mpl")
따라서, Hadamard Gate를 적용하는 것은 동전 던지기의 유사체입니다. 동전을 1000번 던져 앞면/뒷면 통계를 살펴본 것처럼, Qiskit의 "양자 동전"으로 비슷한 작업을 할 수 있습니다. Sampler라는 Qiskit 프리미티브를 사용하면, Circuit을 여러 번 반복하여 결과 상태의 통계를 샘플링할 수 있습니다.
먼저, Qiskit Runtime 서비스와 프리미티브를 불러온 다음, Circuit을 실행할 Backend를 선택합니다.
아래 코드에는 처음 사용 시 자격 증명을 저장하는 코드가 포함되어 있습니다. 노트북을 공유할 때 자격 증명이 실수로 공유되지 않도록, 환경에 저장한 후에는 이 정보를 노트북에서 삭제하세요. 자세한 안내는 IBM Cloud 계정 설정 및 신뢰할 수 없는 환경에서 서비스 초기화를 참고하세요.
# 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 (
SamplerV2 as Sampler,
EstimatorV2 as Estimator,
)
# Use the least busy backend
backend = service.least_busy()
print(backend.name)
ibm_kingston
계정에 사용 가능한 시간이 더 이상 없다면, 대신 시뮬레이터에서 실행하도록 선택할 수도 있습니다. 아래 셀의 코드 주석을 해제하고 실행하면 됩니다:
## Use a local simulator
# from qiskit_aer import AerSimulator
## Generate a simulator that mimics the real quantum system
# backend_sim = AerSimulator.from_backend(backend)
## Import an estimator, this time from qiskit (we will import from Runtime for real hardware)
# from qiskit.primitives import BackendSamplerV2
# sampler_sim = BackendSamplerV2(backend = backend_sim)
# from qiskit.primitives import BackendEstimatorV2
# estimator_sim = BackendEstimatorV2(backend = backend_sim)
## 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(qcoin)
## Execute
# On real hardware:
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# or with Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# counts=job.result()[0].data.meas.get_counts()
## Analysis
from qiskit.visualization import plot_histogram
plot_histogram(counts)
위 Circuit의 1000번 샘플 결과는, 약간의 통계적 변동을 제외하면, 고전적인 동전 히스토그램과 기본적으로 동일하게 보입니다.
양자 동전의 통계를 샘플링하는 것 외에도, Estimator라는 또 다른 Qiskit 프리미티브를 사용하여 상태의 관측량의 소위 기댓값을 측정할 수 있습니다. 이 기댓값이 무엇인지 설명하기 위해 고전적인 동전을 예로 들어 봅시다. 동전으로 도박을 한다고 가정합니다: 동전을 던져 "앞면"이 나올 때마다 1달러를 얻고, "뒷면"이 나올 때마다 1달러를 잃습니다. 던질 때마다 기대할 수 있는 금액(관측량 "돈"의 기댓값)을 계산하려면 다음과 같이 계산합니다:
1달러를 딸 확률과 잃을 확률이 같으므로, 기댓값은 $0입니다.
마찬가지로, 양자 상태에서도 관측량 "Z"의 기댓값을 계산할 수 있습니다. 여기서 Z는 과 상태에 각각 +1과 -1 값을 가지는 파울리 행렬입니다.
from qiskit.quantum_info import Pauli
qcoin = QuantumCircuit(1)
qcoin.h(0)
# for Estimator, we do not apply the measurement to the circuit
<qiskit.circuit.instructionset.InstructionSet at 0x136df1ba0>
## Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
obs = Pauli("Z")
qc_isa = pm.run(qcoin)
obs_isa = obs.apply_layout(layout=qc_isa.layout)
## Execute
# On real hardware:
estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run([[qc_isa, obs_isa]])
res = job.result()
# On a simulator:
# job = estimator_sim.run([[qc_isa, obs_isa]])
# res=job.result()
print(res[0].data.evs)
-0.014799284701239441
예상대로(하하) 기댓값이 0으로 나왔습니다. 이는 0과 1을 측정할 확률이 동일하다는 것을 확인해 주는 또 다른 방법이며, 동전 던지기처럼 동작하는 것으로 보입니다.
이 시점에서 "양자 동전"은 고전적인 동전과 똑같이 보입니다. 하지만 다음 섹션에서는 둘 사이의 근본적인 차이를 드러내는 실험들을 해 볼 것입니다.
양자의 본질을 드러내다: 3차원 실험
사고 실험을 해봅시다. 동전을 공중에 던진 뒤, 바닥에 떨어지게 두는 대신 양손 사이를 지나갈 때 손뼉을 쳐서 손바닥 사이에 동전을 끼웁니다. 이렇게 하면 동전은 앞면이 위 또는 아래를 향하는 것이 아니라, 왼쪽 또는 오른쪽을 향하게 됩니다.
이해도 확인
아래 질문을 읽고 답을 생각해 본 뒤, 삼각형을 클릭해 정답을 확인하세요.
앞면이 왼쪽을 향할 확률과 오른쪽을 향할 확률은 각각 얼마일까요?
정답:
확률은 여전히 50-50입니다. 동전 던지기 결과를 어느 차원에서 측정하든 결과에 영향을 미치지 않아야 합니다.
앞면이 왼쪽 또는 오른쪽을 향할 확률이 여전히 50-50이라고 답하셨기를 바랍니다. 동전 던지기를 측정하는 차원은 결과의 확률에 영향을 주어서는 안 됩니다.
그렇다면 양자 동전의 경우는 어떻게 다를까요? 확인해 봅시다.
앞서와 동일하게 Hadamard Gate를 사용해 양자 중첩 상태를 만들 수 있습니다. 양자 동전에서 "앞면이 왼쪽 또는 오른쪽"을 측정하려면, 고전적인 동전과 같은 방식으로 다른 축을 따라 측정하면 됩니다. 양자 컴퓨터에서의 표준 측정은 수직 축(일반적인 동전의 "앞면이 위 또는 아래" 측정과 동일)을 따라 이루어집니다. 하지만 양자 동전에 앞면이 왼쪽 또는 오른쪽을 향하는지, 즉 축 방향을 가리키는 상태인 또는 인지 물어볼 수도 있습니다. Sampler는 Z 측정 기저에서만 샘플링하지만, Estimator를 사용하면 X의 기댓값을 구할 수 있습니다. X의 값은 상태 에 대해 +1, 에 대해 -1입니다.
이해도 확인
아래 질문을 읽고 답을 생각해 본 뒤, 삼각형을 클릭해 정답을 확인하세요.
양자 동전이 고전적인 동전처럼 행동한다면, 와 상태를 측정할 확률은 50-50일 것입니다. 이 경우 Estimator가 반환할 X의 기댓값은 얼마일까요?
Estimator가 반환할 X의 기댓값은 얼마일까요?정답:
상태에 X를 적용하면 +1, 상태에 적용하면 -1이 됩니다. 따라서 50-50 분포라면 기댓값은 0이 될 것입니다.
# Step 1: map problem
qcoin_lr = QuantumCircuit(1)
qcoin_lr.h(0)
obs = Pauli("X")
# Step 2: Transpile the circuit
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin_lr)
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 = estimator_sim.run([[qc_isa,obs_isa]])
# res=job.result()
# Step 4: Return the result in classical form, and analyze.
print(res[0].data.evs)
0.9985207100591716
이 상태에서 X의 기댓값은 1입니다. 따라서 와 를 측정할 확률은 50-50이 아닙니다.
이해도 확인
아래 질문을 읽고 답을 생각해 본 뒤, 삼각형을 클릭해 정답을 확인하세요.
이 기댓값은 상태 에 대해 무엇을 알려주나요? X 기저에서 와 를 측정할 확률은 각각 얼마인가요?
정답:
기댓값이 상태 에 대한 X의 값과 동일하므로, X 방향으로 측정했을 때 상태를 측정할 확률이 100%라는 의미입니다.
어떻게 된 것일까요? 양자 동전은 한 차원에서는 무작위적이고 확률적인 결과를 내지만, 다른 차원에서는 완벽하게 예측 가능한 결과를 낼 수 있는 것 같습니다. 마치 동전을 던졌는데, 손바닥 사이에 끼울 때마다 앞면이 항상 오른쪽을 향하게 된다는 것을 보장하는 것과 같습니다.
양자 위상
양자 동전의 핵심 차이점은 고전적인 동전에는 없는 특성을 가지고 있다는 것입니다. 고전적인 확률 상태에서는,
각 계수는 단순히 특정 상태를 측정할 확률을 나타내는 실수이자 양수입니다. 양자 상태에서는,
계수가 복소수이므로 실수부와 허수부를 모두 포함합니다. 각 계수 는 크기 와 실수축과 이루는 각도 를 가지는 복소 평면 위의 2차원 벡터로 표현할 수 있습니다:

를 위상이라고 합니다. 위상은 양자 상태의 두 항이 어떻게 간섭하는지, 즉 파동처럼 어떻게 더해지거나 상쇄되는지를 알려줍니다. 두 파동이 위상이 같으면, 즉 마루와 골이 일치하면 진폭이 두 배인 파동을 형성합니다. 이를 보강 간섭이라고 합니다. 위상이 반대이면, 즉 한 파동의 마루가 다른 파동의 골과 일치하면 서로 상쇄되어 완전히 사라집니다. 이를 상쇄 간섭이라고 합니다.
파동처럼, 양자 상태도 보강 또는 상쇄 방식으로 더해질 수 있습니다. 물리적 공간에서의 실제 파동을 이야기하는 것이 아니기 때문에 처음에는 이해하기 어려울 수 있습니다. Qubit의 경우, 간섭은 Qubit의 추상적인 정보 공간에서 발생합니다. 또한, 두 파동 사이의 상대적 위상, 즉 두 계수의 위상 차이 만이 간섭 방식에 영향을 준다는 점에 유의하세요. 따라서 보통 전체 상태에 의 전역 위상을 적용하여 이 순수 실수가 되고 상대적 위상이 에만 나타나도록 합니다.
위상이 양자 동전에서 어떻게 간섭을 일으키는지 보기 위해, Hadamard를 한 번만 적용하는 대신 두 번 적용해 봅시다. 고전적으로는 이것이 말이 되지 않습니다. Hadamard 적용이 동전 던지기와 같다면, 이미 뒤집히고 있는 동전을 다시 뒤집을 수는 없습니다. 하지만 양자 동전에 어떤 일이 일어나는지 살펴봅시다:
qcoin_0 = QuantumCircuit(1)
qcoin_0.h(0)
qcoin_0.h(0)
qcoin_0.measure_all()
qcoin_0.draw("mpl")
Sampler로 결과 상태를 측정하기 전에, 각 Gate가 이 Qubit을 어떻게 변환하는지 생각해 봅시다. Qubit은 평소와 같이 상태에서 시작합니다. 그런 다음 첫 번째 Hadamard가 이미 살펴본 것처럼 상태를 중첩 상태로 변환합니다:
이 경우 두 계수 모두 완전히 실수이고 양수이므로 위상은 입니다.
그런 다음 두 번째 Hadamard가 중첩 상태의 각 부분에 개별적으로 적용됩니다. Hadamard가 상태를 어떻게 변환하는지는 이미 알고 있습니다. 그렇다면 에 대해서는 어떨까요?
이것도 0과 1의 동등한 중첩 상태로, 동전 던지기와 유사합니다. 하지만 이 상태의 앞에 있는 계수는 음수 부호를 부여하는 위상 를 가집니다.
이해도 확인
아래 질문을 읽고 답을 생각해 본 뒤, 삼각형을 클릭해 정답을 확인하세요.
두 번째 Hadamard를 적용한 후의 결과 상태를 계산하세요. 즉, 를 계산합니다. 는 분배 법칙이 성립하므로 각 항에 개별적으로 적용할 수 있습니다.
정답:
이제 Sampler로 예측을 확인해 봅시다.
## Transpile
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin_0)
## Execute
# On real hardware:
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# or with Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# counts=job.result()[0].data.meas.get_counts()
## Analyze
plot_histogram(counts)
두 번째 Hadamard가 첫 번째 Hadamard를 상쇄하여 처음 시작했던 0 상태로 돌아왔습니다! 이는 Hadamard가 과 상태를 비슷한 상태로 변환하지만 위상이 반대이기 때문입니다. 두 번째 Hadamard 이후, 항은 보강 간섭을 일으키지만 항은 상쇄 간섭을 일으켜 서로 상쇄됩니다.
좀 더 탐구해 봅시다. "PHASE" Gate를 사용하여 위상을 변경할 수 있습니다. 이제 중첩 상태를 만들기 위해 Hadamard를 적용하고, 라디안의 위상 이동을 적용한 뒤, 두 번째 Hadamard를 적용해 봅시다:
qcoin_pi = QuantumCircuit(1)
qcoin_pi.h(0)
qcoin_pi.p(np.pi, 0)
qcoin_pi.h(0)
qcoin_pi.measure_all()
qcoin_pi.draw("mpl")
## Transpile
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin_pi)
## Execute
# On real hardware:
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# or with Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# counts=job.result()[0].data.meas.get_counts()
## Analyze
plot_histogram(counts)
이제 Qubit은 0 대신 1 상태로 측정됩니다.
이처럼 몇 가지 간단한 실험만으로도 위상이 양자 Circuit에 얼마나 큰 차이를 만들 수 있는지 이미 확인할 수 있습니다. 처음에는 미묘하고 파악하기 어려울 수 있습니다. 첫 번째 실험에서 단순히 Hadamard Gate로 양자 동전을 던지고 결과를 측정했을 때는 위상의 효과가 전혀 드러나지 않았습니다. 더 깊이 파고들었을 때에야 위상이 얼마나 큰 차이를 만들 수 있는지 발견할 수 있었습니다. 위상은 동일한 양자 Gate가 Qubit에 문자 그대로 정반대의 효과를 낼 수 있게 합니다.
직접 해보세요:
아래 코드 셀을 수정하여, 두 번째 Hadamard가 과 상태에서 각각 25%와 75%의 확률을 가지는 중첩 상태를 생성하도록 위상을 변경해 보세요. 수식으로 답을 검증하세요.
qcoin_phase = QuantumCircuit(1)
qcoin_phase.h(0)
# replace "x" below with a phase from 0 to 2*np.pi (this cell won't run if you leave x)
# qcoin_phase.rz(x, 0)
qcoin_phase.h(0)
qcoin_phase.measure_all()
## Transpile
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin_phase)
## Execute
# On real hardware:
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# or with Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# counts=job.result()[0].data.meas.get_counts()
## Analyze
plot_histogram(counts)
Gate를 활용한 또 다른 (더 나은) 동전 유추
지금까지 동전 뒤집기가 중첩 상태를 만드는 것과 꽤 다르다는 것을 배웠습니다. 중첩 현상을 더 잘 포착하는 동전 유추를 만들 수 있을까요? 네, 있습니다.
동전을 이용한 또 다른 사고 실험을 해봅시다. 테이블 위에 앞면이 위를 향한 채로 놓인 동전을 상상해 보세요. 뒷면이 위를 향하게 하려면 그냥 뒤집으면 됩니다. 이것이 "NOT" Gate의 계산적 등가물입니다.
두 번 적용하면 NOT Gate와 동일한 연산, 즉 "NOT의 제곱근" 또는 을 만들고 싶다고 해봅시다. NOT Gate가 동전에 물리적으로 구현되는 방식을 생각해보면 됩니다: 예를 들어 x축을 기준으로 180도 회전하는 것입니다. 따라서 동전을 x축을 기준으로 90도만 회전하면 Gate와 동일합니다.
Gate를 적용한 후 동전이 앞면인지 뒷면인지 묻고 싶다고 가정해 봅시다. 둘 다 아닙니다 - 동전은 수직축에 대해 옆으로 세워져 있습니다. 하지만 이제 동전의 "측정"을 다시 정의해 봅시다: 첫째, 측정 축을 따라 동전을 쓰러뜨리고(손으로 눌러서 평평하게), 둘째, 앞면이 위인지 아래인지 확인합니다.
옆으로 세워진 동전에 이 "측정"을 수행하면 동전은 동일한 확률로 앞면 위 또는 앞면 아래로 "붕괴"됩니다. 동전 뒤집기와 마찬가지로, 원칙적으로는 동전의 초기 조건과 동전을 "붕괴"시키기 위해 손이 가하는 힘의 정확한 크기를 알면 어느 쪽으로 떨어질지 예측할 수 있습니다. 하지만 실제로는 어느 면이 위로 올라올지 예측하기 어려우므로, 사실상 무작위입니다.
실제로 이 동전을 세 가지 다른 축을 따라 측정할 수 있습니다: , , . 동전의 모서리가 와 방향을 가리키고 있으므로, 그 방향에서의 측정은 동전을 "붕괴"시켜야 합니다 - 따라서 그 축들을 따라 앞면 위와 아래를 측정할 확률은 무작위로 50:50입니다. 하지만 축을 따라서는 이미 평평하게 놓여 있고, 앞면이 -y 방향을 향하고 있습니다. 이것을 "앞면 앞쪽"이라고 부를 수 있습니다.
따라서 x와 z 측정은 무작위 결과를 내놓는 반면, y 측정은 항상 동일한 결과를 내놓을 것입니다! 이전 섹션의 "양자 동전 뒤집기" 실험을 떠올려보면, 이것은 양자 동전이 어떻게 동작했는지와 닮아 있습니다. z 방향으로는 0 또는 1이 50/50 확률로 측정되었지만, X를 따라서는 항상 이고 결코 가 아니었습니다. 이것은 공중에서 마구 뒤집히는 동전보다, 옆으로 세워진 채 정지해 있는 동전이 Qubit의 중첩 상태를 시각화하는 더 나은 방법일 수 있음을 시사합니다.
Qiskit을 사용하여 Gate가 적용될 때 "양자 동전"이 고전 동전과 동일하게 동작하는지 확인해 봅시다. 에서 시작하는 Qubit에 을 적용한 후, Estimator를 사용하여 세 가지 관측 가능량 X, Y, Z의 기댓값을 확인하겠습니다.
qcoin_sx = QuantumCircuit(1)
qcoin_sx.sx(0)
qcoin_sx.draw("mpl")
obs1 = Pauli("X")
obs2 = Pauli("Y")
obs3 = Pauli("Z")
# Step 2: Transpile the circuit
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin_sx)
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
estimator = Estimator(mode=backend)
pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]])]
job = estimator.run(pubs)
res = job.result()
# Run the job on the Aer simulator with noise model from real backend
# pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]])]
# job = estimator_sim.run(pubs)
# res=job.result()
# Step 4: Return the result in classical form, and analyze.
print(res[0].data.evs)
[[-0.01234492]
[-1.00388865]
[ 0.00740695]]
X, Y, Z에 대한 기댓값은 각각 0, -1, 0입니다.
이해도 확인
아래 질문을 읽고 답을 생각해 본 후, 삼각형을 클릭하여 풀이를 확인하세요.
기댓값을 고려할 때, 세 가지 측정 축 각각에 대해 양자 동전이 앞면 위/아래(또는 왼쪽/오른쪽 또는 앞쪽/뒤쪽)로 측정될 확률은 얼마인가요?
답:
X와 Z를 따라서는 각 상태를 측정할 확률이 50/50이고, Y 방향으로는 항상 -y 방향으로 측정됩니다.
이것은 고전 동전에 "" 90도 회전을 적용하는 사고 실험에서 얻은 것과 동일한 결과입니다. 실제로 이제 동전과 Qubit 상태 사이에 정확한 유추가 있습니다. Qubit 상태를 동전의 앞면 방향, 즉 동전 표면에 수직인 벡터로 시각화할 수 있습니다. 따라서 앞면 위, 즉 양자 동전에서의 상태는 직선으로 위를 가리키는 벡터와 같고; 뒷면 위, 즉 은 아래를 가리킵니다. 과 의 동일한 중첩은 수평 방향을 가리킵니다. 상태의 위상이 정확한 수평 방향을 결정합니다 - 적도를 따라 가리키는 방향은 복소 평면에서 계수 가 가리키는 방향과 같습니다.
이제 이 노트북에서 본 모든 Gate는 동전/벡터의 회전(또는 일련의 회전)으로 시각화할 수 있습니다.
-
NOT: x축을 기준으로 180도 회전
-
: x축을 기준으로 90도 회전
-
PHASE: z축을 기준으로 만큼 회전
-
Hadamard: 이것은 조금 더 복잡합니다. 처음에는 동전 뒤집기에 비유했는데, 동전이 공중에서 마구 회전하게 만드는 것처럼요. 하지만 Hadamard는 다른 Gate들처럼 사실 동전의 통제된, 결정론적인 회전입니다. Hadamard는 y축을 기준으로 90도 회전한 다음 x축을 기준으로 180도 회전하여 수행됩니다.
따라서 양자 중첩 상태나 Qubit에 수행하는 표준 연산 중 무작위적인 것은 없습니다. 모든 연산은 결정론적이고 가역적입니다. 무작위성이 개입되는 유일한 순간은 양자 상태를 측정하기로 결정할 때입니다.
Bloch 벡터로서의 Qubit 상태
동전의 "앞면" 방향을 가리키는 이 벡터는 "Bloch 벡터"로 알려져 있습니다. 공식적으로, 임의의 (고립된) Qubit 상태는 좌표 로 반지름 1인 구의 표면 위에 놓인 벡터로 표현될 수 있습니다. 이 좌표로 표현하면 Qubit 상태는 다음과 같습니다:
이제 Qiskit을 사용하여 상태에서 시작한 Qubit에 다양한 Gate를 적용할 때 Bloch 벡터가 어떻게 변하는지 확인해 봅시다.
NOT
from qiskit.visualization import plot_bloch_multivector
qnot = QuantumCircuit(1)
qnot.x(0)
plot_bloch_multivector(qnot)
qsqrtnot = QuantumCircuit(1)
qsqrtnot.sx(0)
plot_bloch_multivector(qsqrtnot)
PHASE ()
qphase = QuantumCircuit(1)
qphase.p(np.pi, 0)
plot_bloch_multivector(qphase)
Hadamard
qhadamard = QuantumCircuit(1)
qhadamard.h(0)
plot_bloch_multivector(qhadamard)
결론 - 중첩 상태란 무엇인가?
우리는 이 모듈을 양자 중첩 상태 측정의 무작위성을 동전 뒤집기에 비교하는 것으로 시작했습니다. 양자 중첩을 만드는 "Hadamard Gate"를 동전 뒤집기 행위에 비유했습니다. 하지만 일련의 실험을 통해 고전적인 동전 뒤집기와 양자 중첩 사이에 근본적인 차이가 있다는 것을 배웠습니다.
중첩 상태에 있는 Qubit에는 실제로 "무작위적"인 것이 없다는 것을 배웠습니다. 이것은 3차원 공간에서 정지해 있는 동전과 같습니다. 실제로 3차원으로 자유롭게 회전할 수 있는 동전은 Qubit의 양자 상태를 시각화하는 특정 방법인 Bloch 벡터와 매우 유사한 유추입니다. 양자 Gate는 이 동전/Bloch 벡터를 결정론적이고 가역적으로 회전시킵니다. Qubit을 측정할 때만 무작위성이 도입됩니다. 우리는 이 측정 과정을 동전을 눌러서 측정 축 방향으로 평평하게 만드는 것에 비유했습니다.
양자 상태가 중첩에 있는지 여부는 실제로 보는 사람의 눈에 달려 있습니다. 아마도 이전에 접했을 것처럼, 좌표계를 자유롭게 선택할 수 있습니다 - , , 는 세 개의 직교하는 방향 중 어느 방향으로도 가리킬 수 있습니다. 따라서 한 좌표계에서 0과 1의 중첩이 있다면, 새로운 좌표계 - 또는 동등하게 새로운 "측정 기저" - 를 정의할 수 있는데, 그 기저에서 상태는 순수하게 방향을 가리켜 중첩 상태에 있지 않습니다. 따라서 Qubit이 중첩에 있다고 할 때, 우리는 "무엇의 중첩인가?"라는 질문에도 답해야 합니다.
이 모듈을 마치면서 양자역학의 모든 신비를 풀었다는 인상을 받을 수도 있습니다. 결국, 소위 "가장 이상한" 측면 중 하나인 Qubit의 중첩 상태가 실제로는 3차원 벡터만큼 간단하니까요. 하지만 동전은 여전히 유추일 뿐이고, Bloch 벡터도 측정 결과의 확률을 계산하기 위한 시각화 도구일 뿐임을 명심하세요. 양자 상태가 측정되기 전에 실제로 무엇을 하고 있는지는 알 수 없습니다. 왜냐하면 그것을 확인하려면 측정이 필요하기 때문입니다!
양자 상태의 "진정한" 본질이 무엇인지, 그리고 얽힘이라는 양자 현상이 이를 어떻게 설명하는 데 도움이 되는지에 대한 딜레마는 Bell의 부등식 모듈에서 논의할 것입니다.
질문
강사는 이 노트북이 어떻게 사용되고 있는지에 대한 간단한 설문을 작성하여 답안 키와 일반 교육과정 내 배치 안내가 포함된 버전을 요청할 수 있습니다.
핵심 개념:
- 중첩 상태의 Qubit 측정은 동전 뒤집기처럼 확률적이지만, 중첩 상태 자체는 뒤집히는 동전과 다르게 동작합니다.
- 고전적 확률 분포와 중첩의 주요 차이점은 중첩이 위상 결맞음(phase coherence)을 가져 건설적 또는 파괴적으로 간섭할 수 있다는 점입니다.
- 단일 고립된 Qubit의 상태는 소위 "Bloch 구" 위의 점으로 시각화할 수 있으며, 과 성분의 상대적 진폭이 극각 를 결정하고 두 성분 간의 상대적 위상이 방위각 를 결정합니다.
- 모든 단일 Qubit 양자 Gate는 이 구 위의 벡터의 회전으로 볼 수 있습니다.
참/거짓 문제:
-
참/거짓 양자 중첩은 동전 뒤집기와 같은 고전 물리학의 확률적 사건과 기본적으로 동일합니다.
-
참/거짓 단일 고립된 Qubit의 상태를 나타내는 Bloch 벡터의 길이는 항상 1입니다.
-
참/거짓 단일 Qubit 양자 Gate는 Bloch 벡터의 길이를 변경하지 않습니다.
객관식 문제:
- 상태를 나타내는 올바른 Bloch 벡터를 선택하세요:

-
Bloch 구는 Qubit의 다음 중 어느 것을 나타내나요: (해당하는 것 모두 선택)
a. 진폭
b. 다른 Qubit과의 얽힘
c. 위상
d. 색깔
e. 측정 결과의 확률