Skip to main content
IBM Quantum Platform

Commencez à utiliser Qiskit en classe

Pour ce module Qiskit en classe, les étudiants doivent disposer d'un environnement Python fonctionnel avec les paquets suivants installés :

  • qiskit v2.1.0 ou plus récent
  • qiskit-ibm-runtime v0.40.1 ou plus récent
  • qiskit-aer v0.17.0 ou plus récent
  • qiskit.visualization
  • numpy
  • pylatexenc

Pour configurer et installer les paquets ci-dessus, voir le guide d' installation de Qiskit. Afin d'exécuter des tâches sur de véritables ordinateurs quantiques, les étudiants devront créer un compte sur IBM Quantum® en suivant les étapes du guide Configurer votre compte IBM Cloud®.

Ce module a été testé et a utilisé 2 secondes de temps QPU sur un processeur Heron v2. Il s'agit uniquement d'une estimation. L'utilisation réelle peut varier.

# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'

Présentation

Dans les modules Qiskit en classe, vous aurez l'occasion d'utiliser un ordinateur quantique pour explorer divers concepts de l'informatique quantique et des domaines connexes tels que la mécanique quantique, l'informatique, la chimie, etc. Ce module sert de prérequis aux autres - il présente les principes fondamentaux de l'informatique quantique et explique comment utiliser Qiskit pour exécuter des circuits quantiques.

Nous vous donnerons d'abord un bref aperçu du fonctionnement d'un ordinateur classique, puis nous vous montrerons comment ces concepts sont adaptés au paradigme de l'informatique quantique. Enfin, nous vous montrerons comment assembler ces concepts pour construire et exécuter votre premier circuit quantique.


Ordinateurs classiques

Vous connaissez sans doute les principes de base du fonctionnement des ordinateurs classiques, mais nous allons ici mettre en évidence quelques-unes de leurs principales caractéristiques, afin de pouvoir ensuite les comparer aux ordinateurs quantiques.

Les unités de base de l'information : les bits

Les ordinateurs classiques traitent des informations classiques, et l'unité fondamentale de l'information classique est le bit. Un seul bit peut stocker la réponse à une question "oui/non". Les deux états binaires d'un bit sont généralement représentés par "0" et "1".

Révision des nombres binaires

La combinaison de bits permet de stocker davantage d'informations. Par exemple, si vous voulez stocker un nombre de 0 à 15, vous pouvez le faire avec quatre bits de la manière suivante :

0 = 00004 = 01008 = 100012 = 1100
1 = 00015 = 01019 = 100113 = 1101
2 = 00106 = 011010 = 101014 = 1110
3 = 00117 = 011111 = 101115 = 1111

En général, pour convertir un nombre binaire de NN bits en un nombre familier, base-10, vous multipliez le bit le moins significatif (le plus à droite) par 20=12^0 = 1, le bit suivant à gauche par 21=22^1 = 2, puis le suivant par 22=42^2 = 4, et ainsi de suite, jusqu'à ce que vous atteigniez le bit le plus significatif (le plus à gauche), que vous multipliez par 2N12^{N-1}.

Cela signifie que NN bits peuvent se trouver dans l'un des 2N2^N états possibles.

Vérifiez votre compréhension

De combien de bits auriez-vous besoin pour représenter le nombre 86? Écrivez la chaîne de bits qui code ce nombre en binaire.

  • Rappelez-vous que NN bits vous permet de représenter les nombres 00 à 2N12^N - 1, de sorte que l'utilisation de six bits nous amènerait à 261=632^6 - 1 = 63. Ce n'est pas tout à fait suffisant. Nous ajoutons un bit supplémentaire pour atteindre 271=1272^7 - 1 = 127. Décomposons maintenant 86 en puissances de 2 :

    86=64+16+4+2=26×1+25×0+24×1+23×0+22×1+21×1+20×0=1010110\begin{aligned} 86 &= 64 + 16 + 4 + 2 \\ &= 2^6 \times 1 + 2^5 \times 0 + 2^4 \times 1 + 2^3 \times 0 + 2^2 \times 1 + 2^1 \times 1 + 2^0 \times 0 \\ &= 1010110 \end{aligned}

Opérations fondamentales : portes logiques

Or, un ordinateur doit être capable de faire quelque chose avec les bits pour pouvoir, eh bien, calculer. Les portes binaires sont les opérations qui constituent les éléments fondamentaux de tous les algorithmes et codes les plus compliqués.

Porte à un seul bit :

N'EST PAS

Lorsque vous n'avez qu'un seul bit, il n'y a qu'une seule façon de transformer son état : inverser l'état de 0 à 1 ou de 1 à 0. C'est ce que nous appelons la porte "NOT". L'effet de cette porte - et des autres portes dont nous parlerons plus loin - peut être représenté par une "table de vérité", avec des colonnes pour les états d'entrée et de sortie des qubits. La table de vérité pour la porte NOT est la suivante

Entrée
Sortie
01
10

Portes à plusieurs bits :

ET

AND est une porte à deux bits qui prend deux bits en entrée et produit un seul bit en sortie. Il émet 1 si les deux bits d'entrée sont à 1, et 0 dans le cas contraire :

Entrée
Sortie
000
010
100
111

OU

Le OU est une autre porte à deux bits avec un seul bit de sortie. Il émet 1 si l 'un des bits est à 1 :

Entrée
Sortie
000
011
101
111

OU X

