Як запраграмаваць квантавы камп'ютэр - Частка 2

Браняносцы з квантавымі вымярэннямі

IBM Research https://www.flickr.com/photos/ibm_research_zurich/33072160062/

У артыкуле "Частка 2" у назве ёсць нездарма. Была частка 1, у якой мы разгледзелі аснову напісання і запуску квантавых праграм.

Я мяркую, што вы прачыталі прынамсі першую палову гэтага, перш чым прыязджаць сюды.

Большасць фактычных ведаў па кадаванні, неабходныя для гэтага ўрока, асвятляліся ў апошні раз. У гэтым артыкуле ў асноўным будзе прысвечана некаторыя рэчы, якія мы можам зрабіць з гэтымі камандамі.

Як глядзець на кубіты

У праграмах мы маем зменныя. У нейкі момант нам трэба будзе паглядзець на іх.

Гэта можа быць у канцы праграмы, калі мы атрымаем вынік. Гэта можа быць і падчас праграмы, калі мы выкарыстоўваем зменную як частку ўмоўнай заявы. Так ці інакш, бывае шмат. А пры праграмаванні неквантавых пераменных гэта даволі адметны працэс.

Гэта таму, што неквантавыя зменныя маюць пэўныя значэнні. Гледзячы на ​​іх, проста падказвае нам, ці ў іншых частках праграмы, якое значэнне ёсць. Нічога пра самую зменную не зменіцца.

Гэта не тычыцца квантавых зменных, якія могуць мець нявызначаныя значэнні. Яны могуць знаходзіцца ў так званай квантовай суперпазіцыі, якая дазваляе ім утрымліваць адразу некалькі супярэчлівых значэнняў.

Калі мы глядзім на іх, яны павінны адмовіцца ад усіх гэтых незвычайнасцяў. Яны вымушаныя прыняць пэўную каштоўнасць, а потым паведаміць нам, што гэта. Паколькі гэта не проста пасіўны працэс, ён патрабуе ўважлівага разгляду. І ім трэба імя. Мы называем гэта вымярэннем.

У гэтым артыкуле мы разгледзім некаторыя ўласцівасці вымярэння. Мы таксама будзем выкарыстоўваць яго ў якасці асновы гульнявога механіка і паглядзім, як дакладна запраграмаваць яго на квантавым кампутары. У рэшце рэшт у нас з'явіцца новая версія Battleships.

Картаванне свету кубіта

Перш чым мы па-сапраўднаму прыступім да вымярэння кубітаў, мы павінны паспрабаваць зразумець іх свет крыху больш. Лепшы спосаб візуалізаваць кубіт - гэта выкарыстанне сферы. Любы магчымы стан кубіта адпавядае пункту на паверхні гэтай сферы.

Станы 0 і 1 абсалютна розныя, абсалютна нязгодныя. Яны супрацьлегласці адзін аднаму. Такім чынам, яны будуць жыць па розныя бакі сферы. Звычайна мы выбіраем 0 на паўночным полюсе і 1 на паўднёвым.

Давайце выбярэм кропку, якая знаходзіцца на роўнай адлегласці паміж імі, дзесьці ўздоўж экватара. Гэта можа быць дзе заўгодна. Мы будзем называць гэта +. Чаму +? Чаму не?

Стан + таксама мае адваротнае, адрознае ад яго, а 0 - 1. Гэта жыццё на супрацьлеглым баку, які таксама будзе кропкай уздоўж экватара. Мы будзем называць гэты стан -.

З ачкамі 0, 1, + і - цяпер вызначана, яшчэ адна пара балаў выпрошвае нашу ўвагу. Гэта тыя, якія знаходзяцца на адлегласці ад 0 да 1, а таксама паміж + і -. Мы назавём гэтыя ↻ і ↺. Чаму? Таму што я аднойчы бачыў хлопца, які не пісаў Код да Вінчы, і ён мне спадабаўся.

Цяпер мы вызначылі свет кубіта з шасцю пунктамі. Гэта зусім не адзіныя, якія мы калі-небудзь будзем выкарыстоўваць. Яны проста арыенціры, па якіх мы будзем арыентавацца.

