주 콘텐츠로 건너뛰기

양자 컴퓨터를 이용한 슈테른-게를라흐 실험

이 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 시간 2초를 사용했습니다. 이는 추정치이며, 실제 사용량은 다를 수 있습니다.

# Added by doQumentation — required packages for this notebook
!pip install -q 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에서 시청할 수 있습니다.


배경

1900년대 초, 원자 스케일에서의 양자화 거동에 대한 증거가 점점 쌓여 가고 있었습니다. 자외선 파국에 대한 막스 플랑크의 설명, 그리고 오토 슈테른과 발터 게를라흐의 실험과 같이 데이터를 성공적으로 해석한 여러 사례들이 양자역학 체계의 필요성을 세상에 납득시키고, 특정 물리 현상이 양자화되어 있음을 보이는 데 결정적인 역할을 했습니다. 슈테른-게를라흐 실험(슈테른이 1921년에 고안하고 슈테른과 게를라흐가 1922년에 수행)의 목표는 원자에서 각운동량의 양자화를 확인하는 것이었습니다.

그 무렵 원자에 대한 주류 모델은 보어-조머펠트 모델이었습니다. 이는 보어 모델의 확장판으로, 보어 모델과 마찬가지로 전자가 태양 주위를 도는 행성처럼 특정 양자화된 궤도에 존재한다고 예측했습니다.

보어-조머펠트 모델의 다이어그램. 중앙의 점은 원자핵을 나타내며, 그 주위의 원 또는 타원은 원자 궤도를 나타냅니다. 태양 주위를 도는 행성 궤도와 매우 유사합니다. 에너지가 높은 궤도일수록 핵에서 더 멀리 위치합니다.

이 처리 방식은 결국 원자의 양자역학적 거동을 설명하기에 불충분한 것으로 판명되었지만, 원자의 이산 스펙트럼선과 같이 관측된 여러 현상을 대체로 예측할 수 있었습니다. 특정 에너지를 가진 전자의 양자화된 궤도는 양자화된 각운동량 값에 대응합니다. 슈테른과 게를라흐가 실험에서 관측하려 했던 것이 바로 이 궤도 각운동량이었습니다. 하지만 이 실험은 스핀을 포함한 모든 유형의 양자화된 각운동량에 적용됩니다. 슈테른-게를라흐 실험이 스핀에 적용되는 경우도 자주 접할 수 있습니다. 원래 실험에서 궤도 각운동량에 집중한 이유는 단순히 조지 울렌벡과 새뮤얼 하우드스미트가 스핀의 존재를 이론화한 것이 1925년이었기 때문입니다.

각운동량의 종류와 무관하게, 각운동량을 가진 전하는 자기 모멘트를 갖습니다. 고전적인 궤도 운동 처리에서, 전하량 qq, 질량 mm, 각운동량 L\vec{L}을 가진 입자의 자기 모멘트 μ\mu는 다음과 같이 주어집니다.

μ=q2mL\vec{\mu} = \frac{q}{2m}\vec{L}

양자역학적 각운동량에 대해서도 거의 같은 공식이 성립하지만, 각운동량의 유형에 관련된 수치 비율인 g-인자 gg가 추가됩니다. 서로 다른 유형의 각운동량을 결합하거나 임의의 유형으로 일반화할 때는 L\vec{L} 대신 J\vec{J}를 사용하는 경우가 많으므로, 다음과 같이 씁니다:

μ=gq2mJ\vec{\mu} = \frac{gq}{2m}\vec{J}

고전적 물체의 경우 g=1g=1이고, 전자의 경우 g2g\approx 2이며, 다양한 원자핵과 소립자에 따라 여러 값이 존재합니다. 여기서 핵심은 양자화된 각운동량은 양자화된 자기 모멘트를 의미한다는 것입니다!

이 자기 모멘트는 자기장 속에서 토크를 받습니다:

τ=μ×B\vec{\tau}=\vec{\mu}\times \vec{B}

그리고 기울기가 0이 아닌 자기장 속에서 힘을 받습니다:

F=(μB)\vec{F} = \nabla(\vec{\mu}\cdot\vec{B})

위 식을 한 번에 한 성분씩 고려하는 경우가 많으므로, zz 성분을 생각하면 편리합니다:

Fz=μzdBzdzF_z = \mu_z \frac{dB_z}{dz}

식들을 결합하면 다음을 얻습니다.

Fz=gq2mdBzdzJzF_z = \frac{gq}{2m} \frac{dB_z}{dz} J_z

슈테른과 게를라흐는 gg 인자에 대해 알지 못했지만, 이를 포함하더라도 힘은 알려지거나 측정 가능한 여러 상수에 각운동량을 곱한 것과 같습니다. 따라서 알려진 기울기를 가진 자기장을 사용하고, 입자가 자기장을 통과할 때의 편향을 측정하면 각운동량에 관한 정보를 얻을 수 있습니다. 이것이 슈테른-게를라흐 실험의 핵심입니다.

균일하지 않은 자기장을 통과하는 은 원자들이 스핀에 따라 위 또는 아래로 편향되는 모습. 고전적으로는 스크린에서 연속적인 분포를 기대하겠지만, 실험에서는 두 개의 뚜렷한 점만 나타납니다.

그림. 슈테른-게를라흐 실험[1]: 균일하지 않은 자기장을 통과하는 은 원자들이 스핀에 따라 위 또는 아래로 편향됩니다. 고전적으로는 스크린에서 연속적인 분포를 기대하겠지만, 실험에서는 두 개의 뚜렷한 점만 나타납니다.

중성 은 원자들을 오븐 속에서 가열했습니다. 오븐에서 은 원자 빔이 방출될 때, 빔 콜리메이터를 사용하여 균일하지 않은 자기장의 중심 근처를 통과하는 원자만 선별했습니다. 물론 일부 원자는 좌우로 약간 벗어나 더 약한 기울기의 자기장 또는 전혀 기울기가 없는 곳을 지나갑니다. 따라서 좌우로 크게 벗어난 원자들의 거동에는 크게 신경 쓸 필요가 없습니다. 우리가 관심 갖는 것은 채널 중심을 따라 이동하는 원자들인데, 이 원자들은 자기장 기울기에 의해 zz 방향으로만 편향됩니다.

고전적으로 무엇을 기대할 수 있을까요?

이 원자들이 크고 고전적인 자석처럼 행동한다면 어떻게 될까요? 실험을 직접 상상해 보세요. 작은 네오디뮴 자석들을 크고 강력한 자석 옆으로 쏜다고 가정합시다. 작은 자석들의 방향은 무작위입니다. 하지만 큰 자석을 지나칠 때, 작은 자석들은 빠르게 자기장에 맞게 정렬되고 큰 자석 쪽으로 끌립니다. 대부분의 작은 자석들은 큰 자석 쪽으로 편향됩니다. 매우 예리한 관찰자라면 "에너지 보존은 어떻게 되나요?"라고 물을 수도 있습니다.

실제로, 외부 자기장 속 자기 모멘트에는 다음과 같은 퍼텐셜 에너지가 연관됩니다:

U=μB=μBcos(θ)U = -\vec{\mu}\cdot \vec{B} = -\mu B \cos(\theta)

따라서 자기 모멘트가 외부 자기장 속에서 회전하면 다음과 같은 에너지 변화가 생깁니다:

ΔU=UfUi=μB(cos(θf)cos(θi)).\Delta U = U_f - U_i = -\mu B (\cos(\theta_f) - \cos(\theta_i)).

작은 자석이 외부 자기장과 완전히 반대 방향에서 뒤집혀 정렬되는 특수한 경우, 퍼텐셜 에너지는 감소합니다:

ΔU=UfUi=μB(cos(0)cos(π))=2μB.\Delta U = U_f - U_i = -\mu B (\cos(0) - \cos(\pi)) = -2\mu B.

