ToolDingo

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.

Taikoma visoms šiame puslapyje vykdomoms simuliacijoms: aukšto lygio programoms ir ranka parašytoms grandinėms.
%
Taikoma kiekvienam elementui ir jo veikiamam kubitui, o nuskaitymo modelyje – kiekvienam nuskaitytam bitui. Pasirinkite norimam scenarijui tinkamą vertę.

Programos kodas

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“.

Dokumentacija

Aprašykite skaičiavimą redaktoriuje. Iš jo automatiškai sugeneruojama kvantinė grandinė ir vykdoma simuliacija. Daugiausia 4000 simbolių. Ctrl+Enter paleidžia simuliaciją.

FormulėAprašymasRibos
quantum.add({ a, b })Dviejų skaičių sudėtisRezultatas iki 4 bitų (0–15)
quantum.subtract({ a, b })Atimtisa ≥ b, daugiausia 4 bitai
quantum.multiply({ a, b })DaugybaDaugikliai 0–7 (3 bitai)
quantum.divide({ a, b })Dalyba (dalmuo ir liekana)b ≥ 1; griežta riba: bits(a)+bits(b)+bits(a÷b)+1 ≤ 10
quantum.random({ bits })Kvantinio atsitiktinio skaičiaus simuliacijabits nuo 1 iki 10

Pasirinkite pavyzdį

Grandinės kodas

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ą.

Pasirinkite pavyzdį

Pagrindai: kaip tai veikia?

Kvantinio kompiuterio schema: valdantysis kompiuteris nukreipia kelis lazerio pluoštus per optinį stalą į kubitą vakuuminėje kameroje.
Nuo klasikinio valdančiojo kompiuterio per lazerius ir optiką iki fizikinio kubito.

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ų.

Dažniausiai užduodami klausimai

Ar tai tikras kvantinis kompiuteris?
Ne. Tai klasikinis būsenos vektoriaus simuliatorius, kuris naršyklėje slankiojo kablelio aritmetika apskaičiuoja nedidelės, iki 10 kubitų, kvantinės grandinės būseną. Realioje kvantinėje įrangoje naudojami fizikiniai kubitai, todėl jos veikimo principas iš esmės kitoks.
Kuris bitų eilutės „10“ kubitas yra q0?
q0 visada yra aukščiausios skilties, t. y. kairysis, bitas. Todėl grandinėje su 2 kubitais x(0) sukuria būseną |10⟩, o ne |01⟩.
Ką reiškia „shots“?
shots nurodo modeliuojamų pakartotinių matavimų skaičių (1–10 000). Kiekvienas matavimas atsitiktinai parenka rezultatą pagal tikslias būsenos vektoriaus tikimybes. Pačios tikimybės nuo atsitiktinės atrankos nepriklauso ir pateikiamos atskirai.
Kodėl kai kuriuose pavyzdžiuose rodomas klaidos pranešimas?
Šioje versijoje leidžiama tik viena grandinė su vienu run() iškvietimu po measureAll(). Netinkami kubitų indeksai, elementai po measureAll(), netinkami kampai ar matavimų skaičiai ir kodo sintaksės klaidos atmetami pateikiant suprantamą klaidos pranešimą.
Ką daro Hadamardo, X ir CNOT elementai?
X sukeičia |0⟩ ir |1⟩. Hadamardo elementas perveda bazinę būseną į vienodai pasvertą superpoziciją. CNOT apverčia tikslinį kubitą tik tada, kai valdantysis yra |1⟩, ir kartu su superpozicija gali sukurti susietumą.
Kaip sukuriamas susietumas?
Viename pavyzdyje pirmam kubitui pritaikomas Hadamardo elementas, o tada CNOT su antru kubitu. Kubitų nebegalima aprašyti nepriklausomai vieno nuo kito, o matuojant gaunami koreliuojantys rezultatai, pavyzdžiui, |00⟩ arba |11⟩.