Ako programovať kvantový počítač - časť 2

Bojové lode s kvantovými meraniami

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

Tento článok má v nadpise časť 2 z dobrého dôvodu. Bola tu časť 1, v ktorej sme sa zaoberali základom písania a spúšťania kvantových programov.

Pred príchodom sem budem predpokladať, že ste si prečítali aspoň jeho prvú polovicu.

Väčšina skutočných znalostí kódovania, ktoré potrebujete pre tento tutoriál, bola pokrytá naposledy. Tento článok sa zameriava hlavne na niektoré veci, ktoré môžeme s týmito príkazmi urobiť.

Ako sa pozerať na qubits

V programoch máme premenné. V určitom okamihu sa na ne budeme musieť pozrieť.

Toto by mohlo byť na konci programu, keď dosiahneme výsledok. Môže to byť aj počas programu, keď premennú používame ako súčasť podmieneného príkazu. V každom prípade sa to stáva veľa. A pri programovaní nekvantových premenných je to celkom nezanedbateľný proces.

Je to preto, že nekvantové premenné majú určité hodnoty. Keď sa na ne pozriete, len nám alebo iným častiam programu povieme, aká je ich hodnota. O samotnej premennej sa nič nezmení.

Toto neplatí pre kvantové premenné, ktoré môžu mať neurčité hodnoty. Môžu byť v tzv. Kvantovej superpozícii, ktorá im umožňuje držať viacero protichodných hodnôt naraz.

Keď sa na ne pozrieme, musia sa vzdať všetkej tejto podivnosti. Sú nútení prijať určitú hodnotu a potom nám povedať, čo je to za hodnotu. Keďže nejde iba o pasívny proces, je potrebné starostlivo zvážiť. A potrebuje meno. Hovoríme tomu meranie.

V tomto článku sa budeme zaoberať niektorými vlastnosťami merania. Použijeme ho aj ako základ herného mechanika a presne uvidíme, ako ho naprogramovať na kvantovom počítači. Nakoniec budeme mať novú verziu Bojových lodí.

Mapovanie sveta hraníc

Skôr než začneme skutočne merať qubity, mali by sme sa pokúsiť pochopiť ich svet trochu viac. Najlepší spôsob, ako si predstaviť quit, je použitie gule. Akýkoľvek možný stav qubit zodpovedá bodu na povrchu tejto gule.

Stavy 0 a 1 sú úplne odlišné, úplne nesúvislé. Sú navzájom protikladmi. Budú teda žiť na opačných stranách gule. Zvyčajne sa rozhodneme dať 0 na severný pól a 1 na juh.

Vyberme bod, ktorý je medzi nimi rovnako vzdialený niekde pozdĺž rovníka. Môže to byť kdekoľvek sa vám páči. Budeme to nazývať +. Prečo +? Prečo nie?

Stav + má tiež opačný rozdiel, ako je od neho 0, od 1. To žije na opačnej strane, ktorá bude tiež bodom pozdĺž rovníka. Tento stav nazývame -.

S bodmi 0, 1, + a -, ktoré sú teraz definované, prosíme o pozornosť ďalších pár bodov. Toto sú tie, ktoré sú rovnako vzdialené od 0 do 1 a tiež od + do -. Nazývame ich ↻ a ↺. Prečo? Pretože som kedysi videl chlapa, ktorý to nenapísal v Da Vinciho kóde, ktorý sa mi páčil.

Teraz sme zmapovali svet qubit so šiestimi bodmi. V žiadnom prípade to nie sú jediné, ktoré kedy použijeme. Sú to jednoducho orientačné body, ktorými sa budeme navigovať.

Meranie hraníc

Akékoľvek meranie jednoducho vyžaduje, aby sme si quit vybrali medzi dvoma protiľahlými bodmi v gule.

Klasický príklad je pre náš obľúbený pár opačných stavov: 0 a 1. Žiadame qubit, aby si vybral medzi týmito dvoma. Ak už bol v stave 0, pôjde o 0. Štvorica v stave 1 bude podobne viesť k výsledku 1. Pre každý iný stav bude výsledok náhodný, pričom najpravdepodobnejšia je najpravdepodobnejšia možnosť.

Na rovníku je to oboje 50/50. Takže ak bol náš stav + alebo - a potom sa opýtame, či je 0 alebo 1, bude si musieť vybrať jeden alebo druhý s rovnakou pravdepodobnosťou.