XOR signifie "OU exclusif" et ressemble à la porte OU, mais il produit 1 si un seul des bits d'entrée est à 1. Il produit 0 s'ils sont tous les deux 1 ou tous les deux 0 :

Entrée
Sortie
000
011
101
110

Mesures :

En général, lorsque l'on apprend l'informatique classique, on n'accorde pas beaucoup d'attention au processus de lecture de l'état des bits. En effet, il n'est pas très complexe d'un point de vue conceptuel. Vous pouvez mesurer les bits à tout moment avant, pendant ou après un calcul, et cela n'affecte pas le résultat. Ce n'est pas le cas de l'informatique quantique, comme nous le verrons plus loin.

Circuits :

En combinant les portes ci-dessus, vous pouvez effectuer toutes les opérations que vous souhaitez sur un ordinateur. Prenons un exemple simple : En utilisant les portes AND et XOR, vous pouvez construire le circuit demi-ordre, qui calcule la somme de deux bits. Ceci est représenté dans un schéma de circuit logique, où les fils représentent les bits et les portes opérant sur les bits sont représentées par des symboles sur les fils correspondants :

Schéma classique du circuit à demi-addition. Une porte XOR génère le bit de sortie Sum et une porte AND génère le bit de sortie Carry.

Les deux bits sont donc copiés et passent à la fois par une porte ET et une porte XOR. Le résultat de la porte XOR est le "bit de somme" (S), qui reste à la place des uns du nombre binaire, et le résultat de la porte AND est le "bit de report" (C), qui est la valeur du chiffre le plus significatif suivant dans le nombre binaire. Voici la table de vérité :

AA
BB
Somme ( ABA \oplus B )
Portage ( ABA \wedge B )
0000
0110
1010
1101

Vérifiez votre compréhension

Vérifiez que la table de vérité ci-dessus donne la solution correcte pour un circuit additionneur. Autrement dit, pour chacune des quatre options de A et B, vérifiez que A+B=S+2×CA+B=S+2 \times C.

  • 0+0=0+0=0 0+1=1+0=1 1+0=1+0=1 1+1=0+2=2 \begin{aligned} 0+0 &= 0+0 = 0 ~\checkmark \\ 0+1 &= 1+0 = 1 ~\checkmark \\ 1+0 &= 1+0 = 1 ~\checkmark \\ 1+1 &= 0+2 = 2 ~\checkmark \\ \end{aligned}

Ordinateurs quantiques

Bits \rightarrow qubits

Tout comme les bits sont les unités fondamentales de l'information classique, les bits quantiques, ou "qubits", sont les unités fondamentales de l'information quantique. Comme le bit classique, l'état d'un qubit peut être soit 0, soit 1, ce que nous désignons généralement par 0\vert 0\rangle et 1\vert 1\rangle. Mais contrairement au bit classique, un bit quantique peut également se trouver dans une superposition de l'état 0\vert 0\rangle et de l'état 1\vert 1\rangle en même temps. En général, un qubit peut être dans n'importe quel état ψ\vert \psi\rangle de la forme :

ψ=c00+c11\vert \psi\rangle = c_0 \vert 0\rangle + c_1 \vert 1\rangle

c0c_0 et c1c_1 sont des amplitudes complexes avec c02+c12=1\vert c_0 \vert ^2+\vert c_1\vert ^2=1.

La phase quantique

Comme c0c_0 et c1c_1 sont complexes, ils peuvent tous deux être écrits sous la forme ci=cieiϕic_i = \vert c_i\vert e^{i\phi_i}, où ϕi\phi_i est appelé la phase. Si l'on multiplie l'ensemble de l'état par le même facteur de phase global, rien ne change physiquement - c'est ce que l'on appelle une phase globale, qui n'a aucune conséquence observable.

C'est pourquoi il est conventionnel de "factoriser" eiϕ0e^{i\phi_0}, en donnant :

ψ=c00+c1eiϕ1\vert \psi\rangle = \vert c_0\vert \vert 0\rangle + \vert c_1\vert e^{i\phi}\vert 1\rangle

ϕ=ϕ1ϕ0\phi = \phi_1-\phi_0 est la phase relative de l'état quantique, qui a des conséquences observables.

Cette phase joue un rôle très important dans l'informatique quantique, et vous explorerez ses différentes conséquences dans les modules suivants de Qiskit in the Classroom.

Qubits multiples

Alors que l'état de plusieurs bits peut simplement être exprimé comme une chaîne de 0s et 1s, l'état de plusieurs qubits est un peu plus compliqué en raison des principes de superposition et d' enchevêtrement.

Rappelons que NN bits peuvent se trouver dans l'un des 2N2^N états possibles, allant des nombres binaires 000...000 à 111...111. Mais aujourd'hui, grâce au principe de superposition, les qubits du site NN peuvent se trouver dans une superposition de tous ces états à la fois!

Cela peut s'exprimer comme suit

ψN=i=02N1cii\psi_N = \sum_{i=0}^{2^N-1} c_i \vert i\rangle

où, comme dans le cas classique, l'état i\vert i\rangle correspond à l'état dans lequel chaque qubit se trouve dans la bonne combinaison de 0s et 1s pour donner le nombre binaire ii. C'est ce qu'on appelle les "états de base de calcul" du système quantique. Par exemple, un état à trois qubits peut être écrit comme une superposition de ses huit états de base de calcul :