Вымярэнне кубіта

Любое вымярэнне проста нам просіць кубіт выбіраць паміж двума процілеглымі пунктамі на сферы.

Класічны прыклад для нашай любімай пары процілеглых станаў: 0 і 1. Мы просім кубіт выбіраць паміж двума. Калі ён ужо быў у стане 0, ён пойдзе на 0. Кубіт у стане 1 дасць вынік 1. У любым іншым стане вынік будзе выпадковым, найбольш верагодным будзе найбліжэйшы варыянт.

На экватары гэта шанец 50/50 у любым выпадку. Такім чынам, калі ў нашай дзяржавы было + ці -, і мы спытаемся, ці з'яўляецца гэта 0 ці 1, прыйдзецца выбраць той ці іншы з аднолькавай верагоднасцю.

Вымярэнне на аснове 0 і 1 мае некалькі назваў. Мы можам назваць гэта вымярэнне 0/1 па зразумелых прычынах. Яго таксама называюць вымярэннем на аснове Z, з-за адмысловай залежнасці, якое мае стан 0 і 1 пры аперацыі, званай z. Больш пра гэтую гісторыю іншым разам.

Наступным найбольш папулярным выглядам вымярэнняў з'яўляецца мяжа для + і -. Я буду называць гэта вымярэннем +/-, але вы можаце таксама ўбачыць яго як X-вымярэнне на аснове. Працуе гэтак жа, як і раней, але толькі для + і - замест 0 і 1. Такім чынам, калі пачаць з кубіта ў стане + і зрабіць гэта вымярэнне, вы атрымаеце вынік +. Але калі пачаць з 0 і задаць адно і тое ж пытанне, ён абярэ выпадковым чынам.

У нас таксама ёсць вымярэнне дзіўных рэчаў са стрэлкамі. Гэта называецца вымярэннем Y на аснове. Ніхто не любіць Y базавых вымярэнняў.

Трохі - гэта няшмат, нават калі гэта квант

Вымярэнне неквантавых аб'ектаў - гэта пасіўны працэс. Ён паведамляе вам, што робіць аб'ект, але ён нічога не мяняе. Вымярэнне квантавых рэчаў вельмі адрозніваецца. Квантовыя вымярэнні не проста змяняюць нашы веды аб пераменных. Яны самі мяняюць зменныя.

Выкажам здагадку, што ў вас ёсць кубіт у стане +, а потым спытаеце яго: 0 ці 1. Калі ён дае вам выпадковы вынік, ён не проста выкрадае вас. Гэта не кажа вам глупства, бо вы задалі няправільнае пытанне. Як толькі ён дае вам вынік, ён будзе прытрымлівацца яго. Гэта значэнне зменіцца, каб адлюстраваць адказ. Калі ён скажа вам 0, ён будзе вечна 0 (альбо пакуль вы зноў не зварочваецеся з ім). Будзе забывацца, што гэта было калі-небудзь +.

Гэта азначае, што кубіт можа быць упэўнены ў сваім выніках толькі пры адным вымярэнні. Калі ён дакладна ведае, што гэта 0 ці 1, ён цалкам нявызначаны, ці будзе гэта +, альбо -, а таксама цалкам нявызначана, ці з'яўляецца гэта ↻ ці ↺. Кубіт мае толькі абмежаваную колькасць дакладнасці, абмежаваную прынцыпам нявызначанасці Гейзенберга.

Гэта азначае, што мы атрымаем толькі адзін стрэл, каб атрымаць інфармацыю з кубіта. Як толькі мы атрымаем адзіны бінарны вынік, усё, што кубіт калі-небудзь ведаў да вымярэння, забываецца. Ён памятае толькі той вынік, які ён даў нам. І таму, нягледзячы на ​​бясконцую колькасць магчымых станаў кубітаў, мы можам толькі калі-небудзь здабыць адзінку інфармацыі. Менавіта таму мы разглядаем гэта як няшмат квантавага варыянту, а не квантавага паплаўка або квантавага 3 вектара і г.д.

Гульня механік

