Qu’est-ce que l’interférence quantique ?
L’interférence quantique est le moment où des amplitudes s’ajoutent ou s’annulent. C’est elle, et non le hasard seul, qui permet à un programme quantique de rendre une bonne réponse probable.
Après cette leçon, vous saurez montrer, nombres en main, comment la suite de portes H, Z, H fait disparaître un résultat.
À la fin de cette leçon
Remarque
Je peux montrer avec les portes H, Z, H comment une mauvaise réponse s’annule.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Interférence | des amplitudes qui s’ajoutent ou s’annulent |
| Phase | le signe, ou l’angle, d’une amplitude |
| Annulation | deux amplitudes opposées dont la somme vaut 0 |
| Chemin | une suite d’étapes qui mène à un résultat |
| Porte H | la porte qui mélange 0 et 1 à parts égales |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une amplitude peut être négative
Une amplitude est un nombre, et un nombre peut être négatif. Le signe n’influe pas sur la chance, car le carré l’efface. Mais il compte quand on additionne des amplitudes.
Deux amplitudes de même signe se renforcent. Deux amplitudes de signes opposés se retranchent : c’est l’annulation.
Exemple travaillé : H puis H sur |0>
| Résultat | Contribution de 0 | Contribution de 1 | Somme |
|---|---|---|---|
| 0 | 0,707 fois 0,707 = 0,5 | 0,707 fois 0,707 = 0,5 | 1 |
| 1 | 0,707 fois 0,707 = 0,5 | 0,707 fois -0,707 = -0,5 | 0 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
H puis H, étape par étape
# H, puis H : les amplitudes de 1 s'annulent.
R = 0.5 ** 0.5
H = [[R, R], [R, -R]]
Z = [[1, 0], [0, -1]]
def appliquer(porte, etat):
a = porte[0][0] * etat[0] + porte[0][1] * etat[1]
b = porte[1][0] * etat[0] + porte[1][1] * etat[1]
return [round(a, 3), round(b, 3)]
etat = [1, 0]
une_fois = appliquer(H, etat)
print("H :", une_fois)
print("H puis H :", appliquer(H, une_fois))
# Ajoutez la porte Z entre les deux H, puis relancez.
# Le résultat certain passe de 0 à 1.
Chaque résultat s’atteint par deux chemins
Après le premier H, l’état a deux amplitudes non nulles. Le second H envoie chacune vers le résultat 0 et vers le résultat 1. Chaque résultat reçoit donc deux contributions : deux chemins.
Pour le résultat 0, les deux contributions ont le même signe : elles s’ajoutent. Pour le résultat 1, elles ont des signes opposés : elles s’annulent.
Z entre les deux H inverse le résultat
Insérez la porte Z entre les deux H. Elle change le signe de l’amplitude de 1, donc l’état devient [0.707, -0.707].
Le second H additionne alors les contributions dans l’autre sens. Le résultat 0 s’annule et le résultat 1 devient certain. La porte Z n’a changé aucune chance, mais elle a changé la phase.
Exemple travaillé : H, Z, H sur |0>
| Résultat | Contribution de 0 | Contribution de 1 | Somme |
|---|---|---|---|
| 0 | 0,707 fois 0,707 = 0,5 | 0,707 fois -0,707 = -0,5 | 0 |
| 1 | 0,707 fois 0,707 = 0,5 | 0,707 fois 0,707 = 0,5 | 1 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Ce que le script va afficher
Le script interfere.py applique H puis H, puis H, Z et H. Ses lignes sont en anglais : H then H veut dire « H puis H ». H then Z then H veut dire « H puis Z puis H ».
La notation 1.000|0> se lit : amplitude 1 pour le résultat 0, donc 0 est certain.
Voir deux annulations différentes
docker exec jupyter python3 steps/interfere.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup pensent que la porte Z ne sert à rien, puisqu’elle ne change aucune chance. Seule, c’est vrai. Entre deux portes H, elle change la façon dont les amplitudes s’additionnent, donc le résultat. Une phase est invisible tant qu’une interférence ne la révèle pas.
Une phase à moitié : une annulation partielle
# Une porte S change la phase à moitié : l'annulation n'est que partielle.
R = 0.5 ** 0.5
H = [[R, R], [R, -R]]
S = [[1, 0], [0, 1j]]
def appliquer(porte, etat):
a = porte[0][0] * etat[0] + porte[0][1] * etat[1]
b = porte[1][0] * etat[0] + porte[1][1] * etat[1]
return [a, b]
etat = appliquer(H, appliquer(S, appliquer(H, [1, 0])))
print("chance de 0 :", round(abs(etat[0]) ** 2, 3))
print("chance de 1 :", round(abs(etat[1]) ** 2, 3))
# Remplacez S par [[1, 0], [0, -1]], puis relancez.
Pour aller plus loin
Dans un carnet du labo, écrivez one = apply(H, apply(Z, apply(H, zero(1), 0), 0), 0) puis show(one). Remplacez Z par X. Que donne le résultat ?
Essayez aussi H, S, H. Les deux chances valent-elles encore 0,5 ? Dites en une phrase pourquoi.