ψ3=c0000+c1001+c2010+c3011+c4100+c5101+c6110+c7111\psi_3 = c_0 \vert 000\rangle + c_1 \vert 001\rangle + c_2 \vert 010\rangle + c_3 \vert 011\rangle + c_4 \vert 100\rangle + c_5 \vert 101\rangle + c_6 \vert 110\rangle + c_7 \vert 111\rangle

Chaque qubit du système est désigné par un index allant de 00 à N1N-1. La convention consiste à lire les états des qubits de droite à gauche, de sorte que l'état du qubit 00 est l'état le plus à droite et l'état du qubit N1N-1 est le plus à gauche. C'est ce que l'on appelle la notation "little-endian", qui peut sembler contre-intuitive à première vue, puisque nous avons l'habitude de lire de gauche à droite.

Vérifiez votre compréhension

À première vue, il peut sembler contre-intuitif d'ordonner les qubits de droite à gauche comme dans la notation little-endian, mais c'est en fait une chose très logique à faire! Expliquez pourquoi. (Rappelons notre discussion ci-dessus sur la conversion des nombres binaires en nombres base-10.)

  • Si l'on ordonne les qubits de droite à gauche, de sorte que le qubit 0 soit le plus à droite et le qubit N-1 le plus à gauche, il est logique d'associer le qubit 00 au bit de poids faible, qui est multiplié par 202^0 et le qubit N1N-1 au bit de poids fort, qui est multiplié par 2N12^{N-1}.

Enchevêtrement

Comme nous l'avons mentionné précédemment, une autre caractéristique clé des qubits est qu'ils peuvent être enchevêtrés les uns avec les autres. Prenons l'exemple d'un état à deux qubits, où c0=c3=12c_0 = c_3 = \frac{1}{\sqrt{2}} et c1=c2=0c_1 = c_2 = 0 :

ψ=12(00+11)\vert \psi\rangle = \frac{1}{\sqrt{2}}(\vert 00\rangle + \vert 11\rangle)

Ainsi, l'état du qubit 0 peut être 0\vert 0\rangle ou 1\vert 1\rangle avec la même probabilité, et il en va de même pour l'état du qubit 1. Mais ces probabilités ne sont plus indépendantes les unes des autres. Si nous constatons que l'état du qubit 0 est 0\vert 0\rangle, nous savons que le qubit 1 sera également 0\vert 0\rangle. Cela est vrai quelle que soit la distance qui sépare les deux qubits, c'est pourquoi la mesure d'un état intriqué est parfois qualifiée d'"action magique à distance"

L'enchevêtrement peut également prendre d'autres formes. Par exemple, l'État

ψ=12(01+10)\vert \psi\rangle = \frac{1}{\sqrt{2}}(\vert 01\rangle + \vert 10\rangle)

produit des résultats opposés à chaque fois : si un qubit est mesuré à l'adresse 0\vert 0\rangle, l'autre est garanti d'être trouvé dans l'état 1\vert 1\rangle.

Vérifiez votre compréhension

L'état ψ=11\vert \psi\rangle = \vert 11\rangle est-il enchevêtré? Pourquoi ?

  • Il n'est pas enchevêtré. Si les résultats sont toujours les mêmes lorsque vous mesurez les deux qubits, c'est uniquement parce que chaque qubit est toujours fixé dans l'état 1\vert 1\rangle. Le résultat de la mesure d'un qubit ne dépend pas réellement de l'autre - les deux sont simplement toujours 1\vert 1\rangle.

    En général, si vous pouvez décrire l'état de chaque qubit séparément et les multiplier ensemble comme ceci :

    ψ=ψ1ψ0\vert \psi\rangle = \vert \psi_1\rangle \vert \psi_0\rangle

    On parle alors d'« état produit » et il n'est pas intriqué.

Notation vectorielle

Il est souvent utile d'utiliser des vecteurs et des matrices pour voir comment l'état quantique se transforme sous l'effet de différentes opérations. Dans cette représentation, nos états quantiques seront des vecteurs, et nos portes quantiques (discutées dans la section suivante) seront des matrices qui transforment les vecteurs.

Pour un qubit unique, la forme vectorielle des états est choisie comme suit : 0=(10)\vert 0\rangle = \begin{pmatrix}1 \\ 0\end{pmatrix} 1=(01)\vert 1\rangle = \begin{pmatrix}0 \\ 1\end{pmatrix} De cette manière, un état arbitraire ψ=a0+b1\vert \psi\rangle = a\vert 0\rangle+b\vert 1\rangle peut être écrit comme suit ψ=(ab)\vert \psi\rangle =\begin{pmatrix}a \\ b\end{pmatrix}

Pour un état qubitaire général, nn, nous aurons besoin d'un vecteur à 2n2^n dimensions, avec des états de base ordonnés, comme on peut s'y attendre, en valeurs binaires croissantes :

0000=(1000),0001=1110=(0010),1111=(0001)\vert 0 \dots 000\rangle = \begin{pmatrix}1 \\ 0 \\ 0 \\ \vdots \\ 0\end{pmatrix}, \vert 0 \dots 001 \rangle = \vert 1 \dots 110\rangle = \begin{pmatrix}0 \\ \vdots \\ 0 \\ 1 \\ 0\end{pmatrix}, \vert 1 \dots 111 \rangle = \begin{pmatrix}0 \\ \vdots \\ 0 \\ 0\\ 1\end{pmatrix}

