Codes CSS
Codes linéaires classiques
Les codes correcteurs d'erreurs classiques ont été étudiés pour la première fois dans les années 1940, et de nombreux codes différents sont aujourd'hui connus. Les codes les plus couramment étudiés et utilisés appartiennent à une catégorie appelée codes linéaires. On va voir exactement ce que le mot « linéaire » signifie dans ce contexte dans un instant, mais une façon très simple de décrire les codes linéaires pour l'instant est de dire que ce sont des codes stabilisateurs qui se trouvent être classiques. Les codes CSS sont essentiellement des paires de codes linéaires classiques que l'on combine pour créer un code correcteur d'erreurs quantiques. Donc, pour la discussion qui suit, on va avoir besoin de comprendre quelques notions de base sur les codes linéaires classiques.
Soit l'alphabet binaire pour toute cette discussion. Quand on parle d'un code linéaire classique, on entend un ensemble non vide de chaînes binaires de longueur pour un certain entier positif qui doit satisfaire une seule propriété fondamentale : si et sont des chaînes binaires dans alors la chaîne est aussi dans Ici, désigne le OU exclusif bit à bit de et que l'on a rencontré plusieurs fois dans le cours « Fondamentaux des algorithmes quantiques ».
En essence, quand on qualifie un code correcteur d'erreurs classique de linéaire, on pense aux chaînes binaires de longueur comme étant des vecteurs à dimensions dont les entrées sont toutes égales à ou et on exige que le code lui-même forme un sous-espace linéaire. Au lieu de l'addition vectorielle ordinaire sur les réels ou les complexes, on utilise l'addition modulo qui est simplement le OU exclusif. Autrement dit, si on a deux mots de code et c'est-à-dire que et sont des chaînes binaires dans alors modulo 2, c'est-à-dire doit aussi être un mot de code dans On remarque en particulier que cette implication doit être vraie même si Cela implique que doit contenir la chaîne tout-zéro car le OU exclusif bit à bit d'une chaîne avec elle-même donne toujours la chaîne tout-zéro.
Exemple : le code à répétition sur 3 bits
Le code à répétition sur 3 bits est un exemple de code linéaire classique. En particulier, on a donc, par rapport à la condition de linéarité, il n'y a que deux choix possibles pour et deux choix possibles pour C'est trivial de parcourir les quatre paires possibles pour vérifier qu'on obtient toujours un mot de code en prenant le OU exclusif bit à bit :
Exemple : le code de Hamming
Voici un autre exemple de code linéaire classique, appelé le code de Hamming . C'est l'un des tout premiers codes correcteurs d'erreurs classiques jamais découverts, et il est constitué de ces 16 chaînes binaires de longueur 7. (Parfois, le code de Hamming est compris comme le code dont ces chaînes sont inversées, mais on va le définir comme étant le code contenant les chaînes montrées ici.)
La logique très simple qui sous-tend le choix de ces chaînes est secondaire par rapport à la leçon et ne sera pas expliquée ici. Pour l'instant, il suffit d'observer que c'est bien un code linéaire classique : faire un XOR de deux quelconques de ces chaînes donnera toujours une autre chaîne appartenant au code.
La notation (entre crochets simples) signifie quelque chose d'analogue à la notation entre double crochets pour les codes stabilisateurs mentionnée dans la leçon précédente, mais ici c'est pour les codes linéaires classiques. En particulier, les mots de code ont bits, on peut encoder bits avec le code (car il y a mots de code), et il s'agit d'un code de distance ce qui signifie que deux mots de code distincts quelconques diffèrent en au moins positions — il faut donc retourner au moins bits pour passer d'un mot de code à un autre. Le fait que ce soit un code de distance implique qu'il peut corriger jusqu'à une erreur de retournement de bit.
Description des codes linéaires classiques
Les exemples mentionnés à l'instant sont des exemples très simples de codes linéaires classiques, mais même le code de Hamming paraît un peu mystérieux quand on se contente de lister les mots de code. Il existe de meilleures façons, plus efficaces, de décrire les codes linéaires classiques, notamment les deux suivantes.
-
Générateurs. Une façon de décrire un code linéaire classique est avec une liste minimale de mots de code qui génèrent le code, c'est-à-dire qu'en prenant tous les sous-ensembles possibles de ces mots de code et en faisant leur XOR, on obtient l'intégralité du code.
Plus précisément, les chaînes génèrent le code linéaire classique si
avec la convention que quand et quand et on dit que cette liste est minimale si en retirant l'une des chaînes on génère un code plus petit. Une façon naturelle de penser à une telle description est que la collection forme une base pour en tant que sous-espace, où l'on considère les chaînes comme des vecteurs à entrées binaires, en gardant à l'esprit qu'on travaille dans un espace vectoriel où l'arithmétique est faite modulo
-
Vérifications de parité. Une autre façon naturelle de décrire un code linéaire classique est par des vérifications de parité — c'est-à-dire une liste minimale de chaînes binaires telles que les chaînes du code sont précisément celles dont le produit scalaire binaire avec chacune de ces chaînes de vérification de parité est zéro. (Comme le OU exclusif bit à bit, le produit scalaire binaire est apparu plusieurs fois dans « Fondamentaux des algorithmes quantiques ».)
Autrement dit, les chaînes sont des chaînes de vérification de parité pour le code linéaire classique si
et cet ensemble de chaînes est minimal si en en retirant une on obtient un code plus grand. On les appelle chaînes de vérification de parité parce que a un produit scalaire binaire égal à zéro avec si et seulement si les bits de aux positions où vaut 1 ont une parité paire. Donc, pour déterminer si une chaîne appartient au code il suffit de vérifier la parité de certains sous-ensembles des bits de
Une chose importante à noter ici est que le produit scalaire binaire n'est pas un produit intérieur au sens formel. En particulier, quand deux chaînes ont un produit scalaire binaire égal à zéro, cela ne signifie pas qu'elles sont orthogonales au sens habituel. Par exemple, le produit scalaire binaire de la chaîne avec elle-même est zéro — il est donc possible qu'une chaîne de vérification de parité pour un code linéaire classique soit elle-même dans le code.
Les codes linéaires classiques sur l'alphabet binaire contiennent toujours un nombre de chaînes qui est une puissance de — et pour un seul code linéaire classique décrit des deux façons qui viennent d'être présentées, on aura toujours En particulier, si on a un ensemble minimal de générateurs, le code encode bits et on aura nécessairement mots de code ; et si on a un ensemble minimal de chaînes de vérification de parité, on aura mots de code. Donc, chaque générateur double la taille de l'espace du code tandis que chaque chaîne de vérification de parité réduit cet espace de moitié.
Par exemple, le code à répétition sur 3 bits est un code linéaire, donc il peut être décrit des deux façons. En particulier, il n'y a qu'un seul choix de générateur qui fonctionne : On peut également décrire le code avec deux chaînes de vérification de parité, comme et — ce qui devrait sembler familier d'après nos discussions précédentes sur ce code — ou on pourrait prendre les chaînes de vérification de parité comme étant et ou et (Les générateurs et les chaînes de vérification de parité ne sont généralement pas uniques pour un code linéaire classique donné.)
Pour un deuxième exemple, considérons le code de Hamming . Voici un choix de liste de générateurs qui fonctionne.
Et voici un choix de liste de vérifications de parité pour ce code.
Ici, on voit d'ailleurs que toutes nos chaînes de vérification de parité sont elles-mêmes dans le code.
Une dernière remarque sur les codes linéaires classiques, qui les relie au formalisme stabilisateur : les chaînes de vérification de parité sont équivalentes à des générateurs stabilisateurs qui ne sont constitués que de matrices de Pauli et identité. Par exemple, les chaînes de vérification de parité et pour le code à répétition sur 3 bits correspondent précisément aux générateurs stabilisateurs et ce qui est cohérent avec les discussions sur les observables de Pauli de la leçon précédente.
Définition des codes CSS
Les codes CSS sont des codes stabilisateurs obtenus en combinant certaines paires de codes linéaires classiques. Cela ne fonctionne pas pour deux codes linéaires classiques quelconques — les deux codes doivent avoir une certaine relation. Néanmoins, cette construction ouvre de nombreuses possibilités pour les codes correcteurs d'erreurs quantiques, basées en partie sur plus de 75 ans de théorie du codage classique.
Dans le formalisme stabilisateur, les générateurs stabilisateurs contenant uniquement des matrices de Pauli et identité sont équivalents aux vérifications de parité, comme on vient de l'observer pour le code à répétition sur 3 bits. Pour un autre exemple, considérons les chaînes de vérification de parité suivantes pour le code de Hamming .
Ces chaînes de vérification de parité correspondent aux générateurs stabilisateurs suivants (écrits sans les symboles de produit tensoriel), qu'on obtient en remplaçant chaque par un et chaque par un Ce sont trois des six générateurs stabilisateurs du code de Steane à 7 qubits.
Donnons le nom de générateurs stabilisateurs à des générateurs stabilisateurs comme ceux-ci, c'est-à-dire qu'ils n'ont que des facteurs tensoriels de Pauli et identité — donc les matrices de Pauli et n'apparaissent jamais dans les générateurs stabilisateurs.
On peut aussi considérer des générateurs stabilisateurs dans lesquels seuls et les matrices de Pauli identité apparaissent comme facteurs tensoriels. De tels générateurs stabilisateurs peuvent être vus comme étant analogues aux générateurs stabilisateurs, sauf qu'ils décrivent des vérifications de parité dans la base plutôt que dans la base standard. Les générateurs stabilisateurs de cette forme sont appelés générateurs stabilisateurs — donc aucune matrice de Pauli ou n'est autorisée cette fois.
Par exemple, considérons les trois générateurs stabilisateurs restants du code de Steane à 7 qubits.
Ils suivent exactement le même schéma tiré du code de Hamming que les générateurs stabilisateurs, sauf que cette fois on substitue à plutôt que Ce qu'on obtient à partir de ces seuls trois générateurs stabilisateurs est un code qui inclut les 16 états montrés ici, qu'on obtient en appliquant des opérations de Hadamard aux états de la base standard correspondant aux chaînes du code de Hamming . (Bien sûr, l'espace de code pour ce code inclut également des combinaisons linéaires de ces états.)