Section 16.2 Linear Codes
To gain more knowledge of a particular code and develop more efficient techniques of encoding, decoding, and error detection, we need to add additional structure to our codes. One way to accomplish this is to require that the code also be a group. A group code is a code that is also a subgroup of \({\mathbb Z}_2^n\text{.}\)
To check that a code is a group code, we need only verify one thing. If we add any two elements in the code, the result must be an \(n\)-tuple that is again in the code. It is not necessary to check that the inverse of the \(n\)-tuple is in the code, since every codeword is its own inverse, nor is it necessary to check that \({\mathbf 0}\) is a codeword. For instance,
Example 16.16.
Suppose that we have a code that consists of the following 7-tuples:
It is a straightforward though tedious task to verify that this code is also a subgroup of \({\mathbb Z}_2^7\) and, therefore, a group code. This code is a single error-detecting and single error-correcting code, but it is a long and tedious process to compute all of the distances between pairs of codewords to determine that \(d_{\min} = 3\text{.}\) It is much easier to see that the minimum weight of all the nonzero codewords is \(3\text{.}\) As we will soon see, this is no coincidence. However, the relationship between weights and distances in a particular code is heavily dependent on the fact that the code is a group.
Lemma 16.17.
Let \({\mathbf x}\) and \({\mathbf y}\) be binary \(n\)-tuples. Then \(w({\mathbf x} + {\mathbf y}) = d({\mathbf x}, {\mathbf y})\text{.}\)
Proof.
Suppose that \({\mathbf x}\) and \({\mathbf y}\) are binary \(n\)-tuples. Then the distance between \({\mathbf x}\) and \({\mathbf y}\) is exactly the number of places in which \({\mathbf x}\) and \({\mathbf y}\) differ. But \({\mathbf x}\) and \({\mathbf y}\) differ in a particular coordinate exactly when the sum in the coordinate is \(1\text{,}\) since
Consequently, the weight of the sum must be the distance between the two codewords.
Theorem 16.18.
Let \(d_{\min}\) be the minimum distance for a group code \(C\text{.}\) Then \(d_{\min}\) is the minimum weight of all the nonzero codewords in \(C\text{.}\) That is,
Proof.
Observe that
Subsection 16.2.1 Linear Codes
From Example 16.16, it is now easy to check that the minimum nonzero weight is \(3\text{;}\) hence, the code does indeed detect and correct all single errors. We have now reduced the problem of finding “good” codes to that of generating group codes. One easy way to generate group codes is to employ a bit of matrix theory.
Define the inner product of two binary \(n\)-tuples to be
where \({\mathbf x} = (x_1, x_2, \ldots, x_n)^\transpose\) and \({\mathbf y} = (y_1, y_2, \ldots, y_n)^\transpose\) are column vectors. 3 For example, if \({\mathbf x} = (011001)^\transpose\) and \({\mathbf y} = (110101)^\transpose\text{,}\) then \({\mathbf x} \cdot {\mathbf y} = 0\text{.}\) We can also look at an inner product as the product of a row matrix with a column matrix; that is,
Example 16.19.
Suppose that the words to be encoded consist of all binary \(3\)-tuples and that our encoding scheme is even-parity. To encode an arbitrary \(3\)-tuple, we add a fourth bit to obtain an even number of \(1\)s. Notice that an arbitrary \(n\)-tuple \({\mathbf x} = (x_1, x_2, \ldots, x_n)^\transpose\) has an even number of \(1\)s exactly when \(x_1 + x_2 + \cdots + x_n = 0\text{;}\) hence, a \(4\)-tuple \({\mathbf x} = (x_1, x_2, x_3, x_4)^\transpose\) has an even number of \(1\)s if \(x_1+ x_2+ x_3+ x_4 = 0\text{,}\) or
This example leads us to hope that there is a connection between matrices and coding theory.
Let \({\mathbb M}_{m \times n}({\mathbb Z}_2)\) denote the set of all \(m \times n\) matrices with entries in \({\mathbb Z}_2\text{.}\) We do matrix operations as usual except that all our addition and multiplication operations occur in \({\mathbb Z}_2\text{.}\) Define the null space of a matrix \(H \in {\mathbb M}_{m \times n}({\mathbb Z}_2)\) to be the set of all binary \(n\)-tuples \({\mathbf x}\) such that \(H{\mathbf x} = {\mathbf 0}\text{.}\) We denote the null space of a matrix \(H\) by \(\Null(H)\text{.}\)
Example 16.20.
Suppose that
For a \(5\)-tuple \({\mathbf x} = (x_1, x_2, x_3, x_4, x_5)^\transpose\) to be in the null space of \(H\text{,}\) \(H{\mathbf x} = {\mathbf 0}\text{.}\) Equivalently, the following system of equations must be satisfied:
The set of binary \(5\)-tuples satisfying these equations is
This code is easily determined to be a group code.
Theorem 16.21.
Let \(H\) be in \({\mathbb M}_{m \times n}({\mathbb Z}_2)\text{.}\) Then the null space of \(H\) is a group code.
Proof.
Since each element of \({\mathbb Z}_2^n\) is its own inverse, the only thing that really needs to be checked here is closure. Let \({\mathbf x}, {\mathbf y} \in \Null(H)\) for some matrix \(H\) in \({\mathbb M}_{m \times n}({\mathbb Z}_2)\text{.}\) Then \(H{\mathbf x} = {\mathbf 0}\) and \(H{\mathbf y} = {\mathbf 0}\text{.}\) So
Hence, \({\mathbf x} + {\mathbf y}\) is in the null space of \(H\) and therefore must be a codeword.
A code is a linear code if it is determined by the null space of some matrix \(H \in {\mathbb M}_{m \times n}({\mathbb Z}_2)\text{.}\)
Example 16.22.
Let \(C\) be the code given by the matrix
Suppose that the \(6\)-tuple \({\mathbf x} = (010011)^\transpose\) is received. It is a simple matter of matrix multiplication to determine whether or not \({\mathbf x}\) is a codeword. Since
the received word is not a codeword. We must either attempt to correct the word or request that it be transmitted again.