양자 순간이동(quantum teleportation) 이해하기

양자 순간이동(quantum teleportation)에 대해서 Qiskit 코드와 함께 알아봅시다.

이 글은 모두의 연구소 QML 스터디에서 발표한 Quantum teleportation with Qiskit 자료를 바탕으로 하고 있습니다. 한눈에 보기를 원하신다면 해당 링크의 발표 자료를 참고하세요. 그럼 시작해볼까요?

1. Quantum teleportation

컴퓨터 상의 정보를 옮길 때 가장 쉬운 방법은 복제가 있습니다. 복사 붙여넣기하면 원하는 정보를 원하는 곳에 옮길 수 있습니다. 그러나 여기에 ‘양자 세계에서’라는 조건이 추가되면 말이 달라집니다. 방금처럼 복사 붙여넣기가 불가능하기 때문이죠.

불가능한 이유는 바로 ‘관측’에 있습니다. 양자 세계에서는 관측하는 행위가 Qubit에 변화를 주기 때문입니다. (자세한 내용은 No-cloning theorem 문서를 참고하세요.) 그래서 양자 순간이동은 말 그대로의 순간이동이 아닌, 정보의 이동이라고 생각하시면 쉽습니다. Qubit A의 정보를 Qubit B로 옮기고자할 때, A 자체가 B로 이동하는 게 아니라 A의 정보가 B로 전달되는 것이란 뜻입니다. 그리고 B로 정보가 옮겨질 때 A의 상태는 붕괴됩니다. B로 정보를 완전히 옮기기 위해서 비트(고전) 정보도 필요하기 때문이죠.

qt1

위의 그림처럼 (1) 비트 정보와 (2) 얽힘 상태의 회로, 이렇게 총 두 가지의 요소가 모두 사용됩니다.

2. Let’s start coding with Qiskit

Qiskit 코드는 Coding with Qiskit; Quantum Teleportation을 참고하였습니다.

qt2

Qubit A의 상태를 순간이동하기 위해 먼저 (1) Bell state로 얽힘 상태를 만듭니다. 그 후 (2) 비트 정보를 얻기 위해 관측을 합니다. (3) 얻은 비트 정보를 통해 복원을 합니다. (복원에 사용되는 게이트는 비트 정보에 따라 다릅니다. 해당 정보는 위의 사진에 주황색 글씨로 표기되어 있습니다.) 이 3단계를 Qiskit을 통해 구현하기만 하면 됩니다.

이제 직접 코드를 작성해봅시다. jupyter notebook을 열어주세요.

각 단계를 회로를 그렸을 때 한 눈에 들어오도록 barrier()를 추가하였습니다.

(0) Check the Qiskit version

이 회로를 작성할 때의 Qiskit 버전은 다음과 같습니다.

import qiskit
qiskit.__qiskit_version__

#{'qiskit-terra': '0.16.0',
# 'qiskit-aer': '0.7.0',
# 'qiskit-ignis': '0.5.0',
# 'qiskit-ibmq-provider': '0.11.0',
# 'qiskit-aqua': '0.8.0',
# 'qiskit': '0.23.0'}

(1) Make a state for A

마지막에 A의 상태가 제대로 옮겨졌는지 확인하기 위해서 첫 번째 Qubit에 X gate를 적용합니다.

from qiskit import *
circuit = QuantumCircuit(3, 3)
circuit.x(0)
circuit.barrier()
%matplotlib inline
circuit.draw(output='mpl')

1

(2) Bell state

circuit.h(1)
circuit.cx(1,2)
circuit.cx(0,1)
circuit.h(0)
circuit.draw(output='mpl')

2

(3) Measurement

circuit.barrier()
circuit.measure([0,1],[0,1])
circuit.draw(output='mpl')
circuit.barrier()

3

(4) Recovery

복원은 비트 정보의 조건에 맞게 일어나도록 CX와 CZ gate가 사용된 것입니다. (마치 조건문처럼요!)

circuit.cx(1,2)
circuit.cz(0,2)
circuit.draw(output='mpl')

4

(5) Check the B state

circuit.measure(2,2)
simulator = Aer.get_backend('qasm_simulator')
result = execute(circuit, backend = simulator, shots = 1024).result()
counts = result.get_counts()
from qiskit.tools.visualization import plot_histogram
plot_histogram(counts)

5

위에서 차례대로 Qubit 0, 1, 2로, 마지막 숫자는 1만 관측되는 것을 확인하실 수 있습니다. 이는 처음 Qubit 0에 X gate를 적용한 결과로, Qubit 0의 정보는 붕괴되고 Qubit 2로 옮겨진 것입니다. 순간이동이 제대로 작동했네요!

References


💬 Any comments and suggestions will be appreciated.

Leave a comment