Перейти до основного вмісту

Квантова телепортація

Для цього модуля «Qiskit у класі» студенти мають мати робоче середовище Python із встановленими такими пакетами:

  • qiskit v2.1.0 або новіший
  • qiskit-ibm-runtime v0.40.1 або новіший
  • qiskit-aer v0.17.0 або новіший
  • qiskit.visualization
  • numpy
  • pylatexenc

Щоб налаштувати і встановити вказані пакети, дивись посібник Встановлення Qiskit. Щоб запускати завдання на реальних квантових комп'ютерах, студентам потрібно створити обліковий запис IBM Quantum®, дотримуючись кроків із посібника Налаштування облікового запису IBM Cloud.

Цей модуль було протестовано — він використав 14 секунд QPU-часу. Це лише оцінка; твоє фактичне використання може відрізнятися.

# 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.


Вступ і контекст

Квантова телепортація — це техніка квантової фізики, яка дозволяє передавати квантову інформацію з одного місця в інше без фізичного переміщення частинок. На відміну від науково-фантастичної концепції телепортації, цей процес не передбачає транспортування матерії. Натомість він спирається на принцип квантової заплутаності, коли дві частинки виявляються пов'язаними незалежно від відстані між ними. Через серію точних вимірювань і класичного зв'язку квантовий стан однієї частинки може бути відтворений в іншій частинці у віддаленому місці — тобто квантова інформація фактично «телепортується». У цьому модулі ми розглянемо, як це працює математично, а потім реалізуємо квантову телепортацію на реальному квантовому комп'ютері. Вступ тут буде коротким; для глибшого ознайомлення з квантовою інформацією та детальнішого пояснення телепортації рекомендуємо курс Джона Ватруса Основи квантової інформації, і зокрема розділ про Телепортацію.

Класичні біти можуть перебувати у станах 0 або 1. Квантові біти (кубіти) можуть перебувати у квантових станах 0|0\rangle та 1|1\rangle, а також у лінійних комбінаціях цих станів — так званих «суперпозиціях», наприклад ψ=α00+α11|\psi\rangle = \alpha_0|0\rangle +\alpha_1|1\rangle, де α0,α1C\alpha_0,\alpha_1 \in \mathbb{C} та α02+α12=1.|\alpha_0|^2+|\alpha_1|^2 = 1. Хоча стани можуть існувати в цій суперпозиції, вимірювання стану «скидає» його до одного зі станів — 0|0\rangle або 1|1\rangle. Параметри aa та bb пов'язані з імовірністю кожного результату вимірювання згідно з формулами

P0=α02P_0 = |\alpha_0|^2 P1=α12P_1 = |\alpha_1|^2

Звідси й умова α02+α12=1.|\alpha_0|^2+|\alpha_1|^2 = 1.

Ще одна ключова властивість — кубіти можуть бути «заплутані»: вимірювання одного кубіта може впливати на результат вимірювання іншого, заплутаного кубіта. Зрозуміти, чим заплутаність відрізняється від класичних кореляцій, дещо непросто. Спочатку пояснимо нашу нотацію. Розглянемо два кубіти, що належать другу 0 (Алісі) і другу 1 (Бобу), кожен з яких перебуває у стані 0|0\rangle:

0B0A|0\rangle_B|0\rangle_A

або

0100|0\rangle_1|0\rangle_0

що іноді скорочується просто до

00|00\rangle

Зверни увагу: кубіт з найменшим номером (або літерою) розташований крайнім праворуч. Це конвенція, яка називається «little-endian» нотацією і використовується в усьому Qiskit. Якщо двокубітний стан пари друзів дорівнює 00|00\rangle і вони вимірюють стан своїх кубітів, кожен отримає 0. Аналогічно, якщо кубіти перебувають у стані 11|11\rangle, кожне вимірювання дасть 1 — це нічим не відрізняється від класичного випадку. Однак у квантових обчисленнях можна поєднати це із суперпозицією і отримати стани на кшталт

12(00+11)\frac{1}{\sqrt{2}}(|00\rangle+|11\rangle)

У такому стані невідомо — і навіть ще не визначено природою — чи кубіти Аліси та Боба перебувають у стані 0 чи 1, проте відомо, що вони виміряють однаковий стан свого кубіта. Наприклад, якщо Боб вимірює свій кубіт у стані 0|0\rangle, це можливо лише тоді, коли вимірювання скинуло двокубітний стан до одного з двох можливих — а саме до 00|00\rangle. Це залишає кубіт Аліси також у стані 0|0\rangle.

Заплутаність кубітів у такий спосіб не вимагає, щоб кубіти залишалися фізично близько один до одного. Іншими словами, можна заплутати кубіти, розділити їх на велику відстань і використовувати їхню заплутаність для передачі інформації. Заплутаний стан, подібний до наведеного вище, є базовою одиницею заплутаності і іноді називається «е-бітом» — одним бітом заплутаності. Ці е-біти можна розглядати як ресурси у квантовому зв'язку, оскільки кожен е-біт, яким діляться між собою віддалені партнери, може бути використаний — як ми описуємо тут — для переміщення інформації з одного місця в інше.

