Linear Codes and Syndrome Decoding
Total Page:16
File Type:pdf, Size:1020Kb
Linear Codes and Syndrome Decoding José Luis Gómez Pardo Departamento de Matemáticas, Universidade de Santiago de Compostela 15782 Santiago de Compostela, Spain e-mail: [email protected] Introduction This worksheet contains an implementation of the encoding and decoding algorithms associated to an error-correcting linear code. Such a code can be characterized by a generator matrix or by a parity- check matrix and we give procedures to compute a generator matrix from a spanning set of the code and to compute a parity-check matrix from a generator matrix. We introduce, as examples, the [7, 4, 2] binary Hamming code, the [24, 12, 8] and [23, 12, 7] binary Golay codes and the [12, 6, 6] and [11, 6, 5] ternary Golay codes. We give procedures to compute the minimum distance of a linear code and we use them with the Hamming and Golay codes. We show how to build the standard array and the syndrome array of a linear code and we give an implementation of syndrome decoding. In the last section, we simulate a noisy channel and use the Hamming and Golay codes to show how syndrome decoding allows error correction on text messages. The references [Hill], [Huffman-Pless], [Ling], [Roman] and [Trappe-Washington] provide detailed information about linear codes and, in particular, about syndrome decoding. Requirements and Copyright Requirements: Maple 16 or higher © (2019) José Luis Gómez Pardo Generator matrices and parity-check matrices Linear codes are vector spaces over finite fields. Maple has a package called LinearAlgebra:- Modular (a subpackage of the LinearAlgebra m (the integers modulo a positive integer m, henceforth denoted , whose elements we will denote by {0, 1, ... m-1}). If p is a prime number, is a field and the -vector spaces which are k- dimensional subspaces of and are called [n,k] (or [n,k,d]) linear p-ary codes, where n is the length, k the dimension and d the minimum distance of the code. Our examples will be binary and ternary codes, i.e., - and - vector spaces, which include the most important error-correcting codes. > > The usual ways to describe a linear code is by giving either a generator matrix (namely, a matrix whose row vectors form a basis of the code) or a parity-check matrix (a generator matrix of the dual code, i.e., of the orthogonal space of the code). The following procedure produces a generator matrix for the code generated over (where the prime p is the first parameter) by a set of vectors (the vectors parameter) which can be given either as a list or as a matrix whose files are the vectors of the generating set. > Suppose now that we have the following list of binary vectors: > Then we can obtain a generator matrix of the binary code generated by these vectors as follows: > Alternatively, we can build the matrix whose row vectors are those on the list and then use the procedure to obtain the generator matrix: > Observe that the relevant command that has been used to build the generator matrix is the Basis command of the LinearAlgebra[Modular] package which, as its name already indicates, computes a basis of the space generated by a set of vectors. Thus the rows of the generator matrix previously constructed are obtained with the following command: > Here, the first paramater indicates the modulo (2 in this case), te second one is the list of vectors, the third one specifies the format of the output vectors (row in this case) and the last one is to indicate the format of the null space vectors in case the null space is computed. The value false used here serves to tell the command to not compute it (recall that the null space is the kernel of the linear map defined by the matrix or, in other words, the solution space of the homogeneous system of equations defined by these vectors). It is important to note that we cannot use for this purpose the command Basis of the LinearAlgebra package because what it would compute would be the basis of the real vector space generated by these vectors, quite a different thing! In this case we would obtain: > Thus we see that the list itself is already a basis of the real vector space that these vectors generate, i. e., the vectors in the list l , where they generate a 4-dimensional subspace of The code defined by the generator matrix constructed above is the [7,4] binary Hamming code, which is a systematic code ([Roman]). For a systematic [n,k] code the GeneratorMatrix procedure provides a standard generator matrix of the form G = [ |P] of size kxn, where is the kxk identity matrix. We next give procedures to generate the parity-check matrix of a linear code from a generator matrix. The next function computes the parity-check matrix by finding a basis of the dual code. The input is a prime p that defines the field , and the vectors of a generating set of the code, which can be given in a list or as the rows of a matrix. In the particular case in which these vectors form a basis of the code and are given in matrix form, the second argument will simply be a generator matrix of the code. > For example, a parity check matrix of the binary Hamming code is the following: > The same result is obtained if we compute the parity-check matrix obtained from the vector list l defined above (which, as we have seen, generates the Hamming code): > > If the generator matrix is systematic (a standard matrix), then the parity-check matrix can be directly computed by the following procedure: > For example, since the matrix G is a standard matrix, we can compute: > Observe that, since a parity-check matrix of the code C is simply a generator matrix of the dual code , we can obtain a generator matrix given a parity-check matrix H by applying the procedure ParityCheckMatrix to H (since the dual code of is C itself). If we apply this procedure to a generator matrix G to obtain H and then we apply it again to H, we can obtain a generator matrix of C different from G. However, if G is a standard matrix (all the codes that we will use will be systematic and hence will have standard generator matrices) and we apply the GeneratorMatrix procedure to the generator matrix thus obtained, we will recover the original standard matrix. For example, the following computation recovers the generator matrix G1 from the parity-check matrix H1: > A standard generator matrix can also be easily obtained from a standard parity-check matrix by means of the following procedure that reverses the steps performed in StandardParityCheckMatrix: > Now, the standard generator matrix of the Hamming code can be obtained from its standard parity- check matrix as follows. > > Our next examples will be the Golay codes. In order to display large matrices on screen, we set: > The Golay codes were introduced by Marcel Golay in the following one-page article, published in 1949: Marcel J. E. Golay: Notes on Digital Coding The generator matrices of the (extended) [24, 12, 8] binary Golay code the [23, 12, 7] binary Golay code and the [12, 6, 6] and [11, 6, 5] ternary Golay codes, are given by the following procedure which takes as inputs the prime p (2 in the binary case and 3 in the ternary) an the length n of the code. > The extended binary Golay code was used in the transmission of color pictures of Jupiter and Saturn from the Voyager spacecrafts in the years 1979-81 ([Huffman-Pless], [Ling-Xing], [Roman], [Trappe-Washington]). The generator matrix of this code (which has length 24) is obtained as follows: > > From this generator matrix we can build a parity-check matrix for the binary Golay code using the procedure ParityCheckMatrix given above: > The binary Golay code of length 23 is obtained by puncturing the extended binary Golay code in the last coordinate and has the following generator matrix: > The parity-check matrix of the [23, 12, 7] Golay code is: > Since the generator matrix G2 is in standard form, we could also have used the procedure StandardParityCheckMatrix to obtain the parity-check matrix from G2. Now, a standard generator matrix for the dual code of the extended binary Golay code can be obtained as follows: > By direct observation one notices that this matrix is the same as the generator matrix displayed above but we can use Maple to check that this is indeed the case: > This shows that the Golay code is self-dual and hence being a generator matrix is equivalent to being a parity-check matrix for this code. Since the dimension of this code is exactly equal to half its length, the fact that the code is self-dual can also be checked by multiplying the generator matrix G2 by its transpose and observing that the result is the zero matrix. Next, we compute a generator matrix of the (extended) [12,6,6] ternary Golay code, which is also self-dual as it can be easily seen: > From this we can obtain a parity-check matrix for this code: > Similarly, we obtain the generator and parity-check matrices of the [11, 6, 5] ternary Golay code: > > > > The minimum distance The minimum distance of a code is an important concept since it serves to determine the error- correcting capability of the code. The minimum distance of a linear code is equal to the minimum weight of the code, i.e., to the minimum number of nonzero entries in a nonzero codeword.