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.
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”.
Šis kods automātiski ģenerēts no augstāk esošā programmas koda un uzreiz simulēts. Šeit varat to manuāli rediģēt un palaist vēlreiz.
Ģenerētā ķēde ir manuāli rediģēta. Tādēļ reģistru grupējums shēmā ir paslēpts; atkārtoti palaižot augstāk esošo programmas kodu, šīs izmaiņas tiks pārrakstītas.
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.
Ķēdes shēma
Soļu skats parāda varbūtības un stāvokļa vektoru tieši pēc izvēlētajiem vārtiem. Zemāk esošie mērījumu rezultāti vienmēr attiecas uz pilnu ķēdi.
OpenQASM 2.0
OpenQASM 2.0 ir plaši izmantots kvantu ķēžu apmaiņas formāts, ko lasa arī Qiskit. Bitu secība: šis simulators lasa q0 kā nozīmīgāko (kreiso) bitu, bet Qiskit lasa q[0] kā mazāk nozīmīgo; tādēļ izmērītās bitu virknes tur izskatās spoguļotas.
Varbūtības
Katras iespējamās bitu virknes izmērīšanas varbūtība, kas precīzi aprēķināta no stāvokļa vektora. Lasīšanas virziens: q0 ir kreisais (nozīmīgākais) bits.
Bloha sfēras
Katra atsevišķā kubita stāvoklis kā bulta Bloha sfērā: ziemeļpols = |0⟩, dienvidpols = |1⟩, ekvators = vienādi svērta superpozīcija. Ja bulta ir ievērojami īsāka par sfēras rādiusu, kubitam nav sava tīra stāvokļa – tas ir sapīts ar citiem kubitiem. Īsa bulta var rasties arī trokšņa dēļ: ar aktīvu trokšņa modeli kubits zaudē koherenci un bulta sarūk uz iekšpusi. Trokšņainās sfēras šeit ir tuvinājums; Bloha vektoram aprēķina vidējo vērtību pār trokšņa trajektorijām. Augšējā soļu skatā bultas pārvietojas pa vārtiem (tikai bez trokšņa).
Mērījumu rezultāti
Cik bieži katra bitu virkne faktiski parādījās simulētajos mērījumos. Ja ir vairāki iespējamie rezultāti, skaitļi nejauši svārstās ap precīzajām varbūtībām.
Stāvokļa vektors
Kompleksās amplitūdas aiz varbūtībām: amplitūdas moduļa kvadrāts (reālā daļa² + imaginārā daļa²) dod attiecīgā stāvokļa varbūtību.
| Stāvoklis | Reālā daļa | Imaginārā daļa |
|---|
Pamati: kā tas darbojas?
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.