Megosztás a következőn keresztül:


Kvantummemória-kezelés

A programok mindig qubitek nélkül indulnak, ami azt jelenti, hogy a típusú Qubit értékeket nem lehet belépésipont-argumentumként átadni. Ez a korlátozás szándékos, mivel a célja egy program teljes egészének kifejezése Q# és indoka. Ehelyett egy program qubiteket vagy kvantummemóriát foglal le és szabadít fel. Ebben a tekintetben Q# a kvantumszámítógépet qubit halommemóriaként modellezi.

Ahelyett, hogy külön lefoglalási és kiadási utasításokat támogat a kvantummemória számára, Q# támogatja a kvantummemória blokkutasítások formájában történő lefoglalását, ahol a memória csak a blokkutasítás hatókörén belül érhető el. Az utasításblokk implicit módon definiálható, amikor qubiteket oszt ki az aktuális hatókör időtartamára, a és borrow az use utasításokkal kapcsolatos szakaszokban részletesebben leírtak szerint. A lefoglalt qubitek elérésének megkísérlése a utasítás leállítása után futásidejű kivételt eredményez.

Q# két utasítással rendelkezik, use és borrow, amelyek qubitértékeket, qubittömböket vagy azok bármely kombinációját példányosítják. Ezeket az utasításokat csak műveletekben használhatja. Összegyűjtik a példányosított qubitértékeket, kötik őket az utasításban megadott változókhoz, majd futtatnak egy utasításblokkot. A blokk végén a kötött változók kikerülnek a hatókörből, és már nincsenek definiálva.

Q# különbséget tesz a tiszta és a piszkos qubitek lefoglalása között. A tiszta qubiteket a rendszer nem használja, és a számítás egy másik része nem használja. A piszkos qubitek olyan qubitek, amelyek állapota ismeretlen, és a kvantumprocesszor memóriájának más részeivel is összefonódhatnak.

Használati utasítás

A tiszta qubiteket a use utasítás foglalja le.

  • Az utasítás a kulcsszóból use , majd egy kötésből és egy opcionális utasításblokkból áll.
  • Ha egy utasításblokk jelen van, a qubitek csak az adott blokkon belül érhetők el. Ellenkező esetben a qubitek az aktuális hatókör végéig érhetők el.
  • A kötés ugyanazt a mintát követi, mint let az utasítások: egyetlen szimbólumot vagy egy rekord szimbólumot, majd egy egyenlőségjelet =, és vagy egyetlen rekordot vagy az inicializálók megfelelő rekordját.

Az inicializálók egyetlen qubithez érhetők el , Qubit()vagy qubitek tömbjéhez, Qubit[n]ahol n egy Int kifejezés. Példa:

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

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

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

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

A qubitek kiosztáskor garantáltan |0⟩ állapotban vannak. A hatókör végén jelennek meg, és a kiadáskor |0⟩ állapotban kell lenniük. Ez a követelmény nem fordítható ki, mivel ehhez szimbolikus értékelésre lenne szükség, amely gyorsan megfizethetetlenül költséges lesz. Szimulátorokon való futtatáskor a követelmény érvényesíthető a futtatókörnyezetben. A kvantumprocesszorok esetében a követelmény nem kényszeríthető ki futtatókörnyezetre; A nem mért qubitek alaphelyzetbe állíthatók |0⟩ unitáris átalakítással. Ennek elmulasztása helytelen viselkedést eredményez.

A use utasítás leküldi a qubiteket a kvantumprocesszor szabad qubit-halommemóriajából, és legkésőbb annak a hatókörnek a végénél visszajuttatja őket a halomba, amelyben a qubitek meg vannak kötve.

Hitelfelvételi kimutatás

A borrow utasítás hozzáférést biztosít azokhoz a qubitekhez, amelyek már ki vannak foglalva, de jelenleg nincsenek használatban. Ezek a qubitek tetszőleges állapotban lehetnek, és a hitelfelvételi kimutatás leállásakor újra ugyanabban az állapotban kell lenniük. Egyes kvantumalgoritmusok anélkül használhatják a qubiteket, hogy a pontos állapotukra támaszkodnának, és nem követelik meg, hogy a rendszer többi részével is össze legyenek kapcsolva. Ez azt jelzi, hogy ideiglenesen további qubitekre van szükségük, de biztosíthatják, hogy ezek a qubitek pontosan az eredeti állapotukba kerülnek vissza, függetlenül attól, hogy melyik állapotban volt.

Ha vannak olyan qubitek, amelyek használatban vannak, de nem érintik az alrutin részeit, ezek a qubitek kölcsönkérhetők egy ilyen algoritmus általi használatra ahelyett, hogy további kvantummemóriát foglalnak le. A kiosztás helyett a kölcsönzés jelentősen csökkentheti az algoritmusok általános kvantummemóriára vonatkozó követelményeit, és egy tipikus téridő-kompromisszum kvantum példája.

Egy borrow utasítás ugyanazt a mintát követi, amelyet korábban már leírt az use utasításhoz, és ugyanazok az inicializálók érhetők el. Példa:

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

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

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

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

A kölcsönzött qubitek ismeretlen állapotban vannak, és ki vannak lépve a hatókörből az utasításblokk végén. A hitelfelvevő kötelezettséget vállal arra, hogy a qubiteket ugyanabban az állapotban hagyja, mint a kölcsönzéskor; vagyis az állapotuk a utasításblokk elején és végén várhatóan megegyezik.

A borrow utasítás olyan használatban lévő qubiteket kér le, amelyeket a program garantáltan nem használ a qubit kötésének időpontjától a qubit utolsó használatáig. Ha nem áll rendelkezésre elegendő qubit a kölcsönzéshez, akkor a qubitek ki vannak foglalva a halomba, mint egy use utasítás.

Megjegyzés

A piszkos qubitek ismert használati esetei közé tartoznak a több vezérlésű CNOT-kapuk implementációi, amelyek nagyon kevés qubitet igényelnek, és a növekményes rendszerek implementációi. Ez a qubitekkel történő faktorálásról szóló tanulmány egy olyan algoritmust mutat be, amely kölcsönzött qubiteket használ.