Meranie založené na 0 a 1 má niekoľko mien. Z pochopiteľných dôvodov to môžeme nazvať 0/1. Nazýva sa to aj meranie bázy Z, pretože majú špeciálny vzťah, ktorý majú stavy 0 a 1, s operáciou zvanou z. Viac o tomto príbehu inokedy.

Ďalším najobľúbenejším typom merania je meranie + a -. Nazvem to meranie +/-, ale tiež by ste ho mohli nazvať meranie na základe X. Funguje to rovnako ako predtým, ale iba pre + a - namiesto 0 a 1. Ak teda začnete s hranicou v stave + a vykonáte toto meranie, dostanete výsledok +. Ak však začnete s 0 a položíte rovnakú otázku, vyberie sa náhodne.

Máme tiež meranie pre veci divné šípky. Toto sa nazýva meranie na základe Y. Nikto nemá rád merania základne Y.

Trocha je trochu, aj keď je kvantová

Meranie nekvantových objektov je pasívny proces. Hovorí vám, čo objekt robí, ale nijakým spôsobom ho nemení. Meranie kvantových vecí je veľmi odlišné. Kvantové merania nemenia naše vedomosti o premenných. Menia samotné premenné.

Predpokladajme, že máte quit v stave +, a potom sa ho opýtajte, či je 0 alebo 1. Keď vám dá náhodný výsledok, nie je to len ošmúrovanie. Nehovorí vám to nezmysly, pretože ste položili nesprávnu otázku. Akonáhle to prinesie výsledok, bude sa držať s ním. Jeho hodnota sa zmení, aby odrážala odpoveď. Ak vám povie 0, bude to 0 na celú dobu (alebo pokiaľ si s ním už nebudete aspoň rozprávať). Zabudne, že to vždy bolo +.

To znamená, že hranica si môže byť vždy istá svojím výsledkom iba jedným meraním. Ak vie určite, či je 0 alebo 1, je úplne neisté, či je + alebo -, a tiež úplne neisté, či je ↻ alebo ↺. Hranica má len obmedzené množstvo istoty, ktorú môže obísť, obmedzená Heisenbergovým princípom neistoty.

To znamená, že pri získavaní informácií od jedného jedinca dostaneme iba jeden výstrel. Akonáhle extrahujeme jeden binárny výsledok, všetko, čo qubit kedy vedel pred meraním je zabudnuté. Spomína si iba výsledok, ktorý nám dal. A tak, napriek nekonečnému počtu možných stavov, môžeme kedykoľvek získať iba jeden kúsok informácií. To je dôvod, prečo to považujeme za kvantovú verziu bitov, skôr ako za kvantový float alebo kvantový vektor 3 atď.

Herný mechanik

Urobíme variant pre bojové lode, v ktorom budú dva typy útokov: bomby a torpéda. Na ponorenie lode bude potrebný iba jeden úspešný útok, ale úspešný útok nie je vždy taký jednoduchý. Niektoré lode majú tak veľkú obranu proti lietadlám, že sa k nim nikdy nedostane žiadna bomba. Iní sú skvelí pri odpudzovaní torpéd.

Aby sme to mohli implementovať na bežnom počítači, mohli by sme pre každú loď definovať dve booleovské premenné. Jeden by nám povedal, či je loď odolná voči bombám a druhá pre torpéda. Tieto je potom možné skontrolovať počas útokov a zistiť, či sa loď potopí alebo nie.

Keby to bola implementácia, ktorú používame, bolo by teoreticky možné, aby bola loď odolná voči obidvom typom útoku. To by bol zlý dizajn hry, pretože znemožňuje jednému hráčovi vyhrať. Dobrá implementácia by musela zabrániť tomu, aby existovali nejaké nezničiteľné lode.

Jedným zo spôsobov, ako sa vyhnúť výrobe takýchto lodí, je niekoľko jednoduchých riadkov kódu. To však v skutočnosti nie je náš štýl. Namiesto toho to spravíme kvantovou mechanikou!

Konkrétne sa budeme snažiť vytlačiť tieto dva booleovské diela do jedinej hranice. Pretože sa celkom nezmestia, získame zaujímavé kvantové správanie. Tým sa do hry pridá niekoľko zaujímavých hier, ako aj zabránenie nezničiteľnosti akejkoľvek lode.