Перша думка багатьох, хто вперше знайомиться з цим, — чи не порушуємо ми теорію відносності: чи не можна так передавати інформацію швидше за світло? Аж ніяк не припиняй ставити запитання і перевіряти наукові закони, але, на жаль, цей підхід не дозволить нам передавати інформацію швидше за світло — з причин, які стануть зрозумілі в ході цього модуля. Спойлер: дивовижно, але це НЕ пов'язано зі швидкістю поширення цього «скидання», яке, схоже, відбувається швидше за світло [1]. Почнемо з двох учасників — Аліси та Боба, які спочатку перебувають в одному місці і можуть спільно працювати з одними кубітами. Ці учасники заплутають свої кубіти. Потім вони переберуться у два різні географічні місця, взявши з собою свої кубіти. Після цього Аліса отримає квантову інформацію на новому кубіті Q. Ми не робимо жодних припущень щодо інформації на Q. Стан Q може бути секретом, невідомим Алісі; він може бути невідомим нікому. Але Аліса отримує завдання передати інформацію з Q до Боба. Вона зробить це за допомогою квантової телепортації.

Щоб це здійснити, нам потрібно знати деякі квантові операції, або «гейти».

Квантові оператори (Gate)

Можеш пропустити цей розділ, якщо вже знайомий із квантовими гейтами. Якщо хочеш краще їх зрозуміти, ознайомся з курсом Основи квантової інформації, особливо першими двома уроками на IBM Quantum Learning.

Для цього протоколу телепортації ми переважно використовуватимемо два типи квантових гейтів: гейт Адамара та гейт CNOT. Кілька інших гейтів відіграватимуть допоміжну роль: гейт XX, гейт ZZ і гейт SWAP.

Цей модуль можна пройти маючи дуже обмежену підготовку з лінійної алгебри, але іноді корисно візуалізувати квантово-механічні гейти через матриці та вектори. Тому ми також наводимо матрично-векторні форми квантових гейтів і станів.

Стани, які ми вже представили, вибрані (частково за конвенцією, частково через обмеження) з такими векторними формами:

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

Таким чином довільний стан ψ=a0+b1|\psi\rangle = a|0\rangle+b|1\rangle можна записати як

ψ=(ab)|\psi\rangle =\begin{pmatrix}a \\ b\end{pmatrix}

Існує певний вибір щодо того, як розширити нотацію на багатокубітні стани, але варіант нижче є досить стандартним:

00=(1000),01=(0100),10=(0010),11=(0001).|00\rangle = \begin{pmatrix}1 \\ 0 \\ 0 \\ 0\end{pmatrix},|01\rangle = \begin{pmatrix}0 \\ 1 \\ 0 \\ 0\end{pmatrix}, |10\rangle = \begin{pmatrix}0 \\ 0 \\ 1 \\0\end{pmatrix},|11\rangle = \begin{pmatrix}0 \\ 0 \\ 0 \\ 1\end{pmatrix}.

З урахуванням цієї векторної нотації введемо необхідні квантові гейти, їхній вплив на квантові стани та їхні матричні форми.

H Гейт Адамара: Створює стан суперпозиції. Однокубітний гейт.

H0=12(0+1),H|0\rangle = \frac{1}{\sqrt{2}}\left(|0\rangle+|1\rangle\right), H1=12(01)H|1\rangle = \frac{1}{\sqrt{2}}\left(|0\rangle-|1\rangle\right) H=12(1111)H=\frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix}

Circuit із гейтом Адамара будується так:

from qiskit import QuantumCircuit

qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")

Output of the previous code cell

CNOT Гейт керованого NOT: Цей гейт використовує два кубіти: керуючий і цільовий. Перевіряє стан керуючого кубіта, який не змінюється. Якщо керуючий кубіт перебуває у стані 1|1\rangle, гейт змінює стан цільового кубіта; якщо стан керуючого кубіта 0|0\rangle — жодних змін не відбувається. У нотації нижче припустимо, що кубіт AA (крайній правий) є керуючим, а кубіт BB (крайній лівий) — цільовим. Нижче використовується нотація CNOT(qcontrol,qtarget)BA.CNOT(q_{control},q_{target})|BA\rangle.

CNOT(A,B)00=00,CNOT(A,B)01=11,CNOT(A,B)10=10,CNOT(A,B)11=01CNOT(A,B)|00\rangle = |00\rangle, \\ CNOT(A,B)|01\rangle = |11\rangle, \\ CNOT(A,B)|10\rangle = |10\rangle, \\ CNOT(A,B)|11\rangle = |01\rangle

Іноді можна зустріти запис CNOT, де порядок керуючого і цільового кубітів просто мається на увазі. Але в коді та на діаграмах Circuit такої неоднозначності немає.

CNOT=(1000000100100100)CNOT=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}