그렇다면 그 에너지는 어디로 갈까요? 작은 네오디뮴 냉장고 자석 같은 고전적인 자석은 많은 입자로 이루어져 있어 거의 어떤 양의 에너지든 열로 방출할 수 있습니다. 자기 모멘트와 외부 자기장 사이의 초기 및 최종 각도는 어떤 값이든 될 수 있으며, 초기 방향은 무작위입니다. 따라서 각 작은 자석마다 서로 다른 양의 에너지가 열로 방출됩니다. 하지만 고전적으로는 고전 입자들의 앙상블이 어떤 양의 에너지든 열로 방출할 수 있으므로 문제가 없습니다.

고전적 사고를 원자 스케일에 적용하면 무엇을 기대할 수 있을까요?

원자 스케일 자석의 경우에는 적어도 이와 동일하지는 않습니다. 관여하는 입자 수가 적고, 에너지가 방출될 수 있는 자유도가 줄어들기 때문입니다. 초기 양자역학의 제안들은 더 나아가, 전자와 같은 개별 입자가 흡수할 수 있는 에너지가 양자화되어 있다고 주장했습니다. 즉, 전자는 몇 가지 특정한 양의 에너지만 흡수할 수 있습니다. 무작위적인 초기 방향은 무작위적인 양의 에너지 방출을 필요로 하므로, 양자화된 에너지 준위를 가진 시스템에서는 이것이 불가능합니다. 초과 에너지는 열로 방출될 수 없습니다. 그렇다면 대신 무슨 일이 일어날까요?

이해 확인

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

위에서 설명한 상황에서 어떤 일이 일어날지 설명해 보세요. 즉, 열로 에너지를 방출할 수 없는 원자 크기의 작은 자석이 있습니다. 따라서 초기 자기 퍼텐셜 에너지는 시스템 내에 유지되어야 합니다. 그런데 외부 자기장이 토크를 가하여 작은 자석을 외부 자기장에 맞게 정렬시키려 합니다. 어떤 일이 벌어질까요?

답:

작은 자기 모멘트는 외부 자기장과 정렬되는 방향으로 회전할 것입니다. 하지만 순간적으로 정렬될 때, 계속 회전하게 만드는 회전 운동 에너지를 갖게 되어 자기장을 지나쳐 다시 비정렬 상태로 돌아갑니다. 이러한 거동은 큰 고전적 자석에서도 관찰할 수 있습니다. 그러나 고전적 시스템에서는 에너지가 열로 방출되면서 작은 자기 모멘트의 진동이 결국 멈춥니다. 하지만 에너지 방출 메커니즘이 없는 시스템에서는 진동이 무한정 지속되어야 합니다.

위 답에서 예상되는 거동을 고려할 때, 스크린에서 어떤 자기 입자 분포를 볼 것으로 예상하나요?

답:

자기장의 강한 쪽으로 최대 편향된 입자들(외부 자기장과 우연히 정렬되어 시작한 입자들)부터 자기장의 약한 쪽으로 최대 편향된 입자들(외부 자기장과 반대 방향으로 시작한 입자들)까지, 그 사이의 모든 편향에 해당하는 각 초기 방향에 대응하는 매끄러운 분포를 볼 것입니다.

자석을 통과하는 입자 빔의 다이어그램. 입자들은 자기장 방향을 따라 다양한 정도로 편향됩니다. 따라서 멀리 있는 스크린에 선을 형성합니다.

양자역학은 무엇을 예측할까요?

모든 가능성 중 가장 이상한 것은 다음과 같습니다: 만약 전자의 각운동량이 양자화되어 있을 뿐만 아니라, 특정 축에 대한 그 투영도 양자화되어 있다면 어떨까요? 각운동량의 크기가 양자화되어 있다는 것은 흥미롭지만, 어떤 사람은 행성 궤도가 서로 교차하지 않고 특정 허용된 각운동량만 갖는 고정 경로로 안착된 것처럼 고전적 직관으로 설명하려 할 수도 있습니다. 하지만 그 각운동량 벡터가 정확히 zz 방향으로만 또는 정확히 zz 반대 방향으로만 가리킬 수 있고, zz 방향으로 다른 성분은 가질 수 없다면 어떨까요? 그리고 다른 방향으로 측정할 때, 벡터가 오로지 xx 방향 또는 정확히 xx 반대 방향만을 가리키고 그 사이의 어떤 값도 갖지 않는다면요? 그것은 모든 고전적 직관을 뒤흔드는 이상한 일일 것입니다.

이해 확인

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

자기장 방향으로 각운동량의 투영이 양자화된 마지막 경우에 스크린에서 어떤 입자 분포를 기대할 수 있나요? 장치의 정중앙을 완벽하게 통과하는 입자만 고려하거나, 기울기가 더 약한 쪽으로 약간 벗어나는 입자들도 포함해서 생각해 보세요. 명확하게 설명해 주세요.

답:

장치 중심의 입자들은 하나의 균일하지 않은 자기장을 경험하며, 모두 두 가지 방향 중 하나로 자기 모멘트가 측정됩니다. 따라서 기울기 방향으로 최대 편향되거나 기울기 반대 방향으로 최대 편향되며, 그 사이의 값은 없습니다. 물론 양쪽으로 벗어난 위치에서는 기울기가 더 약해 편향이 더 작아집니다. 측면으로 매우 크게 벗어난 위치에서는 기울기 밖에 완전히 놓여, 편향되지 않은 입자들의 단일 영역만 있을 수 있습니다.

입자 빔이 위 또는 아래로 편향되어 스크린의 두 점 중 하나에 충돌하며, 두 최댓값 사이에 입자가 없는 다이어그램

Qubit은 이것을 테스트하는 데 어떻게 도움이 될까요?

대부분의 양자 컴퓨터는 "Qubit"을 사용합니다. Qubit은 고전 비트의 양자 유사체입니다. 더 구체적으로, 고전 비트의 "켜짐"/"꺼짐" 상태와 유사한 2준위 시스템으로 설계됩니다. 3준위 시스템(이른바 "쿠트릿") 또는 다준위 시스템("큐딧")을 활용하는 양자 컴퓨팅 패러다임도 존재합니다. 하지만 대부분의 연구는 Qubit에 집중되어 있습니다. 특히, IBM® 양자 컴퓨터는 고정 주파수 트랜스몬 Qubit이라고 불리는 것을 사용합니다. 이것은 원자의 궤도 또는 스핀 각운동량과는 상당히 다릅니다. 하지만 전자의 스핀과 마찬가지로, IBM® Qubit은 빛과 상호작용할 수 있고 측정이 가능한 양자역학적 시스템입니다. 실제로, 양자역학적 스핀의 상태와 Qubit의 계산 상태 사이에 유추 관계가 자주 발견됩니다. 예를 들어, "스핀 업" 상태는 계산 0 상태와, "스핀 다운"은 계산 1 상태와 연관됩니다:

0|\uparrow\rangle \sim |0\rangle 1|\downarrow \rangle \sim |1\rangle

이러한 유사성을 활용하여, IBM 양자 컴퓨터에서 원자의 궤도 또는 스핀 각운동량의 양자역학적 거동을 모방하는 양자역학적 현상을 관측할 수 있습니다. 우리는 이러한 상태들의 선형 결합을 사용하여 임의 방향의 각운동량에 대한 논의를 확장하는 유사한 관측을 수행할 것입니다.

첫 번째 실험: 단일 측정

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

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

일반적으로 이 단계들을 따르겠지만, 항상 명시적으로 레이블을 붙이지는 않을 수 있습니다.

1단계: 고전적 입력을 양자 문제로 매핑

