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.
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“.
See kood loodi ülaltoodud programmikoodist automaatselt ja simuleeriti kohe. Saad seda siin käsitsi muuta ja uuesti käivitada.
Loodud ahelat muudeti käsitsi. Seetõttu on registrite rühmitus skeemil peidetud; ülaltoodud programmikoodi uuesti käivitamine kirjutab need muudatused üle.
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.
Ahelaskeem
Sammuvaade näitab tõenäosusi ja olekuvektorit täpselt pärast valitud väravat. Allolevad mõõtmistulemused kehtivad alati kogu ahela kohta.
OpenQASM 2.0
OpenQASM 2.0 on laialt kasutatav kvantahelate vahetusvorming, mida loeb muu hulgas Qiskit. Bitijärjekorra märkus: simulaator loeb q0 kõrgeima kaaluga vasakpoolseks bitiks, Qiskit aga q[0] madalaima kaaluga bitiks – mõõdetud bitijadad paistavad seal seetõttu peegelpildis.
Tõenäosused
Iga võimaliku bitijada mõõtmise tõenäosus, arvutatud täpselt olekuvektorist. Lugemissuund: q0 on vasakpoolne kõrgeima kaaluga bitt.
Blochi sfäärid
Iga üksiku kubiti olek noolena Blochi sfääris: põhjapoolus = |0⟩, lõunapoolus = |1⟩, ekvaator = võrdsete kaaludega superpositsioon. Kui nool on sfääri raadiusest selgelt lühem, pole kubitil oma puhast olekut – see on põimunud teiste kubittidega. Lühikese noole võib põhjustada ka müra: aktiivse müramudeli korral kaotab kubitt koherentsust ja nool kahaneb sissepoole. Müraga sfäärid on siin lähendus – Blochi vektor keskmistatakse üle müratrajektooride. Ülaloleva sammuvaatega liiguvad nooled väravhaaval (ainult müravabalt).
Mõõtmistulemused
Mitu korda iga bitijada simuleeritud mõõtmistes tegelikult esines. Mitme võimaliku tulemuse korral hajuvad arvud juhuslikult täpsete tõenäosuste ümber.
Olekuvektor
Tõenäosuste taga olevad komplekssed amplituudid: amplituudi mooduli ruut (reaalosa² + imaginaarosa²) annab vastava oleku tõenäosuse.
| Olek | Reaalosa | Imaginaarosa |
|---|
Põhitõed: kuidas see töötab?
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.