Гейт CNOT виглядає дещо інакше на схемі Circuit, оскільки потребує двох кубітів. Ось як його реалізувати:

qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")

Output of the previous code cell

Перевір своє розуміння

Прочитай питання нижче, подумай над відповіддю, а потім натисни на трикутник, щоб побачити рішення.

Більшість гейтів мають однакову матричну форму в Qiskit і в усіх інших місцях. Але гейт CNOT діє на два кубіти, тому одразу виникає питання про порядок нумерації кубітів. Тексти, що впорядковують кубіти як q0,q1,...|q_0,q_1,...\rangle, показуватимуть іншу матричну форму для своїх гейтів CNOT. Перевір явним матричним множенням, що матриця CNOT вище правильно діє на стан 01.|01\rangle.

Відповідь:

CNOT01=(1000000100100100)(0100)=(0001)=11CNOT|01\rangle =\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}\begin{pmatrix}0 \\ 1 \\ 0 \\0\end{pmatrix} = \begin{pmatrix}0 \\ 0 \\ 0 \\1\end{pmatrix} = |11\rangle

Гейт XX: Еквівалент операції NOT. Однокубітний гейт.

X0=1,X1=0X|0\rangle = |1\rangle,\\X|1\rangle=|0\rangle X=(0110)X=\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}

У Qiskit Circuit із гейтом XX виглядає так:

qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")

Output of the previous code cell

Гейт ZZ: Додає «фазу» до стану (префактор, який для Z-власних станів 0|0\rangle та 1|1\rangle дорівнює 1 або −1 відповідно). Однокубітний гейт.

Z0=0,Z1=1Z|0\rangle = |0\rangle,\\Z|1\rangle=-|1\rangle Z=(1001)Z=\begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}

У Qiskit Circuit із гейтом ZZ виглядає так:

qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")

Output of the previous code cell

Теорія

Давай викладемо протокол квантової телепортації за допомогою математики. Потім у наступному розділі ми реалізуємо це налаштування на квантовому комп'ютері.

Аліса та Боб заплутують свої кубіти: Спочатку кубіт Аліси та кубіт Боба кожен окремо перебувають у стані 0|0\rangle (це правомірне припущення і водночас правильна ініціалізація для квантових комп'ютерів IBM®). Запишемо це як 0B0A|0\rangle_B|0\rangle_A або просто як 00|00\rangle. Обчислимо, що відбувається, коли Аліса та Боб застосовують гейт Адамара до кубіта Аліси, а потім гейт CNOT із кубітом Аліси як керуючим і кубітом Боба як цільовим:

CNOT(A,B)HA0B0A=CNOT(A,B)0B12(0A+1A)=12(CNOT(A,B)0B0A+CNOT(A,B)0B1A)=12(0B0A+1B1A)\begin{aligned} CNOT(A,B)H_A |0\rangle_B|0\rangle_A &= CNOT(A,B)|0\rangle_B\frac{1}{\sqrt{2}}\left(|0\rangle_A+|1\rangle_A\right)\\ &=\frac{1}{\sqrt{2}}\left(CNOT(A,B)|0\rangle_B|0\rangle_A+CNOT(A,B)|0\rangle_B|1\rangle_A\right)\\ &=\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right) \end{aligned}

Зверни увагу: тепер кубіти Аліси та Боба заплутані. Хоча природою ще не визначено, чи їхні кубіти перебувають у стані 0|0\rangle або 1|1\rangle, відомо, що вони перебувають в одному стані. Аліса та Боб розділяються: Двоє друзів переміщують свої кубіти до нових місць, можливо, дуже далеко одне від одного. Це супроводжується багатьма застереженнями: переміщення квантової інформації без її порушення — нетривіальне завдання. Але це можливо, і в цьому модулі ти це зробиш. Проте май на увазі, що при переміщенні квантової інформації ми очікуємо певних помилок.

Вводиться Q: Секретний стан підготовлено на кубіті Q:

ψQ=α00Q+α11Q|\psi\rangle_Q = \alpha_0 |0\rangle_Q + \alpha_1 |1\rangle_Q

На цьому етапі Q просто знаходиться поруч із кубітом Аліси (A). Заплутаності не відбулося, тому квантовий стан трьох кубітів разом можна записати як:

ψABψQ=12(0B0A+1B1A)(α00Q+α11Q).|\psi\rangle_{AB}|\psi\rangle_Q = \frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right)\left(\alpha_0 |0\rangle_Q + \alpha_1 |1\rangle_Q\right).

Мета — перемістити інформацію з Q від Аліси до місця, де знаходиться Боб. На цьому етапі ми не висуваємо жодних вимог щодо секретності або швидкості передачі інформації — ми просто досліджуємо, як інформація може переміщатися від Аліси до Боба. Оскільки інформація починається на Q, ми припустимо, що Q отримує найменший номер серед кубітів, завдяки чому у little-endian нотації Q буде крайнім правим кубітом у наведеній нижче математиці.