여기서 고전적 입력은 슈테른-게를라흐 장치에서 측정 전 스핀의 방향입니다. 측정 전 양자 상태의 정확한 성질에 대해 너무 걱정하지 않아도 됩니다. 그것은 벨 정리를 다루는 다른 Qiskit Classrooms 모듈의 주제입니다.

IBM 양자 컴퓨터는 zz 축을 따라 상태를 측정한다는 점에 유의하세요. 따라서 이 첫 번째 실험은 자기장 기울기가 zz 방향인 슈테른-게를라흐 실험과 매우 유사합니다. 나중에 다른 방향으로 측정하도록 시스템을 변경하는 방법을 살펴볼 것입니다.

|\uparrow\rangle|\downarrow\rangle의 혼합, 즉 0|0\rangle1|1\rangle의 혼합인 스핀 상태의 유사체를 만들어 봅시다. 몇 가지 초기 값을 제안했습니다. 하지만 다른 값이나 무작위 값으로 자유롭게 실험해 보세요.

import random
from numpy import pi
import numpy as np

# Use these lines to choose your own arbitrary state vector and normalize it.
# a = 2
# b = (1+1j)
# norm = np.sqrt(a*np.conjugate(a)+b*np.conjugate(b))
# a = a/norm
# b = b/norm
# print(a,b)

# Use these lines if you would rather look at at random spin orientations.
a = random.random()
b = random.random()
norm = np.sqrt(a * np.conjugate(a) + b * np.conjugate(b))
a = a / norm
b = b / norm
print(a, b)
0.7032089086145691 0.7109832845047109

이제 위의 각도를 양자 Circuit의 파라미터로 사용하겠습니다. 한 번에 하나의 입자만 고려하므로, Circuit에서 Qubit을 하나만 사용하고 고전 레지스터도 하나만 필요합니다.

from qiskit.circuit import QuantumRegister, ClassicalRegister, QuantumCircuit, Parameter

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

# Initialize the quantum state
qc.initialize([a, b])
qc.measure(0, 0)
qc.draw("mpl")

이전 코드 셀의 출력

2단계: 양자 실행을 위한 문제 최적화

