Kako programirati kvantno računalo - 2. dio

Borbeni brodovi s kvantnim mjerenjima

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

Ovaj članak ima dobar dio u naslovu "Dio 2". Uslijedio je prvi dio u kojem smo razmotrili osnovu pisanja i izvođenja kvantnih programa.

Pretpostavljam da ste pročitali barem prvu polovicu toga prije dolaska.

Većina stvarnih znanja o kodiranju koja su vam potrebna za ovaj udžbenik, pokrivena je posljednji put Ovaj će se članak uglavnom usredotočiti na neke stvari koje možemo učiniti s ovim naredbama.

Kako gledati na qubits

U programima imamo varijable. U nekom ćemo ih trenutku morati pogledati.

To bi moglo biti na kraju programa kad dobijemo rezultat. Moglo bi se dogoditi i tijekom programa, kada varijablu koristimo kao dio uvjetne izjave. Bilo kako bilo, događa se puno. A kod programiranja nekvantnih varijabli prilično je neupadljiv proces.

To je zato što nekvantne varijable imaju određene vrijednosti. Gledajući ih samo nam govori, ili drugim dijelovima programa, koja je vrijednost. Ništa se oko same varijable neće promijeniti.

To se ne odnosi na kvantne varijable, koje mogu imati neodređene vrijednosti. Oni mogu biti u takozvanoj kvantnoj superpoziciji, što im omogućuje da drže više suprotnih vrijednosti odjednom.

Kad ih pogledamo, oni se moraju odreći svih tih neobičnosti. Prisiljeni su uzeti određenu vrijednost, a zatim nam kažu koja je to vrijednost. Budući da ovo nije samo pasivan proces, treba ga pažljivo razmotriti. I treba mu ime. Mi to zovemo mjerenje.

U ovom ćemo članku istražiti neka svojstva mjerenja. Također ćemo ga koristiti kao osnovu mehaničara igara i vidjeti točno kako ga programirati na kvantnom računalu. Na kraju ćemo imati novu verziju Battleships-a.

Kartiranje svijeta qubita

Prije nego što stvarno započnemo s mjerenjima kbita, trebali bismo pokušati malo više razumjeti njihov svijet. Najbolji način vizualizacije qubita je upotreba sfere. Svako moguće stanje kubita odgovara točki na površini ove sfere.

Stanja 0 i 1 su potpuno različita, potpuno drugačija. Oni su suprotnosti jedni drugima. Oni će stoga živjeti na suprotnim stranama sfere. Obično odlučimo staviti 0 na sjeverni pol i 1 na južni.

Odaberemo točku koja je jednaka između njih, negdje duž ekvatora. To može biti bilo gdje gdje želite. Nazvat ćemo ga +. Zašto +? Zašto ne?

Stanje + također ima suprotno, ono što je različito od njega kao 0 i od 1. To živi na suprotnoj strani, što će također biti točka duž ekvatora. Nazvat ćemo ovu državu -.

Uz bodove 0, 1, + i - sada definirano, za našu pažnju moli se još par točaka. Ovo su oni koji su jednako udaljeni između 0 i 1, a jednako su udaljeni i između + i -. Nazvat ćemo ih ↻ i ↺. Zašto? Jer jednom sam vidio tipa koji nije napisao Da Vincijev kod koji to radi, i svidio mi se.

Sada smo mapirali svijet qubita sa šest točaka. To nikako nisu jedine koje ćemo ikada koristiti. Oni su jednostavno orijentiri po kojima ćemo kretati.

Mjerenje kubita

Svako mjerenje jednostavno od nas traži da kbit odabere između dvije suprotne točke na sferi.

Klasičan je primjer za naš omiljeni par suprotnih stanja: 0 i 1. Pitamo kbit da biramo između ta dva. Ako je već u stanju 0, prelazit će se za 0. Qubit u stanju 1 na sličan će način dati rezultat 1. Za bilo koje drugo stanje, ishod će biti slučajan, s tim da je najbliža opcija najvjerojatnija.

Na ekvatora, bilo koja šansa je 50/50. Dakle, ako je naša država bila + ili -, a mi se pitamo je li to 0 ili 1, morat će s jednakom vjerojatnošću odabrati jedno ili drugo.

