ToolDingo

Kvantu datora simulators

Uzrakstiet nelielu kvantu ķēdi JavaScript, simulējiet to tieši pārlūkā un skatiet shēmu, varbūtības un stāvokļa vektoru. Vai aprakstiet aprēķinu augstā līmenī, piemēram, saskaitīšanu, un vērojiet, kā tas automātiski pārtop īstā atgriezeniskā kvantu ķēdē.

Trokšņa modelis

Reāli kvantu datori nerēķina nevainojami: kubiti ir ļoti jutīgi un ar katru nevēlamu mijiedarbību ar vidi – siltumu, elektromagnētiskajiem laukiem, blakus kubitiem – zaudē daļu informācijas (dekoherence). Arī vārtu darbības nekad nav pilnīgi precīzas, un pat galīgā nolasīšana var būt kļūdaina. Pēc noklusējuma simulators rēķina ideāli; šeit var ieslēgt tipiskus kļūdu modeļus un vērot to ietekmi tieši rezultātos.

Attiecas uz katru simulāciju šajā lapā – gan augsta līmeņa izpildi, gan manuāli rakstītām ķēdēm.
%
Katram vārtu un iesaistītā kubita pārim vai katram nolasītajam bitam nolasīšanas modelī. Izvēlieties pētāmajam scenārijam atbilstošu vērtību.

Programmas kods

Aprakstiet aprēķinu ar quantum.add, quantum.subtract, quantum.multiply, quantum.divide vai quantum.random. Ctrl+Enter sāk simulāciju. Pilna dokumentācija pieejama ar pogu “Dokumentācija”.

Dokumentācija

Aprakstiet aprēķinu redaktorā; no tā automātiski ģenerē īstu kvantu ķēdi un simulē to. Maksimums 4000 rakstzīmes. Ctrl+Enter sāk simulāciju.

FormulaAprakstsIerobežojumi
quantum.add({ a, b })Saskaitīt divus skaitļusRezultāts līdz 4 bitiem (0–15)
quantum.subtract({ a, b })Atņemšanaa ≥ b, maks. 4 biti
quantum.multiply({ a, b })ReizināšanaReizinātāji 0–7 (3 biti)
quantum.divide({ a, b })Dalīšana (dalījums + atlikums)b ≥ 1; stingra robeža: bits(a)+bits(b)+bits(a÷b)+1 ≤ 10
quantum.random({ bits })Kvantu nejaušais skaitlisbits: 1–10

Izvēlieties piemēru

Ķēdes kods

Maksimums 4000 rakstzīmes. Pieejamās QuantumCircuit metodes: x, y, z, h, s, sdg, t, tdg, rx, ry, rz, cnot, cz, ccnot (alternatīvi: toffoli), swap, measureAll, run. Ctrl+Enter sāk simulāciju.

Izvēlieties piemēru

Pamati: kā tas darbojas?

Kvantu datora uzbūves shēma: vadības dators virza vairākus lāzera starus pa optisko galdu uz kubitu vakuuma kamerā.
No klasiskā vadības datora caur lāzeriem un optiku līdz fiziskam kubitam.

No programmas līdz fiziskam kubitam

Īsts kvantu dators ir kas vairāk par mikroshēmu. Klasiskā vadības elektronika pārvērš ķēdi precīzos impulsos. Parādītajā piemērā dzesēšanas, atkārtotas ierosmes, kubita un nolasīšanas lāzeri veido šos signālus uz optiskā galda un virza tos ekranētā vakuuma kamerā. Tur tie maina un mēra kubita stāvokli; mērījuma rezultāts pēc tam atgriežas klasiskajā datorā.

Kubits un bāzes stāvokļi

Klasisks bits ir vai nu 0, vai 1. Kubits papildus var pastāvēt abu bāzes stāvokļu superpozīcijā: |0⟩ un |1⟩. Vairākiem kubitiem visus bāzes stāvokļus pieraksta kā bitu virkni, piemēram, |10⟩ 2 kubitiem; turklāt q0 šajā simulatorā vienmēr ir nozīmīgākais (kreisais) bits.

