Kako programirati kvantni računalnik - 2. del

Bojne ladje s kvantnimi meritvami

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

Ta članek je z naslovom „Del 2“ v naslovu z dobrim razlogom. Bil je 1. del, v katerem smo pogledali osnovo pisanja in vodenja kvantnih programov.

Domneval bom, da ste prebrali vsaj prvo polovico tega, preden ste prišli sem.

Zadnja večina poročil o kodiranju, ki jih potrebujete za to vadnico. Ta članek se bo osredotočil večinoma na nekatere stvari, ki jih lahko naredimo s temi ukazi.

Kako gledati na kbit

V programih imamo spremenljivke. V nekem trenutku jih bomo morali pogledati.

To bi lahko bilo na koncu programa, ko bomo dobili rezultat. Lahko bi bilo tudi med programom, ko spremenljivko uporabljamo kot del pogojne izjave. Kakor koli, zgodi se veliko. In pri programiranju nekvantnih spremenljivk gre za dokaj neopisljiv postopek.

To je zato, ker imajo nekvančne spremenljivke določene vrednosti. Če jih pogledamo samo nam pove, ali druge dele programa, kakšna je vrednost. Nič glede same spremenljivke se ne bo spremenilo.

To ne velja za kvantne spremenljivke, ki imajo lahko nedoločene vrednosti. Lahko so v tako imenovani kvantni superpoziciji, ki jim omogoča, da imajo hkrati več nasprotujočih si vrednosti.

Ko jih pogledamo, se morajo odpovedati vsem tem nenavadnostim. Prisiljeni so sprejeti določeno vrednost in nam nato povedati, kaj je ta vrednost. Ker to ni samo pasiven postopek, ga je treba skrbno razmisliti. In potrebuje ime. Pravimo mu merjenje.

V tem članku bomo raziskali nekatere lastnosti merjenja. Uporabili ga bomo tudi kot osnovo mehanika igre in natančno videli, kako ga lahko programiramo na kvantnem računalniku. Na koncu bomo imeli novo različico Battleships.

Kartiranje sveta qubita

Preden začnemo zares meriti kvitove, bi morali še malo poskušati razumeti njihov svet. Najboljši način za vizualizacijo qubita je uporaba krogle. Vsako možno stanje kbita ustreza točki na površini te krogle.

Stanji 0 in 1 sta popolnoma različni, popolnoma ločeni. So nasprotja drug drugega. Zato bodo živeli na nasprotnih straneh krogle. Običajno se odločimo, da 0 postavimo na severni pol in 1 na južni.

Izberemo točko, ki je enako oddaljena med obema, nekje vzdolž ekvatorja. Lahko je kjerkoli želiš. Poimenovali ga bomo +. Zakaj +? Zakaj ne?

Stanje + ima tudi nasprotno, saj se od njega razlikuje od 0, to je od 1. Ta živi na nasprotni strani, ki bo tudi točka vzdolž ekvatorja. To državo bomo poimenovali -.

S točkami 0, 1, + in - zdaj definiranimi, nas še nekaj točk prosi za našo pozornost. To so tisti, ki so enako oddaljeni med 0 in 1, prav tako pa so enakomerni med + in -. Temu bomo rekli these in ↺. Zakaj? Ker sem nekoč videl fanta, ki ni napisal Da Vincijeve šifre, in to mi je bilo všeč.

Zdaj smo narisali svet qubita s šestimi točkami. To nikakor niso edine, ki jih bomo kdaj uporabili. So preprosto mejniki, po katerih bomo krmarili.

Merjenje kubita

Kakršna koli meritev nas preprosto vpraša kbit, da izbere med dvema nasprotnima točkama na krogli.

Klasičen primer je za naš najljubši par nasprotnih stanj: 0 in 1. Kbit prosimo, da izbere med obema. Če je bilo že v stanju 0, bo šlo za 0. Qubit v stanju 1 bo podobno dal rezultat 1. Za katero koli drugo stanje bo izid naključen, najbližja možnost pa je najverjetnejša.

Na ekvatorju je tako ali tako velika možnost 50/50. Če je bila torej naša država + ali - in se vprašamo, ali je 0 ali 1, bo morala z enako verjetnostjo izbrati eno ali drugo.