Mjerenje na temelju 0 i 1 ima nekoliko naziva. Iz očiglednih razloga možemo to nazvati mjerom 0/1. Također se naziva i mjerenje Z osnove, zbog posebnog odnosa koji države 0 i 1 imaju s operacijom zvanom z. Više o toj priči drugi put.

Sljedeća najpopularnija vrsta mjerenja je ona za + i -. Ja ću to nazvati +/- mjerenje, ali vi ćete ga možda vidjeti i kao X osnovno mjerenje. Djeluje na isti način kao i prije, ali samo za + i - umjesto 0 i 1. Dakle, ako započnete s kbitom u stanju + i izvršite ovo mjerenje, dobit ćete rezultat +. Ali ako započnete sa 0 i postavite isto pitanje, odabrat će nasumično.

Imamo i mjerenje čudnih stvari sa strelicama. To se naziva mjerenje Y osnove. Nitko ne voli mjerenja Y osnove.

Malo je samo malo, čak i kad je kvantno

Mjerenje nekvantnih predmeta pasivan je proces. To vam govori o čemu se radi, ali to ni na koji način ne mijenja. Mjerenje kvantnih stvari vrlo je različito. Kvantna mjerenja ne mijenjaju samo naše znanje o varijablama. Oni mijenjaju same varijable.

Pretpostavimo da imate kbit u državi + i pitajte ga da li je 0 ili 1. Kada vam daje slučajni rezultat, to vas neće samo otjerati. To vam ne govori gluposti jer ste postavili pogrešno pitanje. Jednom kada vam daje rezultat, on će se držati toga. Vrijednost će se promijeniti u skladu s odgovorom. Ako vam kaže 0, iznosit će 0 zauvijek (ili barem dok se ne pobrkate ponovo, barem). Zaboravit će da je to ikad bilo +.

To znači da kubit može biti siguran u svoje rezultate samo jednim mjerenjem. Ako se definitivno zna je li 0 ili 1, potpuno je neizvjesno je li + ili -, a također je potpuno neizvjesno je li ↻ ili ↺. Kubit ima samo ograničenu sigurnost, koju ograničava Heisenbergov princip neizvjesnosti.

To znači da ćemo dobiti samo jedan snimak kad dobijemo informacije od qubita. Jednom kad izvučemo jedan binarni rezultat, sve što je qubit ikad znao prije mjerenja se zaboravlja. Sjeća se samo rezultata koji nam je dao. I tako, unatoč beskonačnom broju mogućih stanja kubita, uvijek možemo izvući samo jedan malo informacija. Zato mi to mislimo kao kvantnu verziju bita, a ne kvantni plovak ili kvantni 3 vektor itd.

Mehaničar igre

Napravit ćemo varijantu Battleships u kojoj će biti dvije vrste napada: bombe i torpeda. Za poniranje broda bit će potreban samo jedan uspješan napad, ali dobivanje uspješnog napada nije uvijek tako jednostavno. Neki brodovi imaju tako sjajnu obranu od zrakoplova da se niti jedna bomba nikada neće približiti njima. Drugi su sjajni u odbijanju torpeda.

Da bismo to implementirali na normalno računalo, mogli bismo definirati dvije logičke varijable za svaki brod. Jedan bi nam rekao je li brod imun na bombe, a drugi za torpeda. To se zatim može provjeriti tijekom napada kako bi se vidjelo je li brod potonuo ili ne.

Da je ovo bila primjena koju koristimo, teoretski bi bilo moguće da brod nije imun na obje vrste napada. To bi bio loš dizajn igre, jer onemogućava jednog igrača da pobijedi. Dobra provedba trebala bi spriječiti postojanje neuništiva brodova.

Jedan od načina izbjegavanja izrade takvih brodova je nekoliko jednostavnih linija koda. To zapravo nije naš stil. Umjesto toga, popravit ćemo to kvantnom mehanikom!

Konkretno, pokušat ćemo ove dvije booleove stisnuti u jedan kubit. Kako se neće sasvim uklopiti, dobit ćemo zanimljivo kvantno ponašanje. To će dodati nešto zanimljivog igranja u igru, kao i sprečiti da se bilo koji brod ne može uništiti.

