Kwantumcomputer Simulator
Schrijf een klein quantumcircuit in JavaScript, simuleer het direct in je browser en bekijk het circuitschema, de waarschijnlijkheden en de toestandsvector. Of beschrijf een berekening op hoog niveau (bijvoorbeeld optellen) en kijk hoe deze automatisch wordt omgezet in een echte, terugdraaibare quantumcircuit.
Ruis Model
Echte quantumcomputers berekenen niet perfect: qubits zijn uiterst gevoelig en verliezen een deel van hun informatie (decoherentie) door elke ongewenste interactie met hun omgeving – warmte, elektromagnetische velden, naburige qubits. Poortbewerkingen zijn ook nooit perfect precies, en zelfs de uiteindelijke uitlezing kan fout gaan. Deze simulator berekent standaard ideaal; hier kun je typische foutmodellen inschakelen en direct het effect in de resultaten observeren.
Beschrijf een berekening met quantum.add, quantum.subtract, quantum.multiply, quantum.divide of quantum.random. Ctrl+Enter start de simulatie. Volledige documentatie via de knop “Documentatie”.
Deze code is automatisch gegenereerd vanuit de programmacode hierboven en direct gesimuleerd. Je kunt deze hier handmatig bewerken en opnieuw uitvoeren.
Het gegenereerde circuit is handmatig bewerkt. De registergroepering in het diagram is daarom verborgen; als je de bovenstaande programmacode opnieuw uitvoert, worden deze wijzigingen overschreven.
Maximaal 4000 tekens. Beschikbare QuantumCircuit methoden: x, y, z, h, s, sdg, t, tdg, rx, ry, rz, cnot, cz, ccnot (alias: toffoli), swap, measureAll, run. Ctrl+Enter start de simulatie.
Circuitdiagram
De stapweergave toont de kansen en de toestandsvector direct na de geselecteerde poort. De resultaten van de shots hieronder zijn altijd van toepassing op het hele circuit.
OpenQASM 2.0
OpenQASM 2.0 is het veelgebruikte uitwisselingsformaat voor quantum circuits en wordt onder meer gelezen door Qiskit. Opmerking over bitvolgorde: deze simulator leest q0 als de meest significante (linker) bit, terwijl Qiskit q[0] leest als de minst significante – gemeten bitreeksen lijken daar dus gespiegeld.
Kansen
De kans om elke mogelijke bitstring te meten, berekend exact uit de toestandsvector. Leesrichting: q0 is de linker (meest significante) bit.
Blochsferen
De toestand van elke individuele qubit als een pijl in de Blochsfeer: noordpool = |0⟩, zuidpool = |1⟩, evenaar = evenredig verdeling. Als de pijl duidelijk korter is dan de straal van de sfeer, heeft de qubit geen zuivere toestand – het is verstrengeld met andere qubits. Een korte pijl kan ook afkomstig zijn van ruis: met een actief ruismodel verliest de qubit coherentie en krimpt de pijl naar binnen. Ruisige sferen zijn hier een benadering – de Blochsvector wordt gemiddeld over de ruispaden. Met de stapweergave bewegen de pijlen poort per poort (alleen zonder ruis).
Shot Resultaten
Hoe vaak elke bitstring daadwerkelijk voorkwam in de gesimuleerde metingen. Met meerdere mogelijke resultaten, schommelen de getallen willekeurig rond de exacte kansen.
Toestandsvector
De complexe amplitudes achter de kansen: het kwadraat van de magnitude van een amplitude (reëel² + imaginair²) geeft de waarschijnlijkheid van zijn toestand.
| Toestand | Reëel deel | Imaginair deel |
|---|
Basics: Hoe werkt het?
Van programma naar fysiek qubit
Een echte quantum computer is meer dan een chip. Klassieke besturingselektronica vertalen het circuit in precieze pulsen. In het getoonde voorbeeld vormen koeling, repump-, qubit- en readoutlasers deze signalen op een optische tafel en sturen ze naar een afgeschermde vacuümkamer. Daar veranderen en meten ze de qubittoestand; het meetresultaat keert dan terug naar de klassieke computer.
Qubit & basistoestanden
Een klassiek bit is ofwel 0 ofwel 1. Een qubit kan daarnaast bestaan in een superpositie van de twee basis toestanden. |0⟩ en |1⟩. Met meerdere qubits worden alle basistoestanden als een bitstring weergegeven, bijvoorbeeld |10⟩ voor 2 qubits – waarbij q0 in deze simulator altijd het meest significante (linkse) bit is.
Superpositie
Een qubit in superpositie draagt gelijktijdig componenten van meerdere basistoestanden. Deze componenten worden beschreven als complexe amplitudes; het kwadraat van de grootte van een amplitude geeft de kans om bij een meting de corresponderende toestand te verkrijgen.
De Bloch sfeer
De toestand van een enkele qubit kan worden gevisualiseerd als een pijl in een bol: de noordpool vertegenwoordigt |0⟩, de zuidpool |1⟩, en alle punten op de evenaar zijn gelijkmatig gewogen superposities – de fase bepaalt de richting langs de evenaar waarin de pijl wijst. De rotatiepoorten rx, ryen rz roteren de pijl rond de respectievelijke as, fasepoorten zoals S en T roteren hem rond de Z-as. Met verstrengelde qubits krimpt de pijl richting het midden van de bol: de individuele qubit heeft dan niet langer een zuivere toestand van zijn eigen – dus verstrengeling wordt letterlijk zichtbaar.
Meting & shots
measureAll() meet alle qubits tegelijkertijd en beëindigt de circuit. Omdat een enkele meting slechts één willekeurig resultaat oplevert, wordt het circuit conceptueel "shots" keer gemeten run({ shots }), zodat de kansverdeling zichtbaar wordt als een histogram. De exacte waarschijnlijkheden worden bovendien direct berekend uit de toestandsvector, onafhankelijk van de willekeurigheid van de shots.
Hadamard poort
De Hadamard poort h(q) brengt een qubit van een zekere toestand (|0⟩ of |1⟩) in een gelijkmatig gewogen superpositie van |0⟩ en |1⟩ – zo ongeveer 50% / 50% bij meting.
Fasepoorten: S en T
De poorten s(q) en t(q) veranderen de meetwaarschijnlijkheden van een enkele qubit niet; ze draaien slechts de |1⟩ amplitude – S met 90°, T met 45°. Ze laten hun effect alleen zien in combinatie met superpositie: tussen twee Hadamard poorten bepaalt de fase hoe amplitudes zich combineren of opheffen (interferentie). De dagger varianten sdg(q) en tdg(q) roteren precies in de tegenovergestelde richting en heffen S en T op. De regel is: twee T maken een S, twee S maken een Z.
CNOT & conditionele verstrengeling
De CNOT poort cnot(control, target) keert de target qubit om precies wanneer de control qubit in toestand |1⟩. Als de control qubit voorafgaandelijk in superpositie staat, kan dit verstrengeling creëren – de twee qubits kunnen dan niet langer onafhankelijk van elkaar worden beschreven, zoals in het Bell-toestands voorbeeld. Als de control qubit in een zekere basistoestand staat, voert CNOT slechts een conditionele bit flip uit zonder verstrengeling. Dus niet elke CNOT creëert automatisch verstrengeling.
CZ: de symmetrische variant van CNOT
De CZ poort cz(a, b) keert het teken van de amplitude om precies wanneer beide qubits in |1⟩In tegenstelling tot CNOT, zijn er geen controle- en doelqubit – de poort werkt identiek op beide qubits, wat verklaart waarom deze in het diagram wordt weergegeven als twee verbonden puntjes. CZ en CNOT kunnen in elkaar worden omgezet: een CNOT is een CZ waarvan de doelqubit door een Hadamard-poort gaat vóór en na. CZ is een centraal bouwblok van veel algoritmen, zoals de Grover-zoekopdracht.
GHZ-toestand: entanglement als een trio
De GHZ-toestand (genoemd naar Greenberger, Horne en Zeilinger) breidt het Bell-toestand principe uit naar drie qubits: één Hadamard-poort plus twee CNOT's entangelen alle drie zodat meting slechts oplevert |000⟩ of |111⟩ – nooit gemengde bitreeksen. Geen qubit heeft meer een eigen toestand; de informatie ligt uitsluitend in de gedeelde correlatie.
Deutsch-algoritme: het kleinste kwantumvoordeel
Het Deutsch-algoritme beantwoordt, met slechts één evaluatie van een onbekende oracle, een vraag waarvoor een klassieke computer twee evaluaties nodig heeft: is de functie constant of gebalanceerd? De truc is om de input door de oracle in superpositie te sturen – dankzij interferentie wordt het antwoord daarna ondubbelzinnig gecodeerd in de input-qubit. Het principe erachter (fasekickback) staat centraal in bijna alle kwantumalgoritmen.
Grover-zoekopdracht: amplitudes versterken
De Grover-zoekopdracht vindt een gemarkeerd item in een ongeordende set met aanzienlijk minder queries dan klassiek vereist. Een oracle markeert de gezochte toestand met een faseflip (hier via een CZ-poort), waarna de diffusieoperator de gemarkeerde amplitude versterkt ten koste van alle anderen. Met 2 qubits is één iteratie voldoende om de hit met 100% kans te meten.
Reversibele optelling: van quantum.add() naar een circuit
De programmacode-editor hierboven vertaalt quantum.add({ a, b }) in een circuit van X-, CNOT- en CCNOT-poorten (Toffoli) dat klassieke optelling op een puur reversibele manier reproduceert: elke poort kan precies worden teruggedraaid, omdat er geen informatie wordt weggegooid. Een CCNOT-poort (ccnot(c1, c2, target)) |1⟩ flipt de doelqubit alleen wanneer beide controlequbits zijn – dat is voldoende als bouwsteen om elk klassiek circuit reversibel te reconstrueren, inclusief een volledige opteller met carry. De inputs A en B worden eerst geïnitialiseerd als definitieve basis toestanden (geen superpositie) met behulp van X-poorten. Omdat het gehele circuit daardoor slechts doorloopt via definitieve toestanden in plaats van superposities, levert de meting aan het einde precies één resultaat op met 100% kans – de klassiek correcte som. Dat is waarom quantum.add() een deterministisch resultaat oplevert ondanks de kwantumsimulatie, in plaats van verschillende mogelijke toestanden met waarschijnlijkheden onder de 100%.
Aftrekken: optelling omgekeerd
Omdat elke poort van een kwantumcircuit precies invertibel is, kan het gehele opteller circuit achterwaarts worden uitgevoerd – en de optelling wordt een aftrekking: quantum.subtract({ a, b }) gebruikt exact dezelfde poorten als de opteller in omgekeerde volgorde en berekent zo a − b. Dit is geen trucje, maar het basisprincipe van reversibele berekening: elke stap vernietigt geen informatie, elke stap kan worden teruggedraaid. In deze versie is a ≥ b vereist zodat er geen negatief resultaat ontstaat.
Vermenigvuldigen: quantum.multiply()
Vermenigvuldiging komt hier voort uit exact dezelfde reversibele bouwstenen als optelling: volgend de methode van de basisschool, wordt factor a herhaaldelijk opgeteld in verschoven posities – passend bij de aangezette bits van factor b. Elke partiële optelling is dezelfde reversibele ripple-carry opteller; de carry stroomt telkens door naar het volgende product bit. Omdat het resultaat register groeit met het product, zijn de factoren hier beperkt tot 3 bits (0–7) – alleen dan passen factor, product en carry qubit samen in deze simulator's 10 qubits.
Delen: quantum.divide()
Delen gebruikt ook slechts reversibele bouwstenen: quantum.divide({ a, b }) voert lange deling uit opgebouwd uit verschoven, reversibele aftrekkingen van de deler van het restregister; het resultaat is het quotiënt en de resta = quotient · b + remainder). Omdat deeltal, deler en quotiënt en een leenqubit samen binnen de 10 qubits moeten passen, is deling de sterkst beperkte bewerking: bits(a) + bits(b) + bits(a÷b) + 1 ≤ 10 moet gelden, en de deler b moet ≥ 1 zijn (geen deling door nul). Als een invoer niet binnen het budget past, meldt de editor dit in plaats van te berekenen.
Echte willekeur: quantum.random()
Klassieke computers kunnen geen echte willekeur genereren: hun 'willekeurige getallen' komen uit deterministische algoritmen (pseudowillekeur). Een kwantumcomputer kan: quantum.random({ bits }) elk bit met een Hadamard-poort in een 50/50-superpositie plaatsen, waarna alleen de meting – fundamenteel onvoorspelbaar – de uitkomst bepaalt. Op echte kwantumhardware is dit fysieke willekeur; deze simulator bootst die na met de pseudowillekeur van je browser.
Simulator tegenover echte kwantumhardware
Deze simulator berekent de toestand exact met klassieke drijvende-kommaberekeningen in je browser. Dat werkt alleen omdat hier uitsluitend zeer kleine circuits met maximaal 10 qubits worden gebruikt. Echte kwantumcomputers gebruiken fysieke qubits, zijn foutgevoelig door decoherentie en ruis, en bieden pas voordeel bij veel grotere circuits die klassiek niet meer praktisch te simuleren zijn. Dit is een leermiddel, geen echte kwantumprocessor.