Meritev, ki temelji na 0 in 1, ima nekaj imen. Lahko ga imenujemo meritev 0/1 iz očitnih razlogov. Imenujemo jo tudi meritev osnove Z, zaradi posebnega razmerja, ki ga imata 0 in 1 stanja z operacijo, imenovano z. Več o tej zgodbi kdaj drugič.

Naslednja najbolj priljubljena vrsta meritev je meritev za + in -. Temu bom rekel +/- meritev, vendar boste morda videli tudi imenovanje meritev na osnovi X. Deluje enako kot prej, vendar samo za + in - namesto 0 in 1. Torej, če začnete s kbitom v stanju + in opravite to meritev, boste dobili rezultat +. Če pa začnete z 0 in postavite isto vprašanje, bo izbral naključno.

Imamo tudi meritev za čudne stvari s puščicami. Temu pravimo meritev Y osnove. Nihče ne mara meritev Y osnove.

Malo je le malo, tudi ko je kvantno

Merjenje nekvantnih predmetov je pasiven postopek. Pove vam, kaj predmet počne, vendar ga nikakor ne spreminja. Merjenje kvantnih stvari je zelo različno. Kvantne meritve ne spremenijo samo našega znanja o spremenljivkah. Spreminjajo spremenljivke same.

Recimo, da imate kbit v stanju + in ga vprašajte, ali je 0 ali 1. Ko vam daje naključen rezultat, vas ne odganja samo. Ne govori vam neumnosti, ker ste postavili napačno vprašanje. Ko vam bo prinesel rezultat, se bo držal. Vrednost bo spremenjena, da odraža odgovor. Če vam pove 0, bo 0 za vedno (ali dokler se z njim vsaj ne spopadate). Pozabil bo, da je bil kdaj +.

To pomeni, da je kubit lahko samo enkrat prepričan v svoj rezultat. Če zagotovo ve, ali je 0 ali 1, je popolnoma negotovo, ali je + ali - in tudi popolnoma negotovo, ali je ↻ ali ↺. Kubit ima le omejeno mero gotovosti, omejeno z Heisenbergovim načelom negotovosti.

To pomeni, da smo kdaj dobili informacije samo od kbit. Ko pridobimo en sam binarni rezultat, pozabimo vse, kar je qubit kdaj vedel pred meritvijo. Spominja se le rezultata, ki nam ga je dal. In tako lahko kljub neskončnemu številu možnih qubit stanj izvlečemo le en košček informacij. Zato mislimo na to kot na kvantno različico bitja, ne pa na kvantni plovec ali kvantni 3 vektor itd.

Mehanik igre

Naredili bomo različico Battleships, v kateri bosta napadi dve vrsti: bombe in torpedi. Za potop ladje bo potreben le en uspešen napad, vendar uspešen napad ni vedno tako enostaven. Nekatere ladje imajo tako odlično obrambo pred letali, da se nobena bomba ne bo nikoli približala njim. Drugi so odlični pri odganjanju torpedov.

Če želite to izvajati na običajnem računalniku, bi lahko definirali dve logični spremenljivki za vsako ladjo. Eden bi nam povedal, ali je ladja imuna na bombe, drugi pa za torpeda. Te lahko nato med napadi preverite, ali ladja potone ali ne.

Če bi bila to izvedba, ki jo uporabljamo, bi bilo teoretično mogoče, da bi bila ladja imuna na obe vrsti napada. To bi bilo slabo igranje iger, saj en igralec onemogoča zmago. Za dobro izvajanje bi bilo treba preprečiti neuničljive ladje.

Eden od načinov, kako se izogniti takšnim ladjam, je nekaj preprostih kod. Vendar to v resnici ni naš slog. Namesto tega bomo to popravili s kvantno mehaniko!

Konkretno, poskušali bomo ta dva boola iztisniti v en kbit. Ker se ne bodo povsem prilegali, bomo dobili nekaj zanimivega kvantnega vedenja. To bo v igro dodalo nekaj zanimivega igranja in preprečilo neuničljivost katere koli ladje.

To bomo izvedli tako, da bomo povezali napad z bombo z meritvijo 0/1. Če dobimo rezultat 1, rečemo, da je ladja potonila. Za 0 sklepamo, da je ladja imuna na bombne napade. Za torpeda namesto tega naredimo meritev +/-, pri čemer - pomeni uničenje in + imuniteto.