Аліса заплутує кубіти A і Q: Аліса застосовує гейт CNOT із власним кубітом як керуючим і Q як цільовим, а потім застосовує гейт Адамара до Q. Обчислимо трикубітний стан після цієї операції:

HQCNOT(A,Q)ψABψQ=HQCNOT(A,Q)12(0B0A+1B1A)(α00Q+α11Q)=HQCNOT(A,Q)12((α00B0A0Q+α10B0A1Q)+(α01B1A0Q+α11B1A1Q))=HQ12(α00B0A0Q+α10B1A1Q+α01B1A0Q+α11B0A1Q)=12(α00B0A0Q+α00B0A1Q+α10B1A0Qα10B1A1Q)+12(α01B1A0Q+α01B1A1Q+α11B0A0Qα11B0A1Q)\begin{aligned} H_Q CNOT(A,Q)|\psi\rangle_{AB}|\psi\rangle_Q &= H_Q CNOT(A,Q)\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right)\left(\alpha_0 |0\rangle_Q + \alpha_1 |1\rangle_Q\right)\\ &= H_Q CNOT(A,Q)\frac{1}{\sqrt{2}}\left(\left(\alpha_0 |0\rangle_B|0\rangle_A|0\rangle_Q + \alpha_1 |0\rangle_B|0\rangle_A|1\rangle_Q\right)+\left(\alpha_0 |1\rangle_B|1\rangle_A|0\rangle_Q + \alpha_1 |1\rangle_B|1\rangle_A|1\rangle_Q\right)\right)\\ &= H_Q \frac{1}{\sqrt{2}}\left(\alpha_0 |0\rangle_B|0\rangle_A|0\rangle_Q + \alpha_1 |0\rangle_B|1\rangle_A|1\rangle_Q+\alpha_0 |1\rangle_B|1\rangle_A|0\rangle_Q + \alpha_1 |1\rangle_B|0\rangle_A|1\rangle_Q\right)\\ &= \frac{1}{2}\left(\alpha_0 |0\rangle_B|0\rangle_A|0\rangle_Q + \alpha_0 |0\rangle_B|0\rangle_A|1\rangle_Q + \alpha_1 |0\rangle_B|1\rangle_A|0\rangle_Q-\alpha_1 |0\rangle_B|1\rangle_A|1\rangle_Q\right)\\ &+\frac{1}{2}\left(\alpha_0 |1\rangle_B|1\rangle_A|0\rangle_Q + \alpha_0 |1\rangle_B|1\rangle_A|1\rangle_Q + \alpha_1 |1\rangle_B|0\rangle_A|0\rangle_Q - \alpha_1 |1\rangle_B|0\rangle_A|1\rangle_Q\right) \end{aligned}

Оскільки A і Q знаходяться в одному місці, згрупуємо наведені вище доданки відповідно до результатів вимірювань кубітів A і Q:

ψ=12((α00B+α11B)0A0Q+(α00Bα11B)0A1Q+(α10B+α01B)1A0Q+(α10B+α01B)1A1Q)\begin{aligned} |\psi\rangle = \frac{1}{2}\left((\alpha_0 |0\rangle_B+\alpha_1 |1\rangle_B)|0\rangle_A|0\rangle_Q + (\alpha_0 |0\rangle_B-\alpha_1 |1\rangle_B)|0\rangle_A|1\rangle_Q + (\alpha_1 |0\rangle_B+\alpha_0 |1\rangle_B)|1\rangle_A|0\rangle_Q+ (-\alpha_1 |0\rangle_B+\alpha_0 |1\rangle_B)|1\rangle_A|1\rangle_Q \right)\\ \end{aligned}

Перевір своє розуміння

Прочитай питання нижче, подумай над відповіддю, а потім натисни на трикутник, щоб побачити рішення.

З огляду на наведений вище вираз для станів усіх трьох кубітів, яка ймовірність того, що вимірювання кубітів A і Q дасть 0A0Q?|0\rangle_A|0\rangle_Q?

Відповідь:

25%. Щоб це побачити, пригадай, що стан Боба має бути нормований, тому A0Q0120A0Q(α00B+α11B)2=14(α00B+α11B)2=14 |_A \langle0|_Q\langle0| \frac{1}{2} |0\rangle_A|0\rangle_Q (\alpha_0 |0\rangle_B+\alpha_1 |1\rangle_B)|^2 = \frac{1}{4}|(\alpha_0 |0\rangle_B+\alpha_1 |1\rangle_B)|^2 = \frac{1}{4}

Тепер Аліса може виміряти кубіти A і Q. Вона не може контролювати результат цього вимірювання, оскільки квантові вимірювання є ймовірнісними. Отже, коли вона вимірює, можливі 4 результати, і всі 4 є однаково ймовірними: 0A0Q,|0\rangle_A|0\rangle_Q, 0A1Q,|0\rangle_A|1\rangle_Q, 1A0Q|1\rangle_A|0\rangle_Q та 1A1Q.|1\rangle_A|1\rangle_Q. Зверни увагу, що кожен результат по-різному впливає на кубіт Боба. Наприклад, якщо Аліса знаходить свої кубіти у стані 0A0Q|0\rangle_A|0\rangle_Q, це скидає весь трикубітний квантовий стан до (α00B+α11B)0A0Q.(\alpha_0|0\rangle_B+\alpha_1|1\rangle_B)|0\rangle_A|0\rangle_Q. Інші результати вимірювань Аліси дають різні стани для Боба. Вони зібрані в таблиці нижче.