Мы збіраемся зрабіць варыянт лінкораў, у якім будзе атака двух тыпаў: бомбы і тарпеды. Для таго, каб затапіць карабель, спатрэбіцца толькі адна ўдалая атака, але атрымаць паспяховую атаку не заўсёды так проста. Некаторыя караблі маюць такую ​​цудоўную абарону ад самалётаў, што ні адна бомба ніколі не наблізіцца да іх. Іншыя выдатна адштурхоўваюць тарпеды.

Каб рэалізаваць гэта на звычайным кампутары, мы маглі б вызначыць дзве булевыя зменныя для кожнага карабля. Адзін сказаў бы нам, што карабель не застрахаваны ад бомбаў, а другі да тарпед. Затым іх можна праверыць падчас нападаў, каб даведацца, ці пагружаецца карабель ці не.

Калі б гэта была рэалізацыя, якую мы выкарыстоўваем, тэарэтычна было б магчыма, каб карабель быў неўспрымальны да абодвух тыпаў нападаў. Гэта будзе дрэнны дызайн гульні, бо немагчыма выйграць аднаго гульца. Добрае ўкараненне павінна прадухіліць ўзнікненне непарушных караблёў.

Адзін са спосабаў пазбегнуць вырабу такіх караблёў - гэта некалькі простых радкоў кода. Але гэта сапраўды не наш стыль. Замест гэтага мы збіраемся выправіць гэта з дапамогай квантавай механікі!

У прыватнасці, мы паспрабуем сціснуць гэтых двух булеў у адзін кубіт. Паколькі яны не зусім падыдуць, мы атрымаем цікавае квантавае паводзіны. Гэта дадасць цікавай гульні ў гульню, а таксама не дапусціць непарушнасці любога карабля.

Мы будзем рэалізоўваць гэта, аб'яднаўшы выбух з вымярэннем 0/1. Калі мы атрымаем вынік 1, мы скажам, што карабель патануў. Для 0 мы выводзім, што карабель не застрахаваны ад атак. Для тарпед замест гэтага мы робім вымярэнне +/-, а - маючы на ​​ўвазе разбурэнне і +, якое прадугледжвае імунітэт.

Гэты метад не дазваляе караблі быць неўспрымальным да абодвух тыпаў нападаў. Калі мы даведаемся, што варожы карабель не застрахаваны ад бомбаў (гэта значыць, яго стан роўны 0), мы ведаем, што ён павінен быць цалкам нявызначаны адносна тарпед (вынік вымярэння +/-). Паколькі тэракт, безумоўна, не зможа, мы павінны наступным чынам атакаваць тарпедамі.

Тады можа апынуцца, што тарпедная атака не працуе (стан становіцца + пасля вымярэння +/-). Карабель вырашыў, што, безумоўна, не застрахаваны ад іх, і любое далейшае нападзенне тарпеды не будзе. Але ўся надзея не губляецца. Стаўшы ўпэўненым у тарпедах, яно стала бомбам. Наступная атака з імі (вымярэнне 0/1) можа прывесці да перамогі.

Калі тэракт не атрымаецца, мы вернемся да тарпед і гэтак далей. Лепшая тактыка заключаецца ў тым, каб працягваць пераключэнне паміж імі, пакуль карабель канчаткова не патапіць.

Мы пачнем адпраўляць караблі як нявызначаныя ў іх імунітэце да абедзвюх нападаў. Зрабіць гэта можна шляхам ініцыялізацыі кубіта ў адным з базавых станаў Y. Пойдзем да for. Гэта насамрэч стан, з якім мы сустрэліся ў частцы 1, а менавіта u3 (0,5 * pi, 0,0) 0, таму мы ўжо ведаем, як зрабіць гэта.

Справа з нядоўгімі кубітамі

Рэалізацыя гульні на квантавым працэсары не будзе такой простай, як мы можам спадзявацца. Мы паглядзім на ўсе праблемы, якія стануць на нашым шляху, і паглядзім, як іх абысці.

Дапусцім, карабель падвяргаецца нападу бомбы і выжывае. Затым у наступным раўндзе ён трапляе пад тарпеду.