Superpozīcija

Kubits superpozīcijā vienlaikus satur vairāku bāzes stāvokļu komponentes. Tās apraksta ar kompleksām amplitūdām; amplitūdas moduļa kvadrāts dod varbūtību mērījumā iegūt atbilstošo stāvokli.

Bloha sfēra

Viena kubita stāvokli var attēlot kā bultu sfērā: ziemeļpols apzīmē |0⟩, dienvidpols |1⟩, bet visi ekvatora punkti ir vienādi svērtas superpozīcijas. Fāze nosaka bultas virzienu gar ekvatoru. Rotācijas vārti rx, ryun rz griež bultu ap attiecīgo asi, bet fāzes vārti, piemēram, S un T, griež to ap Z asi. Sapītiem kubitiem bulta sarūk sfēras centra virzienā: atsevišķam kubitam vairs nav sava tīra stāvokļa. Tā sapīšanās kļūst burtiski redzama.

Mērījumi un atkārtojumi

measureAll() vienlaikus izmēra visus kubitus un noslēdz ķēdi. Tā kā viens mērījums dod tikai vienu nejaušu rezultātu, ķēdi nosacīti mēra “shots” reižu ar run({ shots }), lai varbūtību sadalījums parādītos histogrammā. Precīzās varbūtības papildus aprēķina tieši no stāvokļa vektora neatkarīgi no mērījumu nejaušības.

Adamāra vārti

Adamāra vārti h(q) pārveido kubitu no noteikta stāvokļa (|0⟩ vai |1⟩) par vienādi svērtu superpozīciju starp |0⟩ un |1⟩ – tātad mērījumā aptuveni 50 % / 50 %.

Fāzes vārti: S un T

Vārti s(q) un t(q) nemaina viena kubita mērījumu varbūtības; tie tikai pagriež stāvokļa |1⟩ amplitūdas fāzi: S par 90°, T par 45°. Ietekme parādās tikai kopā ar superpozīciju: starp diviem Adamāra vārtiem fāze nosaka, kā amplitūdas summējas vai savstarpēji dzēšas (interference). Apgrieztie varianti sdg(q) un tdg(q) griež tieši pretējā virzienā un atceļ S un T. Noteikums: divi T veido S, divi S veido Z.

CNOT un nosacīta sapīšanās

CNOT vārti cnot(control, target) apgriež mērķa kubitu tieši tad, kad vadības kubits ir stāvoklī |1⟩. Ja vadības kubits iepriekš ir superpozīcijā, tas var radīt sapīšanos: abus kubitus vairs nevar aprakstīt neatkarīgi, kā Bela stāvokļa piemērā. Ja vadības kubits ir noteiktā bāzes stāvoklī, CNOT tikai nosacīti apgriež bitu bez sapīšanās. Tātad ne katrs CNOT automātiski rada sapīšanos.

CZ: CNOT simetriskais radinieks

CZ vārti cz(a, b) apgriež amplitūdas zīmi tieši tad, kad abi kubiti ir |1⟩. Atšķirībā no CNOT nav vadības un mērķa kubita: vārti vienādi iedarbojas uz abiem, tādēļ shēmā tos attēlo kā divus savienotus punktus. CZ un CNOT var pārveidot vienus par otriem: CNOT ir CZ, kura mērķa kubitam pirms un pēc tam piemēro Adamāra vārtus. CZ ir daudzu algoritmu, piemēram, Grovera meklēšanas, svarīgs pamatelements.

GHZ stāvoklis: trīs kubitu sapīšanās

GHZ stāvoklis (nosaukts Grīnbergera, Horna un Ceilingera vārdā) paplašina Bela stāvokļa principu uz trim kubitiem: vieni Adamāra un divi CNOT vārti sapin visus trīs tā, ka mērījums dod tikai |000⟩ vai |111⟩ – nekad jauktas bitu virknes. Nevienam kubitam vairs nav sava tīra stāvokļa; informācija atrodas kopīgajā korelācijā.