Результат АлісиСтан БобаІнструкція для БобаРезультат
0A0Q \vert 0\rangle_A \vert 0\rangle_Qα00B+α11B\alpha_0\vert 0\rangle_B+\alpha_1\vert 1\rangle_BНічогоα00B+α11B\alpha_0\vert 0\rangle_B+\alpha_1\vert 1\rangle_B
0A1Q \vert 0\rangle_A \vert 1\rangle_Qα00Bα11B\alpha_0\vert 0\rangle_B-\alpha_1\vert 1\rangle_BZZα00B+α11B\alpha_0\vert 0\rangle_B+\alpha_1\vert 1\rangle_B
1A0Q \vert 1\rangle_A \vert 0\rangle_Qα10B+α01B\alpha_1\vert 0\rangle_B+\alpha_0\vert 1\rangle_BXXα00B+α11B\alpha_0\vert 0\rangle_B+\alpha_1\vert 1\rangle_B
1A1Q \vert 1\rangle_A \vert 1\rangle_Qα10B+α01B-\alpha_1\vert 0\rangle_B+\alpha_0\vert 1\rangle_BXX, потім ZZα00B+α11B\alpha_0\vert 0\rangle_B+\alpha_1\vert 1\rangle_B
При всіх можливих результатах вимірювань кубітів Аліси кубіт Боба залишається у стані, що нагадує секретний стан, який спочатку був на Q. Якщо Аліса вимірює $0\rangle_C0\rangle_A(першийрядоктаблиці),кубітБобаодразувиявляєтьсявточностіусекретномустані!Віншихвипадкахщосьіденетак:коефіцієнти( (перший рядок таблиці), кубіт Боба одразу виявляється в точності у секретному стані! В інших випадках щось іде не так: коефіцієнти (\alpha)переставленімісцями,абознак«»стоїтьтам,демаєбути«+»,абообидвацівідхиленняразом.ЩобзмінитикубітБобаізробитийоготочнорівнимсекретномустану,АлісаповинназателефонуватиБобу(скористатисяякимосьзасобомкласичногозвязку)іповідомитийому,якідодатковіопераціїтребавиконатинадсвоїмкубітом,якописановтаблиці.Наприклад,утретьомурядкукоефіцієнтипереставлені.ЯкщоАлісателефонуєБобуікажейомузастосуватигейт) переставлені місцями, або знак «-» стоїть там, де має бути «+», або обидва ці відхилення разом. Щоб змінити кубіт Боба і зробити його точно рівним секретному стану, Аліса повинна зателефонувати Бобу (скористатися якимось засобом класичного зв'язку) і повідомити йому, які додаткові операції треба виконати над своїм кубітом, як описано в таблиці. Наприклад, у третьому рядку коефіцієнти переставлені. Якщо Аліса телефонує Бобу і каже йому застосувати гейт Xдосвогокубіта,цеміняєдо свого кубіта, це міняє0\rangleнана

Тепер має бути зрозуміло, чому ми не можемо використати це налаштування для передачі інформації швидше за світло. Нам може пощастити виміряти 0A0Q|0\rangle_A|0\rangle_Q, і тоді Боб миттєво матиме точний секретний стан. Але Боб не знатиме про це, поки ми не зателефонуємо йому і не скажемо: «Ми виміряли 0A0Q|0\rangle_A|0\rangle_Q, тому тобі нічого не потрібно робити».

У уявному експерименті кубіти часто фізично розділяють і переміщають у нові місця. Квантові комп'ютери IBM® використовують твердотільні кубіти на чіпі, які не можна роз'єднати. Тому замість того, щоб переміщати Алісу та Боба в різні місця, ми розділимо інформацію на самому чіпі, використовуючи так звані «swap-гейти» для переміщення інформації з одного кубіта на інший.

Експеримент 1: Базова телепортація

IBM Quantum рекомендує підходити до задач квантових обчислень за допомогою фреймворку, який ми називаємо «Qiskit patterns» («патерни Qiskit»). Він складається з таких кроків.

  • Крок 1: Відобрази свою задачу у квантовий Circuit
  • Крок 2: Оптимізуй свій Circuit для запуску на реальному квантовому залізі
  • Крок 3: Виконай своє завдання на квантових комп'ютерах IBM за допомогою Runtime Primitives
  • Крок 4: Опрацюй результати після виконання

Крок 1: Відобрази задачу у квантовий Circuit

Вся математика, яку ми виконали вище, — це і є опис кроку 1. Реалізуємо його зараз, побудувавши наш квантовий Circuit за допомогою Qiskit! Починаємо зі створення квантового Circuit із трьома кубітами та заплутуємо два кубіти Аліси та Боба. Візьмемо їх як кубіти 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 of the previous code cell

Це все, що потрібно зробити, щоб стан Аліси телепортувався до Боба. Однак пригадай, що коли ми вимірюємо квантовий стан α00+α11\alpha_0 |0\rangle+\alpha_1|1\rangle, ми отримуємо або 0|0\rangle, або 1.|1\rangle. Тож наприкінці всього цього Боб точно матиме секретний стан Аліси, але легко перевірити це вимірюванням не вийде. Щоб вимірювання показало, що ми все зробили правильно, потрібно застосувати прийом. Ми використовували оператор «U» для «унітарного», яким готували секретний стан Аліси. Можна застосувати обернений до U наприкінці нашого Circuit. Якщо U відображав стан 0|0\rangle Аліси у α00+α11\alpha_0 |0\rangle+\alpha_1|1\rangle, то обернений до U відобразить α00+α11\alpha_0 |0\rangle+\alpha_1|1\rangle Боба назад до 0.|0\rangle. Цей останній крок не обов'язково виконувати, якщо мета — просто перемістити квантову інформацію. Він потрібен лише для перевірки.

# 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 of the previous code cell

Отже, якщо ми все зробили правильно, наше вимірювання кубіта Боба має дати стан 0|0\rangle. Звісно, ці вимірювання є ймовірнісними. Тому, навіть якщо існує невелика ймовірність виміряти кубіт Боба у стані 1|1\rangle, одне вимірювання може дати 1.|1\rangle. Щоб переконатися, що ймовірність 0|0\rangle є досить високою, нам потрібно зробити багато вимірювань.

Крок 2: Оптимізуй задачу для квантового виконання

Цей крок бере операції, які ми хочемо виконати, і виражає їх у термінах функціональності конкретного квантового комп'ютера. Він також відображає нашу задачу на топологію квантового комп'ютера.

Почнемо із завантаження кількох пакетів, необхідних для зв'язку з квантовими комп'ютерами IBM. Також потрібно вибрати Backend, на якому запускати задачу. Можна або обрати найменш завантажений Backend, або вибрати конкретний Backend, властивості якого нам відомі.

Нижче є код для першого збереження твоїх облікових даних. Не забудь видалити цю інформацію з блокнота після збереження у своєму середовищі, щоб твої облікові дані випадково не потрапили до інших під час поширення блокнота. Дивись Налаштування облікового запису IBM Cloud та Ініціалізація сервісу в ненадійному середовищі для отримання додаткових вказівок.

# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService

# Load the Qiskit Runtime 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)
ibm_sherbrooke

Явно вмикаємо логіку для вимірювань.

from qiskit.circuit import IfElseOp

backend.target.add_instruction(IfElseOp, name="if_else")

Тепер потрібно «транспілювати» квантовий Circuit. Це включає багато підкроків і є захопливою темою. Для прикладу одного підкроку: не всі квантові комп'ютери можуть безпосередньо реалізувати всі логічні гейти Qiskit. Необхідно записати гейти нашого Circuit у термінах гейтів, які квантовий комп'ютер може виконати. Це та інші процеси можна виконати за допомогою preset pass manager. Встановлення optimization = 3 (найвищий рівень оптимізації) гарантує, що відображення нашого абстрактного квантового Circuit на інструкції для квантового комп'ютера буде настільки ефективним, наскільки дозволяє наша попередня обробка.

# 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» — це примітив, призначений для вибірки можливих станів, що виникають у результаті квантового Circuit, і збирання статистики про те, які стани можуть бути виміряні та з якою ймовірністю. Імпортуємо тут Qiskit Runtime Sampler:

# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler

sampler = Sampler(mode=backend)

Не всі обчислення на квантовому комп'ютері можна розумно симулювати на класичних комп'ютерах. Ця проста телепортація точно може, але зовсім не дивно, що ми можемо класично зберегти інформацію в одному місці чи іншому. Ми наполегливо рекомендуємо виконувати ці обчислення на реальному квантовому комп'ютері IBM. Але якщо безкоштовний місячний ліміт вичерпано, або якщо завдання потрібно виконати на заняттях і не можна чекати в черзі, цей модуль можна пройти з використанням симулятора. Для цього просто запусти комірку нижче і розкоментуй відповідні рядки у кроках «Execute».

# 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: Виконання

Використай семплер, щоб запустити задачу, передавши Circuit як аргумент.

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)