Realizujeme to spojením bombového útoku s meraním 0/1. Ak dostaneme výsledok 1, hovoríme, že loď klesla. Pre 0 usudzujeme, že loď je odolná voči bombovým útokom. Pre torpéda namiesto toho robíme meranie +/-, s - implikáciou deštrukcie a + implikáciou imunity.

Táto metóda znemožňuje absolútnu imunitu lode voči obidvom typom útoku. Ak zistíme, že nepriateľská loď je imunná voči bombám (tj jej stav je 0), vieme, že o torpédom musí byť úplne neistá (výsledok merania +/-). Keďže bombový útok určite zlyhá, mali by sme preto zaútočiť na torpéda.

Mohlo by sa potom ukázať, že útok torpédom zlyhá (stav sa zmení na + po meraní +/-). Loď by sa rozhodla, že je pre nich určite imúnna, a akýkoľvek ďalší útok torpédom by zlyhal. Ale všetka nádej sa nestratí. Tým, že si bola istá torpédom, stala sa neistá o bombách. Ďalší útok s nimi (meranie 0/1) by mohol viesť k víťazstvu.

Ak útok bomby nebude úspešný, vrátime sa k torpédom atď. Najlepšia taktika je prepínať medzi nimi, až kým sa loď nakoniec nezačne potopiť.

Začneme s loďami, pretože si nie sme istí imunitou voči obom útokom. To sa dá dosiahnuť inicializáciou quitu v jednom zo základných stavov Y. Poďme na ↻. Toto je vlastne stav, s ktorým sme sa stretli v časti 1, konkrétne u3 (0,5 * pi, 0,0) 0, takže už vieme, ako to urobiť.

Zaobchádzanie s krátkodobými vtákmi

Implementácia hry na kvantový procesor nebude taká ľahká, ako by sme dúfali. Pozrime sa na všetky problémy, ktoré sa nám dostanú do cesty, a uvidíme, ako sa nimi obísť.

Predpokladajme, že loď je napadnutá bombou a prežije. Potom v ďalšom kole zasiahne torpédo.

Ak by hra bola spustená na bežnom počítači a bola simulovaná pomocou normálnych bitov, implementácia by bola celkom jednoduchá. Loď by bola inicializovaná na začiatku hry a potom čakala v pamäti, kým sa hráč nerozhodne, čo s tým robiť. Keď hráč pošle bombu, vykonajú sa príslušné operácie, aby sa zistilo, či je zničená. Ak prežije, čaká znova do ďalšieho útoku.

Toto pre nás nebude fungovať. Qubits nemôžu sedieť a čakať na ľudské časové harmonogramy. Niekoľko sekúnd je viac ako dosť času na to, aby sa zhroutili a spálili, aspoň so súčasnou technológiou.

Alternatívou je spustiť nový kvantový proces pri každom útoku. Prvá úloha sa inicializuje so stavom ↻, takže výsledky budú náhodné pre meranie 0/1 (útok bomby) alebo +/- (útok torpéda). Výsledok merania sa potom zaznamená a uloží do pamäte na bežnom počítači. Keď nastane ďalší útok, vytvorí sa ďalšia úloha, aby sa zistilo, čo sa stane. Inicializuje sa s výsledkom posledného merania, a tak pokračuje.

Vykonáva sa meranie +/-

Zatiaľ som napísal celé množstvo slov, ale nie jediný riadok kódu. Začnime pripomenutím, ako je v QASM kóde implementované 0/1 meranie.

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

Úloha c [0] je tu dôležitá na opätovné preskúmanie. Je to výstup z procesu merania. Je to normálny bit, v ktorom je uložený výsledok merania. Pri meraní 0/1 je výsledok 0 alebo 1.

To všetko je celkom jednoduché na meranie 0/1. Ale teraz to sledujeme +/- merania. Ako získame informácie od jedného z nich?

Stále budeme chcieť uložiť výsledok do normálneho bitu c [0]. Pretože je to normálny kúsok, nemá vedomosti o podivných stavoch + a -. Pozná iba normálne binárne súbory. Preto sme sa rozhodli nahlásiť výsledok + ako c [0] = 0 a - ako c [0] = 1. Skutočnosť, že budú vyzerať rovnako ako výsledky merania 0/1, nebude problémom. Rovnako ako v každom počítačovom programe by sme mali vedieť, čo sme naprogramovali, a preto by sme mali vedieť, ako interpretovať výsledky.