실제 양자 컴퓨터에서 실험을 실행하려면, Qiskit Runtime Service를 로드하고 양자 컴퓨터(또는 "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')

# Syntax for specifying a channel and instance (if you need to change from the default set above)
# service = QiskitRuntimeService(channel='<channel name here>', instance="<your instance name here>")

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

# Use the least busy backend, specify options as needed
# backend = service.least_busy(operational=True, simulator=False, min_num_qubits = 127)
backend = service.least_busy()
print(backend.name)
ibm_sherbrooke

이제 Circuit을 Transpile해야 합니다. 즉, Circuit을 선택한 양자 컴퓨터에서 사용 가능한 기본 Gate에 매핑하고, 해당 양자 컴퓨터에서 실행하기 위해 Circuit을 최적화해야 합니다.

# Transpile the circuit and optimize for running on the quantum computer selected
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

pm = generate_preset_pass_manager(optimization_level=3, backend=backend)
qc_ibm = pm.run(qc)

3단계: Qiskit Runtime Primitives를 사용하여 실행

이제 실제 양자 컴퓨터에서 실행하려 합니다. 이를 위한 모든 필요한 구문이 아래 코드 블록에 있습니다. 실제 양자 컴퓨터에 할당된 시간을 모두 사용했거나 인터넷 연결이 없는 경우, 다음 코드 블록의 주석을 해제하면 로컬 시뮬레이터에서 코드를 실행할 수 있습니다.

# Specify that we want to use only a single shot, to represent a single measurement of a spin in a SG device.
num_shots = 1

# Evaluate the problem using a QPU via Qiskit IBM Runtime
# The best practice is to use a session as shown below. This is available to Premium Plan, Flex Plan, and On-Prem (IBM Quantum Platform API) Plan users.
with Session(backend=backend) as session:
sampler = Sampler(mode=session)
dist = sampler.run([qc_ibm], shots=num_shots).result()
session.close()
counts = dist[0].data.c.get_counts()

# Open users can still carry out this experiment, but without making use of a session, meaning repeated queuing is possible.
# from qiskit_ibm_runtime import Batch,
# batch = Batch(backend=backend)
# sampler = Sampler(mode=batch)
# dist = sampler.run([qc_ibm], shots=num_shots).result()
# Close the batch because no context manager was used.
# batch.close()
# counts = dist[0].data.c.get_counts()

실제 양자 컴퓨터에서 실험을 실행할 수 없는 경우 아래 코드를 사용하세요.

# This uses a local simulator
# from qiskit_aer import AerSimulator

# This generates a simulator that mimics the real quantum system
# backend_sim = AerSimulator.from_backend(backend)

# Import an estimator, this time from qiskit (we import from Runtime for real hardware)
# from qiskit.primitives import BackendSamplerV2
# sampler = BackendSamplerV2(backend = backend_sim)

# num_shots = 1

# This runs the job
# dist = sampler.run([qc_ibm], shots = num_shots).result()

# This selects measurement counts for the 0th circuit, which in this case is the only circuit
# counts=dist[0].data.c.get_counts()

4단계: 후처리 및 고전적 분석

이 매우 간단한 실험의 경우, 고전적 분석은 단순히 실험 결과를 시각화하는 것으로 이루어집니다.

from qiskit.visualization import plot_histogram

print("counts = ", counts)
plot_histogram(counts)
counts =  {'0': 1}

이전 코드 셀의 출력

우리는 한 번의 측정을 수행하여 "0"을 얻었습니다. 이것은 우리에게 놀라운 일이 아닙니다. 우리는 Qubit으로 구성된 양자 컴퓨터를 사용하고 있으며, 고전 비트가 0 또는 1을 반환하는 것에 매우 익숙합니다. 하지만 기억하세요: 이것은 자기 모멘트를 가진 입자로 수행된 실험의 양자 컴퓨팅 유사체입니다. 만약 0과 +1 사이에 균등하게 분포될 것을 기대했다면, 첫 번째 측정에서 한쪽 극값을 얻었다는 것에 실제로 놀랐을 것입니다. 슈테른-게를라흐 실험에서 이러한 놀라운 결과의 양자화가 자연에 대한 더 나은 이해로 이어졌고, 그것이 결국 양자 컴퓨터를 만드는 데 도움이 되었습니다.

앙상블 측정을 하면 어떤 일이 일어나는지 살펴봅시다.

두 번째 실험: 많은 입자 측정하기

이러한 많은 측정에 대한 통계를 수집하기 위해 1단계와 2단계를 반복할 필요는 없습니다. 아래 3단계에서 실험의 shot 수를 늘리기만 하면 됩니다. 아래 3단계 인스턴스의 shot 수를 자유롭게 조정해 보세요.

from qiskit_ibm_runtime import Session, SamplerV2 as Sampler

num_shots = 100

# Evaluate the problem using a QPU via Qiskit IBM Runtime
# The best practice is to use a session as shown below. This is available to Premium Plan, Flex Plan, and On-Prem (IBM Quantum Platform API) Plan users.
with Session(backend=backend) as session:
sampler = Sampler(mode=session)
dist = sampler.run([qc_ibm], shots=num_shots).result()
session.close()
counts = dist[0].data.c.get_counts()

# Open users can still carry out this experiment, but without making use of a session, meaning repeated queuing is possible.
# batch = Batch(backend=backend)
# sampler = Sampler(mode=batch)
# dist = sampler.run([qc_ibm], shots=num_shots).result()
# Close the batch because no context manager was used.
# batch.close()
# counts = dist[0].data.c.get_counts()

이전과 마찬가지로, 실제 양자 컴퓨터에서 실행할 수 없는 경우 첫 번째 실험의 위 코드 블록을 주석 해제하고 num_shots = 1num_shots = 100 이상으로 변경하면 됩니다.

plot_histogram(counts)

Output of the previous code cell

0을 측정하는 경우도 있고 1을 측정하는 경우도 있습니다. 0이나 1 외의 다른 결과는 절대로 측정되지 않는다는 점에 주목하세요! shot 수를 변경해 보면, 0 또는 1을 측정할 확률이 서로 다른 수의 shot에서도 꽤 일관되게 유지된다는 것을 알 수 있습니다. 즉, 상태 준비 방식이 측정 결과의 확률을 결정하는 것으로 보이지만, 개별 측정은 0 또는 1 중 어느 쪽이든 나올 수 있습니다.

세 번째 실험: 오븐 속의 무작위 스핀

슈테른-게를라흐 실험에서 연구자들은 오븐에서 나오는 각운동량 벡터의 각도를 지정할 수 없었습니다. 방향은 무작위였습니다(또는 그보다 더 신비로운 무언가였습니다! Bell의 정리에 관한 Qiskit 교실 모듈을 참조하세요). 그 실험의 합리적인 유사 실험은 qubit의 상태를 무작위로 초기화하고 여러 번 측정하는 것입니다.

1단계: 고전적 입력을 양자 문제로 매핑하기

구성하려는 Circuit은 이전과 동일합니다. 단, 이번에는 자유 매개변수 θ\thetaϕ\phi를 가진 Gate를 사용하여 Circuit을 구성한다는 점이 다릅니다. 그런 다음 각 새 실행에 대해 해당 매개변수에 수치 값이 할당됩니다.

# from qiskit.circuit import QuantumCircuit, Parameter

theta = Parameter("θ")
phi = Parameter("$\phi$")

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

# Add rotation gates for rotating the state of qubit 0 to random orientations
qc.rx(theta, 0)
qc.rz(phi, 0)
qc.measure(0, 0)

qc.draw("mpl")

Output of the previous code cell

단일 shot으로만 양자 Circuit을 실행하면서 이를 여러 무작위 구성에 대해 반복하는 것은 양자 컴퓨터에서 일반적이지 않은 워크플로입니다. 물론 수행할 수 있지만, 간단함을 위해 여기서는 로컬 시뮬레이터를 사용하겠습니다.

# This uses a local simulator
from qiskit_aer import AerSimulator

# Import an estimator, this time from qiskit (we import from Runtime for real hardware)
from qiskit.primitives import BackendSamplerV2

# This generates a simulator that mimics the real quantum system
backend_sim = AerSimulator.from_backend(backend)
sampler_sim = BackendSamplerV2(backend=backend_sim)

# from qiskit.primitives import BackendSamplerV2
# sampler = BackendSamplerV2(backend=backend)
# A list to store the accumulated probabilities of the two possible measurement outcomes.
probslist = {"0": 0.0, "1": 0.0}

# Choose how many "particles"/measurements
measurements = 100
num_shots = 1

for i in range(measurements):
# Assign a random orientation for each measurement
phi = random.random() * 2 * pi
theta = random.random() * 2 * pi

angles = [phi, theta]
circuit = qc.assign_parameters(angles)
qc_ibm = pm.run(circuit)

# Run the circuit
# job = sampler.run([circuit],num_shots = 1)
dist = sampler_sim.run([qc_ibm], shots=num_shots).result()

# Update the list of probabilities
zeroterm = dist[0].data.c.get_counts().get("0") or 0
oneterm = dist[0].data.c.get_counts().get("1") or 0
probslist.update({"0": probslist.get("0") + zeroterm})
probslist.update({"1": probslist.get("1") + oneterm})

probslist.update({"0": probslist.get("0") / measurements})
probslist.update({"1": probslist.get("1") / measurements})
# print(probslist)
plot_histogram(probslist)

Output of the previous code cell

qubit의 무작위 초기 상태(슈테른-게를라흐 실험에서 각운동량의 무작위 방향에 해당)가 유사한 수의 0 상태와 1 상태(스핀 업 상태와 스핀 다운 상태의 유사한 수와 같이)를 생성한다는 것을 알 수 있습니다. 이것이 바로 원래 슈테른-게를라흐 실험이 보여준 결과입니다.

네 번째 실험: 반복 측정

Qubit이 무작위 상태에서 시작할 때, 두 극단 중 하나를 측정할 확률이 대략 50대 50이라는 것을 확인했습니다. 그렇다면 측정 후 Qubit의 상태(또는 입자의 각운동량)는 어떻게 될까요? 이를 알아보기 위해 동일한 Qubit에 여러 번 측정을 수행할 수 있는 Circuit을 정의해야 합니다. 이를 조사하는 데 사용할 수 있는 Circuit을 정의해 봅시다. 0|0\rangle1|1\rangle 두 상태 모두 측정할 가능성을 허용하려면 Qubit의 초기 상태를 기본값인 0|0\rangle에서 회전시킬 무언가가 필요합니다. 이 경우 H0=12(0+1)H|0\rangle = \frac{1}{\sqrt{2}}(|0\rangle+|1\rangle)이므로 아다마르 Gate HH를 사용하겠습니다. 기본적으로 두 측정 모두 zz 방향을 따라 수행됩니다.

from qiskit import QuantumCircuit

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

# Initialize the qubit to be a mixture of 0 and 1 states.
qc.h(0)

# Add a first measurement
qc.measure(0, 0)
qc.barrier()

# Add a second measurement
qc.measure(0, 1)

qc.draw("mpl")

qc_ibm = pm.run(qc)
# Step 3: Run the job

num_shots = 1000
dist = sampler.run([qc_ibm], shots=num_shots).result()
# To run on a simulator, uncomment the line below and comment out the line above.
# dist = sampler_sim.run([qc_ibm], shots=num_shots).result()
counts = dist[0].data.c.get_counts()
print(counts)
{'00': 497, '11': 498, '01': 3, '10': 2}
# Step 4: Post-process
plot_histogram(counts)

Output of the previous code cell

위 그림에서 막대는 "00", "01" 등으로 표시되어 있습니다. 여기서 이 숫자들은 "2번째 결과, 1번째 결과"를 나타냅니다. 즉, "00"은 두 측정 모두 0|0\rangle 상태를 나타낸 것이고, "01"은 첫 번째 측정에서 1|1\rangle이, 두 번째 측정에서 0|0\rangle이 나온 것을 의미합니다. Qubit의 대부분은 0|0\rangle으로 두 번 측정되거나 1|1\rangle으로 두 번 측정되었습니다. Qubit이 한 상태로 측정된 후 다른 상태로 측정되는 경우는 매우 드물었으며, 그러한 경우(약 1%)는 노이즈에 의한 것입니다. 이 경우 해당 노이즈는 실제 양자 시스템의 거동에 맞게 시뮬레이션되었습니다. 이처럼 연속 측정 사이에 관찰되는 상관관계는 스핀 각운동량을 가진 입자의 슈테른-게를라흐 방식의 측정에서도 관찰됩니다. 입자가 "스핀 업"으로 측정되면, 그 직후의 측정에서도 다시 "스핀 업"이 나옵니다(노이즈로 인한 약간의 변동은 있을 수 있음).

이것이 사소해 보일 수도 있습니다. 결국 Qubit이 어떤 상태로 측정되고 나서 곧바로 다시 측정하면 여전히 같은 상태가 아니겠냐고 생각할 수 있습니다. 하지만 이 미묘함에 집중한다면, 이 현상을 설명하는 수학적 도구를 선택하는 데 도움이 될 것입니다.

지금까지의 실험 분석

지금까지의 실험에서 몇 가지 관찰 결과를 정리해 봅시다:

  • 양자 역학적 시스템의 측정은 "허용된 값" 집합 중 하나만 산출합니다. Qubit이나 스핀-1/2 입자와 같은 이진 시스템의 경우, 측정은 이진 결과 중 하나만 산출합니다.
  • 이진 시스템의 상태를 무작위로 초기화(오븐에서 나오는 스핀-1/2 입자처럼)하면 두 이진 측정 결과 중 어느 것이든 가능합니다.
  • 측정이 이루어지고 시스템의 상태가 알려진 후, 동일한 물리적 관측 가능량을 반복해서 측정해도 상태는 변하지 않습니다! 즉, 0 상태를 한 번 얻으면 다시 측정해도 여전히 0 상태입니다(시스템의 약 0.1%~1% 정도의 미세한 노이즈는 있을 수 있음).

아직 양자 역학의 확률적 특성을 다루지 않았으며, 상태가 고유 상태로 "붕괴"하는 것에 대해서도 언급하지 않았음을 명심하세요. 위의 관찰만을 사용한다면, 측정 연산자 OO가 특수한 양자 역학적 상태 집합 ψ|\psi\rangle을 어쩌면 상수까지 변하지 않게 놔두는 것, 즉 Oψ=cψO|\psi\rangle = c|\psi \rangle를 만족하는 것을 찾고 싶어질 수 있습니다. 이는 zz 방향으로 두 번 측정하면 같은 결과가 나오기 때문입니다. 결국 이 탐색은 앞으로 보게 될 모든 거동을 설명하지 못할 것입니다. 하지만 일부를 설명할 수는 있으므로, 조금 더 이 방향을 탐구해 보겠습니다.

그러한 연산이 실제로 존재합니다. 행렬 연산은 일부 벡터를 변환시키지만, 다른 벡터(고유벡터)에 대해서는 상수를 제외하고 벡터를 변하지 않게 그대로 둡니다. 예를 들어 행렬 MM과 벡터 v|v\rangle을 생각해 보세요.

M=(1221)M= \begin{pmatrix} 1 & 2 \\ 2 & 1\end{pmatrix}

그리고

v=(11)|v\rangle = \begin{pmatrix} 1\\1 \end{pmatrix}

다음을 확인하세요.

Mv=(1221)(11)=(11+2121+11)=(33)=3v.M|v\rangle= \begin{pmatrix} 1 & 2 \\ 2 & 1\end{pmatrix}\begin{pmatrix} 1\\1 \end{pmatrix} = \begin{pmatrix} 1*1+2*1\\2*1+1*1 \end{pmatrix} = \begin{pmatrix} 3\\3 \end{pmatrix} = 3|v\rangle.

하지만 v=(12)|v'\rangle = \begin{pmatrix} 1\\2\end{pmatrix}와 같은 다른 벡터에 대해서는

Mv=(1221)(12)=(11+2221+12)=(54)cv.M|v'\rangle= \begin{pmatrix} 1 & 2 \\ 2 & 1\end{pmatrix}\begin{pmatrix} 1\\2 \end{pmatrix} = \begin{pmatrix} 1*1+2*2\\2*1+1*2 \end{pmatrix} = \begin{pmatrix} 5\\4 \end{pmatrix} \neq c|v'\rangle.

입자의 스핀을 행렬로, 측정 후 입자의 상태를 "상태 벡터"라고 불리는 벡터로 표현해 볼 수 있습니다. 그러한 행렬이나 상태 벡터에 어떤 값이 들어가야 하는지는 전혀 명확하지 않지만, 지금까지의 측정에서 상태를 표시하는 데 사용할 수 있는 유일한 속성은 0 또는 1을 측정할 확률(스핀-1/2 입자의 맥락에서는 "스핀 업" 또는 "스핀 다운")입니다. 상태 벡터의 항목들이 이 확률과 관련이 있어야 한다고 생각해야 합니다(정확히 확률이거나, "확률 진폭" — 즉 항목을 제곱하면 확률이 되는 것 등). 하지만 현재로서는 이 행렬의 항목이 순전히 실수여야 하는지, 복소수인지, 아니면 어떤 형태인지 알 수 없습니다. 안전하게 다음 조건을 만족하는 벡터와 행렬의 체계를 개발해 봅시다:

  • 행렬 연산자는 실험과 최대한 연결되어야 합니다. 예를 들어, 스핀 행렬의 고유값을 실험적으로 관찰된 스핀 투영과 연결할 수 있습니다.
  • 상태 벡터는 다음과 같은 방식으로 확률과 연결되어야 합니다: 입자가 상태 벡터 A|A\rangle에 있다면, 이후 측정에서 입자가 상태 B|B\rangle에 있을 확률은 PABAB2P_{AB}\equiv |\langle A| B \rangle|^2입니다.

이렇게 하면 첫 번째 행렬을 개발하는 데 있어 상당한 자유도가 주어집니다. 예를 들어, 순진하게 다음을 시도해 볼 수 있습니다.

0(10).|0\rangle \sim |\uparrow\rangle \sim \begin{pmatrix} 1 \\0 \end{pmatrix}.

여기서 0|0\rangle \sim |\uparrow\rangle는 양자 컴퓨터와 스핀-1/2 시스템의 상태가 매우 유사하며 서로 자주 대응된다는 것을 의미합니다. 이 둘은 서로 다른 시스템을 나타내므로 당연히 완전히 동일하지는 않습니다. 하지만 이 두 이진 시스템을 설명하는 대수학은 동일한 규칙을 따를 수 있습니다(스포일러: 실제로 그렇습니다!). 이 무작위 선택은 이미 한 가지 좋은 속성을 가지고 있습니다. 다음을 확인하세요.

P00=002=(10)(10)2=12=1.P_{00} = |\langle 0| 0 \rangle|^2 = \vert \begin{pmatrix} 1 & 0\end{pmatrix} \begin{pmatrix} 1 \\ 0\end{pmatrix}\vert ^2 = |1|^2 = 1.

즉, 입자가 이미 0|0\rangle 상태에 있을 때, 이후 측정에서도 0|0\rangle이 나올 확률은 1입니다(노이즈의 영향을 무시하면). 이미 0 또는 "스핀 업" 상태에 있는 상태는 이후 측정에서도 그 상태를 유지한다는 것을 확인했으므로, 이는 훌륭한 결과입니다. 위의 확률은 실제로 100%여야 합니다.

이해 확인

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

0=(10)|0\rangle = \begin{pmatrix} 1 \\0 \end{pmatrix}

0=(20)|0\rangle = \begin{pmatrix} 2 \\0 \end{pmatrix}

보다 더 나은 선택인가요?

답:

측정 확률을 내적의 제곱과 연결하려는 시도는 각 벡터의 크기가 1이어야 함을 의미합니다. 즉, 모든 v|v\rangle에 대해 vv2=1|\langle v|v\rangle|^2 = 1이어야 합니다. 이는 v|v\rangle 상태에 있는 것이 v|v\rangle 상태에 있을 확률이 100%이기 때문입니다. 이를 "정규화 조건"이라고 합니다.

0=(10)|0\rangle = \begin{pmatrix} 1 \\0 \end{pmatrix}

0=(01)|0\rangle = \begin{pmatrix} 0 \\1 \end{pmatrix}

보다 더 나은 선택인가요?

답:

그렇지 않습니다. 처음에 0=(10)|0\rangle = \begin{pmatrix} 1 \\0 \end{pmatrix}로 선택해야 할 이유는 없습니다. 이는 관례입니다. 하지만 일단 이 선택을 하면, 이후의 선택들에 일정한 제약이 가해집니다. 아래를 참고하세요.

위의 실험에서 0|0\rangle 상태로 초기화된 Qubit은 이후 측정에서도 해당 상태를 유지한다는 것을 확인했습니다. 1|1\rangle에 대해서도 마찬가지입니다. 이는 0|0\rangle에 있는 Qubit이 1|1\rangle 상태로 측정될 확률이 0이라는 것을 의미합니다(노이즈의 영향을 무시하면). 측정과 내적 사이의 필요한 연결을 통해 다음을 알 수 있습니다.

P01=P10=0.P_{01} = P_{10}=0.

일반성을 잃지 않고 상태 벡터 1=(ab)|1\rangle = \begin{pmatrix} a \\ b \end{pmatrix}로 쓸 수 있습니다. 그러면 다음과 같이 쓸 수 있습니다.

P01=012=(10)(ab)2=a2=0.P_{01} = |\langle 0| 1 \rangle|^2 = \vert \begin{pmatrix} 1 & 0\end{pmatrix} \begin{pmatrix} a \\ b\end{pmatrix}\vert ^2 = |a|^2 = 0.

P11=1P_{11} = 1이어야 한다는 요건, 즉 "정규화 조건"은 b2=1|b|^2=1임을 알려줍니다. 이것만으로는 b=eiϕb=e^{i\phi} (ϕR\phi \in \mathbb{R})로만 제한됩니다. b=1b=1을 선택하는 데에는 이 주제의 소개 범위를 넘어서는 다른 이유들이 있습니다. 지금은 b=1b=1이 허용 가능한 해 중 하나라는 것으로 충분합니다.

분석이 상당히 진행되었습니다. 상태 벡터의 형태를 선택하면 여기서 작동하는 물리적 현상에 대한 무언가를 설명하는 행렬을 구성할 수 있습니다. 특히, 원래의 슈테른-게를라흐 실험이 zz 축을 따른 스핀 각운동량 성분에 기반하여 궤적이 분리되는 것을 측정했기 때문에, 바로 그것을 설명하는 연산자 SzS_z가 필요합니다. 실험과의 또 다른 핵심 연결은 편향량, 이동 시간, 알려진 자기장 세기로부터 스핀의 zz 성분 크기를 결정할 수 있다는 것입니다. 이는 실험 장치의 정밀도에 대한 많은 가정이 필요하지만, 여기서는 측정된 스핀 각운동량의 zz 성분이 ±/2\pm \hbar/2라는 점만 재확인하겠습니다.

그러면 우리는 실수 고유값(에르미트 행렬로 만족)을 가지며 고유값이 실험적으로 관찰된 스핀 성분에 해당하는 행렬을 찾고 있습니다. 일반성을 잃지 않고 Sz=(s11s12s21s22)S_z = \begin{pmatrix} s_{11} & s_{12} \\ s_{21} & s_{22}\end{pmatrix}로 쓸 수 있으며, 다음을 요구할 수 있습니다:

Sz=(s11s12s21s22)(10)=(s11s21)=!2(10)s11=/2,s21=0S_z |\uparrow\rangle = \begin{pmatrix} s_{11} & s_{12} \\ s_{21} & s_{22}\end{pmatrix}\begin{pmatrix}1 \\0\end{pmatrix} = \begin{pmatrix} s_{11} \\ s_{21} \end{pmatrix} \overset{!}{=} \frac{\hbar}{2} \begin{pmatrix}1 \\0\end{pmatrix} \rightarrow s_{11} = \hbar/2,s_{21}=0 Sz=(s11s12s21s22)(01)=(s12s22)=!2(01)s12=0,s22=/2S_z |\downarrow\rangle = \begin{pmatrix} s_{11} & s_{12} \\ s_{21} & s_{22}\end{pmatrix}\begin{pmatrix}0 \\1\end{pmatrix} = \begin{pmatrix} s_{12} \\ s_{22} \end{pmatrix} \overset{!}{=} -\frac{\hbar}{2} \begin{pmatrix}0 \\1\end{pmatrix} \rightarrow s_{12} = 0, s_{22}=-\hbar/2

결합하고 전체 인수 /2\hbar/2를 분리하면 다음을 얻습니다.

Sz=2(1001).S_z = \frac{\hbar}{2} \begin{pmatrix} 1 & 0 \\ 0 & -1\end{pmatrix}.

이는 모든 양자 역학 교과서에서 찾아볼 수 있는 잘 알려진 스핀-z 연산자입니다. /2\hbar/2를 제거하면 "파울리-z" 연산자가 되며, 일반적으로 σz\sigma_z로 표시됩니다:

σz=(1001).\sigma_z = \begin{pmatrix} 1 & 0 \\ 0 & -1\end{pmatrix}.

이는 유용합니다. 이 파울리 연산자(및 관련 행렬)는 양자 컴퓨터의 트랜스몬 Qubit 상태를 포함하여 두 가지 수준이나 두 가지 측정 결과를 포함하는 많은 물리 시스템을 설명할 수 있기 때문입니다.

다른 연산자와 이와 관련된 상태로 넘어가기 전에, 많은 사람들이 잘못 이해하는 한 가지 사실을 짚고 넘어가야 합니다. 연산자 작용은 측정과 같지 않습니다. 어떤 의미에서는 "당연하죠! 하나는 종이 위 수학적 계산의 일부이고, 다른 하나는 실험실의 물리적 시스템에서 일어나는 것입니다"라고 말할 수 있습니다. 맞습니다. 하지만 그 이상의 차이가 있습니다. 스핀의 zz 성분을 측정하면 시스템의 초기 상태에 관계없이 항상 "스핀 업" 또는 "스핀 다운" 상태가 나옵니다. 이것은 양자 컴퓨팅 유사물인 0|0\rangle1|1\rangle로도 확인했습니다. 수백 가지 무작위 방향으로 상태를 초기화했음에도 측정은 항상 0|0\rangle 또는 1|1\rangle을 산출했습니다. 이를 측정이 상태를 고유 상태로 "붕괴"시키는 것이라고 합니다. 이것은 행렬을 상태에 적용할 때는 일어나지 않습니다. 아래 질문을 통해 이를 탐구해 보세요.

이해 확인

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

스핀 상태가

ψ=(3/52/5)|\psi\rangle = \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}

