Simulator de calculator cuantic
Scrieți un mic circuit cuantic în JavaScript și simulați-l direct în browser pentru a vedea diagrama, probabilitățile și vectorul de stare. Sau descrieți un calcul de nivel înalt și urmăriți transformarea lui automată într-un circuit cuantic reversibil.
Model de zgomot
Calculatoarele cuantice reale nu funcționează perfect: qubiții sunt extrem de sensibili și pierd informație prin interacțiuni nedorite cu mediul, precum căldura, câmpurile electromagnetice sau qubiții vecini. Porțile nu sunt perfect precise, iar citirea finală poate fi și ea eronată. Simulatorul calculează implicit cazul ideal; aici puteți activa modele tipice de eroare și observa efectul lor direct în rezultate.
Descrieți un calcul cu quantum.add, quantum.subtract, quantum.multiply, quantum.divide sau quantum.random. Ctrl+Enter pornește simularea. Documentația completă este disponibilă prin butonul „Documentație”.
Acest cod a fost generat automat din programul de mai sus și simulat direct. Îl puteți edita manual aici și rula din nou.
Circuitul generat a fost editat manual. Prin urmare, gruparea registrului în diagramă este ascunsă; rularea codului de program de mai sus din nou va suprascrie aceste modificări.
Maximum 4.000 de caractere. Metode QuantumCircuit disponibile: x, y, z, h, s, sdg, t, tdg, rx, ry, rz, cnot, cz, ccnot (alias: toffoli), swap, measureAll și run. Ctrl+Enter pornește simularea.
Diagrama circuitului
Vizualizarea pe pași arată probabilitățile și vectorul de stare imediat după poarta selectată. Rezultatele măsurătorilor de mai jos se referă întotdeauna la circuitul complet.
OpenQASM 2.0
OpenQASM 2.0 este un format de schimb utilizat pe scară largă pentru circuite cuantice și este acceptat, printre altele, de Qiskit. Notă despre ordinea biților: simulatorul citește q0 ca bitul cel mai semnificativ, din stânga, în timp ce Qiskit tratează q[0] drept bitul cel mai puțin semnificativ. De aceea, șirurile de biți măsurate apar inversate acolo.
Probabilități
Șansa de a măsura fiecare șir de biți posibil, calculat exact din vectorul de stare. Direcția de citire: q0 este bitul stâng (cel mai semnificativ).
Sfere Bloch
Starea fiecărui qubit este reprezentată printr-o săgeată în sfera Bloch: polul nord = |0⟩, polul sud = |1⟩, iar ecuatorul = superpoziții cu ponderi egale. Dacă săgeata este clar mai scurtă decât raza sferei, qubitul nu are o stare pură proprie, fiind inseparabil de alți qubiți. O săgeată scurtă poate apărea și din cauza zgomotului, când qubitul își pierde coerența.
Rezultatele măsurătorilor
Frecvența fiecărui șir de biți în măsurătorile simulate. Dacă există mai multe rezultate posibile, frecvențele variază aleatoriu în jurul probabilităților exacte.
Vector de stare
Amplitudinile complexe care determină probabilitățile: pătratul modulului amplitudinii (parte reală² + parte imaginară²) dă probabilitatea stării respective.
| Stare | Partea reală | Partea imaginară |
|---|
Bazele: Cum funcționează?
De la program la qubit fizic
Un computer cuantic real înseamnă mai mult decât un cip. Electronica clasică de control traduce circuitul în impulsuri precise. În exemplul ilustrat, laserele pentru răcire, repompare, controlul qubitului și citire modelează semnalele pe o masă optică și le direcționează spre o cameră de vid ecranată. Acolo modifică și măsoară starea qubiților, iar rezultatul revine la computerul clasic.
Qubitul și stările de bază
Un bit clasic este fie 0, fie 1. Un qubit poate exista suplimentar într-o suprapunere a celor două stări de bază |0⟩ și |1⟩. Pentru mai mulți qubiți, stările de bază se scriu ca șiruri de biți, de exemplu |10⟩ pentru 2 qubiți, unde q0 în acest simulator este întotdeauna cel mai semnificativ (stânga) bit.
Superpoziție
Un qubit în superpoziție conține simultan componente ale mai multor stări de bază. Aceste componente sunt descrise prin amplitudini complexe, iar pătratul modulului unei amplitudini dă probabilitatea de a obține starea corespunzătoare la măsurare.
Sfera Bloch
Starea unui singur qubit poate fi vizualizată ca o săgeată într-o sferă: polul nord reprezintă |0⟩Polul Sud |1⟩, iar toate punctele de pe ecuator reprezintă superpoziții cu ponderi egale. Faza determină direcția săgeții de-a lungul ecuatorului. Porțile de rotație rx, ry, și rz rotesc săgeata în jurul axei respective, iar porțile de fază precum S și T o rotesc în jurul axei Z. Pentru qubiți inseparabili, săgețile se scurtează spre centrul sferei: qubitul individual nu mai are o stare pură proprie, astfel încât inseparabilitatea devine vizibilă.
Măsurare și shots
measureAll() măsoară simultan toți qubiții și încheie circuitul. Deoarece o singură măsurare produce un singur rezultat aleatoriu, circuitul este măsurat conceptual de mai multe ori, conform valorii shots, prin run({ shots }), astfel încât distribuția rezultatelor să poată fi reprezentată ca histogramă. Probabilitățile exacte sunt calculate separat, direct din vectorul de stare, independent de variația aleatorie a măsurătorilor.
Poarta Hadamard
Poarta Hadamard h(q) ia un qubit dintr-o stare definită (|0⟩ sau |1⟩) într-o suprapunere la fel de ponderată a |0⟩ și |1⟩ deci aproximativ 50% / 50% atunci când sunt măsurate.
Porți de fază: S și T
Porțile s(q) și t(q) nu modifică probabilitățile de măsurare ale unui singur qubit; ele doar rotesc faza de |1⟩ a amplitudinii: S cu 90°, T cu 45°. Efectul devine vizibil în combinație cu superpoziția; între două porți Hadamard, faza determină cum se adună sau se anulează amplitudinile, adică interferența. Variantele inverse sdg(q) și tdg(q) rotesc faza în sens opus și anulează S, respectiv T. Regula este: două porți T echivalează cu S, iar două porți S cu Z.
CNOT și inseparabilitatea condiționată
Poarta CNOT cnot(control, target) inversează qubitul țintă exact atunci când qubitul de control este în starea |1⟩. Dacă qubitul de control a fost pus în superpoziție, poarta poate crea inseparabilitate: cei doi qubiți nu mai pot fi descriși independent, ca în starea Bell. Dacă qubitul de control este într-o stare de bază definită, CNOT produce doar o inversare condiționată a bitului, fără inseparabilitate. Așadar, nu fiecare CNOT creează automat inseparabilitate.
CZ: ruda simetrică a CNOT
Poarta CZ cz(a, b) inversează semnul amplitudinii exact atunci când ambii qubiți sunt în starea |1⟩. Spre deosebire de CNOT, nu există un qubit de control și unul țintă: poarta acționează simetric asupra ambilor qubiți, motiv pentru care este desenată ca două puncte conectate. CZ și CNOT pot fi transformate una în cealaltă: o poartă CNOT este echivalentă cu o CZ al cărei qubit țintă trece printr-o poartă Hadamard înainte și după. CZ este un element central al multor algoritmi, inclusiv căutarea Grover.
Starea GHZ: inseparabilitate în trei
Starea GHZ, numită după Greenberger, Horne și Zeilinger, extinde principiul stării Bell la trei qubiți. O poartă Hadamard și două porți CNOT îi fac inseparabili, astfel încât măsurarea produce numai |000⟩ sau |111⟩ și niciodată șiruri de biți mixte. Niciun qubit nu mai are o stare proprie; informația există numai în corelația comună.
Algoritmul Deutsch: cel mai mic avantaj cuantic
Algoritmul Deutsch răspunde printr-o singură evaluare a unui oracol necunoscut la o întrebare pentru care un calculator clasic are nevoie de două evaluări: funcția este constantă sau echilibrată? Intrarea trece prin oracol în superpoziție, iar interferența codifică fără ambiguitate răspunsul în qubitul de intrare. Principiul folosit, numit phase kickback, este fundamental pentru mulți algoritmi cuantici.
Căutarea Grover: amplificarea amplitudinii
Căutarea Grover găsește o intrare marcată într-un set nesortat cu mai puține interogări decât o metodă clasică. Un oracol marchează starea căutată prin inversarea fazei, aici cu o poartă CZ, iar operatorul de difuzie îi amplifică amplitudinea în detrimentul celorlalte. Pentru 2 qubiți, o singură iterație este suficientă pentru a măsura starea marcată cu probabilitate de 100%.
Adăugare reversibilă: de la quantum.add() la un circuit
Editorul de cod de mai sus traduce quantum.add({ a, b }) într-un circuit de porți X, CNOT și CCNOT (Toffoli) care reproduce adunarea clasică în mod reversibil: fiecare poartă poate fi anulată exact, deoarece nicio informație nu este eliminată. O poartă CCNOT (ccnot(c1, c2, target)) inversează qubitul țintă numai atunci când ambii qubiți de control sunt în starea |1⟩ ceea ce este suficient pentru a construi orice circuit clasic reversibil, inclusiv un sumator complet cu transport. Intrările A și B sunt inițializate ca stări de bază definite, fără superpoziție, folosind porți X. Deoarece circuitul trece numai prin stări definite, măsurarea finală produce un singur rezultat cu probabilitate de 100%: suma clasică corectă. De aceea quantum.add() produce un rezultat determinist în ciuda simulării cuantice, în loc de mai multe stări posibile cu probabilități sub 100%.
Scădere: plus în sens invers
Deoarece fiecare poartă a unui circuit cuantic este exact inversibilă, circuitul complet de adăugare poate fi executat înapoi – iar adunarea devine o scădere: quantum.subtract({ a, b }) folosește exact porțile sumatorului în ordine inversă și calculează astfel a − b. Acesta este principiul de bază al calculului reversibil: niciun pas nu distruge informație și fiecare pas poate fi anulat. Versiunea actuală necesită a ≥ b, astfel încât rezultatul să nu fie negativ.
Înmulțire: quantum.multiply()
Înmulțirea folosește aceleași elemente reversibile ca adunarea. După metoda clasică, factorul a este adunat în poziții deplasate, conform biților setați ai factorului b. Fiecare sumă parțială folosește același sumator reversibil, iar transportul trece în următorul bit al produsului. Registrul rezultatului crește odată cu produsul, astfel că factorii sunt limitați la 3 biți (0–7), pentru ca factorii, produsul și qubitul de transport să încapă în buget.
Împărțire: quantum.divide()
Împărțirea folosește, de asemenea, numai elemente reversibile: quantum.divide({ a, b }) efectuează împărțirea în scris prin scăderi reversibile și deplasate ale împărțitorului din registrul restului; rezultatul este câtul și Restul (a = quotient · b + remainder). Deoarece dividendul, divizorul, câtul și un qubit auxiliar de împrumut trebuie să încapă împreună în limita de 10 qubiți, împărțirea este operația cu cele mai stricte restricții: bits(a) + bits(b) + bits(a÷b) + 1 ≤ 10 trebuie respectată limita de biți, iar împărțitorul b trebuie să fie ≥ 1 (fără diviziune la zero). Dacă o intrare nu se potrivește bugetului, editorul o raportează în loc să calculeze.
Aleatorism adevărat: quantum.random()
Calculatoarele clasice nu generează în mod obișnuit aleatoriu autentic; numerele lor provin din algoritmi determiniști, adică pseudoaleatorii. Un computer cuantic poate: quantum.random({ bits }) pune fiecare bit într-o superpoziție 50/50 cu o poartă Hadamard, iar numai măsurarea decide, fundamental imprevizibil, valoarea obținută. Pe hardware cuantic real, rezultatul este aleatoriu fizic autentic; simulatorul îl imită folosind generatorul pseudoaleatoriu al browserului.
Simulator vs hardware cuantic real
Simulatorul calculează vectorul de stare prin aritmetică clasică în virgulă mobilă, direct în browser. Acest lucru este posibil numai pentru circuite foarte mici, cu cel mult 10 qubiți. Calculatoarele cuantice reale folosesc qubiți fizici, sunt afectate de erori precum decoerența și zgomotul, iar avantajul lor apare în circuite mult mai mari, care nu mai pot fi simulate clasic în practică. Instrumentul este destinat învățării, nu este un procesor cuantic real.