To ćemo implementirati tako da povežemo bombaški napad s mjerenjem 0/1. Ako dobijemo rezultat 1, kažemo da je brod potonuo. Za 0 zaključujemo da je brod imun na bombaške napade. Za torpeda radimo mjerenje +/-, što podrazumijeva uništenje i + podrazumijeva imunitet.

Ova metoda onemogućava da brod bude definitivno imun na obje vrste napada. Ako otkrijemo da je neprijateljski brod imun na bombe (tj. Da je njegovo stanje 0), znat ćemo da mora biti posve neizvjestan glede torpeda (rezultat mjerenja +/-). Budući da bombaški napad sigurno ne bi uspio, trebali bismo sljedeće napadati torpedima.

Tada bi moglo ispasti da napad torpeda ne uspije (stanje postaje + nakon mjerenja +/-). Brod bi odlučio da je na njih definitivno imun, i svaki daljnji napad torpeda neće uspjeti. Ali sva nada nije izgubljena. Postajući siguran u torpeda, postalo je neizvjesno u vezi s bombama. Napadajući s njima sljedeće (mjerenje 0/1) moglo bi dovesti do pobjede.

Ako bombaški napad ne uspije, vratimo se na torpeda i tako dalje. Najbolja taktika je nastaviti prebacivanje između njih dvojice dok brod konačno ne potone.

Pokrenut ćemo brodove kao nesigurni u njihov imunitet na oba napada. To se može učiniti inicijalizacijom qubita u jednom od Y stanja. Idemo za ↻. To je zapravo stanje koje smo upoznali u prvom dijelu, naime u3 (0,5 * pi, 0,0) 0, tako da već znamo kako to napraviti.

Suočavanje s kratkotrajnim kubitima

Implementacija igre na kvantnom procesoru neće biti tako jednostavna kao što se možemo nadati. Pogledati ćemo sve probleme koji će nam se dogoditi i vidjeti kako ih zaobići.

Pretpostavimo da brod napadne bomba i preživi. Tada će ga u sljedećem krugu pogoditi torpedo.

Ako se igra odvijala na uobičajenom računalu, a simulirala se pomoću normalnih bitova, implementacija bi bila sasvim jednostavna. Brod bi se inicijalizirao kada igra započne, a zatim bi čekao naokolo u sjećanju dok igrač ne odluči što učiniti s njom. Jednom kada igrač pošalje bombu, primjenjuju se odgovarajuće operacije kako bi se vidjelo je li uništena. Ako preživi, ​​čeka opet do sljedećeg napada.

To neće raditi za nas. Kubiti ne mogu sjediti okolo čekajući ljudske vremenske okvire. Nekoliko sekundi je više nego dovoljno vremena da se oni sruše i zapale, barem uz trenutnu tehnologiju.

Alternativa je pokretanje novog kvantnog procesa svaki put kada se izvrši napad. Prvi zadatak će se inicijalizirati sa stanjem,, tako da će rezultati biti slučajni i za mjerenje 0/1 (napad bombom) ili +/- mjerenje (napad torpeda). Rezultat mjerenja zatim se bilježi i pohranjuje u memoriju na uobičajenom računalu. Kada se dogodi sljedeći napad, kreira se drugi posao da se vidi što se događa. To će se inicijalizirati rezultatom posljednjeg mjerenja i tako se nastavlja.

Obavljanje +/- mjerenja

Do sada sam napisao čitav niz riječi, ali ni jedan redak koda. Za početak podsjetimo kako se mjerenje 0/1 provodi u QASM kodu.

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

Ovdje je važna uloga c [0]. To je izlaz postupka mjerenja. To je normalan bit na koji se pohranjuje rezultat mjerenja. Za mjerenje 0/1 rezultat je 0 ili 1.

Sve je to jednostavno za mjerenje 0/1. Ali to sada gledamo +/- mjerenja. Kako iz nekog od njih dobivamo informacije?

I dalje ćemo željeti rezultat pohraniti u normalan bit c [0]. Kako je to normalan zalogaj, on nema saznanja o čudnim stanjima + i -. Poznaje samo normalne binarne podatke. Stoga odlučujemo izvijestiti rezultat + kao c [0] = 0, i - kao c [0] = 1. Činjenica da će izgledati jednako kao i rezultati mjerenja 0/1 neće predstavljati problem. Kao i u svakom računalnom programu, trebali bismo znati što smo programirali, i tako bismo trebali znati interpretirati rezultate.