Teraz vieme, ako získať výsledky z merania +/-. Zatiaľ sme však nenašli, ako to skutočne urobiť. Je to preto, že o tom musíme byť záludní. Musíme namiesto toho hacknúť proces, ktorý vykonáva merania 0/1 a urobiť z neho +/- jeden.

Kľúčom k nášmu hacku je operácia nazývaná Hadamard. Aplikácia na quit q [0] v kóde QASM vyzerá takto.

hq [0];

Príkaz, ktorý používame v Pythone na pridanie tohto riadku do súboru QASM s názvom gridScript, je

gridScript.h (q [0])

Účinkom Hadamardu je výmena bázických stavov Z za bázické X a naopak. Je to rotácia gule, ktorá posúva zákrutný stav 0 do + a + do 0. Podobne sa 1 otáča do - a naopak.

To znamená, že príbeh, ktorý môžeme povedať o hádanke, pokiaľ ide o 0 a 1 pred Hadamardom, musíme povedať s + a - potom. A každý príbeh + a - sa stane jedným z 0 a 1.

Presne to potrebujeme. To znamená, že meranie +/- na quit q [0] sa môže vykonať pomocou nasledujúceho kódu QASM.

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

Ak chcete zistiť, prečo to funguje, prečítajte si niekoľko príkladov. Hranica q [0] sa začne od každého čerstvo deklarovaného, ​​a tak bude mať predvolenú počiatočnú hodnotu 0.

Príklad nuly:

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

Hranica sa začína v stave 0. Spýta sa, či je 0 alebo 1 a odpovie c [0]. Výsledkom bude vždy c [0] = 0.

Príklad 1:

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

Hranica začína v stave 0 a potom sa otočí na 1. Potom sa opýta, či je 0 alebo 1. Vždy odpovedá 1.

Príklad +:

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

Quit začína v stave 0 a okamžite sa otočí na +. Potom sa opýta, či je jeho stav 0 alebo 1. Náhodne si vyberie jeden alebo druhý a jeho stav sa aktualizuje odpoveďou.

Teraz sme urobili niekoľko triviálnych príkladov, urobme niečo zložitejšie.

Príklad ++:

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

Rýchlosť sa začína v stave 0 a potom sa otočí na +. Potom existujú dva ekvivalentné spôsoby, ako môžeme pokračovať v príbehu.

Jeden znamená, že tri posledné riadky spoločne vykonávajú meranie +/-. Pýtajú sa na otázku, či je to + alebo -. Za + vrátia výsledok c [0] = 0 a za - vrátia c [0] = 1. Pretože hranica prechádza v tomto príklade do stavu so stavom +, vždy sa meria ako +. Vychádza preto z merania stále v tomto stave.

Pokiaľ ide o druhý príbeh, pozeráme sa na účinky riadkov jeden po druhom. Druhý Hadamard zruší účinok prvého, a tak otočí štvoricu späť do stavu 0. Potom sa opýta, či je jej stav 0 alebo 1, a preto vždy odpovedá 0. Ďalší Hadamard to znova otočí na +.

Oba príbehy sa zhodujú na pozorovateľných účinkoch. Súhlasia, že výstup c [0] bude vždy 0 a súhlasia s tým, že stav qubitov na konci bude +. Oni jednoducho nesúhlasia, ako sa to stalo. Obidve interpretácie sú rovnako platné.

Ak chcete, aby nejaký žargón vyhľadal veci na Wikipédii, sú to príklady Schrödingerovej a Heisenbergovej fotografie kvantovej mechaniky.

Príklad +1:

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

Toto je ďalší príklad, pre ktorý máme dva ekvivalentné príbehy. Môžeme povedať, že q [0] sa začína ako 0 a potom sa otočí na 1. Toto sa potom otočí t0 - pred vykonaním merania 0/1. Náhodne rozhoduje o jednom alebo druhom, vydá výstup c [0] = 0 alebo c [0] = 1 a podľa toho aktualizuje svoj stav. Ak sa rozhodne 0, posledný Hadamard to otočí na +. Inak to skončí ako -.

