Share via


Kwantumgeheugenbeheer

Een programma wordt altijd gestart zonder qubits, wat betekent dat u geen waarden van het type Qubit kunt doorgeven als toegangspuntargumenten. Deze beperking is opzettelijk omdat het doel van Q# is om een programma in zijn geheel uit te drukken en te berde te brengen. In plaats daarvan wijst een programma qubits of kwantumgeheugen toe en geeft deze vrij. In dit opzicht modelleert Q# u de kwantumcomputer als een qubit-heap.

In plaats van afzonderlijke toewijzings- en release-instructies voor kwantumgeheugen te ondersteunen, Q# ondersteunt kwantumgeheugentoewijzing in de vorm van blokinstructies, waarbij het geheugen alleen toegankelijk is binnen het bereik van die blokinstructie. Het instructieblok kan impliciet worden gedefinieerd bij het toewijzen van qubits voor de duur van het huidige bereik, zoals uitgebreider wordt beschreven in de secties over de use instructies en borrow . Als u toegang probeert te krijgen tot de toegewezen qubits nadat de instructie is beëindigd, resulteert dit in een runtime-uitzondering.

Q# heeft twee instructies, use en borrow, die qubitwaarden, matrices van qubits of een combinatie daarvan instantiëren. U kunt deze instructies alleen gebruiken binnen bewerkingen. Ze verzamelen de geïnstantieerde qubitwaarden, binden deze aan de variabelen die zijn opgegeven in de instructie en voeren vervolgens een blok met instructies uit. Aan het einde van het blok vallen de afhankelijke variabelen buiten het bereik en worden ze niet meer gedefinieerd.

Q# maakt onderscheid tussen de toewijzing van schone en vuile qubits. Schone qubits zijn niet verstrengeld en worden niet gebruikt door een ander deel van de berekening. Vuile qubits zijn qubits waarvan de status onbekend is en zelfs kunnen worden verstrengeld met andere delen van het geheugen van de kwantumprocessor.

Instructie gebruiken

Schone qubits worden toegewezen door de use -instructie.

  • De instructie bestaat uit het trefwoord use gevolgd door een binding en een optioneel instructieblok.
  • Als er een instructieblok aanwezig is, zijn de qubits alleen beschikbaar binnen dat blok. Anders zijn de qubits beschikbaar tot het einde van het huidige bereik.
  • De binding volgt hetzelfde patroon als let instructies: een enkel symbool of een tuple van symbolen, gevolgd door een gelijkteken =en een enkele tuple of een overeenkomende tuple van initialisatiemiddelen.

Initialisatiemiddelen zijn beschikbaar voor één qubit, aangeduid als Qubit(), of een matrix van qubits, Qubit[n], waarbij n een Int expressie is. Bijvoorbeeld:

use qubit = Qubit();
// ...

use (aux, register) = (Qubit(), Qubit[5]);
// ...

use qubit = Qubit() {
    // ...
}

use (aux, register) = (Qubit(), Qubit[5]) {
    // ...
}

De qubits hebben bij toewijzing gegarandeerd de status |0⟩. Ze worden vrijgegeven aan het einde van het bereik en moeten bij het vrijgeven de status |0⟩ hebben. Deze vereiste wordt niet door compiler afgedwongen, omdat hiervoor een symbolische evaluatie nodig is die al snel onbetaalbaar wordt. Bij uitvoering op simulators kan de vereiste worden afgedwongen door runtime. Op kwantumprocessors kan de vereiste niet worden afgedwongen door runtime; een niet-gemeten qubit kan opnieuw worden ingesteld op |0⟩ via eenheidstransformatie. Als u dit niet doet, resulteert dit in onjuist gedrag.

De use instructie wijst de qubits van de gratis qubit-heap van de kwantumprocessor toe en retourneert deze uiterlijk aan het einde van het bereik waarin de qubits zijn gebonden naar de heap.

Leningsoverzicht

De borrow instructie verleent toegang tot qubits die al zijn toegewezen, maar nog niet in gebruik zijn. Deze qubits kunnen zich in een willekeurige status bevinden en moeten zich opnieuw in dezelfde status bevinden wanneer het kredietoverzicht wordt beëindigd. Sommige kwantumalgoritmen kunnen qubits gebruiken zonder afhankelijk te zijn van hun exacte status en zonder dat ze los hoeven te zijn van de rest van het systeem. Dat wil dus dat ze tijdelijk extra qubits nodig hebben, maar ze kunnen ervoor zorgen dat deze qubits precies in hun oorspronkelijke staat worden geretourneerd, onafhankelijk van welke status dat was.

Als er qubits zijn die in gebruik zijn maar niet worden aangeraakt tijdens delen van een subroutine, kunnen deze qubits worden geleend voor gebruik door een dergelijk algoritme in plaats van extra kwantumgeheugen toe te wijzen. Lenen in plaats van toewijzen kan de algehele vereisten voor kwantumgeheugen van een algoritme aanzienlijk verminderen en is een kwantumvoorbeeld van een typische ruimte-tijd-afweging.

Een borrow instructie volgt hetzelfde patroon dat eerder is beschreven voor de use -instructie, waarbij dezelfde initialisatiemiddelen beschikbaar zijn. Bijvoorbeeld:

borrow qubit = Qubit();
// ...

borrow (aux, register) = (Qubit(), Qubit[5]);
// ...

borrow qubit = Qubit() {
    // ...
}

borrow (aux, register) = (Qubit(), Qubit[5]) {
    // ...
}

De geleende qubits hebben een onbekende status en vallen buiten het bereik aan het einde van het instructieblok. De lener verbindt zich ertoe om de qubits in dezelfde staat te laten als toen ze werden geleend; dat wil gezegd dat hun status aan het begin en het einde van het instructieblok naar verwachting hetzelfde is.

De borrow instructie haalt in-use qubits op die gegarandeerd niet door het programma worden gebruikt vanaf het moment dat de qubit is gebonden tot het laatste gebruik van die qubit. Als er onvoldoende qubits beschikbaar zijn om te lenen, worden qubits toegewezen van en geretourneerd naar de heap als een use instructie.

Notitie

Een van de bekende use-cases van vuile qubits zijn implementaties van meervoudig beheerde CNOT-poorten waarvoor zeer weinig qubits zijn vereist, en implementaties van incrementers. Dit artikel over factoring met qubits bevat een voorbeeld van een algoritme dat gebruikmaakt van geleende qubits.