Kvantinio kompiuterio simuliatorius
Parašykite nedidelę kvantinę grandinę JavaScript kalba, modeliuokite ją tiesiog naršyklėje ir peržiūrėkite schemą, tikimybes bei būsenos vektorių. Arba aprašykite aukšto lygio skaičiavimą, pavyzdžiui, sudėtį, ir stebėkite, kaip jis automatiškai paverčiamas grįžtamąja kvantine grandine.
Triukšmo modelis
Realūs kvantiniai kompiuteriai neskaičiuoja be klaidų. Kubitai itin jautrūs ir dėl nepageidaujamos sąveikos su aplinka, pavyzdžiui, šiluma, elektromagnetiniais laukais ar gretimais kubitais, praranda koherentiškumą. Loginių elementų operacijos taip pat nėra visiškai tikslios, o galutinis nuskaitymas gali būti klaidingas. Pagal numatytąją nuostatą šis simuliatorius skaičiuoja idealiai. Čia galite įjungti būdingus klaidų modelius ir tiesiogiai stebėti jų poveikį rezultatams.
Aprašykite skaičiavimą naudodami quantum.add, quantum.subtract, quantum.multiply, quantum.divide arba quantum.random. Ctrl+Enter paleidžia simuliaciją. Visa dokumentacija pasiekiama mygtuku „Dokumentacija“.
Šis kodas automatiškai sugeneruotas iš aukščiau pateikto programos kodo, o grandinė iškart modeliuota. Galite čia jį redaguoti ranka ir vykdyti dar kartą.
Sugeneruota grandinė buvo redaguota ranka. Todėl registrų grupavimas schemoje paslėptas. Dar kartą paleidus aukščiau pateiktą programą, šie pakeitimai bus perrašyti.
Daugiausia 4000 simbolių. Galimi QuantumCircuit metodai: x, y, z, h, s, sdg, t, tdg, rx, ry, rz, cnot, cz, ccnot (taip pat toffoli), swap, measureAll, run. Ctrl+Enter paleidžia simuliaciją.
Grandinės schema
Žingsnių rodinyje tikimybės ir būsenos vektorius rodomi tiksliai po pasirinkto elemento. Žemiau pateikti matavimų rezultatai visada taikomi visai grandinei.
OpenQASM 2.0
OpenQASM 2.0 yra plačiai naudojamas kvantinių grandinių mainų formatas, kurį skaito ir Qiskit. Bitų tvarka skiriasi: šiame simuliatoriuje q0 yra aukščiausios skilties, kairysis bitas, o Qiskit sistemoje q[0] – žemiausios skilties. Todėl išmatuotos bitų eilutės ten atrodo apverstos.
Tikimybės
Tikimybė išmatuoti kiekvieną galimą bitų eilutę, apskaičiuota tiesiogiai iš būsenos vektoriaus. Skaitymo kryptis: q0 yra kairysis, aukščiausios skilties bitas.
Blocho sferos
Kiekvieno kubito būsena vaizduojama rodykle Blocho sferoje: šiaurės polius yra |0⟩, pietų polius – |1⟩, o pusiaujas – vienodai pasverta superpozicija. Jei rodyklė gerokai trumpesnė už sferos spindulį, atskiras kubitas neturi savos grynosios būsenos: jis susietas su kitais kubitais. Rodyklę gali sutrumpinti ir triukšmas, dėl kurio mažėja koherentiškumas. Sferos su triukšmu čia apskaičiuojamos apytiksliai, suvidurkinant Blocho vektorių per triukšmo trajektorijas. Aukščiau pateiktame žingsnių rodinyje rodyklės kinta po kiekvieno elemento, tačiau ten triukšmas neįtraukiamas.
Matavimų rezultatai
Kiek kartų kiekviena bitų eilutė faktiškai gauta modeliuojant matavimus. Kai galimi keli rezultatai, jų dažniai atsitiktinai svyruoja apie tikslias tikimybes.
Būsenos vektorius
Kompleksinės amplitudės, pagal kurias apskaičiuojamos tikimybės: amplitudės modulio kvadratas (realioji dalis² + menamoji dalis²) yra atitinkamos būsenos tikimybė.
| Būsena | Realioji dalis | Menamoji dalis |
|---|
Pagrindai: kaip tai veikia?
Nuo programos iki fizikinio kubito
Tikras kvantinis kompiuteris yra daugiau nei lustas. Klasikinė valdymo elektronika paverčia grandinę tiksliais impulsais. Parodytame pavyzdyje aušinimo, pakartotinio kaupinimo, kubito valdymo ir nuskaitymo lazeriai formuoja signalus ant optinio stalo ir nukreipia juos į ekranuotą vakuuminę kamerą. Ten jie keičia ir išmatuoja kubito būseną, o rezultatas grąžinamas į klasikinį kompiuterį.
Kubitas ir bazinės būsenos
Klasikinis bitas yra arba 0, arba 1. Kubitas taip pat gali būti dviejų bazinių būsenų superpozicijoje: |0⟩ ir |1⟩. Kai kubitų keli, bazinės būsenos užrašomos bitų eilute, pavyzdžiui, |10⟩ 2 kubitams. Šiame simuliatoriuje q0 visada yra aukščiausios skilties, kairysis bitas.
Superpozicija
Superpozicijoje kubito būsena apima kelių bazinių būsenų komponentus. Jie aprašomi kompleksinėmis amplitudėmis. Amplitudės modulio kvadratas nurodo tikimybę matuojant gauti atitinkamą būseną.
Blocho sfera
Vieno kubito būseną galima pavaizduoti rodykle sferoje: šiaurės polius atitinka |0⟩, pietų polius – |1⟩, o visi pusiaujo taškai yra vienodai pasvertos superpozicijos. Fazė lemia rodyklės kryptį išilgai pusiaujo. Posūkio elementai rx, ryir rz pasuka rodyklę apie atitinkamą ašį, o fazės elementai S ir T – apie Z ašį. Esant susietumui, rodyklė trumpėja sferos centro link: atskiras kubitas nebeturi savos grynosios būsenos. Taip susietumas tampa matomas.
Matavimas ir pakartojimai
measureAll() vienu metu išmatuoja visus kubitus ir užbaigia grandinę. Kadangi vienas matavimas duoda tik vieną atsitiktinį rezultatą, naudojant run({ shots })modeliuojamas „shots“ skaičius nepriklausomų grandinės vykdymų ir matavimų. Taip tikimybių pasiskirstymas išryškėja histogramoje. Tikslios tikimybės taip pat skaičiuojamos tiesiogiai iš būsenos vektoriaus ir nuo atsitiktinių matavimo rezultatų nepriklauso.
Hadamardo elementas
Hadamardo elementas h(q) perveda kubitą iš apibrėžtos būsenos (|0⟩ arba |1⟩) į vienodai pasvertą šių būsenų superpoziciją: |0⟩ ir |1⟩ . Matuojant kiekviena gaunama su 50 % tikimybe.
Fazės elementai: S ir T
Elementai s(q) ir t(q) nekeičia vieno kubito matavimo tikimybių, o tik pasuka būsenos |1⟩ amplitudės fazę: S – 90°, T – 45°. Jų poveikis išryškėja kartu su superpozicija: tarp dviejų Hadamardo elementų fazė lemia, kaip amplitudės sustiprina arba panaikina viena kitą (interferencija). Atvirkštiniai variantai sdg(q) ir tdg(q) suka priešinga kryptimi ir panaikina S bei T poveikį. Du T elementai atitinka S, o du S – Z.
CNOT ir sąlyginis susietumas
CNOT elementas cnot(control, target) apverčia tikslinį kubitą tik tada, kai valdantysis yra būsenos |1⟩. Jei valdantysis kubitas prieš tai buvo superpozicijoje, gali atsirasti susietumas: kubitų nebegalima aprašyti nepriklausomai, kaip Bello būsenos pavyzdyje. Jei valdantysis kubitas yra apibrėžtos bazinės būsenos, CNOT tik sąlygiškai apverčia bitą, nesukurdamas susietumo. Taigi ne kiekvienas CNOT automatiškai sukuria susietumą.
CZ: simetriškas CNOT atitikmuo
CZ elementas cz(a, b) pakeičia amplitudės ženklą tik tada, kai abu kubitai yra |1⟩. Kitaip nei CNOT, čia nėra atskirų valdančiojo ir tikslinio kubitų: poveikis simetriškas, todėl schemoje elementas žymimas dviem sujungtais taškais. CZ ir CNOT galima paversti vieną kitu. CNOT atitinka CZ, kurio tiksliniam kubitui prieš ir po operacijos pritaikomas Hadamardo elementas. CZ svarbus daugeliui algoritmų, pavyzdžiui, Groverio paieškai.
GHZ būsena: trijų kubitų susietumas
GHZ būsena, pavadinta Greenbergerio, Horne'o ir Zeilingerio vardais, išplečia Bello būsenos principą trims kubitams. Vienas Hadamardo ir du CNOT elementai susieja visus tris taip, kad matuojant gaunama tik |000⟩ arba |111⟩ , bet niekada mišrūs bitų deriniai. Atskirų kubitų būsenos nėra grynosios; koreliacija priklauso bendrai trijų kubitų būsenai.
Deutscho algoritmas: mažiausias užklausų pranašumo pavyzdys
Deutscho algoritmas vienu nežinomo orakulo įvertinimu atsako į klausimą, kuriam klasikiniu būdu reikia dviejų įvertinimų: ar funkcija pastovi, ar subalansuota? Į orakulą siunčiama superpozicijoje esanti įvestis. Dėl interferencijos atsakymas po to vienareikšmiškai užkoduojamas įvesties kubite. Šis fazės grįžtamojo poveikio principas naudojamas daugelyje kvantinių algoritmų.
Groverio paieška: amplitudžių stiprinimas
Groverio paieška randa pažymėtą įrašą nesurikiuotoje aibėje naudodama gerokai mažiau užklausų nei klasikinė paieška. Orakulas pažymi ieškomą būseną pakeisdamas fazės ženklą, čia – CZ elementu. Tada difuzijos operatorius sustiprina pažymėtą amplitudę kitų amplitudžių sąskaita. Naudojant 2 kubitus pakanka vienos iteracijos, kad ieškomas rezultatas būtų išmatuotas su 100 % tikimybe.
Grįžtamoji sudėtis: nuo quantum.add() iki grandinės
Aukščiau esantis programos redaktorius paverčia quantum.add({ a, b }) į X, CNOT ir CCNOT (Toffoli) elementų grandinę. Ji atlieka klasikinę sudėtį visiškai grįžtamuoju būdu: kiekvieno elemento poveikį galima tiksliai panaikinti, nes informacija neprarandama. CCNOT elementas (ccnot(c1, c2, target)) apverčia tikslinį kubitą tik tada, kai abu valdantieji kubitai yra |1⟩ . Šio komponento pakanka bet kuriai klasikinei grandinei sudaryti grįžtamuoju būdu, įskaitant visą sumatorių su perkėlimu. Įvesčių A ir B apibrėžtos bazinės būsenos pirmiausia nustatomos X elementais, nenaudojant superpozicijos. Kadangi visa grandinė pereina tik per apibrėžtas būsenas, galutinis matavimas su 100 % tikimybe pateikia vieną rezultatą – teisingą klasikinę sumą. Todėl quantum.add() ir kvantinėje simuliacijoje duoda determinuotą rezultatą, o ne kelias galimas būsenas, kurių tikimybės mažesnės nei 100 %.
Atimtis: sudėtis atvirkštine tvarka
Kadangi kiekvieno kvantinės grandinės elemento poveikis grįžtamas, visą sumatoriaus grandinę galima vykdyti atvirkštine tvarka. Tuomet sudėtis tampa atimtimi: quantum.subtract({ a, b }) naudoja tuos pačius sumatoriaus elementus atvirkštine tvarka ir apskaičiuoja a − b. Tai pagrindinis grįžtamojo skaičiavimo principas: nė vienas žingsnis nesunaikina informacijos, todėl kiekvieną galima atšaukti. Šioje versijoje būtina a ≥ b, kad rezultatas nebūtų neigiamas.
Daugyba: quantum.multiply()
Daugyba sudaroma iš tų pačių grįžtamųjų komponentų kaip ir sudėtis. Pagal daugybos stulpeliu principą daugiklis a pridedamas paslinktose skiltyse, atitinkančiose daugiklio b vieneto vertės bitus. Kiekvienai dalinei sudėčiai naudojamas tas pats grįžtamasis sumatorius su nuosekliu perkėlimu į kitą sandaugos bitą. Sandaugai didėjant reikia platesnio rezultato registro. Todėl daugikliai čia ribojami iki 3 bitų, t. y. 0–7: tik taip daugiklio, sandaugos ir perkėlimo kubitai telpa į simuliatoriaus 10 kubitų ribą.
Dalyba: quantum.divide()
Dalybai taip pat naudojami tik grįžtamieji komponentai: quantum.divide({ a, b }) atlieka dalybą stulpeliu, iš liekanos registro atimdama paslinktą daliklį grįžtamosiomis operacijomis. Rezultatas yra dalmuo ir liekana (a = quotient · b + remainder). Kadangi dalinys, daliklis, dalmuo ir pagalbinis skolinimosi kubitas kartu turi tilpti į 10 kubitų ribą, dalyba yra labiausiai apribota operacija. Turi būti tenkinama sąlyga bits(a) + bits(b) + bits(a÷b) + 1 ≤ 10 , o daliklis b turi būti ≥ 1, nes dalyba iš nulio negalima. Jei įvestis viršija ribą, redaktorius parodo pranešimą ir neskaičiuoja.
Kvantinis atsitiktinumas: quantum.random()
Deterministiniai algoritmai generuoja pseudoatsitiktinius skaičius. Fizikiniai šaltiniai, įskaitant kvantinius matavimus, gali suteikti tikrą atsitiktinumą. Ši operacija quantum.random({ bits }) Hadamardo elementu perveda kiekvieną bitą į vienodai pasvertą superpoziciją, o matavimas parenka rezultatą. Realioje kvantinėje įrangoje šis atsitiktinumas fizikinis. Šiame simuliatoriuje jis atkuriamas naudojant naršyklės pseudoatsitiktinių skaičių generatorių.
Simuliatorius ir reali kvantinė įranga
Šis simuliatorius apskaičiuoja būseną klasikine slankiojo kablelio aritmetika jūsų naršyklėje. Tai įmanoma, nes modeliuojamos tik labai mažos, iki 10 kubitų, grandinės. Realūs kvantiniai kompiuteriai naudoja fizikinius kubitus, patiria dekoherenciją bei triukšmą ir kvantinio skaičiavimo pranašumo siekia gerokai didesnėse grandinėse, kurių praktiškai nebeįmanoma modeliuoti klasikiniu būdu. Ši priemonė skirta mokytis, o ne pakeisti tikrą kvantinį procesorių.