[Перевод] Квантовая телепортация на языке Q#

Скажу сразу: как бы мне этого ни хотелось, квантовая телепортация не позволит перенести мою бабушку из деревни в мою квартиру. Бабуля знает, что мне нравятся всякие квантовые штуки, и решила вместо денег и носков отправить мне на день рождения квантовое состояние. Здесь мы поговорим о другом — передаче квантовой информации.

Это вторая статья из серии о квантовом программировании. Предполагается, что читатель уже знаком с первой частью.

k_0nu4o_wb5qjn-zoc3d9xavqv0.jpeg

Статьи из цикла:


  1. Квантовые вычисления и язык Q# для начинающих
  2. Введение в квантовые вычисления
  3. Квантовые цепи и вентили — вводный курс
  4. Основы квантовых вычислений: чистые и смешанные состояния
  5. Квантовая телепортация на языке Q#


К сожалению, отправить кубит ни по электронной почте, ни посылкой нельзя. Они передаются по специальным квантовым каналам, а в деревне и Интернет-то появился совсем недавно.

Но, может быть, бабушке удастся передать квантовую информацию по классическому каналу связи (например, через Интернет или телефонную линию)? Проблема заключается в том, что диапазон возможных значений квантового состояния непрерывен, поэтому для его точного описания потребуется бесконечное количество классических бит. Моя бабушка — весьма занятой человек, и у нее нет времени набирать столько бит.

Она уже начала терять всякую надежду, и тут я говорю: «Бабуль, все в порядке». Помнишь, мы в прошлую среду за чаем смастерили состояние Белла? Передать квантовое состояние можно через него! Такая передача квантового состояния с использованием классических каналов связи и называется квантовой телепортацией. Мы постараемся разобраться, как она работает — в теории и в коде.

Отправляем бабушке квантовую почту


Этап 0, подготовительный


Чтобы все описанное ниже сработало, мы с бабушкой должны подготовить состояние Белла: перевести ее кубит |G⟩ и мой кубит |F⟩ в состояние запутанности. Я расстаюсь с бабушкой, но свой кубит (половину состояния Белла) беру с собой. Наши кубиты будут находиться в состоянии запутанности вне зависимости от того, какое расстояние их разделяет — несколько километров или несколько миллиардов световых лет.

Помните, мы обсуждали замечательное свойство запутанных состояний — связанность результатов измерений соответствующих кубитов? Если бабушка измерит состояние своего кубита, это скажется на моем кубите (вне зависимости от расстояния). Ниже мы будем активно использовать это свойство.

Этап 1. Запутывание бабушкиного кубита с |ψ⟩

f592xt9olphpusouyag8i5qe47e.png

Исходное состояние будем описывать с помощью приведенной выше диаграммы. В верхнем левом углу находится предмет всех наших стараний — кубит, который бабушка хочет мне отправить. Он находится в неизвестном состоянии, которое можно представить следующим образом:

9tn2mrk_qvsnxo2xgnqvwzogv9e.png

Кроме того, в ее распоряжении находится кубит |G⟩, который, как мы только что обсуждали, запутан с моим кубитом, |F⟩ (эта их связь показана волнистой линией). Теперь два кубита находятся в состоянии Белла, которое описывается формулой

xk9hquewk0hlpo8mbm2sf93ep6c.png

Вначале мы запутаем бабушкин кубит |G⟩ с состоянием |ψ⟩. Скоро поймете зачем. В предыдущей статье мы узнали, что два кубита можно запутать с помощью схемы, состоящей из вентиля CNOT и вентиля Адамара. Давайте посмотрим, как этот процесс представляется с помощью квантовой цепи.

[Чтобы лучше понимать эти обозначения на диаграммах квантовых цепей, рекомендую вкратце ознакомиться со статьей Квантовые цепи и вентили — вводный курс.]

Применение вентиля CNOT

urqvorrxksyc5ylc1z0onmhtuva.png