Inak by sme mohli povedať, že po otočení na 1, quit prechádza meraním +/-. Náhodne sa rozhoduje medzi týmito dvoma možnosťami a dáva výstup c [0] = 0 pre + ac [0] = 0 pre -. Stav sa zodpovedajúcim spôsobom aktualizuje a končí buď v stave + alebo -.

Opäť platí, že tieto dva príbehy sú rovnako platné a zhodujú sa na všetkých pozorovateľných účinkoch. Ak chceme myslieť na tri riadky

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

ako meranie +/- to môžeme urobiť. Ak to chceme myslieť ako na Hadamard, po ktorom nasleduje meranie 0/1 a potom na Hadamard, je to tiež v poriadku.

Predtým, ako pôjdeme ďalej, je potrebné poznamenať jednu dôležitú vec. Rozhranie API spoločnosti IBM nám v súčasnosti po meraní nemôžeme nič urobiť. Toto nie je všeobecné pravidlo pre kvantové počítače. Očakávali by sme, že dokážeme udržať meracie a manipulačné qubity tak dlho, ako by sme chceli. Momentálne to však nemôžeme urobiť.

To nám neprináša žiadne problémy. Pretože qubits nemôžu sedieť, kým sa hráči rozhodujú, musíme stav obnoviť už po každom meraní. Druhý Hadamard sa účinne objaví v nasledujúcom zamestnaní, konajúc v reinkarnovanej verzii štátu.

Všetky ďalšie možné merania je možné dosiahnuť podobnými hackami. Potrebujeme iba vykonať niektoré operácie vopred, aby sme zastavili naše alternatívne meranie, a potom (ak to rozhranie API umožňuje) hneď po ňom vykonajte opačné operácie.

Riešenie chýb

Súčasná kvantová technológia nie je dokonalá. Qubits nie vždy robia, čo majú. Ak je vaša rýchlosť 0 a vykonáte meranie 0/1, výsledok by mal byť vždy 0. Vždy. Ale pri súčasných kvantových zariadeniach existuje šanca, že to bude 1. Môže to byť preto, že operácia x sa vkradla dovnútra, zatiaľ čo sme sa nepozerali. Dôvodom môže byť to, že nám leží meranie. Takéto udalosti sú zriedkavé, ale vyskytujú sa.

S chybami sa môžeme vyrovnať dvoma spôsobmi. Jedným je ignorovať ich. Môžeme ich napísať do príbehu hry. Na mori sú veľké búrky. Tieto niekedy vedú k zničeniu lode útokom, aj keď je imunný. Alebo prežiť útok, ktorý mal zničiť.

Druhým spôsobom riešenia chýb je pokus o odstránenie ich následkov. Keby bolo k dispozícii veľa qubitov, mohli by sme to urobiť pomocou kvantovej korekcie chýb. Bohužiaľ, to je ešte pár rokov preč.

Namiesto toho urobíme nejaké štatistiky. Na to potrebujeme pravdepodobnosti, ktoré dostaneme tým, že každú úlohu spustíme mnohokrát a uvidíme, ako často sa každý možný výsledok objaví.

V nehlučnom prípade by všetky boli 0%, 100% alebo 50%. Výsledok je buď nemožný (napríklad získanie čísla 1, ak je stav 0), istý (napríklad získanie čísla +, ak je stav +) alebo úplne náhodný (napríklad získanie čísla 0, keď je stav +).

Hluk to trochu zmätie. Keď urobíme 0/1 meranie 0, môžeme zistiť, že výsledok 0 sa vyskytuje iba 98% času, s 2% namiesto 1. Aby sme to napravili, urobíme niečo pomerne svojvoľné. Rozhodneme sa, že by sa nikdy nemalo stať nič s pravdepodobnosťou menšou ako 5%. Všetko s pravdepodobnosťou vyššou ako 95% by malo byť isté.

Dávať to všetko dokopy

Tento článok sa venoval širokým úderom herného mechanika pre túto verziu bitevných lodí a ako ju implementovať pomocou kvantového počítača. Namiesto toho, aby som tu prešiel všetky drobné podrobnosti, nechám to na komentáre v skutočnom zdrojovom kóde.

Ak existuje niečo, o čom si myslíte, že potrebujete ďalšie vysvetlenie, neváhajte a dajte mi vedieť.