En gardant à l'esprit ce choix de notation vectorielle, nous pouvons présenter les portes quantiques dont nous avons besoin, leurs effets sur les états quantiques et leurs formes matricielles.

Vérifiez votre compréhension

Il existe quatre états de base de calcul pour un système à deux qubits. Écrivez chacun d'entre eux dans les notations ket et vectorielles.

  • 00=(1000),01=(0100),,10=(0010),11=(0001)\vert 00\rangle = \begin{pmatrix}1 \\ 0 \\ 0 \\ 0\end{pmatrix}, \vert 01 \rangle = \begin{pmatrix}0 \\ 1 \\ 0 \\ 0\end{pmatrix}, \dots, \vert 10\rangle = \begin{pmatrix}0 \\ 0 \\ 1 \\ 0\end{pmatrix}, \vert 11 \rangle = \begin{pmatrix}0 \\ 0 \\ 0\\ 1\end{pmatrix}

Portes \rightarrow portes quantiques

Tout comme les portes classiques telles que NOT, AND, OR et XOR peuvent être combinées pour construire des circuits classiques arbitraires, les portes quantiques jouent le même rôle dans l'informatique quantique. Les qubits ayant des caractéristiques mécaniques quantiques supplémentaires, les portes quantiques sont d'autant plus riches. Bien que nous puissions encore décrire leur action sur la base des états 0|0\rangle et 1|1\rangle à l'aide d'une table de vérité, cela ne rend pas compte de l'ensemble de la situation. Pour les portes quantiques, il est souvent plus naturel d'utiliser une représentation matricielle, car elles agissent également sur des superpositions d'états de base.

Nous présentons ci-dessous les portes quantiques les plus courantes et la manière dont elles transforment les qubits avec lesquels elles interagissent. Le cas échéant, nous les relierons à des portes classiques familières.

Portes à un seul qubit

XX porte : C'est l'équivalent quantique d'une opération NOT. Sa table de vérité ressemble exactement à la porte NOT classique :

Entrée
Sortie
0\vert 0\rangle1\vert 1\rangle
1\vert 1\rangle0\vert 0\rangle

Et la représentation matricielle :

X=(0110)X=\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}

Dans Qiskit, la création d'un circuit avec une porte XX ressemble à ceci :

from qiskit import QuantumCircuit

qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")

Output:

Output of the previous code cell

Dans ce schéma très simple, le qubit est représenté par un fil, la ligne horizontale noire, et la porte est représentée par une boîte sur ce fil.

Porte de Hadamard : Crée un état de superposition. Table de vérité :

Entrée
Sortie
0\vert 0\rangle12(0+1)\frac{1}{\sqrt{2}}\left(\vert 0\rangle+\vert 1\rangle\right)
1\vert 1\rangle12(01)\frac{1}{\sqrt{2}}\left(\vert 0\rangle-\vert 1\rangle\right)

Représentation matricielle : H=12(1111)H=\frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix}

Un circuit avec une porte de Hadamard est réalisé comme suit :

from qiskit import QuantumCircuit

qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")

Output:

Output of the previous code cell

ZZ porte : Ajoute un déphasage de Δϕ=π\Delta \phi = \pi à l'état 1|1\rangle :

Entrée
Sortie
0\vert 0\rangle0\vert 0\rangle
1\vert 1\rangle1-\vert 1\rangle

Z=(1001)Z=\begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}

Dans Qiskit, la création d'un circuit avec une porte ZZ ressemble à ceci :

qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")

Output:

Output of the previous code cell

TT porte : Ajoute un déphasage de Δϕ=π/4\Delta \phi = \pi/4 à l'état 1|1\rangle :

Entrée
Sortie
0\vert 0\rangle0\vert 0\rangle
1\vert 1\rangleeiπ/41e^{i\pi/4}\vert 1\rangle

T=(100eiπ/4)T=\begin{pmatrix} 1 & 0 \\ 0 & e^{i\pi/4} \end{pmatrix}

Dans Qiskit, la création d'un circuit avec une porte TT ressemble à ceci :

qc = QuantumCircuit(1)
qc.t(0)
qc.draw("mpl")

Output:

Output of the previous code cell

Portes multi-qubits

Les portes à deux qubits peuvent ressembler à des portes classiques à deux bits, mais avec une réserve importante : toutes les portes quantiques doivent être réversibles. En termes d'algèbre linéaire, cela signifie qu'ils sont représentés par des matrices unitaires. Ainsi, deux qubits d'entrée correspondent toujours à deux qubits de sortie, et l'opération peut, en principe, être annulée. Cela contraste avec les portes classiques que nous avons vues plus haut, telles que AND ou OR, qui perdent de l'information et sont irréversibles - étant donné une sortie, vous ne pouvez pas déterminer l'entrée de manière unique.

Porte CNOT (Controlled-NOT) : Les deux qubits d'entrée sont appelés qubits de contrôle et qubits cibles. Le qubit de contrôle reste inchangé, mais son état détermine ce qui arrive au qubit cible. Si le qubit de contrôle est dans l'état 1\vert 1\rangle, une porte XX est appliquée à cette cible; si l'état du qubit de contrôle est 0\vert 0\rangle, aucun changement n'est effectué. Dans la notation ci-dessous, on suppose que le qubit AA (qubit le plus à droite) est le contrôle et que le qubit BB (qubit le plus à gauche) est la cible. Ci-dessous, la notation utilisée est la suivante CNOT(qcontrol,qtarget)BA.CNOT(q_{control},q_{target})\vert BA\rangle.