Если добавить вентиль CNOT, схема принимает следующий вид. Состояние, которое подается на вход CNOT, можно записать как |ψ⟩|G⟩, где первый вход соответствует верхнему проводу, второй — среднему. Если подставить определения |ψ⟩ и |G⟩, получим:

bereb4jbqtlpzmhawpjoj6k220c.png

Раскроем скобки:

wefxcgi36e17ucapf_30kpjdouc.png

Таким образом, на вход подается hjtnlpzzbgryt96nq9lzkhpj_h8.png. Каждое из этих слагаемых проходит через вентиль CNOT. В первой статье мы видели, как действует вентиль CNOT и как он обрабатывает два кубита. Самые внимательные читатели уже заметили, что все наши слагаемые — |000〉, |011〉, |100〉 и |111〉 — состоят из трех кубитов. В этом случае в роли управляющего кубита используется первый, а управляемым является второй (см. ниже).

a6fcupyzo4kkijegfdpos3tbnhw.png

Когда управляющий кубит равен |1〉, значение управляемого кубита меняется на противоположное. Таким образом, CNOT превращает набор кубитов |100〉 в |110〉, а |111〉 — в |101〉. Все другие состояния остаются прежними.

khn5z2_mlswhswzplwqlrls9gfk.png

Это значит, что состояние трех кубитов после вентиля CNOT будет описываться следующим выражением: moxuri3tcy25vukr9pf5jtjbtfs.png.

Применение вентиля Адамара


Второй этап запутывания кубита |G⟩ с состоянием |ψ⟩ — применение вентиля Адамара к первому кубиту. Вот как это выглядит на диаграмме квантовой цепи:

nez4gsn85tsbo_tbagbw710xi8q.png

Напомню, что вентиль Адамара преобразует |0〉 и |1〉 в состояния

rgxpnv5h13982tewsnzfgs_xjoq.png

После вентиля CNOT кубиты находились в состоянии moxuri3tcy25vukr9pf5jtjbtfs.png. Применим вентиль Адамара к первому кубиту каждого слагаемого. Результат выглядит довольно неаккуратно:

lbxurd3ourgyof4z6wga6us4c0q.png

Итак, мы получили

bsannjuidvlatehsv0rhyg_nqh8.png

Уберем лишнее


Давайте немного причешем нашу формулу. Как можно заметить, в первом слагаемом nzcdeochkpbt3hyc-fm5vcqthbm.png есть две дроби со знаменателем √2. Перемножим их:

lguyzaask0mansqwscrdzb-imus.png

Если применить аналогичную операцию к другим слагаемым, получим uhlkdsdhcpe5wpswshhbhvmqucw.png, 55wpjxqjr9os5jo2ji9fpkwaf-m.png и h_z8631qjypnxxny1zvu9zzqy2u.png. Как можно заметить, у каждой дроби есть множитель ½. Если вынести его за скобки, получим:

f6d8l6y8guuoeh4kwd793wgyffs.png

Выглядит уже лучше. Теперь раскроем скобки (это упростит нам работу на следующем этапе). В качестве примера я приведу выкладки для слагаемого 3rl31uct_dlgrw2nxe419sbzwzg.png.

khqr4piktpjstq2rsecg4p1jyhq.png

Остальные «читателю предлагается сделать в качестве упражнения». Если честно, я такие заманчивые предложения обычно игнорирую. Вот как будут выглядеть оставшиеся слагаемые, если раскрыть скобки:

o3g7bf5xpskc5qzygdmlxr-fbhk.png

Их сумма равна

2q_ik2yfclfcxndjioecdbha1i0.png

Этап 2. Измерение


Итак, мы запутали бабушкин кубит |G⟩ с кубитом |ψ⟩. Теперь измерим их. Но перед этим результаты нужно привести к виду, более удобному для понимания.

Снова подчищаем результаты


Это последний раз, честное слово. Вот все возможные результаты измерения первого и второго кубита: 00, 01, 10, 11. Пока мы не знаем, каким в каждом из этих случаев будет наш третий кубит. Сгруппируем слагаемые так, чтобы понять, в каком состоянии будет находиться третий кубит, а именно мой кубит |F⟩.