Ta metoda onemogoča, da bi bila ladja zagotovo imun na obe vrsti napada. Če ugotovimo, da je sovražna ladja imuna na bombe (tj. Njeno stanje je 0), vemo, da mora biti popolnoma popolnoma negotova glede torpedov (izid meritve +/-). Ker bombaški napad zagotovo ne bo uspel, bi morali zato naslednjič napasti s torpedi.

Potem se lahko izkaže, da napad torpeda ne uspe (stanje postane + po meritvi +/-). Ladja bi se odločila, da je na njih vsekakor imuna, in vsak nadaljnji napad s torpedi ne bi uspel. Toda vse upanje ni izgubljeno. S tem ko je postalo gotovo glede torpedov, je postalo negotovo glede bomb. Naslednji napad z njimi (meritev 0/1) bi lahko vodil do zmage.

Če napad z bombo ne uspe, se vrnemo na torpeda in podobno. Najboljša taktika je nadaljevati preklapljanje med obema, dokler ladja končno ne potone.

Ladje bomo začeli kot negotovi glede njihove imunosti do obeh napadov. To je mogoče storiti z inicializacijo qubita v enem od osnovnih stanj Y. Pojdimo za ↻. To je dejansko stanje, ki smo ga spoznali v 1. delu, in sicer u3 (0,5 * pi, 0,0) 0, zato že vemo, kako ga narediti.

Ukvarjanje s kratkotrajnimi kiti

Izvajanje igre na kvantnem procesorju ne bo tako enostavno, kot si morda upamo. Ogledali si bomo vse težave, ki nam bodo prišli na vrsto, in videli, kako jih obiti.

Recimo, da ladjo napade bomba in preživi. Nato ga v naslednjem krogu udari torpedo.

Če bi igro izvajali na običajnem računalniku in jo simulirali z običajnimi biti, bi bilo izvajanje tega povsem enostavno. Ladja bi bila inicializirana, ko se igra začne, nato pa v spominu počakajte, dokler se igralec ne odloči, kaj bo z njo. Ko igralec pošlje bombo, se uporabijo ustrezne operacije, da bi videli, ali je uničen. Če preživi, ​​spet počaka do naslednjega napada.

To nam ne bo uspelo. Kubiti ne morejo sedeti okrog in čakati na človeške časovnice. Nekaj ​​sekund je več kot dovolj časa, da se zrušijo in zažgejo, vsaj s trenutno tehnologijo.

Druga možnost je, da se ob ponovnem napadu sproži nov kvantni postopek. Prvo opravilo se bo inicializiralo s stanjem,, tako da bodo rezultati naključni za meritev 0/1 (napad z bombo) ali +/- meritev (torpedni napad). Rezultat meritve se nato zapiše in shrani v pomnilnik v običajnem računalniku. Ko se zgodi naslednji napad, se ustvari drugo opravilo, da se vidi, kaj se zgodi. Inicializiran bo z rezultatom zadnje meritve in tako nadaljuje.

Izvedemo meritev +/-

Do zdaj sem napisal celo vrsto besed, ne pa niti ene vrstice kode. Začnimo s spominjanjem, kako se v kode QASM izvaja meritev 0/1.

izmerite q [0] -> c [0];

Vloga c [0] je tukaj pomembna za ponovno obravnavo. Je izhod postopka merjenja. To je običajni bit, na katerem je shranjen rezultat meritve. Pri meritvah 0/1 je rezultat 0 ali 1.

Vse to je naravnost enostavno za meritev 0/1. Ampak to so +/- meritve, ki jih zdaj gledamo. Kako pridobimo podatke iz enega od njih?

Rezultat bomo še vedno želeli shraniti v običajni bit c [0]. Ker je to običajen zalogaj, nima poznavanja čudnih stanj + in -. Pozna le normalno binarno obliko. Zato se odločimo, da bomo o rezultatu + poročali kot c [0] = 0 in - kot c [0] = 1. Dejstvo, da bodo videti enako kot rezultati meritve 0/1, ne bo problem. Kot v vsakem računalniškem programu bi morali tudi mi vedeti, kaj smo programirali, in tako bi morali znati razlagati rezultate.