Вивід попередньої комірки коду

Перевір своє розуміння

Прочитай запитання нижче, обміркуй відповідь, а потім натисни на трикутник, щоб побачити розв'язок.

Які зі станів вище свідчать про успішну телепортацію, і як це визначити?

Відповідь:

Стани 000,|000\rangle, 001,|001\rangle, 010,|010\rangle, 011|011\rangle — усі сумісні з успішною телепортацією. Це пояснюється тим, що ми додали Gate, який скасовує початкове підготування секретного стану. Якщо секретний стан було успішно телепортовано до кубіта Боба, цей додатковий Gate має повернути його кубіт до стану 0|0\rangle. Тобто будь-який з наведених вище станів, у якому кубіт Боба (Qubit 0, вимірюваний у нульовий компонент класичного регістра, а отже — найстарший/крайній правий) перебуває в стані 0|0\rangle, вказує на успіх.

Цей графік показує всі можливі результати вимірювань трьох кубітів за 5 000 спроб або «знімків» (shots). Раніше ми зазначали, що Аліса вимірює всі можливі стани кубітів A і Q з однаковою ймовірністю. У Circuit ми призначили кубітам 0–2 ролі Q, A і B відповідно. У little-endian нотації кубіт Боба є найлівішим/найменшим. Тому чотири стовпчики ліворуч відповідають стану кубіта Боба 0|0\rangle, а інші два кубіти перебувають у всіх можливих комбінаціях приблизно з однаковою ймовірністю. Зверни увагу: майже всі (зазвичай ~95%) вимірювань дають кубіт Боба у стані 0|0\rangle, тобто наш експеримент вдався! Є невелика кількість знімків (~5%), де кубіт Боба виявився у стані 1|1\rangle. Логічно цього бути не повинно. Проте всі сучасні квантові комп'ютери схильні до шуму та помилок у значно більшій мірі, ніж класичні. А квантова корекція помилок — це поки що лише галузь, що розвивається.