Пока наш результат выглядит так:

zlt2-ub0l47fknadufp0isa5u4o.png

Выделим первый и второй кубит каждого слагаемого:

yxojpr3abserpkisoggbvxmkbim.png

Рассмотрим случаи, в которых первый и второй кубит равны |00〉. Им соответствуют слагаемые 5vfgm2rhqsyiqonwsjgunpxv6m0.png. Их можно преобразовать так:

xf44g7rtwrbomluqo0mqiyg-nbg.png

То же самое можно сделать для случаев |01〉, |10〉 и |11〉.

fjcyhfzzj5h3jjcxa7z3o5id6v8.png

После преобразования выражение принимает следующий вид:

thexuwgnwof5xipum2uqlikqw08.png

Отлично.

Измерение


Так выглядит наша цепь с добавленными символами измерения. Обратите внимание на двойные черты после символов измерения. Они соответствуют переносу классических битов, которые и являются результатами измерений.

l4udtyikervtl8ibehpu2u2jv8k.png

Моя бабушка также измеряет свои два кубита, |G⟩ и |ψ⟩. Как мы уже говорили, всего возможно четыре результата измерения: 00, 01, 10 или 11. При измерении кубита суперпозиция его состояний коллапсирует. Предположим, мы измерили состояние первого кубита |ψ⟩ и получили 0. Суперпозиция коллапсирует, и у нас остаются только те слагаемые, которые согласуются с таким результатом измерения (0), то есть следующие:

euwxttlm8pifu1f-el2nwon0gbw.png

Предположим теперь, что мы измерили состояние второго кубита, |G⟩, и получили 0. Суперпозиция коллапсирует. Остается единственное слагаемое, которое согласуется с обоими результатами измерения (0 и 0), то есть следующее:

o14zoz86mktxxprbtlg7-b5twd8.png

Теперь мы знаем, в каком состоянии находится третий кубит (то есть мой кубит |F⟩): в состоянии m7iz_9sjzp2oxpgqnrfkmzj0ft8.png.

Что, если бы в результате измерения мы получили 01? Вернемся к нашему приведенному результату:

9tjpu75gd8e409ok31j_ig0ptkc.png

Рассуждая по аналогии, мы поймем, что единственное слагаемое, которое соответствует результату измерения 01 — 9ys3xa2jaliduoagjizl0qsgbt0.png, а значит, мой кубит должен находиться в состоянии mcme5dvhqfgxyrbmmfbituuddu4.png. Если после измерений бабушка получила результат 10, то я знаю, что третий кубит в состоянии 69u75_n61rl8csjgzb6ushvj3ky.png, а если она получила 11, то третий кубит равен a9ujfyz2ej4-kee3gjjy7vjr0ky.png.

Этот результат можно представить в виде таблицы:

t5e7ccebcnphz13z4jxjpn7tapw.png

Этап 3. Перевод моего кубита (F) в состояние |ψ⟩


Мы остановились на том, что бабушка измерила состояние своих двух кубитов, позвонила мне и рассказала о результате, так что я знаю состояние моего кубита. Помните, что неизвестное состояние, с которого мы начали, |ψ⟩, было равно 6cxcczxjwhtwrqh4yspjmzg0otg.png. Нам нужно применить к моему кубиту определенные операции, чтобы привести его в это состояние — в состояние, которое мне хотела отправить бабушка (в противном случае я получу нечто совсем иное).

Сейчас сделать это будет просто. Взгляните на таблицу выше. Если результат измерений 00, а мой кубит находится в состоянии bvpmx_glbkkmzjjqn42msjnbona.png, то выполнять какие-либо операции над ним не нужно — он уже в состоянии |ψ⟩. Это самый простой случай.

Если результат измерений 01, то мой кубит находится в состоянии ugs_wco11ysl7qb0zq9h2ugxt18.png. Если сравнить его с состоянием |ψ⟩, станет понятно, что нам нужно поменять местами коэффициенты при |0〉 и |1〉. Для этого просто пропустим мой кубит через вентиль NOT, то есть вентиль X, и получим нужный результат yin7p2f6bbtl8kwo00qprynqvk8.png.