Калі гульня была запушчана на звычайным кампутары і імітавалася з дапамогай звычайных біт, рэалізацыя гэтага была б даволі простая. Карабель будзе ініцыялізаваны, калі гульня пачынаецца, а потым чакаць у памяці, пакуль гулец не вырашыць, што з ім рабіць. Пасля таго, як гулец адпраўляе бомбу, адпаведныя аперацыі будуць прымяняцца, каб даведацца, ці будзе яна знішчана. Калі ён выжыве, ён зноў чакае наступнай атакі.

Гэта не атрымаецца для нас. Кубіты не могуць сядзець побач, чакаючы чалавечых часовых знакаў. Некалькі секунд больш чым дастаткова часу, каб яны ўрэзаліся і спалілі, прынамсі, пры сучасных тэхналогіях.

Альтэрнатыва - запускаць новы квантавы працэс кожны раз, калі робіцца атака. Першае заданне будзе ініцыялізавана са станам,, так што вынікі будуць выпадковымі як для вымярэння 0/1 (бомба), так і для вымярэння +/- (нападзенне тарпеды). Затым вынік вымярэння запісваецца і захоўваецца ў памяці на звычайным кампутары. Калі наступная атака адбудзецца, ствараецца іншая праца, каб паглядзець, што адбываецца. Ён будзе ініцыялізаваны з вынікам апошняга вымярэння і так працягваецца.

Робім вымярэнне +/-

Пакуль я напісаў цэлую колькасць слоў, але ніводнага радка кода. Для пачатку нагадаем, як у QASM-код рэалізуецца вымярэнне 0/1.

вымярэнне q [0] -> c [0];

Ролю c [0] тут важна перагледзець. Гэта выхад з працэсу вымярэння. Гэта звычайны біт, на якім захоўваецца вынік вымярэння. Для вымярэння 0/1 вынік складае 0 або 1.

Усё гэта даволі проста для вымярэння 0/1. Зараз гэта +/- вымярэння. Як мы можам атрымаць інфармацыю з аднаго з іх?

Мы ўсё яшчэ захочам захаваць вынік у звычайным біце c [0]. Паколькі гэта звычайны біт, ён не ведае пра дзіўныя стану і -. Ён ведае толькі звычайныя бінарныя. Таму мы вырашаем паведамляць пра вынік + як c [0] = 0, і - як c [0] = 1. Тое, што яны будуць выглядаць гэтак жа, як і вынікі вымярэння 0/1, не будзе праблемай. Як і ў любой камп'ютэрнай праграме, мы павінны ведаць, што мы запраграмавалі, і таму мы павінны ведаць, як інтэрпрэтаваць вынікі.

Цяпер мы ведаем, як атрымаць вынікі вымярэння +/-. Але мы яшчэ не даведаліся, як зрабіць гэта на самай справе. Гэта таму, што мы павінны быць подлымі да гэтага. Мы павінны ўзламаць працэс, які робіць вымярэння 0/1 і прымусіў яго зрабіць +/- адзін.

Ключ да нашага ўзлому - аперацыя, якая называецца Адамард. Прымяненне гэтага да кубіта q [0] у кодзе QASM выглядае так.

hq [0];

Каманда, якую мы выкарыстоўваем у Python, каб дадаць гэты радок да файла QASM пад назвай gridScript is

gridScript.h (q [0])

Эфект Адамара заключаецца ў тым, каб памяняць Z базавых станаў на асновы X і наадварот. Гэта кручэнне Сферы, якое перамяшчае павароты стану кубіта 0 у +, а + у 0. Аналагічна, 1 круціцца ў - і наадварот.

Гэта азначае, што гісторыю, якую мы можам распавесці пра кубіт у тэрмінах 0 і 1 да Адамара, мы павінны распавесці разам з + і - пасля яго. І любая гісторыя + і - становіцца адной з 0 і 1.

Гэта менавіта тое, што нам трэба. Гэта азначае, што вымярэнне +/- на кубіце q [0] можна зрабіць наступным кодам QASM.

hq [0]; вымярэнне q [0] -> c [0]; hq [0];