CNOT(A,B)BAinput=BAoutputCNOT(A,B)\vert BA\rangle_{input} = \vert BA\rangle_{output}

Entrée
Sortie
00\vert 00\rangle00\vert 00\rangle
01\vert 01\rangle11\vert 11\rangle
10\vert 10\rangle10\vert 10\rangle
11\vert 11\rangle01\vert 01\rangle

La matrice représentant cette action est donc la suivante :

CNOT=(1000000100100100)CNOT=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}

qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")

Output:

Output of the previous code cell

C'est le premier schéma de circuit que nous voyons avec deux qubits, qui sont représentés par les deux fils. La porte CNOT est mise en œuvre entre les deux qubits, avec q0q_0 comme contrôle et q1q_1 comme cible.

Vérifiez votre compréhension

La plupart des portes ont la même forme matricielle à Qiskit que partout ailleurs. Mais la porte CNOT agit sur deux qubits, et les conventions d'ordonnancement des qubits deviennent alors un problème. Les textes qui ordonnent les qubits q0,q1,...\vert q_0,q_1,...\rangle présenteront une forme matricielle différente pour leurs portes CNOT. Vérifier par multiplication matricielle explicite que la matrice CNOT ci-dessus a l'action correcte sur l'état 01.\vert 01\rangle.

  • CNOT01=(1000000100100100)(0100)=(0001)=11CNOT\vert 01\rangle =\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}\begin{pmatrix}0 \\ 1 \\ 0 \\0\end{pmatrix} = \begin{pmatrix}0 \\ 0 \\ 0 \\1\end{pmatrix} = \vert 11\rangle

Porte SWAP : Cette porte permute les états de deux qubits. Table de vérité :

Entrée
Sortie
00\vert 00\rangle00\vert 00\rangle
01\vert 01\rangle10\vert 10\rangle
10\vert 10\rangle01\vert 01\rangle
11\vert 11\rangle11\vert 11\rangle

La matrice représentant cette action est donc la suivante :

SWAP=(1000001001000001)SWAP=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1\end{pmatrix}

qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.draw("mpl")

Output:

Output of the previous code cell

La porte SWAP peut en fait être construite à partir de trois CNOT. Pour voir comment, nous pouvons decompose() la porte avec Qiskit :

qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.decompose().draw("mpl")

Output:

Output of the previous code cell

Nous voyons ici pour la première fois comment plusieurs portes sont représentées dans un schéma de circuit. Nous le lisons de gauche à droite, de sorte que la porte la plus à gauche est appliquée en premier.

Vérifiez votre compréhension

Vérifier que la combinaison des CNOT ci-dessus aboutit à une porte SWAP. Vous pouvez le faire avec la multiplication matricielle ou toute autre méthode.

  • Avec la multiplication matricielle :

    (1000000100100100)(1000010000010010)(1000000100100100)=(1000001001000001)=SWAP \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0\end{pmatrix} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1\end{pmatrix} = SWAP ~\checkmark

    Utiliser une table de vérité pour voir comment les états changent avec chaque CNOT. Dans la dernière colonne, les états doivent être équivalents à la colonne "sortie" de la table de vérité SWAP :

    Entrée
    CNOT(A,B)
    CNOT(B,A)
    CNOT(A,B)
    00\vert 00\rangle00\vert 00\rangle00\vert 00\rangle00\vert 00\rangle \checkmark
    01\vert 01\rangle11\vert 11\rangle10\vert 10\rangle10\vert 10\rangle \checkmark
    10\vert 10\rangle10\vert 10\rangle11\vert 11\rangle01\vert 01\rangle \checkmark
    11\vert 11\rangle01\vert 01\rangle01\vert 01\rangle11\vert 11\rangle \checkmark

Porte de Toffoli (ou "contrôlé-contrôlé-NOT" (CCNOT)) : Il s'agit d'une porte à trois qubits. Le nom "contrôlé-contrôlé-NOT" peut déjà vous indiquer comment il fonctionne : il y a deux qubits de contrôle et un qubit cible, et l'état du qubit cible n'est inversé que si les deux qubits de contrôle sont dans l'état 1\vert 1\rangle. Nous conservons la convention d'ordre que nous avons utilisée avec le CNOT :

CCNOT(ControlA,ControlB,TargetC)CBACCNOT(Control A, Control B, Target C)\vert CBA\rangle

La table de vérité est donc la suivante :

Entrée
Sortie
000\vert 000\rangle000\vert 000\rangle
001\vert 001\rangle001\vert 001\rangle
010\vert 010\rangle010\vert 010\rangle
011\vert 011\rangle111\vert 111\rangle
100\vert 100\rangle100\vert 100\rangle
101\vert 101\rangle101\vert 101\rangle
110\vert 110\rangle110\vert 110\rangle
111\vert 111\rangle011\vert 011\rangle

Et la matrice représentant cette action est :