인 입자에서 시작한다고 가정하세요.

(a) 이 상태 벡터에 SzS_z 연산자를 작용하면 무엇을 얻나요? (b) 이 입자의 스핀 zz 성분에 대해 단일 측정을 수행하면 무엇을 얻나요? (c) 이 상태와 동일한 많은 입자를 준비하고 스핀 zz 성분을 수천 번 측정하면 무엇을 얻나요?

답:

(a) 다음을 얻습니다.

Szψ=2(1001)(3/52/5)S_z |\psi\rangle = \frac{\hbar}{2} \begin{pmatrix} 1 & 0 \\ 0 & -1\end{pmatrix} \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}=2(3/52/5).= \frac{\hbar}{2} \begin{pmatrix}\sqrt{3/5} \\ -\sqrt{2/5}\end{pmatrix}.

그게 전부입니다. 실험적 결과는 없습니다. 행렬을 벡터에 적용하면 새로운 "-" 부호가 생기고, 더 이상 크기가 1이 아닌(전인수 /2\hbar/2가 있으므로) 약간 다른 벡터가 나옵니다.

(b) |\uparrow\rangle 또는 |\downarrow\rangle을 얻습니다. 이는 zz 축에 대한 스핀 투영이 각각 /2\hbar/2 또는 /2-\hbar/2임을 관측하는 것에 해당합니다. 각 결과의 확률도 결정할 수 있습니다.