Каб даведацца, чаму гэта працуе, перагледзім некалькі прыкладаў. Кубіт q [0] пачнецца толькі што абвешчаным у кожным, і такім чынам па змаўчанні будзе пачатковым значэннем 0.

Прыклад нуля:

вымярэнне q [0] -> c [0];

Кубіт пачынаецца ў стане 0. Пытаецца, ці з'яўляецца ён 0, альбо 1 і паведамляе c [0] адказ. Вынік заўсёды будзе c [0] = 0.

Прыклад:

xq [0];
вымярэнне q [0] -> c [0];

Кубіт пачынаецца ў стане 0, а потым паварочваецца да 1. Затым пытаецца, роўна Ці гэта 0 альбо 1. Ён заўсёды адказвае 1.

Прыклад +:

hq [0];
вымярэнне q [0] -> c [0];

Кубіт пачынаецца ў стане 0 і адразу ж пераходзіць у +. Затым пытаецца, ці з'яўляецца яго стан 0 альбо 1. Ён выпадковым чынам выбірае той ці іншы, і яго стан абнаўляецца з адказам.

Цяпер мы зрабілі некалькі банальных прыкладаў, давайце зробім нешта больш складанае.

Прыклад ++:

hq [0];
hq [0]; вымярэнне q [0] -> c [0]; hq [0];

Кубіт пачынаецца ў стане 0, а затым пераходзіць у +. Пасля гэтага ёсць два эквівалентныя спосабы, па якіх мы можам працягнуць гісторыю.

Варта сказаць, што тры выніковыя лініі сумесна робяць вымярэнне +/-. Яны пытаюцца ў кубіта, ці гэта +, альбо -. Для + яны вяртаюць вынік c [0] = 0, а для - яны вяртаюць c [0] = 1. Паколькі кубіт у гэтым прыкладзе пераходзіць у вымярэнне стане +, ён заўсёды вымяраецца як +. Такім чынам, гэта выходзіць з вымярэння яшчэ ў гэтым стане.

У іншай гісторыі мы разгледзім эфекты радкоў адзін за адным. Другі Адамард адмяняе эфект першага і так вяртае кубіт назад у стан 0. Затым пытаецца, ці з'яўляецца яго стан 0 альбо 1, і таму заўсёды адказвае 0. Далейшы Адамард зноў вяртае яго да +.

Абедзве гісторыі згодныя з назіральнымі эфектамі. Яны згодныя, што выхад c [0] заўсёды будзе 0, і яны згодныя, што стан кубіта ў канцы будзе +. Яны проста не згодныя з тым, як гэта адбылося. Абедзве трактоўкі аднолькава справядлівыя.

Калі вы хочаце, каб нейкі жаргон паглядзеў на Вікіпедыю, гэта прыклады малюнкаў Шрэдэнгера і Гейзенберга з квантавай механікі.

Прыклад +1:

xq [0];
hq [0]; вымярэнне q [0] -> c [0]; hq [0];

Вось яшчэ адзін прыклад, для якога мы маем дзве эквівалентныя гісторыі. Можна сказаць, што q [0] пачынаецца з 0, а затым паварочваецца да 1. Затым паварочваецца t0 - перад тым, як прайсці вымярэнне 0/1. Ён выпадковым чынам вырашае той ці іншы, дае выхад c [0] = 0 або c [0] = 1 і адпаведна яго стан абнаўляецца. Калі ён прыняў рашэнне 0, канчатковы Адамар паварочвае яго да +. У адваротным выпадку яно скончыцца як -.

У якасці альтэрнатывы можна сказаць, што пасля павароту да 1 кубіт праходзіць вымярэнне +/-. Ён выпадкова прымае рашэнне паміж гэтымі двума варыянтамі, даючы выхад c [0] = 0 для + і c [0] = 0 для -. Стан абнаўляецца адпаведна, атрымліваючы альбо ў стане +, альбо -.

Зноў жа, гэтыя дзве гісторыі аднолькава справядлівыя і ўзгадняюць усе назіраныя эфекты. Калі мы хочам прыдумаць тры радкі

hq [0]; вымярэнне q [0] -> c [0]; hq [0];