CCNOT=(1000000001000000001000000000000100001000000001000000001000010000)CCNOT=\begin{pmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0\end{pmatrix}
qc = QuantumCircuit(3)
qc.ccx(0, 1, 2)
qc.draw("mpl")

Output:

Output of the previous code cell

La porte de Toffoli peut elle aussi être décomposée en CNOT, de même que d'autres portes. Cependant, elle est beaucoup plus compliquée que la décomposition de la porte SWAP, c'est pourquoi l'exploration et la vérification de cette décomposition feront l'objet d'un exercice facultatif à la fin du module.


Mesures

Les mesures jouent un rôle particulier dans l'informatique quantique, qui n'a pas d'analogue dans l'informatique classique. Alors qu'en informatique classique, vous pouvez vérifier vos bits à n'importe quel moment de votre choix au cours d'un algorithme, en informatique quantique, vous devez être très sélectif quant au moment où vous regardez vos qubits, car la mesure effondre leur état et détruit la superposition qui confère aux qubits leur complexité de calcul.

En particulier, étant donné un état quantique NN -bit ψ=i=02N1cii\vert \psi\rangle = \sum_{i=0}^{2^N-1} c_i \vert i\rangle, une mesure réduira l'état à l'une des fonctions de base i\vert i\rangle avec une probabilité égale à ci2\vert c_i\vert ^2.

Mais cet effet destructeur d'une mesure n'est pas toujours un obstacle. Il s'agit en fait d'une ressource clé dans certains algorithmes et protocoles, tels que la téléportation quantique et la distribution quantique de clés.

Dans Qiskit, lorsqu'une mesure est effectuée, elle est envoyée à un registre classique où elle est stockée sous la forme d'un bit classique. La création d'un circuit avec une mesure se présente comme suit :

qc = QuantumCircuit(
    1, 1
)  # the second number is the number of classical bits in the circuit
qc.measure(0, 0)
qc.draw("mpl")

Output:

Output of the previous code cell

Circuits

Maintenant que nous savons comment fonctionnent les qubits, les portes et les mesures, fabriquons et exécutons notre propre circuit quantique! Pour ce faire, nous allons vous présenter un flux de travail utile appelé Qiskit patterns.

Cadre de modèles Qiskit

Le cadre des modèles Qiskit est une procédure générale permettant d'aborder et de résoudre des problèmes avec un ordinateur quantique. Il se compose de quatre étapes :

  1. Cartographier notre problème à l'aide de circuits et d'opérateurs quantiques
  2. Optimisation du circuit pour le matériel cible
  3. Exécution sur le matériel cible
  4. Post-traitement des résultats

Pour illustrer ces étapes, nous allons mettre en œuvre une version quantique du circuit demi-additionnel présenté ci-dessus.

1. Cartographie

Le circuit additionneur classique utilise une porte XOR et une porte AND pour calculer les bits de somme et de retenue, respectivement. Nous pouvons adapter ces portes au contexte quantique pour réaliser le demi-additionneur quantique. Tout d'abord, si l'on se souvient que les portes quantiques sont réversibles, on ne peut pas simplement écraser les entrées. Au lieu de cela, nous introduisons deux qubits auxiliaires initialisés à 0\vert 0\rangle pour stocker les résultats de la somme et de la retenue. Ainsi, notre état quantique complet sera constitué des qubits AA et BB, ainsi que des qubits de somme et de report, que nous appellerons SS et CC :

ψ=CSBA\vert \psi\rangle = \vert C S B A\rangle

Il nous faut maintenant des portes quantiques qui accomplissent ce que les portes XOR et AND faisaient dans le circuit classique.

Somme :

Pour le XOR, nous appliquons deux CNOT, chacun avec les qubits de contrôle AA et BB et le qubit cible SS pour les deux. Si AA et BB sont différents, l'une des portes CNOT fera basculer SS dans l'état 1\vert 1\rangle. Si AA et BB sont tous deux 0\vert 0\rangle, rien n'arrive à SS et il reste dans l'état 0\vert 0\rangle. Si AA et BB sont tous deux 1\vert 1\rangle, l'état de SS sera inversé deux fois, ce qui le ramènera à l'état 0\vert 0\rangle.

Porter :

Pour le bit de report, nous avons besoin de quelque chose qui fonctionne comme une porte ET classique.

Vérifiez votre compréhension

Reprenez les portes que nous avons étudiées et essayez de deviner quelle porte quantique nous utiliserons à la place de la porte ET classique :

  • C'est la porte Toffoli! Rappelons que la porte de Toffoli, ou porte contrôlé-contrôlé-NOT, inverse l'état de la cible si et seulement si le qubit de contrôle 0 ET le qubit de contrôle 1 sont tous les deux 1\vert 1\rangle. Ainsi, si le qubit cible commence dans l'état 0\vert 0\rangle, il a la même action que la porte ET.

Nous disposons maintenant de tous les ingrédients nécessaires à la réalisation du circuit quantique :

# qubits: a, b, sum, carry
qc = QuantumCircuit(4)

# Choose values for A and B:
a = 0
b = 0

# Prepare A and B qubits according to selected values:
if a:
    qc.x(0)
if b:
    qc.x(1)

# XOR (sum) into qubit 2
qc.cx(0, 2)
qc.cx(1, 2)

# AND (carry) into qubit 3
qc.ccx(0, 1, 3)  # a AND b

# measure
qc.measure_all()


qc.draw("mpl")

Output:

Output of the previous code cell

Ci-dessus figure le schéma du circuit demi-additionneur quantique. Comme indiqué précédemment, les fils représentent les qubits 00 à 33 ordonnés de haut en bas, et le registre de bits classique est le fil à double ligne du bas. Ensuite, en lisant de gauche à droite, nous voyons comment les portes sont appliquées à chaque qubit en observant où les cases apparaissent sur les fils correspondants. Enfin, les mesures sont indiquées à la fin. Les mesures réduisent les états des qubits à des valeurs définies 00 ou 11, et les résultats sont envoyés à un registre classique.

Une subtilité : bien que le schéma soit dessiné de gauche à droite, l'expression matricielle correspondante doit être lue de droite à gauche. En effet, dans la multiplication matricielle, l'opérateur le plus proche du vecteur d'état agit en premier. Ainsi, par exemple, le circuit ci-dessus (sans tenir compte des mesures) s'écrirait comme suit :

CCNOT(q0,q1,q3)CNOT(q1,q2)CNOT(q0,q2)q3q2q1q0CCNOT(q_0,q_1,q_3)CNOT(q_1, q_2)CNOT(q_0,q_2)\vert q_3 q_2 q_1 q_0\rangle

2. Optimisation :

Ensuite, nous devons optimiser le circuit pour qu'il fonctionne sur le matériel quantique. Cette optimisation est réalisée par le transpileur, qui traduit le circuit abstrait présenté ci-dessus en instructions compréhensibles par l'ordinateur quantique. Il assigne les qubits logiques ci-dessus à des qubits physiques réels sur le processeur et réécrit les portes en fonction de son propre ensemble de portes optimisées pour fonctionner sur l'ordinateur quantique. Enfin, le transpileur met également en œuvre ce que l'on appelle la "suppression et l'atténuation des erreurs" pour tenter de minimiser l'effet des erreurs sur le résultat. Cela n'est pas très important pour notre circuit très simple, mais si vous poursuivez votre voyage dans l'informatique quantique en exécutant des circuits plus compliqués, vous verrez rapidement la valeur de la suppression et de l'atténuation des erreurs. Pour en savoir plus, consultez le cours d'Olivia Lane, Quantum Computing in Practice (L'informatique quantique en pratique).

