New Codes from Old

The operations described here produce a new code by modifying in some way the code words of a given code.

Contents

Sum, Intersection and Dual

For the following operators, C and D are codes defined as subsets (or subspaces) of the same R-space V.

C + D : Code, Code -> Code
The (vector space) sum of the linear codes C and D, where C and D are contained in the same R-space V.
C meet D : Code, Code -> Code
The intersection of the linear codes C and D, where C and D are contained in the same R-space V.
Dual(C) : Code -> Code
The dual D of the linear code C. The dual consists of all codewords in the R-space V which are orthogonal to all codewords of C.

Example CodeRng_SumIntersection (H164E9)

Verify some simple results from the sum and intersection of subcodes.
> R<w> := GR(9,2);
> P<x> := PolynomialRing(R);
> g := x^2 + 7*w*x + 1;
> C := CyclicCode(5, g);
> C;
(5, 43046721) Cyclic Code over GaloisRing(3, 2, 2)
Generator matrix:
[  1   0   0   1   w]
[  0   1   0 2*w 2*w]
[  0   0   1   w   1]
[  0   0   0   3   0]
[  0   0   0   0   3]
>
> C1 := sub< C | C.1 >;
> C1;
(5, 81, 3) Linear Code over GaloisRing(3, 2, 2)
Generator matrix:
[1 0 0 1 w]
> C2 := sub< C | C.4 >;
> C2;
(5, 9, 1) Linear Code over GaloisRing(3, 2, 2)
Generator matrix:
[0 0 0 3 0]
> C3 := sub< C | { C.1 , C.4} >;
> C3;
(5, 729, 1) Linear Code over GaloisRing(3, 2, 2)
Generator matrix:
[1 0 0 1 w]
[0 0 0 3 0]
> (C1 + C2) eq C3;
true
> (C1 meet C3) eq C1;
true

Standard Constructions

DirectSum(C, D) : Code, Code -> Code
Given a length n1 code C and a length n2 code D, both over the same ring R, construct the direct sum of C and D. The direct sum consists of all length n1 + n2 vectors u|v, where u ∈C and v ∈D.
DirectProduct(C, D) : Code, Code -> Code
Given a length n1 code C and a length n2 code D, both over the same ring R, construct the direct product of C and D. The direct product has length n1.n2 and its generator matrix is the Kronecker product of the basis matrices of C and D.
C1 cat C2 : Code,Code -> Code
Given codes C1 and C2, both defined over the same ring R, return the concatenation C of C1 and C2. If A and B are the generator matrices of C1 and C2, respectively, the concatenation of C1 and C2 is the code with generator matrix whose rows consist of each row of A concatenated with each row of B.
ExtendCode(C) : Code -> Code
Given a length n code C form a new code C' from C by adding the appropriate extra coordinate to each vector of C such that the sum of the coordinates of the extended vector is zero.
ExtendCode(C, n) : Code, RngIntElt -> Code
Return the code C extended n times.
PadCode(C, n) : Code, RngIntElt -> Code
Add n zeros to the end of each codeword of C.
PlotkinSum(C, D) : Code, Code -> Code
Given codes C and D both over the same ring R and of the same length n, construct the Plotkin sum of C and D. The Plotkin sum consists of all vectors u|u + v, u ∈C and v ∈D.
PunctureCode(C, i) : Code, RngIntElt -> Code
Given a length n code C, and an integer i, 1 ≤i ≤n, construct a new code C' by deleting the i-th coordinate from each code word of C.
PunctureCode(C, S) : Code, { RngIntElt } -> Code
Given a length n code C and a set S of distinct integers { i1, ..., ir } each of which lies in the range [1, n], construct a new code C' by deleting the components i1, ..., ir from each code word of C.
ShortenCode(C, i) : Code, RngIntElt -> Code
Given a length n code C and an integer i, 1 ≤i ≤n, construct a new code from C by selecting only those codewords of C having a zero as their i-th component and deleting the i-th component from these codewords. Thus, the resulting code will have length n - 1.
ShortenCode(C, S) : Code, { RngIntElt } -> Code
Given a length n code C and a set S of distinct integers { i1, ..., ir}, each of which lies in the range [1, n], construct a new code from C by selecting only those codewords of C having zeros in each of the coordinate positions i1, ..., ir, and deleting these components. Thus, the resulting code will have length n - r.

Example CodeRng_lengths (H164E10)

We combine codes in various ways and look at the length of the new code.
> R<w> := GR(8,2);
> C1 := RandomLinearCode(R, 4, 2);
> C2 := RandomLinearCode(R, 5, 3);
> Length(C1);
4
> Length(C2);
5
> C3 := DirectSum(C1, C2);
> Length(C3);
9
> C4 := DirectProduct(C1, C2);
> Length(C4);
20
> C5 := C1 cat C2;
> Length(C5);
9

Example CodeRng_punct-z4 (H164E11)

We note that, in general, puncturing a code over Z4 reduces the minimum Lee distance by 2.
> C := PreparataCode(3);
> C;
(8, 256, 4) Linear Code over IntegerRing(4)
Generator matrix:
[1 0 0 0 3 1 2 1]
[0 1 0 0 2 1 1 3]
[0 0 1 0 1 1 3 2]
[0 0 0 1 3 2 3 3]
> MinimumLeeWeight(C);
6
> C1 := PunctureCode(C,8);
> C1;
(7, 256, 3) Linear Code over IntegerRing(4)
Generator matrix:
[1 0 0 0 3 1 2]
[0 1 0 0 2 1 1]
[0 0 1 0 1 1 3]
[0 0 0 1 3 2 3]
> MinimumLeeWeight(C1);
4
V2.28, 13 July 2023