Експеримент 2: Телепортація через процесор

Мабуть, найцікавіший аспект квантової телепортації полягає в тому, що квантовий стан можна миттєво телепортувати на великі відстані (хоча класична передача додаткових Gate — не миттєва). Як уже зазначалось, ми не можемо фізично відламати кубіти від процесора й переносити їх. Але ми можемо переміщати інформацію з одного кубіта на інший доти, доки кубіти, задіяні в телепортації, не опиняться на протилежних кінцях процесора. Повторимо описані вище кроки, але цього разу побудуємо більший Circuit із достатньою кількістю кубітів, щоб охопити весь процесор.

Крок 1: Відобразь задачу на квантовий Circuit

Цього разу кубіти Аліси і Боба будуть змінюватися. Тому ми не будемо давати конкретному кубіту назву «A» чи «B». Натомість ми пронумеруємо кубіти й використаємо змінні для позначення поточного розташування інформації на кубітах Аліси та Боба. Усі інші кроки, крім SWAP Gate, залишаються такими ж, як описано раніше.

# 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")

Вивід попередньої комірки коду

На діаграмі Circuit видно, що логічні кроки залишились такими ж. Єдина відмінність — ми використали SWAP Gate, щоб перенести стан кубіта Аліси з кубіта 6 (A5A_5) до кубіта 1 (A0A_0), що стоїть поруч із Q. І використали SWAP Gate, щоб перенести початковий стан Боба з кубіта 7 (B0B_0) до кубіта 12 (B5B_5). Зверни увагу: стан кубіта 12 взагалі не пов'язаний із секретним станом Q аж до моменту вимірювань на віддалених кубітах 0 і 1, і не дорівнює секретному стану аж до застосування умовних XX і ZZ Gate.

Крок 2: Оптимізуй свій Circuit

Зазвичай, коли ми використовуємо менеджер проходів для транспіляції та оптимізації Circuit, має сенс встановлювати optimization_level = 3, адже ми хочемо, щоб Circuit були якомога ефективнішими. Але в цьому випадку немає обчислювальної причини переносити стани з кубітів 6 і 7 на кубіти 1 і 12. Це ми зробили лише для демонстрації телепортації на відстані. Якщо попросити менеджер проходів оптимізувати наш Circuit, він зрозуміє, що логічної причини для цих SWAP Gate немає, і видалить їх, виконуючи Gate операції на сусідніх кубітах. Тому для цього особливого випадку ми використовуємо 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())
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)

Вивід попередньої комірки коду

Крок 4: Класична постобробка

Знову бачимо, що ймовірності можливих результатів для кубітів Аліси досить рівномірні. Є явна перевага для знаходження кубіта Боба у стані 0|0\rangle після інвертування секретного коду, тобто висока ймовірність того, що ми правильно телепортували секретний стан через весь процесор від Q до Боба (з кубіта 0 до кубіта 12). Однак зазначимо, що тепер приблизно вища ймовірність не отримати 0|0\rangle для Боба. Це важливий урок у квантових обчисленнях: що більше Gate ти використовуєш, особливо багатокубітних, як-от SWAP Gate, то більше шуму й помилок ти отримаєш.

Питання

Викладачі можуть запросити версії цих ноутбуків із ключами відповідей та рекомендаціями щодо включення до типових навчальних програм, заповнивши це коротке опитування про те, як використовуються ноутбуки.

