Správa kvantové paměti

Program se vždy spustí bez qubitů, což znamená, že hodnoty typu Qubit nemůžete předat jako argumenty vstupního bodu. Toto omezení je záměrné, protože jeho účelem Q# je vyjádřit a odůvodnit program v celém jeho rozsahu. Místo toho program přiděluje a vydává qubity neboli kvantovou paměť tak, jak to jde. V tomto ohledu Q# modeluje kvantový počítač jako haldu qubitů.

Místo podpory samostatných příkazů přidělení a uvolnění pro kvantovou paměť Q# podporuje přidělení kvantové paměti ve formě příkazů bloku, kde je paměť přístupná pouze v rámci tohoto příkazu bloku. Blok příkazů lze implicitně definovat při přidělování qubitů po dobu trvání aktuálního oboru, jak je podrobněji popsáno v částech o use příkazech a borrow . Při pokusu o přístup k přiděleným qubitům po ukončení příkazu dojde k výjimce za běhu.

Q# má dva příkazy use a borrow, které vytvářejí instanci qubitových hodnot, polí qubitů nebo jejich kombinace. Tyto příkazy můžete použít pouze v rámci operací. Shromáždí hodnoty qubitu s instancemi, sváže je s proměnnými zadanými v příkazu a pak spustí blok příkazů. Na konci bloku jsou vázané proměnné mimo rozsah a už se nedefinují.

Q# rozlišuje přidělení čistých a špinavých qubitů. Čisté qubity nejsou provázány a nepoužívají se v jiné části výpočtu. Špinavé qubity jsou qubity, jejichž stav je neznámý a můžou být dokonce propletené s jinými částmi paměti kvantového procesoru.

Use – příkaz

Čisté qubity se přidělují příkazem use .

  • Příkaz se skládá z klíčového slova use následovaného vazbou a volitelným blokem příkazů.
  • Pokud je k dispozici blok příkazů, qubity jsou k dispozici pouze v rámci tohoto bloku. V opačném případě jsou qubity dostupné až do konce aktuálního oboru.
  • Vazba se řídí stejným vzorem jako let příkazy: buď jeden symbol, nebo řazená kolekce řazených symbolů, za kterou následuje symbol =rovná se , a buď jedna řazená kolekce členů, nebo odpovídající řazená kolekce řazených členů inicializátorů.

Inicializátory jsou k dispozici buď pro jeden qubit označený jako Qubit(), nebo pole qubitů , Qubit[n]kde n je Int výraz. Třeba

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

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

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

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

Qubity budou po přidělení zaručeně ve stavu |0⟩. Jsou vydány na konci oboru a při vydání musí být ve stavu |0⟩. Tento požadavek není vynucován kompilátorem, protože by vyžadoval symbolické vyhodnocení, které se rychle výrazně prodraží. Při spuštění na simulátorech je možné požadavek vynutit za běhu. U kvantových procesorů nelze požadavek vynucovat za běhu. Neměřený qubit může být resetován na hodnotu |0⟩ prostřednictvím unitární transformace. Pokud to neuděláte, vede k nesprávnému chování.

Příkaz use přidělí qubity z volné haldy qubitů kvantového procesoru a vrátí je do haldy nejpozději na konec oboru, ve kterém jsou qubity vázány.

Příkaz Vypůjčit

Příkaz borrow uděluje přístup k qubitům, které jsou již přiděleny, ale aktuálně se nepoužívají. Tyto qubity můžou být v libovolném stavu a po ukončení příkazu vypůjčení musí být znovu ve stejném stavu. Některé kvantové algoritmy můžou qubity používat, aniž by se spoléhaly na jejich přesný stav a aniž by vyžadovaly, aby byly propletené se zbytkem systému. To znamená, že dočasně vyžadují další qubity, ale mohou zajistit, aby se tyto qubity vrátily přesně do původního stavu bez ohledu na to, který stav byl.

Pokud existují qubity, které se používají, ale během částí podprogramu se jich nedotýkají, mohou být tyto qubity vypůjčené pro použití takovým algoritmem místo přidělení další kvantové paměti. Zapůjčení místo přidělování může výrazně snížit celkové požadavky algoritmu na kvantovou paměť a je kvantovým příkladem typického kompromisu časoprostoru.

Příkaz borrow se řídí stejným vzorem popsaným výše pro use příkaz se stejnými inicializátory, které jsou k dispozici. Třeba

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

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

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

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

Vypůjčené qubity jsou v neznámém stavu a na konci bloku příkazů jdou mimo rozsah. Vypůjčitel se zavazuje ponechat qubity ve stejném stavu, jako když byly vypůjčené; to znamená, že se očekává, že jejich stav na začátku a na konci bloku příkazů bude stejný.

Příkaz borrow načte používané qubity, které jsou zaručeny, že nebudou programem používány od okamžiku, kdy je qubit vázán až do posledního použití tohoto qubitu. Pokud není k dispozici dostatek qubitů k zapůjčení, pak se qubity přidělují z haldy a vrací se do haldy jako use příkaz.

Poznámka

Mezi známé případy použití špinavých qubitů patří implementace více řízených bran CNOT, které vyžadují velmi málo qubitů, a implementace inkrementátorů. Tento dokument o faktoringu s qubity poskytuje příklad algoritmu, který využívá vypůjčené qubity.