Le but de ce TP est de construire la matrice génératrice d'un code hermitien, puis d'en implanter un algorithme de décodage.
On fixe un corps fini $\mathbb{F}_{q^2}$ dont le cardinal est un carré. On rappelle que l'ensemble des points affines de la courbe hermitienne $H_q$ (définie sur $\mathbb{F}_{q^2}$) sont alors :
$$ \{ (x,y) \in \mathbb{F}_{q^2} \mid y^{q+1} + x^q + x = 0 \}. $$On rappelle également que la courbe hermitienne a pour genre $g = q(q-1)/2$.
Question 1 : Implanter une fonction rational_points(q)
qui retourne la liste de l'ensemble des points affines de la courbe $H_q$. (indication : si on le souhaite, on pourra créer cette liste par "recherche exhaustive")
def rational_points(q):
pass
On note $P_\infty$ le point à l'infini de la courbe $H_q$. Pour un certain $m \ge 0$, on note $L(mP_\infty)$ l'espace de Riemann-Roch associé au diviseur $mP_\infty$. On admet que si $2g-2 \lt m \lt q^3$, alors cet espace a pour base
$$ \{ x^i y^j \mid 0 \le i, 0 \le j \le q,\; (q+1)i + qj \le m \}, $$où $x$ et $y$ sont les fonctions "coordonnées", qui à un point affine $P = (x_0,y_0)$ associent respectivement $x_0$ et $y_0$.
Question 2 : Implanter une fonction exponents(m, q)
qui calcule la liste des couples d'entiers $(i,j)$ tels que $(q+1)i + qj \le m$.
def exponents(q, m):
pass
Le code hermitien $\mathcal{C}(m)$ est le code géométrique dont les points d'évaluation sont l'ensemble des points affines de $H_q$, et dont le diviseur est $m P_\infty$.
Question 3 : Implanter une fonction generator_matrix(q, m, L=None)
qui calcule une matrice génératrice du code $\mathcal{C}(m)$. Le paramètre L=None
représente le fait que l'on peut passer optionnellement en paramètre la liste des points d'évaluation (pour éviter de la recalculer).
def generator_matrix(q, m, L=None):
pass
Question 4 : Vérifier que pour $2g-2 \lt m \lt q^3$, la matrice obtenue à la question précédente est de rang plein et admet $q^3$ colonnes et $m + 1 - q(q-1)/2$ lignes.
Question 5 : Vérifier expérimentalement (avec une petite valeur de $q$) que pour tout $0 \le m \le q^3+q^2-q-2$, les codes $\mathcal{C}(m)$ et $\mathcal{C}(q^3+q^2-q-2-m)$ sont duaux l'un de l'autre.
Soient $q$ et $m$ des paramètres qui définissent le code hermitien $\mathcal{C}(m)$ de diviseur $m P_\infty$.
On suppose maintenant que l'on connaît une matrice de parité $H$ du code $\mathcal{C}(m)$. On considère alors l'algorithme de décodage suivant.
On admet que l'algorithme décrit ci-dessus corrige $t$ erreurs sur un mot du code hermitien $\mathcal{C}(m)$, pour tout entier $t$ tel que $t \le (d-1-g)/2$.
Question 1 : Implanter l'algorithme de décodage d'un code hermitien.
def decode(y, t, L, q, m):
pass
Question 2 : Réécrire (à partir des TP précédents) les fonctions :
random_codeword(G)
qui calcule un mot de code aléatoire à partir d'une matrice génératrice $G$ du code,random_error(F, t)
qui retourne un mot de poids de Hamming $t$ sur le corps fini $F$,corrupt(c, t)
qui corrompt le mot $c$ avec $t$ erreurs.def random_codeword(G):
pass
def random_error(F, t, n):
pass
def corrupt(c, t):
pass
Question 3 : Écrire un script qui permet de vérifier que l'algorithme est valide.
Répéter les exercices précédents avec un code elliptique (on prendra également comme points d'évaluation les points affines d'une courbe elliptique, et comme diviseur $m P_\infty$).