Ключові концепції

  • Кубіти можуть бути заплутані: вимірювання одного кубіта впливає або навіть визначає стан іншого.
  • Заплутаність відрізняється від класичних кореляцій; наприклад, кубіти A і B можуть перебувати в суперпозиції станів на кшталт α000+α111.\alpha_0|00\rangle+\alpha_1|11\rangle. Стан A або B може бути невизначеним від природи, і при цьому A і B гарантовано перебуватимуть в однаковому стані.
  • Завдяки комбінації заплутань і вимірювань можна переносити стан (який може зберігати інформацію) з одного кубіта на інший. Такий перенос може відбуватися навіть на великих відстанях — це і є квантова телепортація.
  • Квантова телепортація спирається на квантові вимірювання, які є імовірнісними. Тому для коригування телепортованих станів може знадобитися класична комунікація. Саме це не дозволяє квантовій телепортації передавати інформацію швидше за світло. Квантова телепортація не порушує теорію відносності чи принцип причинності.
  • Сучасні квантові комп'ютери більш схильні до шуму та помилок, ніж класичні. Очікуй кількох відсотків похибки.
  • Що більше Gate ти додаєш послідовно (особливо 2-кубітних), то більше помилок і шуму варто очікувати.

Запитання «Правда/Хибно»

  1. П/Х Квантову телепортацію можна використовувати для передачі інформації швидше за світло.
  2. П/Х Сучасні дані свідчать, що колапс квантового стану поширюється швидше за світло.
  3. П/Х У Qiskit кубіти впорядковані в станах так, що кубіт з найменшим номером стоїть праворуч, як у q3,q2,q1,q0|q_3,q_2,q_1, q_0\rangle

Запитання з множинним вибором

  1. Кубіти A і B заплутані, а потім розділені на велику відстань dd. Кубіт A вимірюється. Яке твердження правильно описує швидкість, з якою стан кубіта B зазнає впливу?
  • a. Кубіт B зазнає впливу миттєво, в межах експериментальної точності, у проведених досі дослідах.
  • b. Кубіт B зазнає впливу через час d/cd/c, тобто квантовий стан «колапсує» приблизно зі швидкістю світла, в межах експериментальної точності.
  • c. Кубіт B зазнає впливу лише після класичної комунікації, тобто це відбувається за час, більший за d/cd/c.
  • d. Жодне з наведених вище.
  1. Пригадай, що ймовірність вимірювання пов'язана з амплітудами у квантових станах. Наприклад, якщо Qubit початково перебуває у стані α00+α11,\alpha_0|0\rangle+\alpha_1 |1\rangle, ймовірність виміряти стан 0|0\rangle дорівнює α02.|\alpha_0|^2. Не всі набори вимірювань точно відповідатимуть цим ймовірностям через скінченну вибірку (так само, як підкидання монети може двічі поспіль дати решку). Яким із наведених нижче квантових станів може відповідати гістограма вимірювань нижче? Обери найкращий варіант.

entangled_teleportation_fig

  • a. 0|0\rangle
  • b. 12(01)\frac{1}{\sqrt{2}}\left(|0\rangle-|1\rangle\right)
  • c. 12(0+1)\frac{1}{\sqrt{2}}\left(|0\rangle+|1\rangle\right)
  • d. 450+351\frac{4}{5}|0\rangle+\frac{3}{5}|1\rangle
  • e. 350+451\frac{3}{5}|0\rangle+\frac{4}{5}|1\rangle
  1. Які з наведених нижче станів показують заплутаність кубітів A і B? Обери всі правильні варіанти.
  • a. 12(0B0A+1B1A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right)
  • b. 450B0A+351B1A\frac{4}{5}|0\rangle_B|0\rangle_A+\frac{3}{5}|1\rangle_B|1\rangle_A
  • c. 12(0B1A1B0A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|1\rangle_A-|1\rangle_B|0\rangle_A\right)
  • d. 12(0B0A+1B0A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|0\rangle_A\right)
  • e. 0B0A|0\rangle_B|0\rangle_A
  1. У цьому модулі ми підготували заплутаний стан: 12(0B0A+1B1A).\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right). Але існує багато інших заплутаних станів, які можна використати для подібного протоколу. Який зі станів нижче може давати гістограму вимірювань двох кубітів, як показано далі? Обери найкращу відповідь.

entangled_teleportation_fig_0110

  • a. 12(0B0A+1B1A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right)
  • b. 450B0A+351B1A\frac{4}{5}|0\rangle_B|0\rangle_A+\frac{3}{5}|1\rangle_B|1\rangle_A
  • c. 12(0B1A1B0A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|1\rangle_A-|1\rangle_B|0\rangle_A\right)
  • d. 450B1A+351B0A\frac{4}{5}|0\rangle_B|1\rangle_A+\frac{3}{5}|1\rangle_B|0\rangle_A
  • e. 0B0A|0\rangle_B|0\rangle_A

Питання для обговорення

  1. Опиши протокол квантової телепортації від початку до кінця своєму партнеру/групі. Перевір, чи є в них що додати або які запитання виникли.