Zdaj vemo, kako izvleči rezultate meritve +/-. Nismo pa še ugotovili, kako to dejansko storiti. To je zato, ker se moramo pri tem prikradeti. Moramo vdreti postopek, ki opravi meritve 0/1 in namesto tega naredi +/- one.

Ključ do našega heca je operacija, imenovana Hadamard. Če to uporabite za qubit q [0] v kodi QASM, je videti tako.

hq [0];

Ukaz, ki ga uporabljamo v Pythonu za dodajanje te vrstice v datoteko QASM, imenovano gridScript, je

gridScript.h (q [0])

Učinek Hadamarda je, da zamenjamo Z osnovna stanja z X osnovnimi in obratno. Gre za vrtenje sfere, ki premakne zavira stanje kita 0 v + in + na 0. Podobno je 1 zasukan v - in obratno.

To pomeni, da moramo zgodbo, ki jo lahko pripovedujemo o qubitu v smislu 0 in 1 pred Hadamardom, povedati s + in - po njej. In vsaka zgodba o + in - postane ena od 0 in 1.

Prav to potrebujemo. To pomeni, da lahko meritev +/- na qubit q [0] izvedemo z naslednjo kodo QASM.

hq [0]; izmerite q [0] -> c [0]; hq [0];

Če želite videti, zakaj to deluje, pojdimo skozi nekaj primerov. Qubit q [0] se bo začel vnovično deklarirati v vsakem in bo tako v privzeti začetni vrednosti 0.

Primer nič:

izmerite q [0] -> c [0];

Kbit se začne v stanju 0. Vpraša se, ali je 0 ali 1 in c [0] pove odgovor. Rezultat bo vedno c [0] = 0.

Primer 1:

xq [0];
izmerite q [0] -> c [0];

Kbit se začne v stanju 0 in se nato zasuka na 1. Nato se vpraša, ali je 0 ali 1. Vedno odgovori na 1.

Primer +:

hq [0];
izmerite q [0] -> c [0];

Kubit se začne v stanju 0 in se takoj vrti v +. Nato se vpraša, ali je njegovo stanje 0 ali 1. Naključno izbere enega ali drugega in njegovo stanje se posodobi z odgovorom.

Zdaj smo naredili nekaj trivialnih primerov, naredimo nekaj bolj zapletenega.

Primer ++:

hq [0];
hq [0]; izmerite q [0] -> c [0]; hq [0];

Kbit se začne v stanju 0 in se nato vrti v +. Po tem obstajata dva enakovredna načina, kako lahko zgodbo nadaljujemo.

Eno je reči, da tri končne črte skupaj opravijo meritev +/-. Qubit vprašajo, ali je + ali -. Za + vrnejo rezultat c [0] = 0, za - pa vrnejo c [0] = 1. Ker gre v tem primeru kbit v meritev s stanjem +, ga vedno merimo kot +. Zato izhaja iz meritve, ki je še vedno v tem stanju.

Za drugo zgodbo si pogledamo učinke vrstic eno za drugo. Drugi Hadamard razveljavi učinek prvega in tako vrti kbit nazaj v stanje 0. Nato se vpraša, ali je njegovo stanje 0 ali 1, in tako vedno odgovori 0. Nadaljnji Hadamard ga spet zavrti v +.

Obe zgodbi se strinjata glede opaznih učinkov. Strinjajo se, da bo izhod c [0] vedno 0, strinjajo pa se, da bo stanje na koncu kvita +. Ne strinjajo se le, kako se je to zgodilo. Obe interpretaciji sta enako veljavni.

Če želite, da na Wikipediji poiščejo nekaj žargona, so to primeri kvantne mehanike Schrödingerja in Heisenberga.

Primer +1:

xq [0];
hq [0]; izmerite q [0] -> c [0]; hq [0];

Tu je še en primer, za katerega imamo dve enakovredni zgodbi. Lahko rečemo, da se q [0] zažene kot 0 in nato zasuka na 1. To se nato zasuka t0 - preden gremo skozi meritev 0/1. Naključno odloči eno ali drugo, poda izhod c [0] = 0 ali c [0] = 1 in njegovo stanje ustrezno posodobi. Če se je odločila z 0, jo končni Hadamard zavrti na +. V nasprotnem primeru se bo končalo kot -.

