ToolDingo

Kvantarvuti simulaator

Kirjuta JavaScriptis väike kvantahel, simuleeri seda otse brauseris ning vaata ahelaskeemi, tõenäosusi ja olekuvektorit. Või kirjelda arvutust kõrgtasemel, näiteks liitmisena, ja jälgi selle automaatset teisendamist tõeliseks pööratavaks kvantahelaks.

Müramudel

Päris kvantarvutid ei arvuta täiuslikult: kubitid on äärmiselt tundlikud ja kaotavad iga soovimatu keskkonnamõju – soojuse, elektromagnetvälja või naaberkubiti – tõttu osa infost (dekoherents). Ka väravate toimingud pole kunagi täiesti täpsed ja isegi lõplik lugemine võib ebaõnnestuda. Vaikimisi arvutab simulaator ideaalselt; siin saad sisse lülitada tüüpilisi veamudeleid ning jälgida nende mõju otse tulemustes.

Kehtib kõigile selle lehe simulatsioonidele – nii kõrgtaseme käivitustele kui ka käsitsi kirjutatud ahelatele.
%
Iga värava ja selles osalenud kubiti kohta või lugemismudelis iga loetud biti kohta. Vali väärtus uuritava stsenaariumi jaoks.

Programmikood

Kirjelda arvutust käskudega quantum.add, quantum.subtract, quantum.multiply, quantum.divide või quantum.random. Ctrl+Enter käivitab simulatsiooni. Täieliku juhendi leiad nupust „Dokumentatsioon“.

Dokumentatsioon

Kirjelda redaktoris arvutust – sellest luuakse automaatselt päris kvantahel ja seda simuleeritakse. Maksimaalselt 4000 märki. Ctrl+Enter käivitab simulatsiooni.

ValemKirjeldusPiirangud
quantum.add({ a, b })Kahe arvu liitmineTulemus kuni 4 bitti (0–15)
quantum.subtract({ a, b })Lahutaminea ≥ b, kuni 4 bitti
quantum.multiply({ a, b })KorrutamineTegurid 0–7 (3 bitti)
quantum.divide({ a, b })Jagamine (jagatis + jääk)b ≥ 1; väga piiratud: bits(a)+bits(b)+bits(a÷b)+1 ≤ 10
quantum.random({ bits })Tõeline kvantjuhuarvbits 1–10

Vali näide

Ahela kood

Maksimaalselt 4000 märki. Saadaolevad QuantumCircuit meetodid: x, y, z, h, s, sdg, t, tdg, rx, ry, rz, cnot, cz, ccnot (alias: toffoli), swap, measureAll, run. Ctrl+Enter käivitab simulatsiooni.

Vali näide

Põhitõed: kuidas see töötab?

Kvantarvuti skeem: juhtarvuti suunab mitu laserkiirt üle optilise laua vaakumkambris asuvale kubitile.
Klassikalisest juhtarvutist laserite ja optika kaudu füüsilise kubitini.

Programmist füüsilise kubitini

Päris kvantarvuti on enamat kui kiip. Klassikaline juhtelektroonika teisendab ahela täpseteks impulssideks. Näidatud näites kujundavad jahutuslaser, taasergastuslaser, kubiti laser ja lugemislaser neid signaale optilisel laual ning suunavad varjestatud vaakumkambrisse. Seal muudavad ja mõõdavad need kubiti olekut; mõõtmistulemus jõuab tagasi klassikalisse arvutisse.

Kubitt ja baasolekud

Klassikaline bitt on kas 0 või 1. Kubitt võib lisaks olla kahe baasoleku superpositsioonis: |0⟩ ja |1⟩. Mitme kubiti korral kirjutatakse kõik baasolekud bitijadana, näiteks |10⟩ kahe kubiti jaoks; seejuures on q0 selles simulaatoris alati kõrgeima kaaluga vasakpoolne bitt.

Superpositsioon

Superpositsioonis kubitt kannab samaaegselt mitme baasoleku komponente. Neid kirjeldatakse komplekssete amplituudidena; amplituudi mooduli ruut annab vastava oleku mõõtmisel saamise tõenäosuse.

Blochi sfäär

Ühe kubiti olekut saab kujutada noolena sfääris: põhjapoolus tähistab olekut |0⟩, lõunapoolus olekut |1⟩ja kõik ekvaatori punktid on võrdsete kaaludega superpositsioonid – faas määrab, millises suunas piki ekvaatorit nool osutab. Pöördeväravad rx, ryja rz pööravad noolt ümber vastava telje; faasiväravad nagu S ja T pööravad seda ümber Z-telje. Põimunud kubittide korral kahaneb nool sfääri keskme poole: üksikul kubitil pole siis enam oma puhast olekut – nii muutub põimumine sõna otseses mõttes nähtavaks.

Mõõtmine ja kordused

measureAll() mõõdab kõik kubitid korraga ja lõpetab ahela. Kuna üksik mõõtmine annab ainult ühe juhusliku tulemuse, mõõdetakse ahelat mõtteliselt „shots“ korda käsuga run({ shots }), et tõenäosusjaotus ilmuks histogrammina. Täpsed tõenäosused arvutatakse lisaks otse olekuvektorist, sõltumata mõõtmiskorduste juhuslikkusest.