як +/- вымярэнне, мы можам зрабіць гэта. Калі мы хочам успрымаць гэта як Адамара з наступным вымярэннем 0/1, за якім ідзе Адамард, гэта таксама выдатна.

Ёсць адна важная рэч, якую трэба адзначыць, перш чым рухацца далей. API IBM зараз не дазваляе нам рабіць што-небудзь з кубітам пасля таго, як мы яго вымералі. Гэта не агульнае правіла для квантавых кампутараў. Звычайна мы чакаем, што мы зможам весці вымярэння і маніпуляванне кубітамі столькі, колькі мы хацелі б. Але мы не можам гэта зрабіць.

Гэта не стварае нам ніякіх праблем. Паколькі кубіты не могуць сядзець побач, пакуль гульцы ўсё роўна прымаюць выбар, нам ужо прыйдзецца цалкам узнавіць стан пасля кожнага раунду вымярэнняў. Другі Хадамар эфектыўна з'явіцца ў наступнай працы, дзейнічаючы па пераўвасабленай версіі дзяржавы.

Усе іншыя магчымыя вымярэнні могуць быць дасягнуты аналагічнымі ўзломамі. Мы проста павінны зрабіць некаторыя аперацыі загадзя, каб усталяваць наша альтэрнатыўнае вымярэнне, а потым (калі API дазваляе) зрабіць пасля зваротнага дзеяння.

Справа з памылкамі

Сучасная квантавая тэхналогія не з'яўляецца дасканалай. Кубіты не заўсёды робяць тое, што трэба. Калі ваш кубіт роўны 0 і вы робіце вымярэнне 0/1, вынік заўсёды павінен быць 0. Заўсёды. Але ў цяперашніх квантавых прылад ёсць верагоднасць, што гэта будзе 1. Магчыма, таму, што аперацыя х пракралася ў той час, калі мы яго не шукалі. Гэта можа быць таму, што вымярэнне нам хлусіць. Такія падзеі сустракаюцца рэдка, але здараюцца.

Ёсць два спосабы ліквідацыі памылак. Адно - ігнараваць іх. Мы можам запісаць іх у апавяданне пра гульню. На моры бываюць вялікія штормы. Часам яны прыводзяць да знішчэння карабля ў выніку нападу, нават калі ён абаронены. Ці выжыў у выніку нападу, які мусіў яго знішчыць.

Другі спосаб барацьбы з памылкамі - паспрабаваць выдаліць іх наступствы. Калі б кубітаў было шмат, мы маглі б зрабіць гэта з дапамогай квантовай карэкцыі памылак. На жаль, гэта яшчэ некалькі гадоў.

Замест гэтага мы будзем рабіць статыстыку. Для гэтага нам патрэбныя верагоднасці, якія мы атрымліваем, выконваючы кожную працу шмат разоў і бачачы, як часта кожны магчымы вынік узнікае.

У бясшумным выпадку верагоднасць складае 0%, 100% або 50%. Вынік альбо немагчымы (напрыклад, атрыманне значэння 1, калі стан 0), пэўны (напрыклад, атрыманне +, калі стан +), альбо цалкам выпадковы (напрыклад, атрыманне значэння "0", калі стан +).

Шум іх крыху сапсуе. Калі мы робім вымярэнне 0/1, мы можам выявіць, што вынік 0 адбываецца толькі ў 98% часу, а 2% адбываецца замест 1. Каб выправіць гэта, мы зробім нешта даволі адвольнае. Мы вырашым, што нічога з меншай 5% верагоднасцю ніколі не павінна было адбыцца. Усё, што мае больш чым 95% верагоднасць, павінна быць напэўна.

Збіраем усё гэта разам

У гэтым артыкуле асвятляюцца шырокія рысы гульнявога механіка для гэтай версіі Battleships, а таксама як рэалізаваць яе з дапамогай квантавага кампутара. Замест таго, каб прайсці тут усе дэталёва-дробныя дэталі, я пакіну гэта для каментарыяў у фактычным зыходным кодзе.

Калі ёсць што-небудзь, на вашу думку, трэба больш тлумачэнняў, не саромейцеся, дайце мне ведаць.