Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een programma begint altijd zonder qubits, wat betekent dat u geen waarden van het type Qubit als invoerpuntargumenten kunt doorgeven. Deze beperking is opzettelijk omdat het doel van Q# is om in zijn geheel over een programma uit te drukken en te redeneren.
In plaats daarvan wijst een programma qubits of kwantumgeheugen toe en publiceert het naarmate het gaat.
In dit opzicht Q# de kwantumcomputer als qubit heap modelleren.
In plaats van afzonderlijke toe te wijzen en -instructies voor kwantumgeheugen vrij te geven, ondersteunt Q# 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 beschreven in de secties over de use- en borrow-instructies. Een poging om toegang te krijgen tot de toegewezen qubits nadat de instructie is beëindigd, resulteert in een runtime-uitzondering.
Q# twee instructies heeft, 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 ze 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# onderscheid maakt tussen de toewijzing van schone en vuile qubits. Schone qubits zijn verstrengeld en worden niet gebruikt door een ander deel van de berekening. Vuile qubits zijn qubits waarvan de status onbekend is en zelfs kan worden verstrengeld met andere delen van het geheugen van de kwantumprocessor.
Gebruiksinstructie
Schone qubits worden toegewezen door de use instructie.
- De instructie bestaat uit het trefwoord
usegevolgd door een binding en een optioneel instructieblok. - Als er een instructieblok aanwezig is, zijn de qubits alleen beschikbaar in dat blok. Anders zijn de qubits beschikbaar tot het einde van het huidige bereik.
- De binding volgt hetzelfde patroon als
letinstructies: één symbool of een tuple van symbolen, gevolgd door een gelijkteken=, en één tuple of een overeenkomende tuple van initialisaties.
Initializers zijn beschikbaar voor één qubit, aangegeven 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 gegarandeerd de status |0⟩ bij toewijzing. Ze worden aan het einde van het bereik vrijgegeven en moeten de status |0⟩ hebben bij de release. Deze vereiste wordt niet door compiler afgedwongen, omdat hiervoor een symbolische evaluatie vereist is die snel verboden duur wordt. Wanneer u op simulators werkt, 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 unitaire transformatie. Als u dit niet doet, resulteert dit in onjuist gedrag.
De use-instructie wijst de qubits toe uit de gratis qubit-heap van de kwantumprocessor en retourneert deze uiterlijk aan het einde van het bereik waarin de qubits zijn gebonden.
Leningsoverzicht
De instructie borrow verleent toegang tot qubits die al zijn toegewezen, maar die momenteel niet in gebruik zijn. Deze qubits kunnen zich in een willekeurige status bevinden en moeten opnieuw dezelfde status hebben wanneer de leningsverklaring wordt beëindigd.
Sommige kwantumalgoritmen kunnen qubits gebruiken zonder te vertrouwen op hun exacte status en zonder dat ze niet verstrengeld zijn met de rest van het systeem. Dat wil zeggen dat ze tijdelijk extra qubits nodig hebben, maar ze kunnen ervoor zorgen dat deze qubits exact worden geretourneerd naar hun oorspronkelijke staat, onafhankelijk van welke staat 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. Het lenen in plaats van toewijzen kan de totale kwantumgeheugenvereisten van een algoritme aanzienlijk verminderen en is een kwantumvoorbeeld van een typische afweging tussen ruimte en tijd.
Een borrow-instructie volgt hetzelfde patroon dat eerder is beschreven voor de use-instructie, waarbij dezelfde initializers 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 kredietnemer verbindt zich ertoe om de qubits in dezelfde staat te laten als toen ze werden geleend; dat wil zeggen 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 van en geretourneerd aan de heap, zoals een use instructie.
Notitie
Onder de bekende use-cases van vuile qubits zijn implementaties van multi-gecontroleerde CNOT-poorten waarvoor zeer weinig qubits en implementaties van incrementers nodig zijn. Dit document over factoring met qubits biedt een voorbeeld van een algoritme dat gebruikmaakt van geleende qubits.