Pψ=ψ2=(10)(3/52/5)2=3/52=35P_{\uparrow\psi}=|\langle \uparrow|\psi\rangle|^2 = \vert \begin{pmatrix}1 & 0\end{pmatrix} \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}\vert^2 = |\sqrt{3/5}|^2 = \frac{3}{5}Pψ=ψ2=(01)(3/52/5)2=2/52=25P_{\downarrow\psi}=|\langle \downarrow|\psi\rangle|^2 = \vert \begin{pmatrix}0 & 1\end{pmatrix} \begin{pmatrix}\sqrt{3/5} \\ \sqrt{2/5}\end{pmatrix}\vert^2 = |\sqrt{2/5}|^2 = \frac{2}{5}

스핀 업 상태가 20% 더 가능성이 높지만 두 결과 모두 가능하며, 이 두 상태 중 하나만 얻게 됩니다.

(c) (b)에서 계산한 측정 확률에 따르면, 측정의 약 60%는 스핀 업 입자를, 약 40%는 스핀 다운 입자를 산출합니다.

스핀 업 상태의 원자와 Qubit 상태 사이의 유사성을 이용하여 이전 질문의 (b)와 (c) 부분의 답을 검증하세요:

0.|\uparrow\rangle\sim|0\rangle.

원하는 초기 상태를 만드는 양자 Circuit을 코딩하고, 실제 하드웨어 또는 시뮬레이터를 사용하여 단일 측정의 결과와 수백 또는 수천 번의 측정으로 이루어진 앙상블의 결과를 확인하세요.

