Linear code constructors that do not preserve the structural information.¶
This file contains a variety of constructions which builds the generator matrix
of special (or random) linear codes and wraps them in a
sage.coding.linear_code.LinearCode object. These constructions are
therefore not rich objects such as
sage.coding.grs.GeneralizedReedSolomonCodes.
For deprecation reasons, this file also contains some constructions for which Sage now does have rich representations.
All codes available here can be accessed through the codes object:
sage: codes.BinaryGolayCode()
[23, 12] linear code over GF(2)
REFERENCES:
- [HP2003]
AUTHOR:
- David Joyner (2007-05): initial version
- ” (2008-02): added cyclic codes, Hamming codes
- ” (2008-03): added BCH code, LinearCodeFromCheckmatrix, ReedSolomonCode, WalshCode, DuadicCodeEvenPair, DuadicCodeOddPair, QR codes (even and odd)
- ” (2008-09) fix for bug in BCHCode reported by F. Voloch
- ” (2008-10) small docstring changes to WalshCode and walsh_matrix
-
sage.coding.code_constructions.BCHCode(n, delta, F, b=0)¶ A ‘Bose-Chaudhuri-Hockenghem code’ (or BCH code for short) is the largest possible cyclic code of length n over field F=GF(q), whose generator polynomial has zeros (which contain the set)
, where a is a
primitive
root of unity in the splitting field
, b is an integer
and m is the multiplicative order of q modulo n. (The integers
typically lie in the range
.) The integer
is called
the “designed distance”. The length n of the code and the size q of
the base field must be relatively prime. The generator polynomial
is equal to the least common multiple of the minimal polynomials of
the elements of the set
above.Special cases are b=1 (resulting codes are called ‘narrow-sense’ BCH codes), and
(known as ‘primitive’ BCH
codes).It may happen that several values of delta give rise to the same BCH code. The largest one is called the Bose distance of the code. The true minimum distance, d, of the code is greater than or equal to the Bose distance, so
.EXAMPLES:
sage: FF.<a> = GF(3^2,"a") sage: x = PolynomialRing(FF,"x").gen() sage: L = [b.minpoly() for b in [a,a^2,a^3]]; g = LCM(L) sage: f = x^(8)-1 sage: g.divides(f) True sage: C = codes.CyclicCode(8,g); C [8, 4] linear code over GF(3) sage: C.minimum_distance() 4 sage: C = codes.BCHCode(8,3,GF(3),1); C [8, 4] linear code over GF(3) sage: C.minimum_distance() 4 sage: C = codes.BCHCode(8,3,GF(3)); C [8, 5] linear code over GF(3) sage: C.minimum_distance() 3 sage: C = codes.BCHCode(26, 5, GF(5), b=1); C [26, 10] linear code over GF(5)
-
sage.coding.code_constructions.BinaryGolayCode()¶ BinaryGolayCode() returns a binary Golay code. This is a perfect [23,12,7] code. It is also (equivalent to) a cyclic code, with generator polynomial
. Extending it yields
the extended Golay code (see ExtendedBinaryGolayCode).EXAMPLE:
sage: C = codes.BinaryGolayCode() sage: C [23, 12] linear code over GF(2) sage: C.minimum_distance() 7 sage: C.minimum_distance(algorithm='gap') # long time, check d=7 7
AUTHORS:
- David Joyner (2007-05)
-
sage.coding.code_constructions.CyclicCode(n, g, ignore=True)¶ If g is a polynomial over GF(q) which divides
then
this constructs the code “generated by g” (ie, the code associated
with the principle ideal
in the ring
in the usual way).The option “ignore” says to ignore the condition that (a) the characteristic of the base field does not divide the length (the usual assumption in the theory of cyclic codes), and (b)
must divide
. If ignore=True, instead of returning
an error, a code generated by
is created.EXAMPLES:
sage: P.<x> = PolynomialRing(GF(3),"x") sage: g = x-1 sage: C = codes.CyclicCodeFromGeneratingPolynomial(4,g); C [4, 3] linear code over GF(3) sage: P.<x> = PolynomialRing(GF(4,"a"),"x") sage: g = x^3+1 sage: C = codes.CyclicCodeFromGeneratingPolynomial(9,g); C [9, 6] linear code over GF(4) sage: P.<x> = PolynomialRing(GF(2),"x") sage: g = x^3+x+1 sage: C = codes.CyclicCodeFromGeneratingPolynomial(7,g); C [7, 4] linear code over GF(2) sage: C.generator_matrix() [1 1 0 1 0 0 0] [0 1 1 0 1 0 0] [0 0 1 1 0 1 0] [0 0 0 1 1 0 1] sage: g = x+1 sage: C = codes.CyclicCodeFromGeneratingPolynomial(4,g); C [4, 3] linear code over GF(2) sage: C.generator_matrix() [1 1 0 0] [0 1 1 0] [0 0 1 1]
On the other hand, CyclicCodeFromPolynomial(4,x) will produce a ValueError including a traceback error message: “
must
divide
”. You will also get a ValueError if you
typesage: P.<x> = PolynomialRing(GF(4,"a"),"x") sage: g = x^2+1
followed by CyclicCodeFromGeneratingPolynomial(6,g). You will also get a ValueError if you type
sage: P.<x> = PolynomialRing(GF(3),"x") sage: g = x^2-1 sage: C = codes.CyclicCodeFromGeneratingPolynomial(5,g); C [5, 4] linear code over GF(3)
followed by C = CyclicCodeFromGeneratingPolynomial(5,g,False), with a traceback message including “
must divide
”.
-
sage.coding.code_constructions.CyclicCodeFromCheckPolynomial(n, h, ignore=True)¶ If h is a polynomial over GF(q) which divides
then
this constructs the code “generated by
”
(ie, the code associated with the principle ideal
in
the ring
in the usual way). The
option “ignore” says to ignore the condition that the
characteristic of the base field does not divide the length (the
usual assumption in the theory of cyclic codes).EXAMPLES:
sage: P.<x> = PolynomialRing(GF(3),"x") sage: C = codes.CyclicCodeFromCheckPolynomial(4,x + 1); C [4, 1] linear code over GF(3) sage: C = codes.CyclicCodeFromCheckPolynomial(4,x^3 + x^2 + x + 1); C [4, 3] linear code over GF(3) sage: C.generator_matrix() [2 1 0 0] [0 2 1 0] [0 0 2 1]
-
sage.coding.code_constructions.CyclicCodeFromGeneratingPolynomial(n, g, ignore=True)¶ If g is a polynomial over GF(q) which divides
then
this constructs the code “generated by g” (ie, the code associated
with the principle ideal
in the ring
in the usual way).The option “ignore” says to ignore the condition that (a) the characteristic of the base field does not divide the length (the usual assumption in the theory of cyclic codes), and (b)
must divide
. If ignore=True, instead of returning
an error, a code generated by
is created.EXAMPLES:
sage: P.<x> = PolynomialRing(GF(3),"x") sage: g = x-1 sage: C = codes.CyclicCodeFromGeneratingPolynomial(4,g); C [4, 3] linear code over GF(3) sage: P.<x> = PolynomialRing(GF(4,"a"),"x") sage: g = x^3+1 sage: C = codes.CyclicCodeFromGeneratingPolynomial(9,g); C [9, 6] linear code over GF(4) sage: P.<x> = PolynomialRing(GF(2),"x") sage: g = x^3+x+1 sage: C = codes.CyclicCodeFromGeneratingPolynomial(7,g); C [7, 4] linear code over GF(2) sage: C.generator_matrix() [1 1 0 1 0 0 0] [0 1 1 0 1 0 0] [0 0 1 1 0 1 0] [0 0 0 1 1 0 1] sage: g = x+1 sage: C = codes.CyclicCodeFromGeneratingPolynomial(4,g); C [4, 3] linear code over GF(2) sage: C.generator_matrix() [1 1 0 0] [0 1 1 0] [0 0 1 1]
On the other hand, CyclicCodeFromPolynomial(4,x) will produce a ValueError including a traceback error message: “
must
divide
”. You will also get a ValueError if you
typesage: P.<x> = PolynomialRing(GF(4,"a"),"x") sage: g = x^2+1
followed by CyclicCodeFromGeneratingPolynomial(6,g). You will also get a ValueError if you type
sage: P.<x> = PolynomialRing(GF(3),"x") sage: g = x^2-1 sage: C = codes.CyclicCodeFromGeneratingPolynomial(5,g); C [5, 4] linear code over GF(3)
followed by C = CyclicCodeFromGeneratingPolynomial(5,g,False), with a traceback message including “
must divide
”.
-
sage.coding.code_constructions.DuadicCodeEvenPair(F, S1, S2)¶ Constructs the “even pair” of duadic codes associated to the “splitting” (see the docstring for
_is_a_splittingfor the definition) S1, S2 of n.Warning
Maybe the splitting should be associated to a sum of q-cyclotomic cosets mod n, where q is a prime.
EXAMPLES:
sage: from sage.coding.code_constructions import _is_a_splitting sage: n = 11; q = 3 sage: C = Zmod(n).cyclotomic_cosets(q); C [[0], [1, 3, 4, 5, 9], [2, 6, 7, 8, 10]] sage: S1 = C[1] sage: S2 = C[2] sage: _is_a_splitting(S1,S2,11) True sage: codes.DuadicCodeEvenPair(GF(q),S1,S2) ([11, 5] linear code over GF(3), [11, 5] linear code over GF(3))
-
sage.coding.code_constructions.DuadicCodeOddPair(F, S1, S2)¶ Constructs the “odd pair” of duadic codes associated to the “splitting” S1, S2 of n.
Warning
Maybe the splitting should be associated to a sum of q-cyclotomic cosets mod n, where q is a prime.
EXAMPLES:
sage: from sage.coding.code_constructions import _is_a_splitting sage: n = 11; q = 3 sage: C = Zmod(n).cyclotomic_cosets(q); C [[0], [1, 3, 4, 5, 9], [2, 6, 7, 8, 10]] sage: S1 = C[1] sage: S2 = C[2] sage: _is_a_splitting(S1,S2,11) True sage: codes.DuadicCodeOddPair(GF(q),S1,S2) ([11, 6] linear code over GF(3), [11, 6] linear code over GF(3))
This is consistent with Theorem 6.1.3 in [HP2003].
-
sage.coding.code_constructions.ExtendedBinaryGolayCode()¶ ExtendedBinaryGolayCode() returns the extended binary Golay code. This is a perfect [24,12,8] code. This code is self-dual.
EXAMPLES:
sage: C = codes.ExtendedBinaryGolayCode() sage: C [24, 12] linear code over GF(2) sage: C.minimum_distance() 8 sage: C.minimum_distance(algorithm='gap') # long time, check d=8 8
AUTHORS:
- David Joyner (2007-05)
-
sage.coding.code_constructions.ExtendedQuadraticResidueCode(n, F)¶ The extended quadratic residue code (or XQR code) is obtained from a QR code by adding a check bit to the last coordinate. (These codes have very remarkable properties such as large automorphism groups and duality properties - see [HP2003], Section 6.6.3-6.6.4.)
INPUT:
n- an odd primeF- a finite prime field F whose order must be a quadratic residue modulo n.
OUTPUT: Returns an extended quadratic residue code.
EXAMPLES:
sage: C1 = codes.QuadraticResidueCode(7,GF(2)) sage: C2 = C1.extended_code() sage: C3 = codes.ExtendedQuadraticResidueCode(7,GF(2)); C3 Extension of [7, 4] linear code over GF(2) sage: C2 == C3 True sage: C = codes.ExtendedQuadraticResidueCode(17,GF(2)) sage: C Extension of [17, 9] linear code over GF(2) sage: C3 = codes.QuadraticResidueCodeOddPair(7,GF(2))[0] sage: C3x = C3.extended_code() sage: C4 = codes.ExtendedQuadraticResidueCode(7,GF(2)) sage: C3x == C4 True
AUTHORS:
- David Joyner (07-2006)
-
sage.coding.code_constructions.ExtendedTernaryGolayCode()¶ ExtendedTernaryGolayCode returns a ternary Golay code. This is a self-dual perfect [12,6,6] code.
EXAMPLES:
sage: C = codes.ExtendedTernaryGolayCode() sage: C [12, 6] linear code over GF(3) sage: C.minimum_distance() 6 sage: C.minimum_distance(algorithm='gap') # long time, check d=6 6
AUTHORS:
- David Joyner (11-2005)
-
sage.coding.code_constructions.QuadraticResidueCode(n, F)¶ A quadratic residue code (or QR code) is a cyclic code whose generator polynomial is the product of the polynomials
(
is a primitive
root of unity;
ranges over the set of
quadratic residues modulo
).See QuadraticResidueCodeEvenPair and QuadraticResidueCodeOddPair for a more general construction.
INPUT:
n- an odd primeF- a finite prime field F whose order must be a quadratic residue modulo n.
OUTPUT: Returns a quadratic residue code.
EXAMPLES:
sage: C = codes.QuadraticResidueCode(7,GF(2)) sage: C [7, 4] linear code over GF(2) sage: C = codes.QuadraticResidueCode(17,GF(2)) sage: C [17, 9] linear code over GF(2) sage: C1 = codes.QuadraticResidueCodeOddPair(7,GF(2))[0] sage: C2 = codes.QuadraticResidueCode(7,GF(2)) sage: C1 == C2 True sage: C1 = codes.QuadraticResidueCodeOddPair(17,GF(2))[0] sage: C2 = codes.QuadraticResidueCode(17,GF(2)) sage: C1 == C2 True
AUTHORS:
- David Joyner (11-2005)
-
sage.coding.code_constructions.QuadraticResidueCodeEvenPair(n, F)¶ Quadratic residue codes of a given odd prime length and base ring either don’t exist at all or occur as 4-tuples - a pair of “odd-like” codes and a pair of “even-like” codes. If
is prime
then (Theorem 6.6.2 in [HP2003]) a QR code exists over
iff q is a
quadratic residue mod
.They are constructed as “even-like” duadic codes associated the splitting (Q,N) mod n, where Q is the set of non-zero quadratic residues and N is the non-residues.
EXAMPLES:
sage: codes.QuadraticResidueCodeEvenPair(17,GF(13)) ([17, 8] linear code over GF(13), [17, 8] linear code over GF(13)) sage: codes.QuadraticResidueCodeEvenPair(17,GF(2)) ([17, 8] linear code over GF(2), [17, 8] linear code over GF(2)) sage: codes.QuadraticResidueCodeEvenPair(13,GF(9,"z")) ([13, 6] linear code over GF(9), [13, 6] linear code over GF(9)) sage: C1,C2 = codes.QuadraticResidueCodeEvenPair(7,GF(2)) sage: C1.is_self_orthogonal() True sage: C2.is_self_orthogonal() True sage: C3 = codes.QuadraticResidueCodeOddPair(17,GF(2))[0] sage: C4 = codes.QuadraticResidueCodeEvenPair(17,GF(2))[1] sage: C3 == C4.dual_code() True
This is consistent with Theorem 6.6.9 and Exercise 365 in [HP2003].
TESTS:
sage: codes.QuadraticResidueCodeEvenPair(14,Zmod(4)) Traceback (most recent call last): ... ValueError: the argument F must be a finite field sage: codes.QuadraticResidueCodeEvenPair(14,GF(2)) Traceback (most recent call last): ... ValueError: the argument n must be an odd prime sage: codes.QuadraticResidueCodeEvenPair(5,GF(2)) Traceback (most recent call last): ... ValueError: the order of the finite field must be a quadratic residue modulo n
-
sage.coding.code_constructions.QuadraticResidueCodeOddPair(n, F)¶ Quadratic residue codes of a given odd prime length and base ring either don’t exist at all or occur as 4-tuples - a pair of “odd-like” codes and a pair of “even-like” codes. If n 2 is prime then (Theorem 6.6.2 in [HP2003]) a QR code exists over GF(q) iff q is a quadratic residue mod n.
They are constructed as “odd-like” duadic codes associated the splitting (Q,N) mod n, where Q is the set of non-zero quadratic residues and N is the non-residues.
EXAMPLES:
sage: codes.QuadraticResidueCodeOddPair(17,GF(13)) ([17, 9] linear code over GF(13), [17, 9] linear code over GF(13)) sage: codes.QuadraticResidueCodeOddPair(17,GF(2)) ([17, 9] linear code over GF(2), [17, 9] linear code over GF(2)) sage: codes.QuadraticResidueCodeOddPair(13,GF(9,"z")) ([13, 7] linear code over GF(9), [13, 7] linear code over GF(9)) sage: C1 = codes.QuadraticResidueCodeOddPair(17,GF(2))[1] sage: C1x = C1.extended_code() sage: C2 = codes.QuadraticResidueCodeOddPair(17,GF(2))[0] sage: C2x = C2.extended_code() sage: C2x.spectrum(); C1x.spectrum() [1, 0, 0, 0, 0, 0, 102, 0, 153, 0, 153, 0, 102, 0, 0, 0, 0, 0, 1] [1, 0, 0, 0, 0, 0, 102, 0, 153, 0, 153, 0, 102, 0, 0, 0, 0, 0, 1] sage: C3 = codes.QuadraticResidueCodeOddPair(7,GF(2))[0] sage: C3x = C3.extended_code() sage: C3x.spectrum() [1, 0, 0, 0, 14, 0, 0, 0, 1]
This is consistent with Theorem 6.6.14 in [HP2003].
TESTS:
sage: codes.QuadraticResidueCodeOddPair(9,GF(2)) Traceback (most recent call last): ... ValueError: the argument n must be an odd prime
-
sage.coding.code_constructions.RandomLinearCode(n, k, F)¶ Deprecated alias of
random_linear_code().EXAMPLES:
sage: C = codes.RandomLinearCode(10, 3, GF(2)) doctest:...: DeprecationWarning: codes.RandomLinearCode(n, k, F) is deprecated. Please use codes.random_linear_code(F, n, k) instead See http://trac.sagemath.org/21165 for details. sage: C [10, 3] linear code over GF(2) sage: C.generator_matrix().rank() 3
-
sage.coding.code_constructions.ReedSolomonCode(n, k, F, pts=None)¶
-
sage.coding.code_constructions.TernaryGolayCode()¶ TernaryGolayCode returns a ternary Golay code. This is a perfect [11,6,5] code. It is also equivalent to a cyclic code, with generator polynomial
.EXAMPLES:
sage: C = codes.TernaryGolayCode() sage: C [11, 6] linear code over GF(3) sage: C.minimum_distance() 5 sage: C.minimum_distance(algorithm='gap') # long time, check d=5 5
AUTHORS:
- David Joyner (2007-5)
-
sage.coding.code_constructions.ToricCode(P, F)¶ Let
denote a list of lattice points in
and let
denote the set of all
points in
(ordered in some fixed way). Put
and let
denote the dimension of the
vector space of functions
.
The associated toric code
is the evaluation code which
is the image of the evaluation map
where
is the multi-index notation
(
,
, and
), where
, and where
. This function returns the toric
codes discussed in [Joy2004].INPUT:
P- all the integer lattice points in a polytope defining the toric variety.F- a finite field.
OUTPUT: Returns toric code with length n = , dimension k over field F.
EXAMPLES:
sage: C = codes.ToricCode([[0,0],[1,0],[2,0],[0,1],[1,1]],GF(7)) sage: C [36, 5] linear code over GF(7) sage: C.minimum_distance() 24 sage: C = codes.ToricCode([[-2,-2],[-1,-2],[-1,-1],[-1,0],[0,-1],[0,0],[0,1],[1,-1],[1,0]],GF(5)) sage: C [16, 9] linear code over GF(5) sage: C.minimum_distance() 6 sage: C = codes.ToricCode([ [0,0],[1,1],[1,2],[1,3],[1,4],[2,1],[2,2],[2,3],[3,1],[3,2],[4,1]],GF(8,"a")) sage: C [49, 11] linear code over GF(8)
This is in fact a [49,11,28] code over GF(8). If you type next
C.minimum_distance()and wait overnight (!), you should get 28.AUTHOR:
- David Joyner (07-2006)
-
sage.coding.code_constructions.WalshCode(m)¶ Returns the binary Walsh code of length
. The matrix
of codewords correspond to a Hadamard matrix. This is a (constant
rate) binary linear
code.EXAMPLES:
sage: C = codes.WalshCode(4); C [16, 4] linear code over GF(2) sage: C = codes.WalshCode(3); C [8, 3] linear code over GF(2) sage: C.spectrum() [1, 0, 0, 0, 7, 0, 0, 0, 0] sage: C.minimum_distance() 4 sage: C.minimum_distance(algorithm='gap') # check d=2^(m-1) 4
REFERENCES:
-
sage.coding.code_constructions.from_parity_check_matrix(H)¶ Return the linear code that has
Has a parity check matrix.If
Hhas dimensions
then the linear code will have
dimension
and length
.EXAMPLES:
sage: C = codes.HammingCode(GF(2), 3); C [7, 4] Hamming Code over GF(2) sage: H = C.parity_check_matrix(); H [1 0 1 0 1 0 1] [0 1 1 0 0 1 1] [0 0 0 1 1 1 1] sage: C2 = codes.from_parity_check_matrix(H); C2 [7, 4] linear code over GF(2) sage: C2.systematic_generator_matrix() == C.systematic_generator_matrix() True
-
sage.coding.code_constructions.lift2smallest_field2(a)¶ INPUT: a is an element of a finite field GF(q)
OUTPUT: the element b of the smallest subfield F of GF(q) for which F(b)=a.
EXAMPLES:
sage: from sage.coding.code_constructions import lift2smallest_field2 sage: FF.<z> = GF(3^4,"z") sage: a = z^40 sage: lift2smallest_field2(a) doctest:...: DeprecationWarning: lift2smallest_field2 will be removed in a future release of Sage. Consider using sage.coding.code_constructions._lift2smallest_field instead, though this is private and may be removed in the future without deprecation warning. If you care about this functionality being in Sage, consider opening a Trac ticket for promoting the function to public. See http://trac.sagemath.org/21165 for details. (2, Finite Field of size 3) sage: FF.<z> = GF(2^4,"z") sage: a = z^15 sage: lift2smallest_field2(a) (1, Finite Field of size 2)
Warning
Since coercion (the FF(b) step) has a bug in it, this only works in the case when you know F is a prime field.
AUTHORS:
- David Joyner
-
sage.coding.code_constructions.permutation_action(g, v)¶ Returns permutation of rows g*v. Works on lists, matrices, sequences and vectors (by permuting coordinates). The code requires switching from i to i+1 (and back again) since the SymmetricGroup is, by convention, the symmetric group on the “letters” 1, 2, ..., n (not 0, 1, ..., n-1).
EXAMPLES:
sage: V = VectorSpace(GF(3),5) sage: v = V([0,1,2,0,1]) sage: G = SymmetricGroup(5) sage: g = G([(1,2,3)]) sage: permutation_action(g,v) (1, 2, 0, 0, 1) sage: g = G([()]) sage: permutation_action(g,v) (0, 1, 2, 0, 1) sage: g = G([(1,2,3,4,5)]) sage: permutation_action(g,v) (1, 2, 0, 1, 0) sage: L = Sequence([1,2,3,4,5]) sage: permutation_action(g,L) [2, 3, 4, 5, 1] sage: MS = MatrixSpace(GF(3),3,7) sage: A = MS([[1,0,0,0,1,1,0],[0,1,0,1,0,1,0],[0,0,0,0,0,0,1]]) sage: S5 = SymmetricGroup(5) sage: g = S5([(1,2,3)]) sage: A [1 0 0 0 1 1 0] [0 1 0 1 0 1 0] [0 0 0 0 0 0 1] sage: permutation_action(g,A) [0 1 0 1 0 1 0] [0 0 0 0 0 0 1] [1 0 0 0 1 1 0]
It also works on lists and is a “left action”:
sage: v = [0,1,2,0,1] sage: G = SymmetricGroup(5) sage: g = G([(1,2,3)]) sage: gv = permutation_action(g,v); gv [1, 2, 0, 0, 1] sage: permutation_action(g,v) == g(v) True sage: h = G([(3,4)]) sage: gv = permutation_action(g,v) sage: hgv = permutation_action(h,gv) sage: hgv == permutation_action(h*g,v) True
AUTHORS:
- David Joyner, licensed under the GPL v2 or greater.
-
sage.coding.code_constructions.random_linear_code(F, length, dimension)¶ Generate a random linear code of length
length, dimensiondimensionand over the fieldF.This function is Las Vegas probabilistic: always correct, usually fast. Random matrices over the
Fare drawn until one with full rank is hit.If
Fis infinite, the distribution of the elements in the random generator matrix will be random according to the distribution ofF.random_element().EXAMPLES:
sage: C = codes.random_linear_code(GF(2), 10, 3) sage: C [10, 3] linear code over GF(2) sage: C.generator_matrix().rank() 3
-
sage.coding.code_constructions.walsh_matrix(m0)¶ This is the generator matrix of a Walsh code. The matrix of codewords correspond to a Hadamard matrix.
EXAMPLES:
sage: walsh_matrix(2) [0 0 1 1] [0 1 0 1] sage: walsh_matrix(3) [0 0 0 0 1 1 1 1] [0 0 1 1 0 0 1 1] [0 1 0 1 0 1 0 1] sage: C = LinearCode(walsh_matrix(4)); C [16, 4] linear code over GF(2) sage: C.spectrum() [1, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0]
This last code has minimum distance 8.
REFERENCES:
