양자 순간이동
이 교실 내 키스킷 모듈을 사용하려면 학생에게 다음 패키지가 설치된 Python 환경이 있어야 합니다:
qiskitv2.1.0 이상qiskit-ibm-runtimev0.40.1 이상qiskit-aerv0.17.0 이상qiskit.visualizationnumpypylatexenc
위의 패키지를 설정하고 설치하려면 키스킷 설치 가이드를 참조하세요. 실제 양자 컴퓨터에서 작업을 실행하려면 학생들은 IBM Cloud 계정 설정 가이드의 단계에 따라 IBM Quantum®에 계정을 설정해야 합니다.
이 모듈은 테스트를 거쳐 14초의 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 에서 시청하세요.
서론 및 배경
양자 텔레포테이션은 입자를 물리적으로 이동시키지 않고도 한 장소에서 다른 장소로 양자 정보를 전송할 수 있게 해주는 양자 물리학의 기술입니다. 공상과학 소설에 등장하는 순간이동 개념과는 달리, 이 과정에는 물질의 이동이 수반되지 않습니다. 대신, 이 현상은 거리와 상관없이 두 입자가 서로 연결되는 양자 얽힘의 원리에 기반을 두고 있습니다. 일련의 정밀한 측정과 고전적 통신을 통해, 한 입자의 양자 상태를 멀리 떨어진 곳에 있는 다른 입자에서 재현할 수 있으며, 이를 통해 양자 정보를 사실상 “텔레포트”할 수 있다. 이 모듈에서는 이것이 수학적으로 어떻게 작동하는지 살펴본 다음, 실제 양자 컴퓨터에서 양자 텔레포테이션을 구현해 보겠습니다. 이 글에서는 간략하게 소개할 예정입니다. 양자 정보에 대한 더 자세한 배경 지식과 텔레포테이션에 대한 더 자세한 설명을 원하신다면, 존 왓루스(John Watrous)의 ‘양자 정보의 기초’ 강좌, 특히 텔레포테이션에 관한 부분을 참고하시기 바랍니다.
고전적 비트는 0 또는 1의 상태를 가질 수 있습니다. 양자 비트(큐비트)는 및 로 표시되는 양자 상태에 있을 수 있으며, 또한 , , 과 같이 “중첩”이라고 불리는 이러한 상태들의 선형 조합 상태에도 있을 수 있습니다. 비록 상태가 이러한 중첩 상태로 존재할 수 있지만, 상태를 측정하면 해당 상태는 또는 상태 중 하나로 “붕괴”됩니다. 와 매개변수는 다음 식에 따라 각 측정 결과의 확률과 관련이 있습니다
따라서 라는 제약 조건이 성립한다.
또 다른 주요 특징은 양자 비트가 "얽힐 수 있다"는 것인데, 이는 한 큐비트의 측정이 얽힌 다른 큐비트의 측정 결과에 영향을 미칠 수 있다는 것을 의미합니다. 얽힘이 단순한 고전적 상관관계와 어떻게 다른지 이해하는 것은 조금 까다롭습니다. 먼저 표기법에 대해 설명하겠습니다. 친구 0(앨리스)과 친구 1(밥)에 속한 두 큐비트를 각각 상태로 호출합니다
또는
때로는 간단히 줄여서
번호(또는 문자)가 가장 작은 큐비트가 가장 오른쪽에 위치한다는 점에 유의하십시오. 이는 “리틀 엔디안(little-endian)” 표기법이라고 하는 관례로, Qiskit 전반에 걸쳐 사용됩니다. 친구들의 2-큐비트 상태가 일 때, 각자가 자신의 큐비트 상태를 측정하면 둘 다 0을 얻게 될 것이다. 마찬가지로, 큐비트들이 상태에 있다면, 각각을 측정할 때마다 1이 나올 것입니다. 이는 고전적인 경우와 다를 바가 없습니다. 그러나 양자 컴퓨팅에서는 이를 중첩 현상과 결합하여 다음과 같은 상태를 얻을 수 있습니다
이러한 상태에서, 앨리스와 밥이 0 상태인지 1 상태인지 여부는 아직 알려지지 않았으며, 심지어 자연에 의해서도 아직 결정되지 않았지만, 우리는 그들이 각자의 큐비트에서 동일한 상태를 측정하게 될 것임을 알고 있다. 예를 들어, 밥이 자신의 큐비트가 상태에 있다고 측정했다면, 그런 결과가 나올 수 있는 유일한 경우는 측정을 통해 2-큐비트 상태가 두 가지 가능한 상태 중 하나, 구체적으로 상태로 붕괴되었을 때뿐이다. 그러면 앨리스의 큐비트도 상태에 있게 된다.
이러한 방식으로 큐비트를 얽히게 하면 큐비트들이 물리적으로 서로 가깝게 유지될 필요가 없습니다. 즉, 큐비트를 얽힌 다음 큰 거리만큼 분리하고 그 얽힘을 이용해 정보를 전송할 수 있습니다. 위와 같은 얽힘 상태는 얽힘의 기본 단위이며, 얽힘의 단일 비트인 'e비트'라고도 합니다. 이러한 전자 비트는 양자 통신의 자원으로 생각할 수 있는데, 멀리 떨어져 있는 파트너 간에 공유되는 각 전자 비트는 여기에서 설명한 것처럼 한 위치에서 다른 위치로 정보를 이동하는 데 사용될 수 있기 때문입니다.
이를 처음 접하는 많은 사람들이 가장 먼저 떠올리는 것은 상대성 이론을 위반하는 것, 즉 빛보다 빠르게 정보를 전송할 수 있을까 하는 것입니다 과학적 규칙에 대해 계속 질문하고 탐구해 보세요. 하지만 안타깝게도 이 모듈의 과정을 통해 명확해질 이유 때문에 빛보다 빠른 속도로 정보를 전송할 수는 없습니다. 스포일러: 놀랍게도 이 붕괴가 빛보다 빠르게 일어나는 것처럼 보이는 것은 붕괴가 전파되는 속도 때문이 아닙니다 [1].
처음에는 같은 위치에 있고 같은 큐비트에서 함께 작업할 수 있는 두 명의 공동 작업자 앨리스와 밥으로 시작합니다. 이러한 공동 작업자는 큐비트를 얽게 됩니다. 그런 다음 두 개의 다른 지리적 위치로 분리되어 각각의 큐비트를 가지고 이동합니다. 그러면 앨리스는 새로운 큐비트 Q에 대한 양자 정보를 얻게 됩니다. 당사는 Q의 정보에 대해 어떠한 가정도 하지 않습니다. Q의 상태는 앨리스에게만 알려지지 않은 비밀일 수도 있고, 모든 사람에게 알려지지 않은 비밀일 수도 있습니다. 하지만 앨리스에게는 Q에 대한 정보를 밥에게 전송하는 임무가 주어집니다. 양자 순간 이동을 이용해 이 작업을 수행합니다.
이를 위해서는 몇 가지 양자 연산 또는 '게이트'를 알아야 합니다.
양자 연산자(게이트)
양자 게이트에 이미 익숙하다면 이 섹션을 건너뛰셔도 됩니다. 이러한 관문을 더 잘 이해하고 싶다면 양자 정보의 기초, 특히 처음 두 강의를 IBM 양자 학습에서 확인하세요.
이 텔레포트 프로토콜에는 주로 두 가지 유형의 양자 게이트, 즉 하다마드 게이트와 CNOT 게이트가 사용됩니다. 게이트, 게이트, SWAP 게이트 등 몇 가지 다른 게이트는 덜 중요한 역할을 합니다.
이 모듈은 매우 제한된 선형 대수 배경으로도 완성할 수 있지만, 때로는 행렬과 벡터를 사용하여 양자 역학적 게이트를 시각화하는 것이 도움이 될 수 있습니다. 따라서 여기에서는 양자 게이트/상태의 행렬/벡터 형태도 소개합니다.
이미 제시한 상태는 (일부는 관습에 따라, 일부는 제약 조건에 따라) 벡터 형태를 갖도록 선택되었습니다:
이런 식으로 임의의 상태 는 다음과 같이 작성할 수 있습니다
다중 큐비트 상태로 표기법을 확장하는 방법에는 몇 가지 선택 사항이 있지만, 아래 선택 사항이 표준입니다:
이러한 벡터 표기법을 염두에 두고 필요한 양자 게이트와 양자 상태에 미치는 영향, 행렬 형태를 소개할 수 있습니다.
H 하다마드 게이트: 중첩 상태를 생성합니다. 단일 큐비트 게이트.
하다마드 게이트가 있는 회로는 다음과 같이 만들어집니다:
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")Output:
CNOT 제어-NOT 게이트: 이 게이트는 제어 큐비트와 대상 큐비트, 총 두 개의 큐비트를 사용합니다. 변경되지 않은 제어 큐비트의 상태를 확인합니다. 그러나 제어 큐비트가 상태에 있다면, 이 게이트는 대상 큐비트의 상태를 변화시키지만, 제어 큐비트의 상태가 인 경우에는 아무런 변화도 일어나지 않는다. 아래 표기법에서, 큐비트 (가장 오른쪽 큐비트)를 제어 큐비트로, 큐비트 (가장 왼쪽 큐비트)를 대상 큐비트로 가정합니다. 이하에서는 표기법을 사용합니다.
가끔 컨트롤과 대상의 순서가 암시된 상태로 CNOT가 작성된 것을 볼 수 있습니다. 하지만 코드나 회로도에는 이러한 모호함이 없습니다.
CNOT 게이트는 두 개의 큐비트가 필요하기 때문에 회로에서 약간 다르게 보입니다. 이것이 구현되는 방식입니다:
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")Output:
이해도 점검
대부분의 게이트는 Qiskit에서도 다른 곳과 마찬가지로 동일한 행렬 형태를 띱니다. 하지만 CNOT 게이트는 두 개의 큐비트에 작용하기 때문에, 갑자기 큐비트의 순서 지정 규칙이 문제가 됩니다. 큐비트를 순서대로 배열하는 교재 에서는 CNOT 게이트에 대해 서로 다른 행렬 형태를 제시하고 있습니다. 명시적인 행렬 곱셈을 통해 위의 CNOT 행렬이 상태 에 대해 올바른 작용을 하는지 확인해 보십시오.
게이트 : NOT 연산에 해당합니다. 단일 큐비트 게이트.
키스킷에서 게이트가 있는 회로를 만드는 것은 다음과 같습니다:
qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")Output:
Gate : 상태에 "위상"을 추가합니다(Z 고유 상태 및 의 경우 각각 1 또는 -1 인 프리팩터). 단일 큐비트 게이트.
키스킷에서 게이트가 있는 회로를 만드는 것은 다음과 같습니다:
qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")Output:
이론
수학을 이용해 양자 순간 이동의 프로토콜을 설명해 보겠습니다. 그런 다음 다음 섹션에서는 양자 컴퓨터를 사용하여 이 설정을 구현해 보겠습니다.
앨리스와 밥은 큐비트를 얽습니다: 처음에 앨리스의 큐비트와 밥의 큐비트는 각각 상태에 있습니다(좋은 가정이며 IBM® 양자 컴퓨터의 올바른 초기화이기도 합니다). 이를 또는 간단히 으로 작성할 수 있습니다. 앨리스와 밥이 앨리스의 큐비트에서 하다마드 게이트와 앨리스의 큐비트를 컨트롤로, 밥의 큐비트를 타깃으로 하는 CNOT 게이트로 행동할 때 어떤 일이 일어나는지 계산해 보겠습니다:
이제 앨리스와 밥의 큐비트가 서로 얽혀 있다는 점에 유의하세요. 두 큐비트가 모두 상태인지 상태인지는 아직 본질적으로 결정되지 않았지만, 두 큐비트는 같은 상태인 것으로 알려져 있습니다.
앨리스와 밥이 헤어집니다: 두 친구는 큐비트를 아주 멀리 떨어진 새로운 위치로 옮깁니다. 양자 정보를 방해하지 않고 이동하는 것은 쉬운 일이 아니기 때문입니다. 그러나 이동이 가능하며 실제로 이 모듈에서 이동하게 됩니다. 하지만 양자 정보를 많이 이동할 때 약간의 오류가 발생할 수 있다는 점을 주의해야 합니다.
Q가 소개됩니다: 큐비트 Q에서 비밀 상태가 준비됩니다:
이 시점에서 Q는 앨리스의 큐비트(A)에 단순히 인접합니다. 얽힘이 없었기 때문에 세 큐비트의 양자 상태는 다음과 같이 쓸 수 있습니다:
목표는 Q의 정보를 앨리스의 위치에서 밥의 위치로 이동하는 것입니다. 현재로서는 정보 전송의 기밀성이나 속도에 대해 어떠한 주장이나 요구도 하지 않습니다. 우리는 단순히 정보가 앨리스에서 밥으로 이동하는 방법을 탐구하고 있습니다.
정보가 Q에서 시작되므로, 아래 수학에서 엔디안 표기가 거의 없는 Q는 큐비트 수에서 가장 낮은 숫자가 할당된다고 가정합니다.
앨리스가 큐비트 A와 Q를 얽히다: 앨리스는 이제 자신의 큐비트를 제어로, Q를 대상으로 하는 CNOT 게이트로 연산한 다음, Q에 하다마드 게이트를 적용합니다. 이 연산 후 3큐비트 상태를 계산해 보겠습니다:
A와 Q는 같은 위치에 있으므로 큐비트 A와 Q에 대한 측정 결과에 따라 위의 용어들을 그룹화해 보겠습니다:
이해도 점검
위의 세 큐비트 모두의 상태에 대한 식을 고려할 때, 큐비트 A와 Q를 측정했을 때 다음 결과가 나올 확률은 얼마인가?
25%. 이를 확인하려면 Bob의 상태를 정규화해야 한다는 점을 기억하세요
이제 앨리스는 큐비트 A와 Q를 측정할 수 있다. 양자 측정은 확률적이기 때문에, 그녀는 그 측정 결과를 통제할 수 없다. 따라서 그녀가 측정할 때, 4가지 가능한 결과가 있으며 이 4가지 모두의 발생 확률은 동일합니다: , , , 그리고 . 각 결과는 밥의 큐비트에 대해 서로 다른 의미를 지닌다는 점에 유의하십시오. 예를 들어, 앨리스가 자신의 큐비트가 상태에 있음을 확인하면, 이는 전체 3-큐비트 양자 상태가 상태로 붕괴되었음을 의미합니다. 앨리스가 다른 측정 결과를 얻게 되면, 밥에게 나타나는 상태도 달라집니다. 이 내용은 아래 표에 정리되어 있습니다.
앨리스 결과 | 밥의 상태 | 밥에게 지시 | 결과 |
|---|---|---|---|
| 없음 | |||
| 다음 |
앨리스의 큐비트에서 가능한 모든 측정 결과에 대해 밥의 큐비트는 원래 Q의 비밀 상태와 모호하게 닮은 상태로 남습니다. 앨리스가 (표의 첫 번째 행)를 측정하는 경우, 밥의 큐비트는 정확히 비밀 상태로 남아 있습니다! 다른 경우에는 상태에 문제가 있는 경우입니다. 계수( )가 바뀌었거나 "+" 기호가 있어야 할 곳에 "-" 기호가 있거나 둘 다 있습니다. 밥의 큐비트를 비밀 상태와 정확히 같도록 수정하려면 앨리스는 밥에게 전화를 걸어 (고전적인 통신 수단을 사용해) 표에 설명된 대로 밥에게 큐비트에 추가 연산을 수행하라고 지시해야 합니다. 예를 들어 세 번째 행에서는 계수가 바뀝니다. 앨리스가 밥에게 전화를 걸어 자신의 큐비트에 게이트를 적용하라고 하면 이 로 바뀌고, 그 반대의 경우도 마찬가지이며, 비밀 상태가 나옵니다.
이제 왜 이 방식을 이용해 빛보다 빠르게 정보를 전송할 수 없는지 분명해졌을 것입니다. 운이 좋다면 를 측정하게 될 수도 있는데, 이는 밥이 정확히 그 비밀 상태를 가지고 있음을 즉시 알 수 있음을 의미합니다. 하지만 우리가 밥에게 전화를 걸어 “ 를 측정했으니, 당신은 아무것도 할 필요가 없다”고 말하기 전까지는 밥은 그 사실을 알지 못합니다
사고 실험에서 큐비트는 종종 물리적으로 분리되어 새로운 위치로 이동합니다. IBM® 양자 컴퓨터는 분리할 수 없는 칩에 고체 상태의 큐비트를 사용합니다. 따라서 앨리스와 밥을 다른 위치로 이동하는 대신, 소위 '스왑 게이트'를 사용하여 한 큐비트에서 다른 큐비트로 정보를 이동함으로써 칩 자체의 정보를 분리할 것입니다.
실험 1: 기본 순간이동
IBM 퀀텀은 "키스킷 패턴"이라는 프레임워크를 사용하여 양자 컴퓨팅 문제를 해결할 것을 권장합니다. 다음 단계로 구성됩니다.
- 1단계: 문제를 양자 회로에 매핑하기
- 2단계: 실제 양자 하드웨어에서 실행되도록 회로 최적화하기
- 3단계: IBM Quantum 의 기본 연산 기능을 사용하여 IBM 양자 컴퓨터에서 작업을 실행합니다
- 4단계: 결과 후처리
1단계: 문제를 양자 회로에 매핑하기
위에서 수행한 모든 계산은 1단계의 개요를 설명한 것입니다. 이제 키스킷을 사용하여 양자 회로를 구축하여 이를 구현해 보겠습니다! 세 큐비트로 양자 회로를 만들고 앨리스와 밥의 두 큐비트를 얽기 시작합니다. 이를 큐비트 1과 2로 간주하고 비밀 상태를 위해 큐비트 0을 예약하겠습니다.
# Step 1: Map your problem to a quantum circuit
# Import some general packages
from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister
import numpy as np
# Define registers
secret = QuantumRegister(1, "Q")
Alice = QuantumRegister(1, "A")
Bob = QuantumRegister(1, "B")
cr = ClassicalRegister(3, "c")
qc = QuantumCircuit(secret, Alice, Bob, cr)
# We entangle Alice's and Bob's qubits as in our work above.
# We apply a Hadamard gate and then a CNOT gate.
# Note that the second argument in the CNOT gate is the target.
qc.h(Alice)
qc.cx(Alice, Bob)
# Inserting a barrier changes nothing about the logic. It just allows us to
# force gates to be positioned in "layers".
qc.barrier()
# Now we will use random variables to create the secret state.
# Don't worry about the "u" gate and the details.
np.random.seed(42) # fixing seed for repeatability
theta = np.random.uniform(0.0, 1.0) * np.pi # from 0 to pi
varphi = np.random.uniform(0.0, 2.0) * np.pi # from 0 to 2*pi
# Assign the secret state to the qubit on the other side of Alice's (qubit 0), labeled Q
qc.u(theta, varphi, 0.0, secret)
qc.barrier()
# Now entangle Q and Alice's qubits as in the discussion above.
qc.cx(secret, Alice)
qc.h(secret)
qc.barrier()
# Now Alice measures her qubits, and stores the outcomes in the "classical registers" cr[]
qc.measure(Alice, cr[1])
qc.measure(secret, cr[0])
# Now we insert some conditional logic. If Alice measures Q in a "1" we need a Z gate, and if Alice
# measures A in a "1" we need an X gate (see the table).
with qc.if_test((cr[1], 1)):
qc.x(Bob)
with qc.if_test((cr[0], 1)):
qc.z(Bob)
qc.draw(output="mpl")Output:
앨리스의 상태를 밥에게 순간이동시키기 위해서는 이것만 하면 됩니다. 하지만, 양자 상태 를 측정하면 또는 중 하나가 나온다는 점을 상기해 보자. 따라서 이 모든 과정이 끝날 때 밥은 분명히 앨리스의 비밀 상태를 가지고 있지만, 측정을 통해 이를 쉽게 확인할 수는 없다. 측정 결과가 우리가 이 작업을 올바르게 수행했음을 알려주려면, 한 가지 요령을 써야 합니다. 우리는 앨리스의 비밀 상태를 준비하는 데 사용한, “U”(“유니터리”를 의미)라고 표시된 연산자를 가지고 있었습니다. 회로 끝부분에 U의 역함수를 적용할 수 있습니다. 만약 U 연산으로 앨리스의 상태를 로 변환했다면, U의 역연산은 밥의 를 다시 로 변환할 것입니다. 따라서 단순히 양자 정보를 이동시키는 것이 목적이라면, 이 마지막 단계는 반드시 수행될 필요는 없습니다. 이는 단지 우리가 스스로를 점검하기 위한 것입니다.
# Add the inverse of U and measure Bob's qubit.
qc.barrier()
qc.u(theta, varphi, 0.0, Bob).inverse() # inverse of u(theta,varphi,0.0)
qc.measure(Bob, cr[2]) # add measurement gate
qc.draw(output="mpl")Output:
따라서 우리가 이 과정을 올바르게 수행했다면, 밥의 큐비트에 대한 측정 결과 상태가 나와야 합니다. 물론, 이러한 측정값은 확률적입니다. 따라서 밥의 큐비트가 상태에 있을 가능성이 아주 조금이라도 있다면, 단 한 번의 측정만으로도 와 같은 결과가 나올 수 있습니다. 따라서 의 확률이 상당히 높다는 것을 확신하기 위해서는 실제로 많은 측정을 수행해야 합니다.
2단계: 양자 실행을 위한 문제 최적화
이 단계에서는 수행하고자 하는 연산을 특정 양자 컴퓨터의 기능으로 표현합니다. 또한 우리의 문제를 양자 컴퓨터의 레이아웃에 매핑합니다.
IBM 양자 컴퓨터와 통신하는 데 필요한 몇 가지 패키지를 로드하는 것으로 시작하겠습니다. 또한 실행할 백엔드도 선택해야 합니다. 가장 사용량이 적은 백엔드를 선택하거나 속성을 알고 있는 특정 백엔드를 선택할 수 있습니다.
처음 사용할 때 자격 증명을 저장하는 코드는 아래에 있습니다. 노트북을 공유할 때 실수로 자격 증명이 공유되지 않도록 노트북을 환경에 저장한 후 이 정보를 노트북에서 삭제해야 합니다. 자세한 안내는 IBM Cloud 계정 설정하기 및 신뢰할 수 없는 환경에서 서비스 초기화를 참조하세요.
# Load IBM Quantum Compute Service
from qiskit_ibm_runtime import QiskitRuntimeService
# Load IBM Quantum Compute Service
# 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()
# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_brisbane".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_brisbane")
print(backend.name)Output:
ibm_sherbrooke
측정에 대한 로직을 명시적으로 활성화합니다.
from qiskit.circuit import IfElseOp
backend.target.add_instruction(IfElseOp, name="if_else")이제 양자 회로를 '트랜스파일'해야 합니다. 여기에는 많은 하위 단계가 포함되며 흥미로운 주제입니다. 하위 단계의 예를 들자면, 모든 양자 컴퓨터가 키스킷의 모든 논리 게이트를 직접 구현할 수 있는 것은 아닙니다. 우리는 양자 컴퓨터가 구현할 수 있는 게이트로 회로의 게이트를 작성해야 합니다. 사전 설정된 패스 관리자를 사용하여 이 프로세스 및 기타 프로세스를 수행할 수 있습니다. optimization = 3 (최고 수준의 최적화)를 설정하면 추상적인 양자 회로에서 양자 컴퓨터에 주어진 명령어로의 매핑이 사전 처리에서 얻을 수 있는 최대한의 효율을 보장합니다.
# 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)“샘플러(Sampler)”는 양자 회로에서 발생할 수 있는 상태들을 표본 추출하고, 어떤 상태가 어떤 확률로 측정될 수 있는지에 대한 통계를 수집하도록 설계된 기본 요소입니다. 여기서 IBM Quantum 샘플러를 가져옵니다:
# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler
sampler = Sampler(mode=backend)양자 컴퓨터의 모든 계산을 기존 컴퓨터에서 합리적으로 시뮬레이션할 수 있는 것은 아닙니다. 이렇게 간단한 순간 이동은 분명 가능하지만, 고전적으로 정보를 한 곳에 저장할 수 있다는 것은 전혀 놀라운 일이 아닙니다. 이러한 계산은 실제 양자 컴퓨터( IBM )를 사용하여 수행하는 것이 좋습니다. 하지만 월간 무료 사용량을 모두 소진했거나 수업 중에 완료해야 하는 일이 있어 대기열에서 기다릴 수 없는 경우, 시뮬레이터를 사용하여 이 모듈을 완료할 수 있습니다. 이렇게 하려면 아래 셀을 실행하고 '실행' 단계에서 관련 줄의 주석 처리를 해제하면 됩니다.
# Load the backend sampler
from qiskit.primitives import BackendSamplerV2
# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel
noise_model = NoiseModel.from_backend(backend)
# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)
# Alternatively, load a fake backend with generic properties and define a simulator.
# backend_gen = GenericBackendV2(num_qubits=18)
# sampler_gen = BackendSamplerV2(backend=backend_gen)3단계: 실행
샘플러를 사용하여 회로를 인수로 사용하여 작업을 실행합니다.
job = sampler.run([qc_isa])
# job = sampler_sim.run([qc_isa])
res = job.result()
counts = res[0].data.c.get_counts()4단계: 후처리 및 분석
결과를 플로팅하고 해석해 보겠습니다.
# This required 5 s to run on a Heron r2 processor on 10-28-24
from qiskit.visualization import plot_histogram
plot_histogram(counts)Output:
이해도 점검
위의 상태 중 어떤 것이 텔레포트가 성공했음을 나타내는 것이며, 어떻게 알 수 있습니까?
, , , 에 제시된 주장들은 모두 성공적인 순간이동과 모순되지 않습니다. 이는 비밀 상태의 초기 준비를 되돌리기 위한 게이트를 추가했기 때문입니다. 만약 비밀 상태가 밥의 큐비트로 성공적으로 순간이동되었다면, 그 추가 게이트는 밥의 큐비트를 ‘ ’ 상태로 되돌려야 한다. 따라서 위의 상태 중 밥의 큐비트(큐비트 0, 고전 레지스터의 0번 성분으로도 측정되며, 따라서 가장 높은/가장 오른쪽에 위치함)가 ‘ ’ 상태에 있는 경우, 이는 성공을 의미합니다.
이 플롯은 세 큐비트에 대한 모든 측정 결과, 즉 5,000번 이상의 시도 또는 '샷'을 보여줍니다. 앞서 앨리스가 큐비트 A와 Q에 대해 가능한 모든 상태를 동일한 확률로 측정한다는 점을 지적했습니다. 회로의 큐비트 0~2번을 순서대로 Q, A, B에 할당했습니다. 리틀 엔디안 표기법에서 밥의 큐비트는 가장 왼쪽/가장 낮은 큐비트입니다. 따라서 왼쪽의 네 개의 막대는 Bob의 큐비트가 이며, 나머지 두 큐비트는 거의 동일한 확률로 가능한 모든 조합에 해당합니다. 거의 모든(보통 ~95%) 측정에서 Bob의 큐비트가 상태로 나온다는 것은 설정이 성공적이었다는 것을 의미합니다! 상태에서 밥의 큐빗을 획득한 몇 개의 샷(~5%)이 있습니다. 논리적으로 불가능합니다. 그러나 모든 최신 양자 컴퓨터는 기존 컴퓨터보다 훨씬 더 많은 노이즈와 오류를 겪습니다. 그리고 양자 오류 수정은 아직 떠오르는 분야입니다.
실험 2: 프로세서 간 순간이동
양자 순간 이동의 가장 흥미로운 부분은 양자 상태를 즉시 먼 거리로 순간 이동시킬 수 있다는 점입니다(고전적인 추가 게이트 통신은 즉각적이지 않지만). 이미 언급했듯이 큐비트를 프로세서에서 분리하여 이동할 수는 없습니다. 하지만 순간 이동에 관련된 큐비트가 프로세서의 반대편에 있을 때까지 한 큐비트에서 다른 큐비트로 정보를 이동할 수 있습니다. 위에서 수행한 단계를 반복하되, 이번에는 프로세서에 충분한 큐비트가 있는 더 큰 회로를 만들어 보겠습니다.
1단계: 문제를 양자 회로에 매핑하기
이번에는 앨리스와 밥에 해당하는 큐비트가 변경됩니다. 따라서 하나의 큐비트에 'A'라는 이름을 붙이고 다른 큐비트에 'B'라는 이름을 붙이지 않습니다. 대신 큐비트에 번호를 매기고 변수를 사용하여 앨리스와 밥에 속한 큐비트 정보의 현재 위치를 표현합니다. 스왑 게이트를 제외한 다른 모든 단계는 앞서 설명한 대로 진행됩니다.
# Step 1: Map
# Define registers
qr = QuantumRegister(13, "q")
qc = QuantumCircuit(qr, cr)
# Define registers
secret = QuantumRegister(1, "Q")
ebitsa = QuantumRegister(6, "A")
ebitsb = QuantumRegister(6, "B")
# q = ClassicalRegister(1, "q meas")
# a = ClassicalRegister(1, "a")
# b = ClassicalRegister(1, "b")
cr = ClassicalRegister(3, "c")
qc = QuantumCircuit(secret, ebitsa, ebitsb, cr)
# We'll start Alice in the middle of the circuit, then move information outward in both directions.
Alice = 5
Bob = 0
qc.h(ebitsa[Alice])
qc.cx(ebitsa[Alice], ebitsb[Bob])
# Starting with Bob and Alice in the center, we swap their information onto adjacent qubits,
# until the information is on distant qubits.
for n in range(Alice):
qc.swap(ebitsb[Bob], ebitsb[Bob + 1])
qc.swap(ebitsa[Alice], ebitsa[Alice - 1])
Alice = Alice - 1
Bob = Bob + 1
qc.barrier()
# Create a random state for Alice (qubit zero)
np.random.seed(42) # fixing seed for repeatability
# theta = np.random.uniform(0.0, 1.0) * np.pi #from 0 to pi
theta = 0.3
varphi = np.random.uniform(0.0, 2.0) * np.pi # from 0 to 2*pi
qc.u(theta, varphi, 0.0, secret)
# Entangle Alice's two qubits
qc.cx(secret, ebitsa[Alice])
qc.h(secret)
qc.barrier()
# Make measurements of Alice's qubits and store the results in the classical register.
qc.measure(ebitsa[Alice], cr[1])
qc.measure(secret, cr[0])
# Send instructions to Bob's qubits based on the outcome of Alice's measurements.
with qc.if_test((cr[1], 1)):
qc.x(ebitsb[Bob])
with qc.if_test((cr[0], 1)):
qc.z(ebitsb[Bob])
qc.barrier()
# Invert the preparation we did for Carl's qubit so we can check whether we did this correctly.
qc.u(theta, varphi, 0.0, ebitsb[Bob]).inverse() # inverse of u(theta,varphi,0.0)
qc.measure(ebitsb[Bob], cr[2]) # add measurement gate
qc.draw("mpl")Output:
회로도에서 논리적 단계가 동일하다는 것을 알 수 있습니다. 유일한 차이점은 스왑 게이트를 사용해 앨리스의 큐비트 상태를 큐비트 6( )에서 큐비트 1( )로, 바로 옆에 있는 큐비트로 가져왔다는 것입니다. 그리고 스왑 게이트를 사용하여 밥의 초기 상태를 큐비트 7 ( )에서 큐비트 12 ( )로 가져왔습니다. 큐비트 12의 상태는 멀리 떨어진 큐비트 0과 1에 대한 측정이 이루어질 때까지는 Q의 비밀 상태와 관련이 없으며, 조건부 및 게이트가 적용될 때까지 큐비트 12의 상태는 비밀 상태와 같지 않습니다.
2단계: 회로 최적화
일반적으로 패스 관리자를 사용하여 회로를 트랜스파일링하고 최적화할 때는 회로의 효율을 최대한 높이기 위해 optimization_level = 3 을 설정하는 것이 좋습니다. 이 경우 큐비트 6과 7에서 큐비트 1과 12로 상태를 전송해야 할 계산상의 이유가 없습니다. 원거리 순간 이동을 시연하기 위해 그렇게 한 것뿐입니다. 패스 매니저에게 회로 최적화를 요청하면, 패스 매니저는 이러한 스왑 게이트에 논리적 이유가 없음을 깨닫고 이를 제거하고 인접 큐비트에서 게이트 연산을 수행합니다. 따라서 이 특별한 경우에는 optimization_level = 0 을 사용합니다.
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pmzero = generate_preset_pass_manager(target=target, optimization_level=0)
qc_isa_zero = pmzero.run(qc)
print(qc_isa_zero.depth())Output:
105
plot_circuit_layout 함수를 사용하여 이러한 큐비트가 양자 프로세서에서 어디에 있는지 시각화할 수 있습니다.
3단계: 실행
이전과 마찬가지로 실제 IBM 양자 컴퓨터에서 실행하는 것을 권장합니다. 월간 무료 사용량에 도달한 경우 시뮬레이터 셀의 주석을 해제하여 시뮬레이터에서 실행할 수 있습니다.
# This required 5 s to run on a Heron r2 processor on 10-28-24
job = sampler.run([qc_isa_zero])
# job = sampler_sim.run([qc_isa_zero])
counts = job.result()[0].data.c.get_counts()from qiskit.visualization import plot_histogram
plot_histogram(counts)Output:
4단계: 고전적 후처리
여기서도 앨리스의 큐비트에 대해 가능한 결과에 대한 확률이 상당히 균일하다는 것을 알 수 있습니다. 비밀 코드를 반전시킨 후 에서 Bob의 큐비트를 찾을 확률이 높다는 것은 프로세서 전체에서 비밀 상태를 Q에서 Bob(큐비트 0~12)으로 올바르게 순간 이동했을 확률이 높다는 것을 의미합니다. 그러나 이제 Bob의 경우 을 측정하지 않을 가능성이 더 높습니다. 이는 양자 컴퓨팅에서 중요한 교훈입니다. 게이트, 특히 스왑 게이트와 같은 멀티비트 게이트가 많을수록 더 많은 노이즈와 오류가 발생한다는 것입니다.
질문
교수자는 노트북이 어떻게 사용되고 있는지에 대한 이 간단한 설문조사를 작성하여 공통 커리큘럼에 배치하는 방법에 대한 안내와 답안지가 포함된 노트북 버전을 요청할 수 있습니다.
핵심 개념
- 큐비트는 서로 얽혀 있어 한 큐비트의 측정이 다른 큐비트의 상태에 영향을 미치거나 심지어 결정할 수도 있습니다.
- 얽힘은 고전적 상관관계와 다릅니다. 예를 들어, 큐비트 A와 B는 과 같은 상태의 중첩 상태에 있을 수 있습니다. A나 B의 상태는 본질적으로 결정되지 않을 수 있지만, 그럼에도 불구하고 A와 B가 동일한 상태에 있다는 사실은 보장될 수 있습니다.
- 얽힘과 측정의 조합을 통해 한 큐비트에서 다른 큐비트로 상태(정보를 저장할 수 있는)를 전송할 수 있습니다. 이러한 전송은 장거리에서도 가능하며, 이를 양자 순간 이동이라고 합니다.
- 양자 순간이동은 확률적인 양자 측정에 의존합니다. 따라서 텔레포트된 상태를 조정하려면 고전적인 통신이 필요할 수 있습니다. 이는 양자 순간 이동이 빛보다 빠르게 정보를 이동하는 것을 방지합니다. 양자 순간 이동은 상대성 이론이나 인과 관계를 위반하지 않습니다.
- 최신 양자 컴퓨터는 기존 컴퓨터보다 노이즈와 오류에 더 취약합니다. 몇 퍼센트의 오차가 발생할 수 있습니다.
- 더 많은 게이트(특히 2쿼비트 게이트)를 순차적으로 추가할수록 더 많은 오류와 노이즈가 발생할 수 있습니다.
참/거짓 문제
- T/F 양자 순간 이동은 빛보다 빠르게 정보를 전송하는 데 사용할 수 있습니다.
- T/F 현대의 증거에 따르면 양자 상태의 붕괴는 빛보다 빠르게 전파됩니다.
- T/F 키스킷에서 큐비트는 다음과 같이 오른쪽에 가장 낮은 숫자의 큐비트가 있는 상태 순으로 정렬됩니다
MC 질문
- 큐비트 A와 B가 얽힌 다음 큰 거리로 분리되어 있습니다 . 큐비트 A가 측정됩니다. 큐비트 B의 상태가 영향을 받는 속도에 대해 옳은 서술은 다음 중 어느 것입니까?
- a. 지금까지 실행된 실험에서 Qubit B는 실험 허용 오차 범위 내에서 즉시 영향을 받았습니다.
- b. 큐비트 B는 일정 시간이 지나면 영향을 받습니다 , 즉 양자 상태가 실험적 허용 오차 내에서 거의 빛의 속도로 "붕괴"한다는 의미입니다.
- c. 큐비트 B는 클래식 통신이 발생한 후에만 영향을 받으므로 보다 긴 시간에 발생합니다.
- d. 해당 항목 없음
- 측정 확률은 양자 상태의 진폭과 관련이 있다는 점을 상기하자. 예를 들어, 큐비트가 처음에 상태에 있다면, 상태를 측정할 확률은 입니다. 유한한 표본 추출로 인해 모든 측정 결과가 이 확률들과 정확히 일치하는 것은 아닙니다(마치 동전을 던졌을 때 앞면이 두 번 연속으로 나올 수도 있는 것과 같습니다). 아래의 측정 히스토그램은 다음 중 어떤 양자 상태에 해당할 수 있습니까? 가장 적합한 옵션을 선택하세요.
- a.
- b.
- c.
- d.
- e.
- 다음 중 큐비트 A와 B가 얽혀 있는 상태를 나타내는 것은? 해당되는 항목을 모두 선택하십시오.
- a.
- b.
- c.
- d.
- e.
- 이 모듈에서는 와 같은 얽힘 상태를 준비했습니다. 하지만 이와 유사한 프로토콜에 사용할 수 있는 얽힘 상태는 이 외에도 많이 있습니다. 아래 주들 중 어느 곳에서 다음과 같은 2-큐비트 측정 히스토그램이 나올 수 있을까요? 가장 적절한 답변을 선택하세요.
- a.
- b.
- c.
- d.
- e.
토론 질문
-
양자 순간 이동 프로토콜을 처음부터 끝까지 파트너/그룹에게 설명하세요. 추가할 내용이 있는지, 질문이 있는지 확인하세요.
-
앨리스와 밥이 처음 얽힌 상태에는 독특한 점이 있나요? 그렇다면 어떤 점이 독특한가요? 그렇지 않다면 어떤 다른 얽힌 상태를 사용할 수 있었을까요?