답:

#Use the backend sampler for part (b) because it allows us to use a single shot.
from qiskit_aer import AerSimulator
backend_sim = AerSimulator.from_backend(backend)
from qiskit.primitives import BackendSampler
sampler = BackendSampler(backend = backend_sim)

#Create a quantum circuit to initialize the state.
import math
psi = [math.sqrt(3/5),math.sqrt(2/5)]
qc = QuantumCircuit(1,1)
qc.initialize(psi, [0])

#Add measurement to the circuit
qc.measure(0,0)
qc.draw('mpl')

#Set num_shots =1 for part (b) and num_shots = 1000 or more for part (c).
num_shots = 1000

#Run the job and print the result. You should obtain only 0 or 1 in part (b) for a single shot.
#You should obtain a probability distribution with approximately 60% 0 and 40% 1 in part (c)

dist = sampler.run([qc_ibm], shots = num_shots).result()
counts=dist[0].data.c.get_counts()
print(counts)

#You should obtain {0: 599, 1: 401} or something equivalently close to the 60%-40% distribution predicted.

다섯 번째 실험: 다른 관측량 측정하기

지금까지는 z축 방향으로만 측정을 수행했습니다. Stern-Gerlach 실험에서 예를 들어 x축 방향으로 측정하고 싶다면, 불균일 자기장을 xx축 방향으로 향하게 하고 화면에서 xx 방향의 편향을 관찰하면 됩니다. 그러나 IBM 양자 컴퓨터는 오직 하나의 축(zz)으로만 측정하도록 설계되어 있습니다. xx 방향으로 상태를 측정하려면 "기저 변환(change of basis)"을 수행해야 합니다. 이는 블로흐 구(Bloch sphere)에서 xx 방향의 상태를 zz 방향으로, 그 반대 방향으로도 변환하는 연산을 수행해야 함을 의미합니다. 이를 구현하는 방법은 여러 가지가 있지만, 가장 선호되는 방법은 Hadamard Gate입니다:

H=12(1111)H=\frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}

이해도 확인하기

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

H0=+xH|0\rangle = |+\rangle_x 이고 H+x=0H|+\rangle_x = |0\rangle 임을 보이세요.

답:

H0=12(1111)(10)=12(11)=+xH|0\rangle = \frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\begin{pmatrix}1 \\ 0\end{pmatrix} = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ 1\end{pmatrix} = |+\rangle_xH+x=1(2)(1111)12(11)=12(20)=(10)=0H|+\rangle_x = \frac{1}{\sqrt(2)}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ 1\end{pmatrix} = \frac{1}{2}\begin{pmatrix}2 \\ 0\end{pmatrix} = \begin{pmatrix}1 \\ 0\end{pmatrix} = |0\rangle

H1=xH|1\rangle = |-\rangle_x 이고 Hx=1H|-\rangle_x = |1\rangle 임을 보이세요.

답:

H1=12(1111)(01)=12(11)=xH|1\rangle = \frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\begin{pmatrix}0 \\ 1\end{pmatrix} = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix} = |-\rangle_xHx=1(2)(1111)12(11)=12(02)=(01)=1H|-\rangle_x = \frac{1}{\sqrt(2)}\begin{pmatrix}1 & 1 \\ 1 & -1\end{pmatrix}\frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix} = \frac{1}{2}\begin{pmatrix}0 \\ 2\end{pmatrix} = \begin{pmatrix}0 \\ 1\end{pmatrix} = |1\rangle
# Define registers
qr = QuantumRegister(1, "q")
cr = ClassicalRegister(1, "c")
qc = QuantumCircuit(qr, cr)

# Add a hadamard gate to rotate into the x-basis
qc.h(0)
qc.measure(0, 0)

qc.draw("mpl")

Output of the previous code cell

이 Circuit은 측정(z 방향)이 회전 이전의 xx 특성을 알려주도록 시스템을 회전시킵니다. 양자 컴퓨터가 상태를 0|0\rangle, 즉 |\uparrow\rangle에 해당하는 상태로 초기화한다는 것을 이미 알고 있습니다. 처음에 |\uparrow\rangle 상태에 있는 스핀의 xx 방향 투영을 측정하면 어떻게 되는지 살펴보겠습니다. 여러 다른 초기화를 가진 Circuit의 통계를 탐색할 수 있도록 이 단계를 시뮬레이터로 실행합니다.

from qiskit.primitives import StatevectorSampler as Sampler

sampler_sv = Sampler()

job = sampler_sv.run([qc], shots=10000)
print(job.result()[0].data.c.get_counts())
{'1': 4977, '0': 5023}

이 결과는 0|0\rangle 상태(혹은 동등하게 |\uparrow\rangle 스핀)에 처음 있던 Qubit에 대해 +x+x 또는 x-x 방향 투영을 측정할 확률이 약 50대 50임을 보여줍니다. 어떤 의미에서 이는 완벽히 이치에 맞습니다. 무언가가 z 방향을 향하고 있다면 ±x\pm x 방향에 대한 특별한 선호도가 없을 것이기 때문입니다. 1|1\rangle 상태(또는 |\downarrow\rangle)에서 시작하더라도 마찬가지일 것이라고 예상할 수 있습니다. 확인해 보겠습니다:

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

# Add a NOT gate and hadamard gate. Measure.
qc.x(0)
qc.h(0)
qc.measure(0, 0)

qc.draw("mpl")

Output of the previous code cell

job = sampler_sv.run([qc], shots=10000)
print(job.result()[0].data.c.get_counts())
{'0': 4935, '1': 5065}

맞습니다! 다시 한번 ±x\pm x 방향 투영을 측정할 확률이 50대 50임을 확인했습니다. zz 방향 측정과의 유사성을 바탕으로, +x+x 방향으로 확실히 붕괴된 입자가 이후 x-x 방향으로 측정될 확률이 0일 것이라고 더 의심해볼 수 있습니다. 확인해 보겠습니다:

from qiskit import QuantumCircuit

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

# Rotate into x-basis using a Hadamard gate, then make two measurements in succession
qc.h(0)
qc.measure(0, 0)
qc.barrier()
qc.measure(0, 1)

qc.draw("mpl")

Output of the previous code cell

job = sampler_sv.run([qc])
print(job.result()[0].data.c.get_counts())
plot_histogram(job.result()[0].data.c.get_counts())
{'00': 504, '11': 520}

Output of the previous code cell

예상대로, 투영이 +x+x 방향이었다가 이후에도 다시 +x+x 방향인 결과와, 처음에 x-x 방향이었다가 이후에도 다시 x-x 방향인 결과를 얻었습니다. 투영이 +x+x에서 x-x로, 또는 그 반대로 전환되는 경우는 관찰되지 않았습니다. 이 관찰 결과를 정리하여 행렬 형태의 추가 연산자와 추가 상태 벡터를 도출하는 데 활용할 수 있습니다.

