양자 코인 — 중첩과 간섭에 관한 모듈
이 교실 내 키스킷 모듈을 사용하려면 학생에게 다음 패키지가 설치된 Python 환경이 있어야 합니다:
qiskitv2.1.0 이상qiskit-ibm-runtimev0.40.1 이상qiskit-aerv0.17.0 이상qiskit.visualizationnumpypylatexenc
위의 패키지를 설정하고 설치하려면 키스킷 설치 가이드를 참조하세요. 실제 양자 컴퓨터에서 작업을 실행하려면 학생들은 IBM Cloud 계정 설정 가이드의 단계에 따라 IBM Quantum®에 계정을 설정해야 합니다.
이 모듈은 테스트 결과 47초의 QPU 시간을 사용했습니다. 이는 추정치일 뿐입니다. 실제 사용량은 다를 수 있습니다.
# 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'아래에서 케이티 박사( McCormick )의 모듈 워크스루를 시청하거나 여기를 클릭하여 YouTube 에서 시청하세요.
소개
이 모듈에서는 양자 이론의 핵심 원리 중 하나인 중첩에 대해 살펴봅니다. 일상적인 경험에서 사물은 항상 명확한 특징을 가지고 있습니다. 관찰자가 아직 측정하지 않았더라도 위치, 크기, 모양, 색상 등 모든 것이 결정되고 확실합니다. 양자 세계에서는 반드시 그렇지만은 않습니다. 양자 객체는 고전적으로 허용되는 여러 상태의 '중첩'이라고 불리는 상태에 있을 수 있습니다. 중첩이 측정되면 해당 상태 중 하나로 무작위로 '붕괴'됩니다.
어떤 면에서 보면, 중첩 상태를 측정하는 것은 동전을 던지는 것과 비슷합니다. 동전이 어느 쪽으로 떨어질지 미리 알 수 있는 방법은 없기 때문입니다. 이러한 근본적인 불확정성은 아인슈타인조차도 고심했던 양자역학의 불편한 측면이다. 그는 이러한 우연성에 대해 “신은 주사위를 던지지 않는다”는 유명한 말을 남겼습니다. 하지만, 곧 보게 되겠지만, 하나님은 사실 주사위를 굴리기도 하고 동전을 던지기도 하십니다.
고전적인 동전 던지기를 중첩 상태 측정에 비유하여 생각해 보겠습니다. 그리고 키스킷과 큐비트( IBM® ) 양자 프로세서의 큐비트를 사용하는 '양자 코인'을 사용해 보면 이 비유가 가진 한계를 금방 알 수 있습니다.
고전적 동전
고전적인 동전부터 시작하겠습니다. 동전을 던지면 각각 50 %의 확률로 위쪽 또는 아래쪽에 떨어집니다. 원칙적으로 동전의 정확한 초기 조건과 동전 던지기의 힘/토크를 안다면 동전이 어느 쪽에 떨어질지 계산할 수 있지만, 실제로는 어느 쪽에 떨어질지 선험적으로 알 수 있는 방법이 없습니다. 그렇기 때문에 결과가 본질적으로 무작위인 고전적 확률 상태의 대표적인 예로 동전 던지기를 사용합니다. 이 50/50 확률을 반영하여 코인이 착지하기 전의 상태를 기록할 수 있습니다:
여기서 두 항은 플립의 두 가지 가능한 결과를 나타내며, 계수는 각 결과의 확률을 나타냅니다. 일반적으로 " "("케트"라고도 함)는 양자 상태를 나타내는 데 사용되지만 여기서는 고전적인 확률론적 상태에 대해 이야기하고 있다는 점에 유의하세요. 고전 정보와 양자 정보를 표현하는 방법에 대해 자세히 알아보려면 양자 정보 기초 과정의 수업 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()Output:
양자 코인
양자 컴퓨터의 큐비트를 사용하여 유사한 확률적 상태를 만들 수 있습니다. 동전 던지기와 마찬가지로 큐비트도 와 의 두 가지 가능한 상태로 측정할 수 있습니다. 상태에서 시작하여 확률적인 "중첩" 상태를 만든 다음, 큐비트에 하다마드 게이트라고 하는 것을 적용하여 확률적인 "중첩" 상태를 만듭니다. 이렇게 하면 과 이 동등한 중첩 상태가 됩니다. 이 중첩 상태는 언뜻 보기에는 동전처럼 보이고 동작할 수 있지만, 곧 그보다 훨씬 더 많은 것이 있다는 것을 알게 될 것입니다. 이 모듈의 요점은 중첩이 고전적인 동전 던지기와는 다르다는 것을 보여주기 위한 것입니다.
따라서 큐비트가 0과 1의 동일한 중첩 상태에 있기 때문에 큐비트를 측정할 때 을 측정할 확률은 50%, 을 측정할 확률은 50%입니다. 이 상태는 나중에 명확해질 이유 때문에 고전적인 확률론적 경우와 약간 다르게 작성합니다:
여기서 두 상태 각각을 측정할 확률은 위의 고전적 확률 상태의 경우처럼 더 이상 계수와 같지 않습니다. 대신 확률을 알려주는 것은 계수의 제곱이며, 이제 이러한 각 계수는 복잡할 수 있으므로 실수와 허수를 모두 가질 수 있습니다.
하지만 이러한 차이에도 불구하고 이 상태를 측정한 결과는 동전을 던지는 것과 본질적으로 동일합니다.
from qiskit import QuantumCircuit
qcoin = QuantumCircuit(1)
qcoin.h(0)
qcoin.measure_all()
qcoin.draw("mpl")Output:
따라서, 사실상 하다마르 게이트를 적용하는 것은 동전을 던지는 것과 유사합니다. 마치 동전이 앞면이나 뒷면으로 떨어지는 확률을 알아보기 위해 동전을 1,000번 던졌던 것처럼, Qiskit에서도 “양자 동전”을 이용해 비슷한 실험을 해볼 수 있습니다 라는 기본 요소를 사용할 수 있는데 Sampler, 이 요소는 회로를 여러 번 반복하여 결과 상태의 통계적 특성을 샘플링합니다.
먼저, IBM Quantum 컴퓨트 서비스와 기본 구성 요소를 불러온 다음, 회로를 실행할 백엔드를 선택합니다.
처음 사용할 때 자격 증명을 저장하는 코드는 아래에 있습니다. 노트북을 공유할 때 실수로 자격 증명이 공유되지 않도록 노트북을 환경에 저장한 후 이 정보를 노트북에서 삭제해야 합니다. 자세한 안내는 IBM Cloud 계정 설정하기 및 신뢰할 수 없는 환경에서 서비스 초기화를 참조하세요.
# Load IBM Quantum Compute 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)Output:
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)Output:
위의 회로 샘플 1000개를 사용하면 통계적 변동이 있을 때까지 기본적으로 고전적인 동전 히스토그램과 동일한 모양을 갖게 됩니다.
양자 코인의 통계를 샘플링하는 것 외에도, 우리는 또 다른 기본 요소를 사용할 수 있습니다. Estimator 상태의 관측 가능한 변수 의 소위 기대값을 측정하기 위해. 이 기대값이 무엇인지 설명하기 위해, 고전적인 동전 실험을 예로 들어 보겠습니다. 동전을 도박에 사용한다고 가정해 봅시다. 동전을 던졌을 때 ‘앞면이 위로’ 나오면 1달러를 따게 됩니다. 하지만 동전이 “앞면이 아래로” 떨어질 때마다 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 circuitOutput:
<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)Output:
-0.014799284701239441
예상대로 기대값이 0이 나옵니다(하하). 이것은 실제로 0과 1이 측정될 확률이 동일한지 확인하는 또 다른 방법으로, 동전 던지기와 같이 작동하는 것처럼 보입니다.
이 시점에서 '양자 코인'은 고전적인 동전과 똑같이 생겼습니다. 하지만 다음 섹션에서는 이 둘의 근본적인 차이점을 알아볼 수 있는 몇 가지 실험을 해보겠습니다.
양자의 비밀이 밝혀지다: 3차원 실험
사고 실험을 해보겠습니다: 공중에서 동전을 던졌는데, 동전이 땅에 떨어지지 않고 손바닥 사이로 지나갈 때 박수를 치고 손바닥 사이에 동전을 끼워 넣는 협응력이 있다고 가정해 보겠습니다. 이제 동전의 앞면이 위나 아래가 아닌 왼쪽이나 오른쪽이 앞면입니다.
이해도 점검
왼쪽 머리 또는 오른쪽 머리의 각 결과가 나올 확률은 얼마입니까?
확률은 여전히 50 대 50입니다. 동전 던지기의 결과를 측정하기 위해 어떤 차원을 선택하든 상관없습니다.
다행히도 왼쪽 또는 오른쪽 머리를 찾을 확률은 여전히 50 대 50이라고 대답하셨기를 바랍니다. 동전 던지기가 측정되는 차원은 결과의 확률에 영향을 미치지 않아야 합니다.
그렇다면 양자 코인의 경우 상황은 어떻게 달라질까요? 확인해 보겠습니다.
지난번과 같은 방식으로 하다마드 게이트를 사용해 양자 중첩을 만들 수 있습니다. 양자 동전의 '왼쪽 또는 오른쪽 머리'를 측정하려면 기존 동전에서 했던 것처럼 다른 축을 따라 측정하면 됩니다. 양자 컴퓨터의 표준 측정은 기존 동전의 일반적인 "위 또는 아래" 측정과 마찬가지로 수직 축을 따라 이루어집니다. 그러나 양자 코인의 머리가 왼쪽인지 오른쪽인지, 즉 -축을 따라 가리키는 또는 상태에 있는지 물어볼 수도 있습니다. Sampler 측정 기준 Z의 샘플만 있지만 Estimator 을 사용하여 X의 기대값을 구할 수 있습니다. 상태 또는 의 경우 X 값은 각각 +1 및 -1 입니다.
이해도 점검
이 경우 양자 코인이 기존 동전처럼 작동한다면, 상태가 와 에 있을 확률이 50대 50일 것입니다. 이 경우 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)Output:
0.9985207100591716
이 상태에 대한 X의 기대값은 1입니다. 따라서 과 을 측정할 확률은 50 대 50이 아닙니다.
이해도 점검
이 기대값은 상태에 대해 무엇을 알려줍니까? 이 X 기준에서 과 을 측정할 확률은 얼마인가요?
기대값은 상태 의 X 값과 동일하므로, X를 따라 측정할 때 상태 를 측정할 확률이 100%라는 뜻입니다.
여기에서 진행되는 작업 양자 코인은 한 차원에서는 무작위적이고 확률적인 결과를 가져올 수 있지만, 다른 차원에서는 완벽하게 예측 가능한 결과를 가져올 수 있는 것처럼 보입니다. 이는 동전을 던져서 두 손 사이에 끼워 잡을 때마다 머리가 오른쪽을 향하도록 하는 것과 같습니다.
양자 위상
양자 코인의 핵심적인 차이점은 기존 코인에는 없는 또 다른 특성이 있다는 것입니다. 고전적인 확률론적 상태에서는 이를 기억하세요,
각 계수는 단순히 특정 상태를 측정할 확률을 나타내는 양의 실수입니다. 양자 상태에서,
계수는 복잡하기 때문에 실제 부분과 가상 부분이 포함되어 있습니다. 각 계수 는 복소 평면에서 2차원 벡터로 표현할 수 있으며, 크기 와 각도 는 실수 축과 함께 만들어집니다:
을 단계라고 합니다. 위상은 양자 상태의 두 항이 어떻게 간섭을 일으키거나 파동처럼 더하거나 상쇄하는지를 알려줍니다. 두 파동이 서로 위상이 같아서 파고와 최저점이 일직선이 되면 두 파동이 합쳐져 두 배 높은 파동을 형성하게 됩니다. 우리는 이를 건설적인 간섭이라고 부릅니다. 위상이 맞지 않는 경우, 즉 한쪽의 볏이 다른 쪽의 트로프와 일직선이 되거나 그 반대의 경우, 서로 파괴적으로 간섭하여 완전히 상쇄됩니다.
파동과 마찬가지로 양자 상태도 건설적이거나 파괴적으로 추가될 수 있습니다. 물리적 공간에서 실제 파도에 대해 이야기하는 것이 아니기 때문에 확인하기가 더 까다로울 수 있습니다. 큐비트의 경우 간섭은 큐비트의 추상적인 정보 공간에서 발생합니다. 또한 두 파동 사이의 상대 위상, 즉 두 계수의 위상 차이 만이 간섭 방식에 중요하므로 일반적으로 전체 상태에 의 전역 위상을 적용하여 은 순전히 실제이고 상대 위상은 에서 완전히 캡처됩니다.
위상이 양자 코인에서 어떻게 간섭을 일으키는지 알아보기 위해 하다마드를 한 번이 아닌 두 번 적용해 보겠습니다. 하다마드를 적용하는 것이 동전 던지기와 같다면 이미 던져진 동전을 다시 던질 수 없기 때문에 고전적으로 이것은 말이 되지 않습니다. 하지만 양자 코인이 어떻게 되는지 살펴봅시다:
qcoin_0 = QuantumCircuit(1)
qcoin_0.h(0)
qcoin_0.h(0)
qcoin_0.measure_all()
qcoin_0.draw("mpl")Output:
이제 Sampler 을 사용하여 결과 상태를 측정하기 전에 각 게이트에서 이 큐비트가 어떻게 변환되는지 생각해 보겠습니다. 평소와 같이 에서 시작합니다. 그런 다음 첫 번째 하다마드는 이미 살펴본 것처럼 상태를 중첩으로 변환합니다:
이 경우 두 계수는 모두 완전 실수이고 양수이므로 위상은 입니다.
그런 다음 두 번째 하다마드는 중첩 상태의 각 조각에 개별적으로 적용됩니다. 우리는 이미 Hadamard가 상태를 어떻게 변환하는지 알고 있습니다. 하지만 은 어떨까요?
이 역시 동전 던지기와 마찬가지로 0과 1을 동일하게 중첩한 것이지만, 앞의 상태 계수는 의 위상을 가지므로 음의 부호를 갖습니다.
이해도 점검
두 번째 하다마드를 적용한 후 결과 상태를 계산합니다. 즉, 계산: . 은 배포용이므로 각 용어에 개별적으로 적용할 수 있습니다.
이제 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)Output:
두 번째 하다마드가 첫 번째 하다마드를 상쇄하고 시작했던 0 상태로 돌아갔습니다! 이는 하다마드가 상태와 상태를 모두 비슷한 상태로 변환하지만 위상은 반대이기 때문입니다. 두 번째 하다마드 이후에는 용어가 건설적으로 간섭하지만 용어는 파괴적으로 간섭하여 서로를 상쇄하는 것을 볼 수 있습니다.
더 자세히 살펴봅시다. 'PHASE' 게이트를 사용하여 위상을 변경할 수 있습니다. 이제 하다마드를 적용하여 중첩을 만들고 위상 이동을 라디안으로 적용한 다음 두 번째 하다마드를 적용해 보겠습니다:
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")Output:
## 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)Output:
이제 큐비트는 0이 아닌 1 상태에 있는 것으로 측정됩니다.
따라서 이 몇 가지 간단한 실험만으로도 이 단계가 양자 회로에 얼마나 큰 변화를 가져올 수 있는지 알 수 있습니다. 처음에는 미묘하고 눈에 잘 띄지 않을 수 있습니다. 첫 번째 실험에서는 단순히 양자 동전을 하다마드 게이트에 던지고 뒤집힌 결과를 측정했지만 위상의 효과는 전혀 나타나지 않았습니다. 더 깊이 파고들었을 때 비로소 단계가 가져올 수 있는 차이를 발견할 수 있었습니다. 동일한 양자 게이트가 큐비트에서 말 그대로 정반대의 효과를 낼 수 있습니다.
직접 해보세요:
아래 코드 셀을 편집하여 두 번째 하다마드가 와 에서 각각 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)Output:
게이트를 활용한 또 다른 (더 나은) 동전 비유
지금까지 동전을 던지는 행위는 중첩 상태를 만드는 것과는 상당히 다르다는 것을 배웠습니다. 중첩과 같은 현상을 더 잘 포착할 수 있는 동전에 대한 더 좋은 비유가 있을까요? 예. 네, 있습니다.
동전으로 또 다른 사고 실험을 해보겠습니다. 동전이 테이블 위에 올려져 있다고 상상해 보세요. 머리를 아래로 향하게 하려면 간단히 뒤집으면 됩니다. 이것은 계산적으로 "NOT" 게이트에 해당합니다.
두 번 적용하면 NOT 게이트에 해당하는 연산을 구성하고 싶다고 가정해 보겠습니다. 즉, "NOT의 제곱근"( )이 필요합니다. 코인에서 NOT 게이트가 물리적으로 구현되는 방식을 고려하면 이를 수행할 수 있습니다. 예를 들어, X축을 중심으로 180도 회전하는 것입니다. 따라서 동전을 X축을 중심으로 90도만 회전하면 게이트에 해당합니다.
게이트를 적용한 후 동전이 위쪽인지 아래쪽인지 물어보고 싶다고 상상해 보세요. 세로축을 기준으로 가장자리에 서 있습니다. 하지만 이제 동전의 '측정'을 첫째, 측정 축을 따라 동전을 손으로 눌러서 평평하게 눕히고 둘째, 동전이 위쪽인지 아래쪽인지 확인하는 것으로 재정의해 보겠습니다.
가장자리에 서 있는 동전에 대해 이 "측정"을 수행하면 동전은 동일한 확률로 위쪽과 아래쪽으로 "붕괴"됩니다. 동전 던지기와 마찬가지로 원칙적으로 동전의 초기 조건과 동전을 '무너뜨리기 위해' 손의 힘을 얼마나 정확히 가하는지에 따라 동전이 떨어지는 방향을 예측할 수 있습니다. 그러나 실제로는 어느 쪽이 나올지 예측하기 어렵기 때문에 기본적으로 무작위입니다.
실제로 이 코인은 세 가지 축을 따라 측정할 수 있습니다: , , 그리고 입니다. 동전의 가장자리가 과 을 가리키고 있으므로 이 방향에서 측정하려면 동전을 "접어야" 합니다. 따라서 이 축을 따라 위쪽과 아래쪽을 측정할 확률이 50:50으로 무작위입니다. 하지만 축을 따라가면 이미 평평하고 머리가 -y 방향을 향하고 있습니다. 이를 "앞으로 나아가는 것"이라고 부를 수 있습니다
따라서 x 및 z 측정은 임의의 결과를 산출하지만, y 측정은 항상 동일한 결과를 산출합니다! 이전 섹션의 "양자 동전 던지기" 실험을 기억하신다면, 이는 양자 동전이 어떻게 작동했는지를 연상하게 합니다. Z 방향에서 50/50 확률로 0 또는 1로 측정되었지만, 항상 이었고 X를 따라 은 아니었습니다. 이는 동전이 공중을 날아다니는 것보다 가장자리에 가만히 앉아 있는 것이 큐비트의 중첩 상태를 시각화하는 데 더 좋은 방법이라는 것을 암시합니다.
키스킷을 사용해 게이트가 적용되었을 때 '양자 코인'이 기존 코인과 동일한 방식으로 작동하는지 확인해 보겠습니다. 에서 시작하는 큐비트에 을 적용한 다음 Estimator 을 사용하여 세 가지 관측 변수인 X, Y, Z의 기대값을 확인합니다.
qcoin_sx = QuantumCircuit(1)
qcoin_sx.sx(0)
qcoin_sx.draw("mpl")Output:
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)Output:
[[-0.01234492]
[-1.00388865]
[ 0.00740695]]
기대값은 X, Y, Z에 대해 각각 0, -1, 0입니다.
이해도 점검
기대값이 주어졌을 때, 3개의 측정 축 각각에 대해 양자 동전이 위/아래(또는 왼쪽/오른쪽 또는 앞/뒤)로 측정될 확률은 얼마인가요?
X와 Z를 따라 두 상태를 측정할 확률은 50/50이며, 상태는 항상 Y를 따라 -y 방향으로 측정됩니다.
이는 클래식 동전에 " " 90도 회전을 적용한 사고 실험에서 얻은 결과와 동일합니다. 사실 현재 코인과 큐비트 상태 사이에는 정확한 비유가 있습니다. 큐비트 상태를 동전 표면에 수직인 동전의 머리 방향을 가리키는 벡터로 시각화할 수 있습니다. 따라서 양자 코인의 위쪽, 즉 상태는 똑바로 위를 가리키는 벡터에 해당하며, 아래쪽, 즉 상태는 똑바로 아래를 가리키는 것과 같습니다. 과 을 가로로 동일하게 겹쳐서 가리키면 됩니다. 상태의 위상은 정확한 수평 방향을 결정합니다. 적도를 따라 가리키는 방향은 복소 평면에서 계수 가 가리키는 방향과 동일합니다.
이제 이 노트에서 살펴본 모든 게이트를 동전/벡터의 회전(또는 일련의 회전)으로 시각화할 수 있습니다.
-
아니요: x축을 중심으로 180도
-
x축을 중심으로 90도
-
단계: z축을 중심으로 회전
-
하다마드: 이건 좀 더 까다로운 문제입니다. 처음에는 이를 동전 던지기에 비유하여 동전이 공중에서 통제할 수 없이 회전하는 것에 비유했습니다. 그러나 하다마드는 실제로 다른 게이트와 마찬가지로 동전의 제어되고 결정론적인 회전입니다. 하다마드는 Y축을 중심으로 90도 회전한 다음 X축을 중심으로 180도 회전하는 방식으로 수행됩니다.
따라서 양자 중첩 상태나 큐비트에서 수행하는 표준 연산에는 무작위성이 전혀 없습니다. 모든 작업은 결정론적이며 되돌릴 수 있습니다. 무작위성이 작용하는 유일한 경우는 양자 상태를 측정하기로 결정할 때입니다.
블로흐 벡터로서의 큐비트 상태
동전의 "머리" 방향을 가리키는 이 벡터를 "블로흐 벡터"라고 합니다 공식적으로 임의의 (고립된) 큐비트 상태는 반지름 1의 구의 표면에 좌표 를 가진 벡터로 표현할 수 있습니다. 이 좌표로 표현하면 큐비트 상태는 다음과 같습니다:
이제 키스킷을 통해 상태에서 시작하여 큐비트에 다양한 게이트를 적용할 때 블로흐 벡터가 어떻게 변하는지 확인해 보겠습니다.
아님
from qiskit.visualization import plot_bloch_multivector
qnot = QuantumCircuit(1)
qnot.x(0)
plot_bloch_multivector(qnot)Output:
qsqrtnot = QuantumCircuit(1)
qsqrtnot.sx(0)
plot_bloch_multivector(qsqrtnot)Output:
PHASE ( )
qphase = QuantumCircuit(1)
qphase.p(np.pi, 0)
plot_bloch_multivector(qphase)Output:
Hadamard
qhadamard = QuantumCircuit(1)
qhadamard.h(0)
plot_bloch_multivector(qhadamard)Output:
결론 - 그렇다면 중첩 상태 란 무엇인가?
이 모듈은 양자 중첩 상태 측정의 무작위성을 동전 던지기와 비교하는 것으로 시작되었습니다. 저희는 양자 중첩을 생성하는 '하다마드 게이트'를 동전 던지기에 비유했습니다. 하지만 일련의 실험을 통해 고전적인 동전 던지기와 양자 중첩 사이에는 근본적인 차이가 있다는 것을 알게 되었습니다.
중첩 상태의 큐비트에는 실제로 '무작위'라는 것이 존재하지 않는다는 것을 알게 되었습니다. 마치 3차원 공간에 가만히 놓여 있는 동전과 같습니다. 실제로 3차원에서 자유롭게 회전하는 동전은 큐비트의 양자 상태를 시각화하는 특정 방법인 블로흐 벡터와 매우 유사합니다. 양자 게이트는 이 코인/블로흐 벡터를 결정론적으로 그리고 가역적으로 회전시킵니다. 큐비트를 측정할 때만 임의성이 도입됩니다. 이 측정 과정을 동전이 측정 축 방향으로 평평하게 놓이도록 압착하는 것과 비교했습니다.
양자 상태가 중첩되어 있는지 여부는 보는 사람의 눈에 따라 달라질 수 있습니다. 이미 경험하셨겠지만 좌표계는 , , 의 세 가지 직교 방향 중 하나를 자유롭게 선택할 수 있습니다. 따라서 하나의 좌표계에 0과 1이 중첩되어 있는 경우, 상태가 중첩 상태가 아닌 방향을 가리키는 새로운 좌표계, 즉 새로운 '측정 기준'을 정의할 수 있습니다. 따라서 큐비트가 중첩 상태에 있다고 말할 때 " 무엇의 중첩인가?"라는 질문에도 답해야 합니다
이 모듈은 양자역학에서 모든 미스터리를 제거한 것 같은 인상을 남길 수 있습니다. 결국, '가장 이상한' 측면 중 하나인 큐비트의 중첩 상태는 실제로는 3차원 벡터만큼이나 간단합니다. 그러나 동전은 여전히 비유에 불과하며 블로흐 벡터도 측정 결과의 확률을 계산하기 위한 시각화 도구일 뿐이라는 점을 명심하세요. 양자 상태를 측정하기 전에는 양자 상태가 실제로 어떤 일을 하는지 알 수 없습니다. 이를 확인하려면 측정이 필요하기 때문입니다!
양자 상태의 '진정한' 본질이 무엇인지, 양자 얽힘 현상이 이를 해명하는 데 어떻게 도움이 될 수 있는지에 대한 이 수수께끼는 벨의 부등식 모듈에서 논의할 것입니다.
질문
교수자는 노트북이 어떻게 사용되고 있는지에 대한 이 간단한 설문조사를 작성하여 공통 커리큘럼에 배치하는 방법에 대한 안내와 답안지가 포함된 노트북 버전을 요청할 수 있습니다.
핵심 개념:
- 중첩에서 큐비트의 측정은 동전 던지기와 같이 확률적이지만, 중첩 상태 자체는 동전 던지기와는 다르게 작동합니다.
- 고전적인 확률 분포와 중첩의 주요 차이점은 중첩이 위상 일관성을 가지므로 건설적 또는 파괴적으로 간섭할 수 있다는 점입니다.
- 고립된 단일 큐비트의 상태는 소위 '블로흐 구체'의 한 점으로 시각화할 수 있는데, 및 구성 요소의 상대 진폭이 극각 을 결정하고 두 구성 요소 간의 상대 위상이 방위각 을 결정합니다.
- 모든 단일 큐비트 양자 게이트는 이 구체에서 벡터의 회전으로 볼 수 있습니다.
T/F 문제:
-
T/F 양자 중첩은 기본적으로 동전 던지기와 같은 고전 물리학의 확률적 사건과 동일합니다.
-
T/F 고립된 단일 큐비트의 상태를 설명하는 블로흐 벡터의 길이는 항상 1입니다.
-
T/F 단일 큐비트 양자 게이트는 블로흐 벡터의 길이를 변경하지 않습니다.
MC 질문:
- 상태를 나타내는 올바른 블로흐 벡터를 선택합니다 :
-
블로흐 구체는 큐비트를 설명합니다: (해당되는 항목 모두 선택)
a. 진폭
b. 다른 큐비트와의 얽힘
c. 단계
d. 색상
e. 측정 결과의 확률
토론 질문:
-
큐비트의 상태는 블로흐 구체에서 시각화할 수 있지만 동전 던지기의 확률 분포는 시각화할 수 없는 이유는 무엇일까요?
-
공중에서 동전을 던지는 것이 양자 중첩 상태에 가장 적합한 비유가 아닌 이유는 무엇인가요? 이 비유에서 중첩의 어떤 측면이 포착되지 않나요?
도전 문제:
- 키스킷을 사용하여 상태를 다음과 같은 상태로 변환하는 회로를 생성합니다