Kvantumszámítógép-szimulátor
Írjon egy kis kvantumáramkört JavaScriptben, szimulálja közvetlenül a böngészőjében, majd tekintse meg az áramköri rajzot, a valószínűségeket és az állapotvektort. Vagy írjon le magas szinten egy számítást – például összeadást –, és figyelje meg, hogyan alakul automatikusan valódi, reverzibilis kvantumáramkörré.
Zajmodell
A valódi kvantumszámítógépek nem működnek tökéletesen: a qubitek érzékenyek, és a környezettel való nem kívánt kölcsönhatások – például hő, elektromágneses mezők vagy szomszédos qubitek – miatt koherenciát veszíthetnek. A kapuműveletek és a végső kiolvasás is hibázhat. A szimulátor alapértelmezésben ideális áramkört számol, itt pedig tipikus zajmodelleket kapcsolhat be és közvetlenül megfigyelheti a hatásukat.
Írjon le egy számítást a quantum.add, quantum.subtract, quantum.multiply, quantum.divide vagy quantum.random használatával. A Ctrl+Enter elindítja a szimulációt. A teljes leírást a „Dokumentáció” gombbal nyithatja meg.
Ezt a kódot automatikusan generálták a fenti programkódból, és közvetlenül szimulálták. Itt kézzel is meg lehet szerkeszteni, és újra lefuttatni.
A generált áramkört kézzel módosította, ezért a diagram elrejti a regisztercsoportosítást. A fenti programkód újbóli futtatása felülírja ezeket a módosításokat.
Legfeljebb 4000 karakter. Elérhető QuantumCircuit-metódusok: x, y, z, h, s, sdg, t, tdg, rx, ry, rz, cnot, cz, ccnot (más néven toffoli), swap, measureAll, run. A Ctrl+Enter elindítja a szimulációt.
Áramkör-diagram
A lépésnézet a kiválasztott kapu utáni valószínűségeket és állapotvektort mutatja. Az alábbi mérési eredmények mindig a teljes áramkörre vonatkoznak.
OpenQASM 2.0
Az OpenQASM 2.0 a kvantumáramkörök széles körben használt csereformátuma, amelyet többek között a Qiskit is olvas. Bitsorrend: ez a szimulátor q0-t tekinti a legnagyobb helyiértékű, bal oldali bitnek, míg a Qiskit q[0]-t a legkisebb helyiértékűnek; ezért a mért bitláncok ott tükrözöttnek tűnhetnek.
Valószínűségek
Az egyes lehetséges bitláncok pontos valószínűsége közvetlenül az állapotvektorból számítva. Olvasási irány: q0 a bal oldali, legnagyobb helyi értékű bit.
Bloch-gömbök
Minden qubit állapotát nyíl jelzi a Bloch-gömbön: az északi pólus |0⟩, a déli |1⟩, az egyenlítő pedig egyenlő súlyú szuperpozíció. Ha a nyíl rövidebb a gömb sugaránál, a qubit önmagában nem tiszta állapotú, például mert más qubitekkel összefonódott. Zaj hatására is rövidülhet: az itt látható zajos Bloch-vektor a zajpályák átlaga. A fenti lépésnézetben a nyilak csak zajmentes esetben követik kapuról kapura az állapotot.
Mérési eredmények
A szimulált mérések során milyen gyakran fordult elő minden bitsztring. Számos lehetséges eredmény esetén a számok véletlenszerűen szétszóródnak a pontos valószínűségek körül.
Állapotvektor
A valószínűségek mögötti komplex amplitúdók: egy amplitúdó abszolútérték-négyzete (valós² + képzetes²) adja az adott állapot valószínűségét.
| Állapot | Valódi rész | Képzeleti rész |
|---|
Alapvető: Hogyan működik?
A programtól a fizikai qubitig
A valódi kvantumszámítógép több egyetlen chipnél. A klasszikus vezérlőelektronika az áramkört pontos impulzusokká alakítja. A bemutatott példában a hűtő-, újrapumpáló-, qubitvezérlő és kiolvasó lézerek egy optikai asztalon formálják ezeket a jeleket, majd árnyékolt vákuumkamrába irányítják őket. Ott módosítják és mérik a qubit állapotát; a mérési eredmény ezután visszakerül a klasszikus számítógéphez.
Qubit és alapállapotok
A klasszikus bit értéke 0 vagy 1. A qubit e két alapállapot szuperpozíciójában is létezhet: |0⟩ és |1⟩. Több qubittel, minden alap állapot egy bitsztring, pl. |10⟩ két qubit esetén, ahol q0 q0 Ebben a szimulátorban mindig a legjelentősebb (bal) bit.
Szuperpozíció
Szuperpozícióban a qubit egyszerre több alapállapot komponensét hordozza. Ezeket komplex amplitúdók írják le; az amplitúdó abszolútérték-négyzete adja annak valószínűségét, hogy méréskor a megfelelő állapotot kapjuk.
A Bloch gömb
A qubit állapota egy gömbön lévő nyílként szemléltethető: az északi pólus jelöli a |0⟩, a déli pólus |1⟩, az egyenlítő minden pontja pedig egyenlő súlyú szuperpozíciót jelent. A fázis határozza meg, merre mutat a nyíl az egyenlítő mentén. A forgatókapuk rx, ry, és rz a nyilat a megfelelő tengely körül forgatják, az S és T fáziskapuk pedig a Z tengely körül. Összefonódott qubitnél a nyíl a gömb közepe felé rövidül: az egyedi qubitnek már nincs önálló tiszta állapota, így az összefonódás szemléletesen láthatóvá válik.
Mérések és ismétlések
measureAll() egyszerre méri az összes qubitet, majd lezárja az áramkört. Mivel egyetlen mérés csak egy véletlenszerű eredményt ad, az áramkört a gyakorlatban többször futtatjuk, például run({ shots }), így a valószínűségi eloszlás hisztogramként jelenik meg. A pontos valószínűségek közvetlenül az állapotvektorból is kiszámíthatók, a futtatások véletlenszerűségétől függetlenül.
Hadamardi kapu
A Hadamard kapu h(q) egy meghatározott állapotú qubitet (|0⟩ vagy |1⟩) egyenlő súlyú szuperpozícióba alakít: |0⟩ és |1⟩ – mindkettő körülbelül 50%-os valószínűségű.
Fáziskapuk: S és T
A kapuk. s(q) és t(q) önmagában nem változtatja meg egyetlen qubit mérési valószínűségét; csak a |1⟩ amplitúdó fázisát forgatja el – az S 90°-kal, a T 45°-kal. Hatásuk szuperpozícióval együtt válik láthatóvá: két Hadamard-kapu között a fázis dönti el, hogyan erősítik vagy oltják ki egymást az amplitúdók. Az inverz változatok sdg(q) és tdg(q) pontosan az ellenkező irányba forgatnak, így visszavonják az S és T hatását. Két T kapu egy S kapunak, két S kapu pedig egy Z kapunak felel meg.
CNOT és feltételes összefonódás
CNOT kapu cnot(control, target) pontosan akkor fordítja meg a célqubitet, ha a vezérlő qubit ebben az állapotban van: |1⟩. Ha a vezérlő előzőleg szuperpozícióban volt, a művelet összefonódást hozhat létre: a két qubit ezután már nem írható le egymástól függetlenül, ahogy a Bell-állapot példája mutatja. Meghatározott vezérlőállapotnál a CNOT csupán feltételes bitfordítás, összefonódás nélkül. Nem minden CNOT hoz létre automatikusan összefonódást.
CZ: az CNOT szimmetrikus relatív értéke
CZ kapu cz(a, b) az amplitúdó jelét pontosan akkor fordítja, amikor mindkét kvadráns |1⟩. A CNOT kapuval ellentétben itt nincs vezérlő- és célqubit: a kapu mindkét qubitre azonos módon hat, ezért az ábrán két összekötött pontként jelenik meg. A CZ és a CNOT egymásba alakítható: a CNOT olyan CZ, amelynek célqubitje a művelet előtt és után egy Hadamard-kapun halad át. A CZ számos algoritmus, például a Grover-keresés alapvető építőeleme.
GHZ állapot: összefonódás, mint egy trió
A Greenberger, Horne és Zeilinger nevét viselő GHZ-állapot három qubitre terjeszti ki a Bell-állapot elvét: egy Hadamard- és két CNOT-kapu mindhármat összefonja, így a mérés csak ezt adhatja: |000⟩ vagy |111⟩ – vegyes bitláncot soha. Egyik qubitnek sincs már önálló állapota; az információ kizárólag a közös korrelációban rejlik.
Deutsch algoritmus: a legkisebb kvantum előny
A Deutsch-algoritmus egyetlen orákulumkiértékeléssel válaszol arra a kérdésre, amelyhez klasszikusan két kiértékelés kell: a függvény állandó vagy kiegyensúlyozott? A bemenet szuperpozícióban halad át az orákulumon, majd az interferencia egyértelműen a bemeneti qubitbe kódolja a választ. A mögöttes fázis-visszahatás számos kvantumalgoritmus alapelve.
Grover keresés: amplitúdó felerősítése
A Grover-keresés a klasszikus módszernél lényegesen kevesebb lekérdezéssel talál meg egy megjelölt elemet egy rendezetlen halmazban. Az orákulum fázisfordítással – itt CZ kapuval – jelöli a keresett állapotot, a diffúziós operátor pedig a többi rovására felerősíti annak amplitúdóját. Két qubitnél egyetlen iteráció elég ahhoz, hogy a találat 100%-os valószínűséggel mérhető legyen.
Reverzibilis összeadás: a quantum.add() programtól az áramkörig
A fenti programkód szerkesztő fordít quantum.add({ a, b }) az X, CNOT és CCNOT (Toffoli) kapukból olyan áramkört készít, amely teljesen reverzibilis módon valósítja meg a klasszikus összeadást: minden kapu pontosan visszafordítható, mert nem vész el információ. A CCNOT kapu (ccnot(c1, c2, target)) csak akkor fordítja meg a célqubitet, ha mindkét vezérlő qubit |1⟩ állapotú. Ez elegendő építőelem ahhoz, hogy bármely klasszikus áramkört, köztük a teljes összeadót is reverzibilisen felépítsük. Az A és B bemenetet X kapuk határozott alapállapotként inicializálják, szuperpozíció nélkül. Az egész áramkör ezért meghatározott állapotokon halad át, így a végső mérés 100%-os valószínűséggel pontosan egy, klasszikusan helyes összeget ad. Emiatt quantum.add() a kvantumszimuláció ellenére determinisztikus eredményt kapunk, nem pedig több, 100%-nál kisebb valószínűségű lehetséges állapotot.
Kivonás: az összeadó visszafelé
Mivel a kvantumáramkör minden kapuja pontosan visszafordítható, a teljes összeadóáramkör hátrafelé is végrehajtható, és az összeadás kivonássá válik: quantum.subtract({ a, b }) pontosan az összeadó kapuit használja fordított sorrendben, és így a -b-t számítja ki. Ez nem egy trükk, hanem a visszafordítható számítás alapelve: egyetlen számítási lépés sem semmisíti meg az információt, minden lépést vissza lehet csinálni. Ebben a verzióban egy ≥ b szükséges, hogy ne legyen negatív eredmény.
Szorzás: quantum.multiply()
A szorzás ugyanazokat a reverzibilis építőelemeket használja, mint az összeadás. Az írásbeli módszert követve az a tényezőt a b tényező beállított bitjeinek megfelelő eltolt helyeken adja hozzá. Minden részösszeg ugyanazt a reverzibilis, átvitelterjesztő összeadót használja. Mivel a szorzat az eredményregiszterben növekszik, a tényezők itt legfeljebb 3 bitesek (0–7), így a tényező-, szorzat- és átviteli qubitek együtt beleférnek a szimulátor 10 qubites keretébe.
Osztás: quantum.divide()
Az osztás is kizárólag reverzibilis építőelemeket használ: quantum.divide({ a, b }) eltolt, reverzibilis kivonásokból felépített hosszú osztást hajt végre az osztóval a maradékregiszteren; az eredmény a hányados és a maradék (a = quotient · b + remainder). Mivel az osztaléknak, az osztónak, a hányadosnak és és egy kölcsönzési qubitnek együtt kell elférnie 10 qubitben, az osztás a legszigorúbban korlátozott művelet: bits(a) + bits(b) + bits(a÷b) + 1 ≤ 10 értéket kell tartania, az osztó b értékének legalább 1-nek kell lennie, mert nullával nem lehet osztani. Ha egy bemenet túllépi a kubitkeretet, a szerkesztő egyértelmű hibát jelez a számítás elindítása helyett.
Igaz véletlenszerűség: quantum.random ()
A klasszikus számítógépek általában determinisztikus algoritmusokból állítanak elő álvéletlen számokat. A quantum.random() ehelyett kvantumos elvet szemléltet: quantum.random({ bits }) minden bitet Hadamard-kapu helyez 50–50%-os szuperpozícióba, és csak a mérés dönti el alapvetően kiszámíthatatlanul, melyik érték jelenik meg. Valódi kvantumhardveren ez fizikai véletlenszerűség; a böngészős szimulátor ezt álvéletlen mintavétellel utánozza.
Szimulátor vs. valódi kvantum hardver
A szimulátor klasszikus lebegőpontos aritmetikával, a böngészőben számítja ki pontosan az állapotvektort. Ez csak azért lehetséges, mert itt legfeljebb 10 qubites, nagyon kis áramkörök futnak. A valódi kvantumszámítógépek fizikai qubiteket használnak, hibáknak és zajnak vannak kitéve, és előnyük olyan nagyobb áramköröknél jelentkezhet, amelyeket a gyakorlatban már nem lehet klasszikusan szimulálni. Ez tanulási eszköz, nem valódi kvantumprocesszor.