При результате измерений 10 мой кубит находится в состоянии mytdvjadvjt4eob1y4c29r8rg_m.png. Сравним его с |ψ⟩. У нас есть s6elbl8p_suhhki-filcqz9ds0y.png, а нужно be6bmb0tpew8zwvxwvqwsydzpxu.png. Чтобы сделать желаемое действительным, применим вентиль Z, который меняет знак.

И последний вариант — 11. В этом случае мой кубит находится в состоянии 9fwayvb1urzmdzj_x4edkcp9xuu.png. Здесь нужно поменять местами коэффициенты при |0〉 и 1〉, а также знак при yz6zjn2qhzunaiq5wdzb5qduavq.png. Таким образом, мой кубит нужно пропустить через вентиль X, а потом через Z. Тогда мы получим нужный результат, b0hvkkdzc9hhf8bjruvpop_6h54.png. Внесем эти операции в таблицу.

z05ffddqi6o9emspwiubae-d_ti.png

Обратите внимание: если первый бит результата измерения равен 1, то мы применяем вентиль Z, а если второй бит равен 1, то применяем вентиль X. Окончательный вариант цепи показан ниже. Мы добавили вентиль Z, используя верхний провод в качестве управляющего, и вентиль X, для которого управляющим будет второй провод. Управляемым при этом будет мой кубит (потому что именно его нужно обработать с помощью вентилей).

9h5sa31hvg9n6-wt6kbmf1o2j3w.png

Итак, мы показали, что бабушке достаточно передать всего два классических бита (а именно результаты измерения состояний кубитов |G⟩ и |ψ⟩), чтобы мы могли узнать неизвестное до этого состояние кубита. Благодаря явлению квантового запутывания информация от бабушки помогает узнать значения коэффициентов α и β. При этом нам удалось обойтись без канала квантовой связи. Поэтому такой метод называется квантовой телепортацией.

Подготавливаем и запускаем код


Итак, мы немного разобрались в теории квантовой телепортации. Пора переходить к коду!
Если на каком-либо шаге вам понадобится помощь, готовый код доступен здесь (просто клонируйте или скачайте репозиторий, откройте файл QuantumTeleportation.sln в Visual Studio и переходите к этапу 5).

Этап 1. Создайте проект


Создайте в Visual Studio новый проект типа «Приложение Q#» и присвойте ему какое-нибудь простое и понятное название — например, QuantumTeleportation.

Этап 2. Загрузите копию кода


Загрузите копию кода с примерами квантовых вычислений на свой компьютер. Для этого клонируйте или скачайте репозиторий.

Этап 3. Измените файл Operation.qs


Теперь нужно заменить весь код в файле Operation.qs на код из файла TeleportationSample.qs, который находится в разделе Quantum > Samples > Teleportation здесь.

Этап 4. Измените файл Driver.cs


Замените весь код в файле Driver.cs на содержимое файла Program.cs.

Этап 5. Сохраните и запустите проект


Нажмите на кнопку «start», чтобы запустить код. На экран будут выведены результаты для итераций 0–8. Они должны выглядеть примерно так:

qmh-bi7ehx9tfft55nr6q6qku_8.png

Разбираемся, как этот код работает


На самом деле вы сможете в нем разобраться и без моей помощи — код замечательно прокомментирован. Мы просто сопоставим его с теорией, разобранной выше, — это будет несложно.

Этап 1. Телепортация


В первой части статьи мы говорили о трех кубитах: кубит в неизвестном состоянии |ψ⟩ и два кубита в состоянии Белла (один у бабушки, второй у меня). Этим трем кубитам в операции Teleport (Телепортация) соответствуют кубиты msg (неизвестное состояние, которое мне отправляет бабушка), here (кубит у бабушки) и there (мой кубит F, где |ψ⟩ — пересылаемое состояние).