Sada znamo kako doći do rezultata mjerenja +/-. Ali još nismo saznali kako to zapravo učiniti. To je zato što se trebamo oglušiti na to. Moramo hakirati postupak koji vrši mjerenja 0/1 i umjesto njega napraviti +/- jedan.

Ključ našeg haka je operacija koja se zove Hadamard. Primjena ovoga na qubit q [0] u QASM kodu izgleda ovako.

HQ [0];

Naredba koju koristimo u Pythonu za dodavanje ovog retka u QASM datoteku pod nazivom gridScript je

gridScript.h (q [0])

Učinak Hadamarda je zamijeniti Z osnovna stanja s X osnovnim i obrnuto. To je rotacija sfere koja se kreće pretvara stanje u kbit-u 0 u +, a + u 0. Slično tome, 1 se okreće u - i obrnuto.

To znači da priču koju možemo ispričati o qubitu u smislu 0 i 1 prije Hadamarda, moramo reći s + i - nakon njega. I svaka priča o + i - postaje jedna od 0 i 1.

To je upravo ono što nam treba. To znači da se +/- mjerenje na qubit q [0] može obaviti sljedećim QASM kodom.

HQ [0]; izmjerite q [0] -> c [0]; HQ [0];

Da bismo vidjeli zašto se to događa, prođite kroz nekoliko primjera. Qubit q [0] započet će sa svježe deklariranim u svakom, i tako će biti u početnoj početnoj vrijednosti od 0.

Primjer nula:

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

Kubit započinje u stanju 0. Postavlja se pitanje je li 0 ili 1 i c [0] govori odgovor. Rezultat će uvijek biti c [0] = 0.

Primjer prvi:

XQ [0];
izmjerite q [0] -> c [0];

Kubit započinje u stanju 0, a zatim se okreće u 1. Tada se postavlja pitanje je li 0 ili 1. Uvijek odgovara na 1.

Primjer +:

HQ [0];
izmjerite q [0] -> c [0];

Kubit počinje u stanju 0 i odmah se okreće u +. Potom se postavlja pitanje je li njegovo stanje 0 ili 1. Slučajno bira jedno ili drugo, a stanje se ažurira odgovorom.

Sada smo napravili nekoliko trivijalnih primjera, napravimo nešto složenije.

Primjer ++:

HQ [0];
HQ [0]; izmjerite q [0] -> c [0]; HQ [0];

Kubit započinje u stanju 0, a zatim se okreće u +. Nakon toga postoje dva jednaka načina na koja možemo nastaviti priču.

Jedan je reći da tri završne crte zajedno čine +/- mjerenje. Oni pitaju qubit je li + ili -. Za + vraćaju rezultat c [0] = 0, a za - vraćaju c [0] = 1. Budući da se u ovom primjeru kbit ulazi u mjerenje sa stanjem +, uvijek se mjeri kao +. Stoga izlazi iz mjerenja još uvijek u ovom stanju.

U drugoj priči pogledamo učinke redaka jedan po jedan. Drugi Hadamard poništava učinak prvog i tako rotira kbit natrag u stanje 0. Tada se postavlja pitanje je li njegovo stanje 0 ili 1, i tako uvijek odgovara 0. Daljnji Hadamard ga ponovo rotira u +.

Obje se priče slažu o vidljivim efektima. Slažu se da će izlaz c [0] uvijek biti 0, a slažu se i da će stanje kubita na kraju biti +. Oni se samo ne slažu kako se to dogodilo. Obje su interpretacije podjednako valjane.

Ako želite da neki žargon pogleda stvari na Wikipediji, ovo su primjeri Schrödingerove i Heisenbergove slike kvantne mehanike.

Primjer +1:

XQ [0];
HQ [0]; izmjerite q [0] -> c [0]; HQ [0];

Evo još jednog primjera za koji imamo dvije ekvivalentne priče. Možemo reći da q [0] započinje kao 0 i zatim se okreće u 1. To se zatim rotira t0 - prije nego što prođemo kroz mjerenje 0/1. Slučajno odlučuje jedno ili drugo, daje izlaz c [0] = 0 ili c [0] = 1 i njegovo stanje se ažurira u skladu s tim. Ako je presudila 0, konačni je Hadamard zakrenuo u +. Inače će završiti kao -.