Deutsch algoritms: mazākā kvantu priekšrocība

Deutsch algoritms ar vienu nezināma orākula novērtējumu atbild uz jautājumu, kam klasiskam datoram vajag divus novērtējumus: vai funkcija ir konstanta vai līdzsvarota? Paņēmiens ir sūtīt ievadi caur orākulu superpozīcijā; pateicoties interferencei, atbilde pēc tam ir nepārprotami iekodēta ievades kubitā. Pamatprincips – fāzes atgriezeniskā ietekme – ir gandrīz visu kvantu algoritmu pamatā.

Grovera meklēšana: amplitūdu pastiprināšana

Grovera meklēšana atrod atzīmētu elementu nesakārtotā kopā ar ievērojami mazāk vaicājumiem nekā klasiski. Orākuls atzīmē meklēto stāvokli ar fāzes apgriešanu (šeit ar CZ vārtiem), tad difūzijas operators pastiprina atzīmēto amplitūdu uz pārējo rēķina. Ar 2 kubitiem pietiek ar vienu iterāciju, lai trāpījumu izmērītu ar 100 % varbūtību.

Atgriezeniska saskaitīšana: no quantum.add() līdz ķēdei

Augšējais programmas koda redaktors pārvērš quantum.add({ a, b }) par X, CNOT un CCNOT (Tofoli) vārtu ķēdi, kas atveido klasisku saskaitīšanu pilnībā atgriezeniski: katrus vārtus var precīzi atcelt, jo informācija netiek atmesta. CCNOT vārti (ccnot(c1, c2, target)) apgriež mērķa kubitu tikai tad, ja abi vadības kubiti ir |1⟩ – ar to kā pamatelementu pietiek, lai atgriezeniski atveidotu jebkuru klasisku ķēdi, arī pilnu saskaitītāju ar pārnesumu. Ievades A un B vispirms ar X vārtiem inicializē kā noteiktus bāzes stāvokļus bez superpozīcijas. Tā kā visa ķēde tādēļ iziet tikai caur noteiktiem stāvokļiem, gala mērījums dod tieši vienu rezultātu ar 100 % varbūtību – klasiski pareizo summu. Tādēļ quantum.add() dod determinētu rezultātu, neraugoties uz kvantu simulāciju, nevis vairākus iespējamus stāvokļus ar varbūtībām zem 100 %.

Atņemšana: saskaitīšana pretējā virzienā

Tā kā visi kvantu ķēdes vārti ir precīzi apgriežami, visu saskaitītāja ķēdi var izpildīt atpakaļgaitā, un saskaitīšana kļūst par atņemšanu: quantum.subtract({ a, b }) izmanto tieši saskaitītāja vārtus pretējā secībā un aprēķina a − b. Tas nav triks, bet atgriezeniskas skaitļošanas pamatprincips: neviens aprēķina solis neiznīcina informāciju, un katru soli var atcelt. Šajā versijā nepieciešams a ≥ b, lai nerastos negatīvs rezultāts.

Reizināšana: quantum.multiply()

Reizināšana šeit rodas no tiem pašiem atgriezeniskajiem pamatelementiem kā saskaitīšana: pēc rakstiskās metodes reizinātāju a vairākkārt pieskaita nobīdītās pozīcijās atbilstoši reizinātāja b iestatītajiem bitiem. Katra daļējā saskaitīšana ir tas pats atgriezeniskais secīgā pārnesuma saskaitītājs; pārnesums katru reizi pāriet nākamajā reizinājuma bitā. Tā kā rezultāta reģistrs aug līdz ar reizinājumu, reizinātāji šeit ierobežoti līdz 3 bitiem (0–7). Tikai tad reizinātājs, reizinājums un pārnesuma kubits kopā ietilpst simulatora 10 kubitos.

Dalīšana: quantum.divide()

