Qu’est-ce que l’intrication quantique ?
L’intrication est un lien entre deux qubits : leurs résultats de mesure sont liés, même si chacun pris seul est un tirage au hasard. L’état de Bell en est l’exemple le plus simple.
Après cette leçon, vous saurez construire cet état avec deux portes et expliquer pourquoi on ne peut pas le décrire qubit par qubit.
À la fin de cette leçon
Remarque
Je peux construire un état de Bell avec H et CNOT et expliquer pourquoi il est intriqué.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Produit tensoriel | la façon d’assembler deux états en un état de plus de qubits |
| CNOT | une porte à deux qubits : le contrôle décide si l’autre est inversé |
| État produit | un état de deux qubits qu’on peut séparer en un état par qubit |
| Intrication | un lien qui empêche de séparer les qubits |
| État de Bell | un état intriqué de deux qubits, 00 ou 11 à parts égales |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Deux qubits demandent quatre amplitudes
Deux bits peuvent former 00, 01, 10 ou 11. Deux qubits ont donc quatre amplitudes, rangées dans cet ordre : [00, 01, 10, 11]. Le qubit 0 est le bit de gauche.
Pour assembler un qubit a et un qubit b, on forme le produit tensoriel : chaque amplitude de a multiplie chaque amplitude de b.
Exemple travaillé : deux qubits assemblés
| Résultat | Amplitude de a | Amplitude de b | Produit |
|---|---|---|---|
| 00 | 0,6 | 1 | 0,6 |
| 01 | 0,6 | 0 | 0 |
| 10 | 0,8 | 1 | 0,8 |
| 11 | 0,8 | 0 | 0 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Assembler deux qubits
# Deux qubits : les quatre amplitudes de 00, 01, 10 et 11.
def produit_tensoriel(a, b):
resultat = []
for x in a:
for y in b:
resultat.append(x * y)
return resultat
print(produit_tensoriel([0.6, 0.8], [1, 0]))
# Changez [1, 0] en [0, 1], puis relancez.
# Quelles amplitudes sont non nulles ?
Que fait la porte CNOT ?
La porte CNOT agit sur deux qubits. Le premier est le contrôle, le second la cible. Si le contrôle vaut 1, la cible est inversée, comme avec X. Sinon, rien ne bouge.
Sur les quatre amplitudes, CNOT échange simplement celles de 10 et de 11. Celles de 00 et de 01 restent en place.
Ce que fait CNOT sur les quatre résultats
| Avant | Après | Pourquoi |
|---|---|---|
| 00 | 00 | le contrôle vaut 0 |
| 01 | 01 | le contrôle vaut 0 |
| 10 | 11 | le contrôle vaut 1, la cible est inversée |
| 11 | 10 | le contrôle vaut 1, la cible est inversée |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
H puis CNOT fabrique un état de Bell
Partez de deux qubits dans |00>. La porte H sur le qubit 0 donne [0.707, 0, 0.707, 0]. Puis CNOT échange les amplitudes de 10 et de 11 : [0.707, 0, 0, 0.707].
C’est l’état de Bell. Seuls 00 et 11 ont une chance, 0,5 chacun : les deux qubits donnent toujours le même résultat.
Ce que le script va afficher
Le script bell.py applique H puis CNOT, puis mesure 1000 fois. Ses lignes sont en anglais : after H on qubit 0 veut dire « après H sur le qubit 0 ». after CNOT, a Bell state veut dire « après CNOT, un état de Bell ».
La notation 0.707|00> + 0.707|11> se lit : amplitude 0,707 pour 00 et pour 11. 1000 shots, seed 1 veut dire « 1000 tirages, graine 1 ».
Construire un état de Bell et le mesurer
docker exec jupyter python3 steps/bell.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.
Un état intriqué ne se sépare pas
Un état produit s’écrit a puis b. Pour lui, les quatre amplitudes e0, e1, e2, e3 vérifient e0 * e3 = e1 * e2. Vérifiez sur le tableau précédent : 0,6 fois 0 vaut 0 fois 0,8.
Pour l’état de Bell, 0,707 fois 0,707 vaut 0,5, et 0 fois 0 vaut 0. L’égalité est fausse : aucun a et aucun b ne le produisent. L’état est intriqué.
Construire l’état de Bell en Python
# H sur le qubit 0, puis CNOT : un état de Bell.
R = 0.5 ** 0.5
def produit_tensoriel(a, b):
resultat = []
for x in a:
for y in b:
resultat.append(x * y)
return resultat
def cnot(etat):
# Le contrôle est le qubit 0 : il échange les amplitudes de 10 et de 11.
return [etat[0], etat[1], etat[3], etat[2]]
def arrondir(etat):
resultat = []
for a in etat:
resultat.append(round(a, 3))
return resultat
apres_h = produit_tensoriel([R, R], [1, 0])
bell = cnot(apres_h)
print("après H :", arrondir(apres_h))
print("après CNOT :", arrondir(bell))
# Les amplitudes de 01 et de 10 sont nulles dans l'état de Bell.
Tester si un état est un produit
# Un état est un produit s'il s'écrit a puis b : alors e[0]*e[3] = e[1]*e[2].
R = 0.5 ** 0.5
def ecart(e):
return round(e[0] * e[3] - e[1] * e[2], 3)
produit = [0.6, 0.0, 0.8, 0.0]
bell = [R, 0.0, 0.0, R]
print("écart du produit :", ecart(produit))
print("écart de l'état de Bell :", ecart(bell))
# Un écart de 0 veut dire : état produit. Sinon : intriqué.
Une erreur fréquente
Attention
Beaucoup pensent que l’intrication permet d’envoyer un message instantané. Non : chaque qubit seul reste un tirage à 50 %. Le lien n’apparaît qu’en comparant les deux listes de résultats, ce qui demande un échange ordinaire.
Pour aller plus loin
Dans un carnet du labo, construisez bell = CNOT @ apply(H, zero(2), 0), puis mesurez-le avec measure(bell, 1000, seed=2). Les comptes changent-ils beaucoup ?
Appliquez maintenant X au qubit 0 de bell avec apply(X, bell, 0). Quels résultats apparaissent à présent, 00 et 11 ou 01 et 10 ?