Comment les programmes Q# sont-ils structurés ?
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);