Mik a Q#-programok fő összetevői?
Mielőtt saját kvantumprogramokat ír, fontos tisztában lenni a Q# programozási nyelv szerkezetével és összetevőivel.
Ebben a leckében megismerheti egy Q#-program alapvető összetevőit.
A Main művelet
Minden Q#-programnak legalább egy műveletet tartalmaznia kell. A Q#-fordító a belépési pontként meghatározott műveletből kezdi meg a program futtatását, amely alapértelmezés szerint a Main művelet. A következő Q#-program például tartalmaz egy qubitet létrehozó és a qubit állapotának mérésére szolgáló Main műveletet:
// This operation is the entry point to your program because it's name is Main
operation Main() : Result {
use q = Qubit();
return M(q);
}
A Q#-kód nem futtatható belépésipont-művelet nélkül. Ha a belépési ponttól eltérő Main műveletet szeretne használni, használja az @EntryPoint() attribútumot. Az alábbi kód például leíróbb nevet ad az előző műveletnek, MeasureOneQubités a Q#-program belépési pontjaként definiálja a műveletet:
// The @EntryPoint() attribute tells the compiler to start running your code from this operation
@EntryPoint()
operation MeasureOneQubit() : Result {
use q = Qubit();
return M(q);
}
Típusok
A Q# számos olyan beépített adattípust biztosít, amelyeket már ismerhet, például Int, Double, Boolés String. A Q# olyan típusokat is biztosít, amelyek a kvantum-számítástechnikára jellemzőek, például Qubit és Result.
A művelet például MeasureOneQubit egy típusértéket Result ad vissza. A Result típus egy qubit állapotát jelöli, amikor a qubitet megmérik, és értéke lehet akár Zero, vagy One.
Kvantumkódtárak
A Q# számos olyan kódtárat tartalmaz, amelyek függvényeket és műveleteket tartalmaznak a kvantumprogramok írásához. Ha függvényt vagy műveletet szeretne meghívni egy tárból, használja a import kulcsszót, és adja meg az erőforrástár névterét. Ha például a függvényt a MessageStd.Intrinsic standard kvantumtár névteréből szeretné használni, használja a következő kódot:
// import all functions and operations from Std.Intrinsic
import Std.Intrinsic.*;
operation Main() : Unit {
// call the Message function from Std.Intrinsic
Message("Hello quantum world!");
}
A csillag azt jelenti, hogy az összes függvényt importálja a Std.Intrinsic névtérből. Másik lehetőségként csak a Message függvényt importálhatja:
// import only the Message function from Std.Intrinsic
import Std.Intrinsic.Message;
operation Main() : Unit {
// call the Message function from Std.Intrinsic
Message("Hello quantum world!");
}
Megjegyzés:
A Q#-ban a Unit típus azt jelenti, hogy a függvény vagy művelet nem ad vissza értéket. A Q#-típusokról további információt a Type System (Típusrendszer) című témakörben talál.
A Q# standard kódtárának megismeréséhez tekintse meg az API-referenciát.
Qubit-kiosztás
Qubit Q#-ban való lefoglalásához használja a kulcsszót use és a típust Qubit . A use kulcsszóval lefoglalt qubitek mindig $\ket{0}$ állapotban kezdődnek.
Egyetlen qubitet vagy több qubitet is lefoglalhat egy qubittömbben. Íme egy példa, amely egyetlen qubitet foglal le a változóban q1 , és egy öt qubitből álló tömböt a következőben q5:
use q1 = Qubit(); // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits
Qubitmérés
A Q#-ban a Measure művelet egy vagy több qubit közös mérését hajtja végre a megadott Pauli-bázisokon, amelyek lehetnek PauliX, PauliYvagy PauliZ. A Measure művelet olyan típus Result értéket ad vissza, amelynek értéke lehet vagy Zero, vagy One.
A $\lbrace\ket{0}, \ket{1}\rbrace$ számítási bázisban történő mérés elvégzéséhez a M műveletet is használhatja. A M művelet egyenértékű az Measure Pauli-Z alapján végzett művelettel, ezért M([qubit]) pontosan ugyanúgy viselkedik, mint Measure([PauliZ], [qubit])a . A M művelet azonban csak egyetlen qubitet fogad el bemenetként, qubittömböket nem.
Qubitek alaphelyzetbe állítása
A Q#-ban a qubiteknek $\ket{0}$ állapotban kell lenniük a kiadásukhoz. Amikor befejezi a qubit használatát, hívja meg a Reset műveletet, hogy a qubitet a $\ket{0}$ állapotba állítsa. A következő kód például leküld egy qubitet, méri a qubit állapotát, majd alaphelyzetbe állítja a qubitet:
operation Main() : Result {
use q = Qubit();
let result = M(q);
// Reset the qubit so that you can release it
Reset(q);
return result;
}