Alternativno, možemo reći da nakon okretanja u vrijednost 1, qubit prolazi mjerenje +/-. Nasumično se odlučuje između ove dvije mogućnosti, dajući izlaz c [0] = 0 za + i c [0] = 0 za -. Stanje se ažurira u skladu s tim što završava ili u državi + ili -.

Opet su ove dvije priče podjednako valjane i slažu se o svim vidljivim efektima. Ako želimo razmišljati o tri pravca

HQ [0]; izmjerite q [0] -> c [0]; HQ [0];

kao +/- mjerenje, slobodni smo to učiniti. Ako o tome želimo razmišljati kao o Hadamardu, nakon čega slijedi mjerenje 0/1, a slijedi ga Hadamard, i to je u redu.

Treba napomenuti jednu važnu stvar prije nego što krenemo dalje. IBM-ov API trenutno nam ne omogućuje da učinimo bilo što na qubit-u nakon što smo ga izmjerili. Ovo nije opće pravilo za kvantna računala. Obično bismo očekivali da ćemo moći zadržati mjerenje i manipulaciju qubitima onoliko dugo koliko želimo. Ali to u ovom trenutku ne možemo.

To nam ne predstavlja probleme. Budući da qubiti ionako ne mogu sjediti, a igrači ionako odlučuju, već moramo u potpunosti izraditi stanje nakon svakog kruga mjerenja. Drugi Hadamard učinkovito će se pojaviti u sljedećem poslu, djelujući na reinkarniranu verziju države.

Sva ostala moguća mjerenja mogu se postići sličnim hakovima. Samo moramo prethodno obaviti neke operacije kako bismo uknjižili naše alternativno mjerenje, a zatim (ako API dopušta) izvršiti obrnute operacije odmah nakon.

Suočavanje s pogreškama

Trenutna kvantna tehnologija nije savršena. Kubiti ne rade uvijek ono što bi trebali. Ako je vaš qubit 0 i napravite mjerenje 0/1, rezultat bi trebao biti 0. Uvijek. Ali s trenutnim kvantnim uređajima, postoji šansa da će biti 1. Možda je to zato što se x operacija ugurala dok je nismo gledali. Možda je to što nas mjerenje laže. Događaji poput ovih su rijetki, ali se događaju.

Postoje dva načina na koje bismo mogli riješiti pogreške. Jedno je ignorirati ih. Možemo ih upisati u narativ igre. Na moru su velike oluje. Oni ponekad dovedu do toga da se napad uništi, čak i ako je imun. Ili preživjeti napad koji ga je trebao uništiti.

Drugi način suočavanja s pogreškama je pokušaj uklanjanja njihovih učinaka. Ako je na raspolaganju bilo mnogo qubita, to bismo mogli učiniti s kvantnom ispravkom grešaka. Nažalost, to je ostalo još nekoliko godina.

Umjesto toga, napravit ćemo statistiku. Za to su nam potrebne vjerojatnosti, koje dobivamo izvođenjem svakog posla mnogo puta i gledanjem koliko često dolazi do mogućeg rezultata.

U slučaju bez buke, vjerojatnost bi bila 0%, 100% ili 50%. Rezultat je ili nemoguć (poput dobivanja 1 ako je stanje 0), izvjesnog (poput dobivanja + ako je stanje +) ili potpuno slučajnog (poput dobivanja 0 kada je stanje +).

Buka će ih malo zabrljati. Kada izvršimo mjerenje broja 0/1, možemo ustanoviti da se rezultat 0 pojavljuje u samo 98% vremena, a umjesto toga 2% ide za 1. Da ispravimo to, učinit ćemo nešto prilično proizvoljno. Odlučit ćemo da se ništa s manje od 5% vjerojatnosti nikada nije smjelo dogoditi. Sve s više od 95% vjerojatnosti trebalo je biti sigurno.

Stavljajući sve zajedno

Ovaj članak je pokrivao široke poteze mehaničara igara za ovu verziju Battleships-a i kako ga implementirati s kvantnim računalom. Umjesto da ovdje prođemo kroz sve sitno-mršave detalje, to ću ostaviti za komentare u stvarnom izvornom kodu.

Ako postoji nešto za što mislite da treba više objašnjenja, slobodno me obavijestite.