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#.

Espaces de noms

Chaque fichier Q# commence par un espace de noms. Voici un exemple :

namespace HelloQuantum {
    // Your code goes here.
}

Le mot clé namespace est utilisé pour définir un espace de noms. Les espaces de noms sont utilisés pour organiser le code Q# en unités logiques. Leur utilisation devient importante lorsque vous utilisez des bibliothèques Q# dans vos programmes et lorsque vous écrivez vos propres bibliothèques.

Allocation de qubits

Dans Q#, pour obtenir un qubit, vous devez utiliser le mot clé use. 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

Opérations quantiques

Ces opérations sont à la base des programmes en Q#. Une opération Q# est une sous-routine quantique. Autrement dit, il s’agit d’une routine pouvant être appelée qui contient des opérations quantiques permettant de modifier l’état du registre de qubits.

Pour définir une opération Q#, vous devez spécifier un nom pour celle-ci, ainsi que ses entrées et sa sortie. Voici un exemple de base :

operation SayHelloQ() : Unit {
    Message("Hello quantum world!");
}

Ici, SayHelloQ correspond au nom de l’opération. Elle n’accepte aucun argument comme entrée et retourne le type Unit, ce qui signifie que l’opération ne retourne aucune information.

Les bibliothèques Q# fournissent également des opérations que vous pouvez utiliser dans vos programmes, par exemple l’opération Hadamard, H, qui place un qubit dans un état de superposition.

Types

Q# fournit de nombreux types intégrés avec lesquels vous êtes peut-être déjà familiarisé, notamment Int, Double, Bool et String.

Dans cet exemple, le type Unit est utilisé pour indiquer que l’opération ne retourne aucune information :

operation SayHelloQ() : Unit {
    Message("Hello quantum world!");
}

Dans les unités suivantes, vous allez utiliser le type Result, qui est un type spécifique à l’informatique quantique. Un type Result est le résultat de la mesure d’un qubit, et peut être One et Zero.

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 open, et vous spécifiez l’espace de noms de la bibliothèque. Par exemple, pour utiliser la bibliothèque Microsoft.Quantum.Intrinsic, effectuez ce qui suit :

    open Microsoft.Quantum.Intrinsic;

Point d’entrée

EntryPoint indique au compilateur Q# où commencer l’exécution du programme. Chaque programme Q# doit avoir un point d’entrée, suivi d’une opération. Par exemple, le code suivant définit une opération de point d’entrée, HelloQ, qui affiche « Hello quantum world! » dans la console :

namespace HelloQuantum {

    open Microsoft.Quantum.Intrinsic;

    @EntryPoint()
    operation HelloQ() : Unit {
        Message("Hello quantum world!");
    }
}

Remarque

Notez que le programme Q# ci-dessus ouvre la bibliothèque Microsoft.Quantum.Intrinsic pour utiliser l’opération Message, qui écrit un message dans la console.

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);