Tout d'abord, nous chargeons les paquets nécessaires pour communiquer avec les ordinateurs quantiques IBM® et nous sélectionnons un backend pour l'exécuter. Nous pouvons soit choisir le backend le moins occupé, soit sélectionner un backend spécifique dont nous connaissons les propriétés.

Le code ci-dessous vous permet de sauvegarder vos données d'identification lors de la première utilisation. Veillez à supprimer ces informations du bloc-notes après l'avoir enregistré dans votre environnement, afin que vos informations d'identification ne soient pas accidentellement partagées lorsque vous partagez le bloc-notes. Voir Configurer votre compte IBM Cloud et Initialiser le service dans un environnement non fiable pour plus d'informations.

# Load IBM Quantum Compute Service
from qiskit_ibm_runtime import QiskitRuntimeService

# Load IBM Quantum Compute Service

# Syntax for first saving your token.  Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform',
# instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')

# Load saved credentials
service = QiskitRuntimeService()

# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_brisbane".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_brisbane")
print(backend.name)

Output:

ibm_fez

Nous utilisons maintenant le transpileur pour optimiser le circuit. Nous pouvons choisir le niveau d'optimisation de 0 (aucune optimisation) à 3 (optimisation maximale). Pour savoir ce qu'implique chaque niveau, consultez le guide des niveaux d'optimisation de Set transpiler. Le circuit qui en résultera sera sensiblement différent du circuit logique que nous avons créé lors de notre étape de mise en correspondance.

# Transpile the circuit and optimize for running on the quantum computer selected
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)

qc_isa.draw("mpl")

Output:

Output of the previous code cell

Un « échantillonneur » est une primitive conçue pour échantillonner les états possibles résultant d'un circuit quantique et pour recueillir des statistiques sur les états susceptibles d'être mesurés et sur leur probabilité respective. Nous importons ici l'échantillon « IBM Quantum » :

# Load the IBM Quantum primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler

sampler = Sampler(mode=backend)

Si vous avez épuisé le temps qui vous était imparti sur des ordinateurs quantiques réels ou si vous n'avez pas de connexion internet, vous pouvez préférer utiliser un simulateur. Pour ce faire, exécutez la cellule ci-dessous et décompressez la ligne associée dans l'étape "Exécuter".

# Load the backend sampler
from qiskit.primitives import BackendSamplerV2

# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel

noise_model = NoiseModel.from_backend(backend)

# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)

# Alternatively, load a fake backend with generic properties and define a simulator.
# backend_gen = GenericBackendV2(num_qubits=18)
# sampler_gen = BackendSamplerV2(backend=backend_gen)

3. Exécution

Après avoir préparé le circuit, nous pouvons maintenant le faire fonctionner sur l'ordinateur quantique!

job = sampler.run([qc_isa], shots=100)
# job = sampler_sim.run([qc_isa]) # uncomment if you want to run on a simulator
res = job.result()
counts = res[0].data.meas.get_counts()

4. Post-traitement

Nous sommes maintenant prêts à consulter nos résultats! Nous afficherons un histogramme des 100 échantillons du circuit.

from qiskit.visualization import plot_histogram

print("counts = ", counts)
plot_histogram(counts)

Output:

counts =  {'0000': 90, '0100': 4, '1100': 3, '0010': 3}
Output of the previous code cell

L'histogramme ci-dessus montre les résultats des mesures des quatre qubits à la fin du circuit. Un ordinateur quantique idéal sans bruit aurait mesuré les qubits pour qu'ils aient les mêmes valeurs à chaque fois, mais en réalité, le bruit provoquera des erreurs lors de certains passages.

