Comment les programmes Q# sont-ils structurés ?

Effectué

Avant de commencer à écrire des programmes quantiques, il est important de comprendre la structure et les composants d’un programme Q#.

Dans cette unité, vous allez passer en revue les principaux composants d’un programme Q#.

Opération Main

Chaque programme Q# doit contenir au moins une opération, en général l’opération Main. L’opération Main est le point d’entrée de votre programme. Par défaut, le compilateur Q# démarre l’exécution d’un programme à partir de l’opération Main(). Vous pouvez éventuellement utiliser l’attribut @EntryPoint() pour spécifier n’importe quelle opération dans le programme comme point d’exécution.

Par exemple, le code suivant définit une opération de point d’entrée, MeasureOneQubit :

@EntryPoint()
operation MeasureOneQubit() : Result {
    ...
}

Toutefois, vous pouvez également écrire ce code sans l’attribut @EntryPoint() en renommant l’opération MeasureOneQubit() en Main() :

// The Q# compiler automatically detects the Main() operation as the entry point. 
operation Main() : Result {
    ...
}

Types

Q# fournit de nombreux types intégrés avec lesquels vous êtes peut-être déjà familiarisé, notamment Int, Double, Bool et String. Q# fournit également des types spécifiques à l’informatique quantique, comme Qubit et Result.

Dans cet exemple, l’opération MeasureOneQubit retourne un type Result. Un type Result est le résultat de la mesure d’un qubit, et peut être One ou Zero.

operation MeasureOneQubit() : Result {
    ...
}

Bibliothèques quantiques

Les bibliothèques Q# contiennent des fonctions et des opérations que vous pouvez utiliser dans les programmes quantiques. Quand vous appelez une fonction ou une opération à partir d’une bibliothèque, vous utilisez la directive import, et vous spécifiez l’espace de noms de la bibliothèque. Par exemple, pour utiliser la fonction Message à partir de l’espace de noms Microsoft.Quantum.Intrinsic dans la bibliothèque quantique Standard, procédez comme suit :

// imports all functions and operations from Microsoft.Quantum.Intrinsic 
import Microsoft.Quantum.Intrinsic.*;
    Message("Hello quantum world!");


// imports just the `Message` function from Microsoft.Quantum.Intrinsic
import Microsoft.Quantum.Intrinsic.Message;
    Message("Hello quantum world!");

Vous pouvez importer les espaces de noms de la bibliothèque Standard en utilisant Std à la place de Microsoft.Quantum. Par exemple :

// imports all functions and operations from Microsoft.Quantum.Intrinsic == Std.Intrinsic
import Std.Intrinsic.*;
    Message("Hello quantum world!");

Allocation de qubits

En Q#, pour allouer un qubit, vous utilisez le mot clé use et le type Qubit. Chaque qubit que vous allouez avec le mot clé use commence à l’état $\ket{0}$.

Vous pouvez allouer un ou plusieurs qubits à la fois. Voici un exemple qui alloue un et cinq qubits :

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

Mesure des qubits

En Q#, l’opération Measure effectue une mesure conjointe d’un ou de plusieurs qubits dans les bases de Pauli spécifiées, qui peuvent être PauliX, PauliY ou PauliZ. L’opération Measure retourne un type Result, à savoir One ou Zero.

Pour implémenter une mesure dans la base de calcul $\lbrace\ket{0},\ket{1}\rbrace$ vous pouvez également utiliser l’opération M, qui effectue une mesure dans la base Z de Pauli. Ainsi, l’opération M équivaut à l’application de Measure([PauliZ], [qubit]).

Réinitialisation de qubits

En Q#, les qubits doivent être à l’état $\ket{0}$ au moment où ils sont libérés. Une fois que vous avez fini d’utiliser un qubit, vous utilisez l’opération Reset pour réinitialiser le qubit à $\ket{0}$.

    // Reset the qubit so it can be safely released.
    Reset(qubit);