Как уже обсуждалось, мы с бабушкой заранее подготовили пару кубитов в состоянии Белла. Один из них находится у бабушки, второй — у меня. Поэтому в самом начале нам нужно запутать ее кубит, который называется here, с моим, there. В коде для этого используются вентиль Адамара и вентиль CNOT:

lnqbbl3qygs1ysdlvyjcxyveuky.png

Воспользуемся нашей диаграммой цепи. Я буду добавлять на нее обозначения по мере их появления в коде.

3bvj0vucyk311_4j3rjqta7vuce.png

Повторяя операции, описанные в начале статьи, мы запутываем кубит бабушки here с неизвестным квантовым состоянием msg. Вентиль CNOT и вентиль Адамара на диаграмме соответствуют следующим строкам кода:

djl_l3qwak5klbreev41llug6b8.png

Затем мы измерили первый и второй кубиты, msg и here. О результатах именно этих измерений бабушка сообщила мне по телефону. Этим событиям соответствуют условия оператора if:

_bkhxtodqa8j-p_z3gehpugdzse.png

Как мы обсуждали в конце первой части этой публикации, после получения результатов измерения нужно изменить состояние моего кубита так, чтобы оно соответствовало кубиту |ψ⟩, то есть msg. Как мы говорили, если результат измерения первого кубита равен 1, то мой кубит (there) нужно пропустить через вентиль Z. Эта операция показана выше. Если результат измерения второго кубита равен 1, то мой кубит нужно пропустить через вентиль X.

Готово! Теперь мой кубит находится именно в том состоянии, которое мне хотела передать бабушка.

Этап 2. TeleportClassicalMessage


Давайте подумаем, как с помощью только что рассмотренной операции Teleport можно передать сообщение. Бабушка уже вполне освоилась с квантовой телепортацией и теперь посылает мне не неизвестное квантовое состояние, а известное — сообщение длиной в один бит. Предположим, я спросила бабушку, включила ли она чайник. Ответом будет одно из двух возможных сообщений — да или нет.

Вначале выделим регистр на два кубита, булево сообщение, которое мы будем пересылать (msg), и мой кубит, (there), с помощью которого бабушка будет передавать сообщение. Помните, что нумерация элементов регистра начинается с 0 (так же, как в массивах). Результат выглядит так:

j5sgjrxm9835m99v_jhxcgd3p_o.png

Кубит msg, который мы выделили, изначально находится в состоянии |0〉 (это состояние по умолчанию для всех выделяемых кубитов). Сообщение бабушки о том, включен ли чайник, может принимать одно из двух значений — да или нет. Если ответ — нет, то ничего дополнительно делать не надо — такое сообщение соответствует состоянию |0〉, в котором кубит msg находится изначально. Если ответ — да, то есть |1〉, то нам нужно пропустить кубит msg через квантовый вентиль NOT, чтобы перевести его в показанное ниже состояние.

bwhk8bximmvyypnxmzok_mkizjy.png

Далее бабушка передает состояние мне с помощью операции Teleport.

dzrdij0j432haiufs-mk8_axeke.png

Затем мы измеряем состояние моего кубита, there.

_hcs6ahuh3zl6qmmrimv81xym7o.png

В результате я получаю сообщение объемом 1 бит и узнаю, могу ли я рассчитывать на горячий чай. Так десятки лет исследований в сферах квантовой механики и вычислений нашли очень важное применение.

Если вы запустите код, на экран будут выводиться результаты передачи различных булевых состояний, которые содержатся в файле Driver.cs.

dz8_bn3ndsw0cfuojzan4rmvybo.png

На этом мы закончим.

hkf5bf8jr5p6lezhprm-7enlno8.png

Ресурсы


  • Более подробная информация доступна на веб-сайте Microsoft Quantum
  • Загрузите Quantum Development Kit
  • Подпишитесь на информационный бюллетень Microsoft Quantum
  • Узнавайте о новейших разработках из блога Microsoft Quantum
  • Twitter
  • Facebook

© Habrahabr.ru