다음을 알 수 있습니다:

  • +z+z 또는 z-z 방향으로 확실한 투영을 가진 상태는 +x+x 방향 투영으로 측정될 확률이 50%, x-x 방향 투영으로 측정될 확률이 50%입니다.
  • +x+x 방향으로 확실한 투영을 가진 상태는 이후 x-x 방향 투영으로 측정될 확률이 0이며, 그 반대도 마찬가지입니다.

이 결과를 이용하여 xx 방향으로 확실하고 양의 투영을 가진 상태(+x|+x\rangle라고 부름)와 확실하고 음의 투영을 가진 상태(x|-x\rangle라고 부름)를 구성할 수 있습니다. 이 상태들로부터 SzS_z를 구했던 것과 동일한 방식으로 SxS_x에 해당하는 행렬을 구성할 수 있습니다. 이는 학습자에게 연습 문제로 남겨두겠습니다. 마찬가지로 yy축 방향으로 측정하는 실험을 구성하고, +y|+y\rangley|-y\rangle에 대한 벡터를 구한 다음, 최종적으로 SyS_y에 대한 식을 얻을 수 있습니다.

이 모든 벡터와 행렬을 정리하면 다음과 같습니다:

+x=12(11)x=12(11)Sx=2(0110)+y=12(1i)y=12(1i)Sy=2(0ii0)+z=(10)z=(01)Sz=2(1001)\begin{aligned} |+x\rangle &= \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ 1\end{pmatrix} & \: & |-x\rangle &=& \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix} & \: &S_x &=& \frac{\hbar}{2} \begin{pmatrix} 0 & 1 \\ 1 & 0\end{pmatrix}\\ |+y\rangle &= \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ i\end{pmatrix} & \: & |-y\rangle &=& \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -i\end{pmatrix} & \: &S_y &=& \frac{\hbar}{2} \begin{pmatrix} 0 & -i \\ i & 0\end{pmatrix}\\ |+z\rangle &= \begin{pmatrix}1 \\ 0\end{pmatrix} & \: &|-z\rangle &=& \begin{pmatrix}0 \\ 1\end{pmatrix} & \: &S_z &=& \frac{\hbar}{2} \begin{pmatrix} 1 & 0 \\ 0 & 1\end{pmatrix}\\ \end{aligned}

질문

강사는 이 간단한 설문을 작성하여 노트북 사용 방법을 알려주시면 답안 키와 일반 교육과정 배치 지침이 포함된 노트북 버전을 요청할 수 있습니다.

핵심 개념:

  • 스핀-1/2 입자의 경우, 어떤 축에 대한 스핀 투영 측정은 오직 두 가지 결과 중 하나만 나올 수 있으며, 이를 흔히 "업(up)"과 "다운(down)"이라고 합니다.
  • Qubit은 오직 두 가지 상태 중 하나로만 측정되며, 흔히 0|0\rangle1|1\rangle로 표현합니다.
  • 양자 컴퓨터에서 Qubit을 사용하여 스핀-1/2 입자의 Stern-Gerlach 실험을 모델링할 수 있습니다.
  • 동일한 입자/Qubit에 대해 동일한 물리적 관측량을 반복 측정하면 같은 결과가 나옵니다 (시스템이 잡음에 의해 교란되지 않는 한).
  • Stern-Gerlach 실험 또는 양자 컴퓨터에서의 유사 실험 결과를 이용하여 양자역학적 스핀을 기술하는 상태 벡터 및 행렬 연산자 체계를 유도할 수 있습니다.

참/거짓 문제:

  1. 참/거짓: 실험적 관측으로부터 |\uparrow\rangle을 나타내는 벡터로 유일하게 유효한 선택은 (10)\begin{pmatrix}1 \\ 0\end{pmatrix}이다.
  2. 참/거짓: =(10)|\uparrow\rangle = \begin{pmatrix}1 \\ 0\end{pmatrix}이면, |\downarrow\rangle의 유일한 선택은 (전체 위상을 제외하고) (01)\begin{pmatrix}0 \\ 1\end{pmatrix}이다.
  3. 참/거짓: 0|0\rangle 상태로 측정된 입자는 zz 방향으로 이후 측정에서도 계속 0|0\rangle 상태에서 발견된다.
  4. 참/거짓: 0|0\rangle 상태로 측정된 입자는 xx 방향으로 이후 측정에서도 계속 0|0\rangle 상태에서 발견된다.
  5. 참/거짓: 0|0\rangle 상태로 측정된 입자는 xx 방향으로 이후 측정에서 항상 +x|+\rangle_x 상태에서 발견된다.

객관식 문제:

  1. 처음에 |\uparrow\rangle 상태에 있는 입자가 +x|+x\rangle 상태로 측정될 확률은?

    • a. 0%
    • b. 25%
    • c. 50%
    • d. 71%
    • e. 100%
  2. 처음에 |\uparrow\rangle 상태에 있는 입자가 |\downarrow\rangle 상태로 측정될 확률은?

    • a. 0%
    • b. 25%
    • c. 50%
    • d. 71%
    • e. 100%
  3. 스핀-1/2 입자의 |\uparrow\rangle 상태는 어떤 양자 컴퓨팅 상태와 가장 일반적으로 연관됩니까?

    • a. +|+\rangle
    • b. |-\rangle
    • c. 0|0\rangle
    • d. 1|1\rangle
    • e. 위의 어느 것도 아님

토론 문제:

  1. 세 친구가 양자 측정과 연산자에 대해 이야기하고 있습니다. 친구 A는 "zz 방향으로 측정하는 것과 연산자 σz\sigma_z를 적용하는 것은 같은 것이다."라고 말합니다. 친구 B는 "음, 두 가지는 다른 절차이지만 결과는 같다."라고 말합니다. 친구 C는 "둘은 완전히 다르다. 대부분의 상태에 대해 효과도 다르다."라고 말합니다. 누구의 의견에 동의하며 그 이유는 무엇입니까?

자유 서술 문제:

  1. 실험적 관측과 제안된 표기법을 고려할 때:

P+x=(10)(ab)2=a2=12P_{\uparrow+x}=\vert \begin{pmatrix}1 & 0\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |a|^2 =\frac{1}{2} P+x=(01)(ab)2=b2=12P_{\downarrow+x}=\vert \begin{pmatrix}0 & 1\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |b|^2 =\frac{1}{2}

전체 위상을 제외하고 다음을 보이세요.

+x=12(1eiα)|+\rangle_x = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ e^{i\alpha}\end{pmatrix}

α=0\alpha = 0을 선택하여 표준 결과를 얻으세요.

  1. 실험적 관측과 제안된 표기법을 고려할 때:

Px=(10)(ab)2=a2=12P_{\uparrow-x}=\vert \begin{pmatrix}1 & 0\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |a|^2 =\frac{1}{2} Px=(01)(ab)2=b2=12P_{\downarrow-x}=\vert \begin{pmatrix}0 & 1\end{pmatrix}\begin{pmatrix}a \\ b\end{pmatrix}\vert^2 = |b|^2 =\frac{1}{2}

그리고 도전 문제 3의 결과를 사용하여:

P+xx=12(11)(cd)2=12c+d2=0P_{+x-x}=\vert \frac{1}{\sqrt{2}}\begin{pmatrix}1 & 1\end{pmatrix}\begin{pmatrix}c \\ d\end{pmatrix}\vert^2 = \frac{1}{2}|c+d|^2 =0

전체 위상을 제외하고 다음을 보이세요.

+x=12(11)|+\rangle_x = \frac{1}{\sqrt{2}}\begin{pmatrix}1 \\ -1\end{pmatrix}

감사의 글

[1] By Tatoute - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=34095239