Vérifiez votre compréhension

En utilisant la chaîne de bits ayant le plus grand nombre de comptes comme valeurs pour AA, BB, SS, et CC, vérifiez que le circuit de l'additionneur quantique a fonctionné.

  • Nous devons vérifier que A+B=S+2×CA+B = S+2 \times C. Rappelez-vous que l'ordre de la chaîne de bits suit la notation little-endian, et qu'elle est donc lue CSBA.

    L'histogramme ci-dessus montre que la chaîne de bits 0000 est dominante.

    0+0=0+0×2=0 0 + 0 = 0 + 0 \times 2 = 0 ~\checkmark

Revenez en arrière et changez les valeurs de AA et BB en A=1A=1 et B=1B=1 et suivez à nouveau les étapes des modèles Qiskit pour réexécuter le circuit. Vérifiez que le circuit de l'additionneur fonctionne à nouveau.

  • Vous devriez obtenir un histogramme dont la chaîne de bits dominante est 1011:

    1+1=0+1×2=2 1 + 1 = 0 + 1 \times 2 = 2 ~\checkmark

L'une des caractéristiques supplémentaires du demi-additionneur quantique par rapport au demi-additionneur classique est qu'il peut fonctionner avec des entrées quantiques. En d'autres termes, il peut "ajouter" les qubits AA et BB même s'ils sont dans des états de superposition. Dans la section Questions du défi ci-dessous, il vous sera demandé de préparer les qubits dans des superpositions et de voir ce qui se passe!


Conclusion

Ce module a été conçu pour vous donner une solide compréhension des principes de base de l'informatique quantique en la comparant à l'informatique classique. Nous avons étudié le circuit classique à demi-addition et nous avons montré comment adapter le circuit pour qu'il fonctionne avec des qubits sur un ordinateur quantique. Vous êtes maintenant prêt à explorer les autres modules de Qiskit dans la salle de classe!

Concepts essentiels :

  • Contrairement aux bits classiques qui ne peuvent prendre que les valeurs 0 et 1, les qubits peuvent également se trouver dans des états de superposition de 0 et de 1.
  • Plusieurs qubits peuvent être en superposition sur les chaînes de bits classiquement autorisées, appelées états de base de calcul.
  • Plusieurs qubits peuvent être intriqués de sorte que l'état de l'un dépende de l'état de l'autre.
  • La convention Qiskit consiste à utiliser la notation little-endian, qui place le qubit le moins significatif, q0q_0, dans la position la plus à droite et le qubit le plus significatif, qNq_N, dans la position la plus à gauche.
  • Les portes quantiques sont des opérations réversibles représentées par des matrices unitaires qui agissent sur les vecteurs d'état quantique. Dans cette notation, la matrice la plus proche du vecteur (qui est la plus à droite) agit en premier.
  • Les mesures effondrent un état de superposition quantique dans l'un de ses états autorisés classiquement, avec une probabilité égale au carré de l'amplitude de l'état de base de calcul correspondant dans la superposition.
  • Les circuits quantiques sont souvent représentés à l'aide de schémas de circuits quantiques, où les qubits sont représentés par des fils horizontaux et les portes quantiques apparaissent le long de ces fils, de gauche à droite.
  • Pour exécuter un circuit quantique, nous utilisons les quatre étapes du flux de travail des modèles Qiskit : Map, Optimize, Execute, Post-process.

Questions

Questions vrai/faux

  1. Dans un ordinateur classique, un bit ne peut contenir que la valeur 0 ou 1.

  2. L'intrication signifie que l'état d'un qubit est indépendant de l'état d'un autre.

  3. Les portes quantiques sont généralement des opérations irréversibles.

  4. La convention Qiskit place le qubit le moins significatif, q0q_0, à la position la plus à gauche.

  5. La mesure d'un état quantique donne toujours exactement le même résultat si elle est répétée plusieurs fois.

  6. La porte de Hadamard crée une superposition dans un seul qubit.

  7. Les circuits quantiques peuvent inclure des opérations de mesure qui réduisent l'état de superposition à l'un des états classiquement autorisés.

  8. Le nombre d'états classiques possibles pour NN bits est 2N2N.

  9. Les probabilités de résultat des mesures quantiques sont données par le carré des amplitudes des états de base classiquement mesurables.

Questions à réponse courte

  1. Quelles sont les principales différences entre un bit et un qubit?

  2. Qu'arrive-t-il à un état quantique lorsqu'il est mesuré?

  3. Pourquoi utilise-t-on la notation little-endian dans Qiskit?

  4. Quelles sont les quatre étapes du flux de travail des modèles Qiskit?

Questions de défi :

  1. Dans le module, nous n'avons utilisé l'additionneur que pour ajouter des états classiquement autorisés pour AA et BB. Mais nous pouvons aussi préparer AA et BB en superpositions! Modifiez le code pour préparer chaque qubit dans une superposition égale de 0 et de 1, puis exécutez le nouveau circuit et obtenez un nouvel histogramme. Que voyez-vous? Expliquez ce qui se passe.

  2. Décomposition de la porte de Toffoli. Utilisez decompose() pour montrer comment la porte de Toffoli est décomposée en portes à un et deux qubits, puis vérifiez cette construction à l'aide de la multiplication de matrices. N'oubliez pas que si les schémas de circuits se lisent de gauche à droite, les matrices s'appliquent aux états quantiques de droite à gauche!

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.