Arī dalīšana izmanto tikai atgriezeniskus pamatelementus: quantum.divide({ a, b }) veic rakstisko dalīšanu, ko veido nobīdītas, atgriezeniskas dalītāja atņemšanas no atlikuma reģistra; rezultāts ir dalījums un atlikums (a = quotient · b + remainder). Tā kā dalāmajam, dalītājam, dalījumam un aizņēmuma kubitam kopā jāietilpst 10 kubitos, dalīšana ir visstingrāk ierobežotā darbība: bits(a) + bits(b) + bits(a÷b) + 1 ≤ 10 jābūt izpildītam, un dalītājam b jābūt ≥ 1 (nedrīkst dalīt ar nulli). Ja ievade neietilpst limitā, redaktors aprēķina vietā par to ziņo.

Kvantu nejaušība: quantum.random()

Klasiskie nejaušo skaitļu algoritmi ir determinēti un rada pseidonejaušību. Kvantu dators savukārt var izmantot fiziski nejaušu mērījumu: quantum.random({ bits }) ar Adamāra vārtiem katru bitu ievieto superpozīcijā 50/50, un tikai mērījums fundamentāli neparedzami nosaka iegūto vērtību. Reālā kvantu aparatūrā tā ir fiziski īsta nejaušība; šis simulators to atdarina ar jūsu pārlūka pseidonejaušību.

Simulators un reāla kvantu aparatūra

Simulators aprēķina stāvokli tieši ar klasisku peldošā komata aritmētiku pārlūkā; tas ir iespējams, jo šeit aplūko tikai ļoti mazas ķēdes ar līdz 10 kubitiem. Reāli kvantu datori izmanto fiziskus kubitus, ir pakļauti kļūdām (dekoherencei, troksnim), un to priekšrocība izpaužas daudz lielākās ķēdēs, ko praksē vairs nevar klasiski simulēt. Šis rīks ir mācībām, nevis īsts kvantu procesors.

Biežāk uzdotie jautājumi

Vai tas ir īsts kvantu dators?
Nē. Tas ir klasisks stāvokļa vektora simulators, kas nelielas kvantu ķēdes (līdz 10 kubitiem) matemātiku aprēķina tieši, izmantojot peldošā komata aritmētiku pārlūkā. Reāla kvantu aparatūra izmanto fiziskus kubitus un darbojas būtiski citādi.
Kurš kubits ir q0 tādā bitu virknē kā “10”?
q0 vienmēr ir nozīmīgākais (kreisais) bits. Tādēļ ar 2 kubitiem x(0) izveido stāvokli |10⟩, nevis |01⟩.
Ko nozīmē “shots”?
Shots ir simulēto atkārtoto mērījumu skaits (1–10 000). Katrs mērījums nejauši izlozē iznākumu pēc stāvokļa vektora precīzā varbūtību sadalījuma. Pašas precīzās varbūtības nav atkarīgas no nejaušības un tiek parādītas atsevišķi.
Kāpēc dažos piemēros parādās kļūdas ziņojums?
Šī sākotnējā versija atļauj tieši vienu ķēdi ar tieši vienu run() izsaukumu pēc measureAll(). Nederīgus kubitu indeksus, vārtus pēc measureAll(), nederīgus leņķus vai mērījumu skaitu un sintakses kļūdas kodā noraida ar saprotamu kļūdas ziņojumu.
Ko dara Adamāra, X un CNOT vārti?
X apmaina |0⟩ un |1⟩. Adamāra vārti pārvērš bāzes stāvokli vienādi svērtā superpozīcijā. CNOT apgriež mērķi tikai tad, ja vadības kubits ir |1⟩, un kopā ar superpozīciju var radīt sapīšanos.
Kā rodas sapīšanās?
Vienā piemērā pirmajam kubitam piemēro Adamāra vārtus, pēc tam otrajam – CNOT. Kubitus vairs nevar aprakstīt neatkarīgi, un mērījums dod korelētus iznākumus, piemēram, |00⟩ vai |11⟩.