Lahko pa rečemo, da gre po vrtenju v 1 kbit skozi meritev +/-. Naključno se odloči med tema dvema možnostma, pri čemer dobimo izhod c [0] = 0 za + in c [0] = 0 za -. Stanje se ustrezno posodobi in konča v stanju + ali -.

Ponovno sta ti dve zgodbi enako veljavni in se strinjata o vseh opaznih učinkih. Če želimo pomisliti na tri vrstice

hq [0]; izmerite q [0] -> c [0]; hq [0];

kot +/- merjenje smo to svobodni. Če želimo o tem razmišljati kot o Hadamardu, ki mu sledi meritev 0/1, ki mu sledi Hadamard, je tudi to v redu.

Preden nadaljujemo, je treba opozoriti na eno pomembno stvar. IBM-ov API trenutno ne omogoča, da naredimo karkoli na qubit-u, potem ko smo ga izmerili. Za kvantne računalnike to ni splošno pravilo. Ponavadi pričakujemo, da bomo lahko obdržali meritve in manipulacijo s kitiji tako dolgo, kot bi želeli. Vendar tega trenutno ne moremo storiti.

To nam ne predstavlja težav. Ker qubiti tako ali tako ne morejo sedeti, igralci se tako ali tako odločajo, moramo stanje po vsakem krogu merjenja v celoti poustvariti. Drugi Hadamard se bo učinkovito predstavil v naslednjem poslu, ki bo deloval na reinkarnirano različico države.

Vse druge možne meritve je mogoče doseči s podobnimi krampami. Predhodno moramo opraviti nekaj operacij, da nastavimo svojo alternativno meritev, nato pa (če API dovoli) opraviti nasprotno.

Odkrivanje napak

Trenutna kvantna tehnologija ni popolna. Kiti ne delajo vedno, kar bi morali. Če je vaš kbit 0 in opravite meritev 0/1, mora biti rezultat vedno 0. Vedno. Toda pri trenutnih kvantnih napravah obstaja možnost, da bo 1. Morda je to, da se je operacija x prikradla, medtem ko nismo gledali. Mogoče zato, ker nam meritev laže. Taki dogodki so redki, vendar se zgodijo.

Obstajamo dva načina, kako lahko odpravimo napake. Eno je, da jih ignoriramo. Lahko jih zapišemo v pripoved o igri. Na morju so velike nevihte. Te včasih vodijo, da ladjo napad uniči, tudi če je imuna. Ali preživeti napad, ki bi ga moral uničiti.

Drugi način za reševanje napak je poskus, da odstranite njihove učinke. Če bi bilo na voljo veliko qubitov, bi to lahko storili s kvantnim popravljanjem napak. Žal je to še nekaj let.

Namesto tega bomo naredili nekaj statistike. Za to potrebujemo verjetnosti, ki jih dobimo tako, da vsako opravilo večkrat zaženemo in vidimo, kako pogosto pride do vsakega možnega rezultata.

V primeru brez hrupa bi bile vse verjetnosti 0%, 100% ali 50%. Rezultat je bodisi nemogoč (na primer pridobivanje 1, če je stanje 0), določen (na primer pridobivanje +, če je stanje +), ali pa je povsem naključen (npr. Pridobivanje 0, ko je stanje +).

Hrup jih bo nekoliko zmešal. Ko bomo izmerili vrednost 0/1, lahko ugotovimo, da se rezultat 0 pojavlja le v 98% časa, namesto tega pa 2%. Da bi to popravili, bomo naredili nekaj precej poljubnega. Odločili se bomo, da se nič, kar je manj kot 5% verjetnosti, nikoli ne bi zgodilo. Vse, kar bi imelo več kot 95-odstotno verjetnost, bi moralo biti gotovo.

Vse skupaj

Ta članek je zajel široke poteze mehanike igre za to različico Battleships in kako jo izvajati s kvantnim računalnikom. Namesto da bi podrobneje preučili vse podrobnosti, ki jih dobimo tukaj, bom to pustil za komentarje v dejanski izvorni kodi.

Če obstaja nekaj, za kar menite, da potrebuje več razlage, mi to sporočite.