Hadamardi värav

Hadamardi värav h(q) viib kubiti kindlast olekust (|0⟩ või |1⟩) võrdsete kaaludega superpositsiooni olekutest |0⟩ ja |1⟩ – mõõtmisel seega ligikaudu 50% / 50%.

Faasiväravad: S ja T

Väravad s(q) ja t(q) ei muuda ühe kubiti mõõtmistõenäosusi, vaid pööravad ainult oleku |1⟩ amplituudi faasi – S 90° ja T 45° võrra. Nende mõju ilmneb ainult koos superpositsiooniga: kahe Hadamardi värava vahel määrab faas, kuidas amplituudid liituvad või tühistuvad (interferents). Kaaskomplekstransponeeritud variandid sdg(q) ja tdg(q) pööravad täpselt vastassuunas ning tühistavad S-i ja T-d. Reegel on järgmine: kaks T-d annavad S-i, kaks S-i annavad Z-i.

CNOT ja tingimuslik põimumine

CNOT-värav cnot(control, target) pöörab sihtkubiti täpselt siis, kui juhtkubitt on olekus |1⟩. Kui juhtkubitt on eelnevalt superpositsioonis, võib see tekitada põimumise – kaht kubitti ei saa siis enam teineteisest sõltumatult kirjeldada, nagu Belli oleku näites. Kui juhtkubitt on hoopis kindlas baasolekus, teeb CNOT ainult tingimusliku bitipöörde ilma põimumiseta. Seega ei tekita iga CNOT automaatselt põimumist.

CZ: CNOT-i sümmeetriline sugulane

CZ-värav cz(a, b) vahetab amplituudi märgi täpselt siis, kui mõlemad kubitid on olekus |1⟩. Erinevalt CNOT-ist pole siin juht- ega sihtkubitti – värav toimib mõlemale kubitile ühtemoodi, mistõttu joonistatakse see skeemile kahe ühendatud punktina. CZ ja CNOT on teineteiseks teisendatavad: CNOT on CZ, mille sihtkubitt läbib enne ja pärast Hadamardi värava. CZ on paljude algoritmide, näiteks Groveri otsingu keskne ehitusplokk.

GHZ-olek: põimumine kolmekesi

GHZ-olek, mis on nimetatud Greenbergeri, Horne’i ja Zeilingeri järgi, laiendab Belli oleku põhimõtet kolmele kubitile: üks Hadamardi värav ja kaks CNOT-i põimivad kõik kolm nii, et mõõtmine annab ainult |000⟩ või |111⟩ – mitte kunagi segatud bitijadasid. Ühelgi kubitil pole enam omaette olekut; info sisaldub ainult ühises korrelatsioonis.

Deutschi algoritm: väikseim kvanteelis

Deutschi algoritm vastab tundmatu oraakli ühe päringuga küsimusele, milleks klassikaline arvuti vajab kaht päringut: kas funktsioon on konstantne või tasakaalustatud? Võte on saata sisend läbi oraakli superpositsioonis – tänu interferentsile on vastus seejärel üheselt sisendkubitti kodeeritud. Selle aluseks olev faasi tagasikandumise põhimõte on peaaegu kõigi kvantalgoritmide keskmes.

Groveri otsing: amplituudide võimendamine

Groveri otsing leiab sortimata hulgast märgistatud kirje oluliselt vähemate päringutega kui klassikaliselt vaja. Oraakel märgistab otsitava oleku faasipöördega (siin CZ-väravaga), seejärel võimendab hajutusoperaator märgistatud amplituudi kõigi teiste arvelt. Kahe kubiti korral piisab ühest iteratsioonist, et mõõta tabamust 100% tõenäosusega.

Pööratav liitmine: quantum.add()-ist ahelani

Ülalolev programmikoodi redaktor teisendab käsu quantum.add({ a, b }) X-, CNOT- ja CCNOT-väravate (Toffoli) ahelaks, mis taasesitab klassikalise liitmise puhtalt pööratavalt: iga värava toime saab täpselt tagasi pöörata, sest infot ei visata ära. CCNOT-värav (ccnot(c1, c2, target)) pöörab sihtkubiti ainult siis, kui mõlemad juhtkubitid on |1⟩ – sellest piisab ehitusplokina mistahes klassikalise ahela pööratavaks taastamiseks, sealhulgas ülekandega täisliitjaks. Sisendid A ja B algväärtustatakse esmalt X-väravate abil kindlate baasolekutena, ilma superpositsioonita. Kuna kogu ahel läbib seetõttu superpositsioonide asemel ainult kindlaid olekuid, annab lõppmõõtmine täpselt ühe tulemuse 100% tõenäosusega – klassikaliselt õige summa. Seepärast annab quantum.add() kvantsimulatsioonist hoolimata deterministliku tulemuse, mitte mitu võimalikku olekut alla 100% tõenäosustega.

Lahutamine: liitmine tagurpidi

