Was sind die Hauptkomponenten eines Q#-Programms?

Abgeschlossen

Bevor Sie Ihre eigenen Quantenprogramme schreiben, ist es wichtig, die Struktur und Komponenten der Q#-Programmiersprache zu verstehen.

In dieser Lektion erfahren Sie mehr über die grundlegenden Komponenten eines Q#-Programms.

Der Main-Vorgang

Jedes Q#-Programm muss mindestens einen Vorgang enthalten. Der Q#-Compiler beginnt, ein Programm aus dem Einstiegspunktvorgang auszuführen, bei dem es sich standardmäßig um den Main Vorgang handelt. Das folgende Q#-Programm enthält z. B. einen Vorgang, der einen Main Qubit erstellt und eine Messung des Qubitzustands zurückgibt:

// This operation is the entry point to your program because it's name is Main
operation Main() : Result {
    use q = Qubit();
    return M(q);
}

Ihr Q#-Code kann nicht ohne eine Entrypoint-Operation ausgeführt werden. Wenn Sie eine andere Operation als Main als Einstiegspunkt verwenden möchten, verwenden Sie das @EntryPoint()-Attribut. Der folgende Code gibt z. B. dem vorherigen Vorgang einen aussagekräftigeren Namen und MeasureOneQubitdefiniert diesen Vorgang als Einstiegspunkt zu Ihrem Q#-Programm:

// The @EntryPoint() attribute tells the compiler to start running your code from this operation
@EntryPoint()
operation MeasureOneQubit() : Result {
    use q = Qubit();
    return M(q);
}

Typen

Q# bietet viele integrierte Datentypen, mit denen Sie möglicherweise bereits vertraut sind, wie z.B. Int, Double, Bool und String. Q# stellt auch Typen bereit, die spezifisch für das Quantencomputing sind, wie Qubit und Result.

Beispielsweise gibt der MeasureOneQubit Vorgang einen Result Typwert zurück. Der Result Typ stellt den Zustand eines Qubits dar, wenn der Qubit gemessen wird, und kann einen Wert von entweder Zero oder One.

Quantumbibliotheken

Q# enthält mehrere Bibliotheken, die Funktionen und Vorgänge enthalten, die Ihnen beim Schreiben von Quantenprogrammen helfen. Um eine Funktion oder einen Vorgang aus einer Bibliothek aufzurufen, verwenden Sie das import Schlüsselwort, und geben Sie den Namespace der Bibliothek an. Wenn Sie beispielsweise die Message Funktion aus dem Microsoft.Quantum.Intrinsic Namespace in der Standardmäßigen Quantenbibliothek verwenden möchten, verwenden Sie den folgenden Code:

// import all functions and operations from Microsoft.Quantum.Intrinsic 
import Microsoft.Quantum.Intrinsic.*;

operation Main() : Unit {
    // call the Message function from Microsoft.Quantum.Intrinsic
    Message("Hello quantum world!");
}

Das Sternchen bedeutet, dass Sie alle Funktionen aus dem Microsoft.Quantum.Intrinsic Namespace importieren. Alternativ können Sie nur die Message Funktion importieren:

// import only the Message function from Microsoft.Quantum.Intrinsic 
import Microsoft.Quantum.Intrinsic.Message;

operation Main() : Unit {
    // call the Message function from Microsoft.Quantum.Intrinsic
    Message("Hello quantum world!");
}

Hinweis

In F# bedeutet der Unit Typ, dass die Funktion oder der Vorgang keinen Wert zurückgibt. Weitere Informationen zu Typen in Q# finden Sie unter Typsystem.

Sie können Namespaces in der Standardbibliothek mit Std anstelle von Microsoft.Quantum importieren. Der folgende Code importiert beispielsweise alle Funktionen und Vorgänge aus dem Microsoft.Quantum.Intrinsic Namespace:

// import everything from Std.Intrinsic (Microsoft.Quantum.Intrinsic)
import Std.Intrinsic.*;

operation Main() : Unit {
    // call the Message function from Std.Intrinsic
    Message("Hello quantum world!");
}

Informationen zur Q#-Standardbibliothek finden Sie in der API-Referenz.

Qubit-Zuordnung

Verwenden Sie zum Zuweisen eines Qubits in Q# das use Schlüsselwort und den Qubit Typ. Qubits, die Sie mit dem use Schlüsselwort zuordnen, beginnen immer im Status $\ket{0}$.

Sie können einen einzelnen Qubit oder mehrere Qubits in einem Qubit-Array zuordnen. Hier ist ein Beispiel, das ein einzelnes Qubit in der Variablen q1 zuweist und ein Array von fünf Qubits in q5:

use q1 = Qubit();  // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits

Qubit-Messung

In Q# führt der Measure-Vorgang eine gemeinsame Messung eines oder mehrerer Qubits in den angegebenen Pauli-Basen durch. Diese können PauliX, PauliY oder PauliZ sein. Der Measure Vorgang gibt einen Typ Result zurück, der einen Wert von entweder Zero oder One hat.

Um eine Messung in der Rechenbasis $\lbrace\ket{0},\ket{1}\rbrace$durchzuführen, können Sie den M Vorgang auch verwenden. Der M Vorgang entspricht dem Measure Vorgang in der Pauli-Z Basis, verhält sich also M([qubit]) genau wie Measure([PauliZ], [qubit]). Der M Vorgang akzeptiert jedoch nur einzelne Qubits als Eingabe, nicht qubit-Arrays.

Zurücksetzen von Qubits

In Q# müssen Qubits im Zustand "$\ket{0}$" sein, um sie freizugeben. Wenn Sie mit der Verwendung eines Qubits fertig sind, rufen Sie den Reset Vorgang auf, um den Qubit auf den Status "$\ket{0}$" zurückzusetzen. Der folgende Code weist z. B. ein Qubit zu, misst den Zustand des Qubits und setzt dann den Qubit zurück:

operation Main() : Result {
    use q = Qubit();
    let result = M(q);

    // Reset the qubit so that you can release it
    Reset(q);

    return result;
    }