Ce TP a pour but d'implanter effectivement un code de Reed-Solomon et son algorithme de décodage.
Question : Implanter une fonction random_message(F, k)
qui retourne un vecteur aléatoire tiré uniformément dans l'esspace vectoriel sur F
de dimentsion k
.
def random_message(F, k):
pass
Question : Implanter une fonction random_error(F, n, t)
qui retourne un vecteur d'erreur de poids t
et de longueur n
sur le corps fini F
.
(on pourra supposer que le nombre d'erreurs est assez faible comparé à la longueur, typiquement $t \le n$)
def random_error(F, n, t):
pass
Question : En déduire une fonction corrupt(c, t)
qui ajoute une erreur de poids t
à un mot c
.
def corrupt(c, t):
pass
Question : Implanter une fonction parity_check_matrix(G)
qui retourne une matrice de parité du code engendré par la matrice génératrice G
.
def parity_check_matrix(G):
pass
def TEST_PARITY_CHECK_MATRIX():
r, k, n = 0, 6, 10
G = random_matrix(GF(7), k, n)
print(G * parity_check_matrix(G).transpose() == 0)
Question : Implanter une fonction systematic_form(G)
qui retourne :
G
def systematic_form(G):
pass
def TEST_SYSTEMATIC_FORM():
r, k, n = 0, 6, 10
while r != k:
G = random_matrix(GF(7), k, n)
r = G.rank()
Gp, I = systematic_form(G)
print(G.row_space() == Gp.row_space() and Gp[:,I] == identity_matrix(GF(7), k))
Question : Implanter une fonction uncode(G, c)
qui prend en entrée une matrice génératrice G
d'un code $\mathcal{C}$ et un mot c
de $\mathcal{C}$, et qui retourne le message associé au mot c
.
def uncode(G, c):
pass
def TEST_UNCODE():
r, k, n = 0, 6, 10
while r != k:
G = random_matrix(GF(7), k, n)
r = G.rank()
m = random_message(GF(7), k)
c = m * G
print(uncode(G, c) == m)
Question : Implanter une fonction generator_matrix_reed_solomon(x, k)
qui prend en entrée un vecteur x
de points d'évaluation et un entier k
, et qui retourne une matrice génératrice du code de Reed--Solomon $\mathrm{RS}_k(\mathbf{x})$.
def generator_matrix_reed_solomon(x, k):
pass
Question : Implanter une fonction random_evaluation_points(F, n)
qui prend en entrée un corps fini F
(de cardinal $q$) et un entier n
($\le q$), et qui retourne un vecteur aléatoire de longueur n
formé d'éléments de F
deux à deux distincts.
def random_evaluation_points(F, n):
pass
Question : Implanter une fonction get_evaluation_vector(P, x)
qui prend en entrée un polynôme P
et des points d'évaluation x
et qui retourne le vecteur d'évaluation de P
sur x
.
def get_evaluation_vector(P, x):
pass
Question : Implanter une fonction interpolate(x, y)
qui prend en entrée un vecteur de points d'évaluation x
et un vecteur y
de même longueur, et qui retourne le polynôme $P$ de plus petit degré tel que $P(x_i) = y_i$ pour tout $i$.
def interpolate(x, y):
pass
Question : Implanter une fonction partial_xgcd(A, B, s)
qui prend en entrée deux polynômes A
et B
, qui effectue l'algorithme d'Euclide étendu jusque ce que le degré du reste soit $<s$, puis qui retourne les coefficients de Bezout et le reste associé.
def partial_xgcd(A, B, s):
pass
Question : Implanter l'algorithme de Gao tel que vu en TD. La fonction à implanter sera notée gao_decoding(y, x, k)
, et retournera un message sous la forme d'un vecteur $\mathbf{m} = (m_0, \dots, m_{k-1})$ tel que y
est le mot le plus proche de get_evaluation_vector(P, x)
où $P(X) = \sum_{i=0}^{k-1} m_i X^i$.
def gao_decoding(y, x, k):
pass
Question : Tester votre algorithme avec la fonction suivante :
def TEST_GAO():
q, n, k = 31, 26, 12
t = (n-k)//2
F = GF(q)
x = random_evaluation_points(F, n)
G = generator_matrix_reed_solomon(x, k)
m = random_message(F, k)
c = m * G
y = corrupt(c, t)
m_dec = gao_decoding(y, x, k)
print(m == m_dec)