Kuna iga kvantahela värav on täpselt pööratav, saab kogu liitmisahela käivitada tagurpidi – ja liitmisest saab lahutamine: quantum.subtract({ a, b }) kasutab täpselt liitja väravaid vastupidises järjekorras ning arvutab nii a − b. See pole trikk, vaid pööratava arvutuse aluspõhimõte: ükski arvutussamm ei hävita infot ja iga sammu saab tagasi pöörata. Selles versioonis on nõutav a ≥ b, et negatiivset tulemust ei tekiks.

Korrutamine: quantum.multiply()

Korrutamine tekib siin täpselt samadest pööratavatest ehitusplokkidest nagu liitmine: koolimeetodi järgi liidetakse tegurit a mitu korda nihutatud kohtades, vastavalt teguri b seatud bittidele. Iga osaliitmine on sama pööratav järjestikülekandega liitja; ülekanne liigub iga kord järgmisse korrutisebitti. Kuna tulemusregister kasvab koos korrutisega, on tegurid siin piiratud 3 bitiga (0–7) – ainult nii mahuvad tegur, korrutis ja ülekandekubitt koos simulaatori 10 kubiti piiridesse.

Jagamine: quantum.divide()

Ka jagamine kasutab ainult pööratavaid ehitusplokke: quantum.divide({ a, b }) teeb kirjalikku jagamist, lahutades jagajat nihutatult ja pööratavalt jäägiregistrist; tulemuseks on jagatis ja jääk (a = quotient · b + remainder). Kuna jagatav, jagaja, jagatis ja laenamise kubitt peavad koos 10 kubitti mahtuma, on jagamine kõige rangemalt piiratud tehe: bits(a) + bits(b) + bits(a÷b) + 1 ≤ 10 peab kehtima ning jagaja b peab olema ≥ 1 (nulliga jagamine pole lubatud). Kui sisend ei mahu eelarvesse, teatab redaktor sellest arvutamise asemel.

Tõeline juhuslikkus: quantum.random()

Klassikalised arvutid ei saa luua tõelist juhuslikkust – nende „juhuarvud“ pärinevad deterministlikest algoritmidest (pseudojuhuslikkus). Kvantarvuti saab: quantum.random({ bits }) viib iga biti Hadamardi väravaga 50/50 superpositsiooni ning alles mõõtmine otsustab põhimõtteliselt ennustamatult, milline väärtus saadakse. Päris kvantriistvaral on see füüsikaliselt tõeline juhuslikkus; simulaator jäljendab seda sinu brauseri pseudojuhuslikkusega.

Simulaator ja päris kvantriistvara

Simulaator arvutab olekut täpselt klassikalise ujukomaaritmeetika abil sinu brauseris – see on võimalik ainult seetõttu, et siin käsitletakse üksnes väga väikseid, kuni 10 kubitiga ahelaid. Päris kvantarvutid kasutavad füüsilisi kubitte, on veatundlikud (dekoherents, müra) ning nende eelis ilmneb alles palju suuremate ahelate korral, mida ei saa praktikas enam klassikaliselt simuleerida. See tööriist on õppevahend, mitte päris kvantprotsessor.

Korduma kippuvad küsimused

Kas see on päris kvantarvuti?
Ei. See tööriist on klassikaline olekuvektori simulaator, mis arvutab väikese, kuni 10 kubitiga kvantahela matemaatikat täpselt sinu brauseris ujukomaaritmeetika abil. Päris kvantriistvara kasutab füüsilisi kubitte ja toimib põhimõtteliselt teisiti.
Milline kubitt on q0 bitijadas „10“?
q0 on alati kõrgeima kaaluga vasakpoolne bitt. Kahe kubiti korral loob x(0) seega oleku |10⟩, mitte |01⟩.
Mida tähendab „shots“?
Shots on simuleeritud kordusmõõtmiste arv (1–10 000). Iga mõõtmine valib juhuslikult tulemuse olekuvektori täpse tõenäosusjaotuse järgi. Täpsed tõenäosused ise juhusest ei sõltu ja neid kuvatakse eraldi.
Miks näitavad mõned näited veateadet?
Esmase versiooni ulatus lubab täpselt üht ahelat ja täpselt üht run() väljakutset pärast measureAll(). Vigased kubitiindeksid, väravad pärast measureAll(), vigased nurgad või mõõtmiste arvud ja koodi süntaksivead lükatakse tagasi arusaadava veateatega.
Mida teevad Hadamardi, X- ja CNOT-väravad?
X vahetab |0⟩ ja |1⟩. Hadamard viib baasoleku võrdsete kaaludega superpositsiooni. CNOT pöörab sihtkubiti ainult siis, kui juhtkubitt on |1⟩, ning võib koos superpositsiooniga tekitada põimumise.
Kuidas põimumine tekib?
Ühes näites rakendatakse esimesele kubitile Hadamardi väravat ja seejärel teisele CNOT-i. Kubitte ei saa enam sõltumatult kirjeldada ning mõõtmine annab korreleeritud tulemusi, näiteks |00⟩ või |11⟩.