r"""
Binary self-dual codes
This module implements functions useful for studying binary
self-dual codes.
The main function is ``self_dual_codes_binary``,
which is a case-by-case list of entries, each represented by a
Python dictionary.
Format of each entry: a Python dictionary with keys "order
autgp", "spectrum", "code", "Comment", "Type", where
- "code" - a sd code C of length n, dim n/2, over GF(2)
- "order autgp" - order of the permutation automorphism group of C
- "Type" - the type of C (which can be "I" or "II", in the binary case)
- "spectrum" - the spectrum [A0,A1,...,An]
- "Comment" - possibly an empty string.
Python dictionaries were used since they seemed to be both
human-readable and allow others to update the database easiest.
- The following double for loop can be time-consuming but should
be run once in awhile for testing purposes. It should only print
True and have no trace-back errors::
for n in [4,6,8,10,12,14,16,18,20,22]:
C = self_dual_codes_binary(n); m = len(C.keys())
for i in range(m):
C0 = C["%s"%n]["%s"%i]["code"]
print n, ' ',i, ' ',C["%s"%n]["%s"%i]["spectrum"] == C0.spectrum()
print C0 == C0.dual_code()
G = C0.automorphism_group_binary_code()
print C["%s"%n]["%s"%i]["order autgp"] == G.order()
- To check if the "Riemann hypothesis" holds, run the following
code::
R = PolynomialRing(CC,"T")
T = R.gen()
for n in [4,6,8,10,12,14,16,18,20,22]:
C = self_dual_codes_binary(n); m = len(C["%s"%n].keys())
for i in range(m):
C0 = C["%s"%n]["%s"%i]["code"]
if C0.minimum_distance()>2:
f = R(C0.sd_zeta_polynomial())
print n,i,[z[0].abs() for z in f.roots()]
You should get lists of numbers equal to 0.707106781186548.
Here's a rather naive construction of self-dual codes in the binary
case:
For even m, let A_m denote the mxm matrix over GF(2) given by adding
the all 1's matrix to the identity matrix (in
``MatrixSpace(GF(2),m,m)`` of course). If M_1, ..., M_r are square
matrices, let `diag(M_1,M_2,...,M_r)` denote the"block diagonal"
matrix with the `M_i` 's on the diagonal and 0's elsewhere. Let
`C(m_1,...,m_r,s)` denote the linear code with generator matrix
having block form `G = (I, A)`, where
`A = diag(A_{m_1},A_{m_2},...,A_{m_r},I_s)`, for some
(even) `m_i` 's and `s`, where
`m_1+m_2+...+m_r+s=n/2`. Note: Such codes
`C(m_1,...,m_r,s)` are SD.
SD codes not of this form will be called (for the purpose of
documenting the code below) "exceptional". Except when n is
"small", most sd codes are exceptional (based on a counting
argument and table 9.1 in the Huffman+Pless [HP], page 347).
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AUTHORS:
- David Joyner (2007-08-11)
REFERENCES:
- [HP] W. C. Huffman, V. Pless, Fundamentals of
Error-Correcting Codes, Cambridge Univ. Press, 2003.
- [P] V. Pless,
"A classification of self-orthogonal codes over GF(2)", Discrete
Math 3 (1972) 209-246.
"""
from sage.rings.finite_rings.constructor import FiniteField as GF
from sage.matrix.matrix_space import MatrixSpace
from linear_code import LinearCode
from sage.matrix.constructor import block_diagonal_matrix
from sage.rings.integer_ring import ZZ
from sage.groups.perm_gps.permgroup import PermutationGroup
F = GF(2)
def MS(n):
r"""
For internal use; returns the floor(n/2) x n matrix space over GF(2).
EXAMPLES::
sage: import sage.coding.sd_codes as sd_codes
sage: sd_codes.MS(2)
Full MatrixSpace of 1 by 2 dense matrices over Finite Field of size 2
sage: sd_codes.MS(3)
Full MatrixSpace of 1 by 3 dense matrices over Finite Field of size 2
sage: sd_codes.MS(8)
Full MatrixSpace of 4 by 8 dense matrices over Finite Field of size 2
"""
n2 = ZZ(n)/2; return MatrixSpace(F, n2, n)
def matA(n):
r"""
For internal use; returns a list of square matrices over GF(2) `(a_{ij})`
of sizes 0 x 0, 1 x 1, ..., n x n which are of the form
`(a_{ij} = 1) + (a_{ij} = \delta_{ij})`.
EXAMPLES::
sage: import sage.coding.sd_codes as sd_codes
sage: sd_codes.matA(4)
[
[0 1 1]
[0 1] [1 0 1]
[], [0], [1 0], [1 1 0]
]
"""
A = []
n2 = n.quo_rem(2)[0]
for j in range(n2+2):
MS0 = MatrixSpace(F, j, j)
I = MS0.identity_matrix()
O = MS0(j*j*[1])
A.append(I+O)
return A
def matId(n):
r"""
For internal use; returns a list of identity matrices over GF(2)
of sizes (floor(n/2)-j) x (floor(n/2)-j) for j = 0 ... (floor(n/2)-1).
EXAMPLES::
sage: import sage.coding.sd_codes as sd_codes
sage: sd_codes.matId(6)
[
[1 0 0]
[0 1 0] [1 0]
[0 0 1], [0 1], [1]
]
"""
Id = []
n2 = n.quo_rem(2)[0]
for j in range(n2):
MSn = MatrixSpace(F, n2-j, n2-j)
Id.append(MSn.identity_matrix())
return Id
def MS2(n):
r"""
For internal use; returns the floor(n/2) x floor(n/2) matrix space over GF(2).
EXAMPLES::
sage: import sage.coding.sd_codes as sd_codes
sage: sd_codes.MS2(8)
Full MatrixSpace of 4 by 4 dense matrices over Finite Field of size 2
"""
n2 = n.quo_rem(2)[0]
return MatrixSpace(F, n2, n2)
I2 = lambda n: MS2(n).identity_matrix()
MS7 = MatrixSpace(F, 7, 7)
And7 = MS7([[1, 1, 1, 0, 0, 1, 1],\
[1, 1, 1, 0, 1, 0, 1],\
[1, 1, 1, 0, 1, 1, 0],\
[0, 0, 0, 0, 1, 1, 1],\
[0, 1, 1, 1, 0, 0, 0],\
[1, 0, 1, 1, 0, 0, 0],\
[1, 1, 0, 1, 0, 0, 0]])
MS8 = MatrixSpace(ZZ, 8, 8)
H8 = MS8([[1, 1, 1, 1, 1, 1, 1, 1],\
[1, -1, 1, -1, 1, -1, 1, -1],\
[1, 1, -1, -1, 1, 1, -1, -1],\
[1, -1, -1, 1, 1, -1, -1, 1],\
[1, 1, 1, 1, -1, -1, -1, -1],\
[1, -1, 1, -1, -1, 1, -1, 1],\
[1, 1, -1, -1, -1, -1, 1, 1],\
[1, -1, -1, 1, -1, 1, 1, -1]])
def self_dual_codes_binary(n):
r"""
Returns the dictionary of inequivalent sd codes of length n.
For n=4 even, returns the sd codes of a given length, up to (perm)
equivalence, the (perm) aut gp, and the type.
The number of inequiv "diagonal" sd binary codes in the database of
length n is ("diagonal" is defined by the conjecture above) is the
same as the restricted partition number of n, where only integers
from the set 1,4,6,8,... are allowed. This is the coefficient of
`x^n` in the series expansion
`(1-x)^{-1}\prod_{2^\infty (1-x^{2j})^{-1}}`. Typing the
command f = (1-x)(-1)\*prod([(1-x(2\*j))(-1) for j in range(2,18)])
into Sage, we obtain for the coeffs of `x^4`,
`x^6`, ... [1, 1, 2, 2, 3, 3, 5, 5, 7, 7, 11, 11, 15, 15,
22, 22, 30, 30, 42, 42, 56, 56, 77, 77, 101, 101, 135, 135, 176,
176, 231] These numbers grow too slowly to account for all the sd
codes (see Huffman+Pless' Table 9.1, referenced above). In fact, in
Table 9.10 of [HP], the number B_n of inequivalent sd binary codes
of length n is given::
n 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30
B_n 1 1 1 2 2 3 4 7 9 16 25 55 103 261 731
According to http://oeis.org/classic/A003179,
the next 2 entries are: 3295, 24147.
EXAMPLES::
sage: C = self_dual_codes_binary(10)
sage: C["10"]["0"]["code"] == C["10"]["0"]["code"].dual_code()
True
sage: C["10"]["1"]["code"] == C["10"]["1"]["code"].dual_code()
True
sage: len(C["10"].keys()) # number of inequiv sd codes of length 10
2
sage: C = self_dual_codes_binary(12)
sage: C["12"]["0"]["code"] == C["12"]["0"]["code"].dual_code()
True
sage: C["12"]["1"]["code"] == C["12"]["1"]["code"].dual_code()
True
sage: C["12"]["2"]["code"] == C["12"]["2"]["code"].dual_code()
True
"""
sd_codes = {}
if n == 4:
genmat = I2(n).augment(I2(n))
spectrum = [1, 0, 2, 0, 1]
sd_codes_4_0 = {"order autgp":8,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Unique."}
sd_codes["4"] = {"0":sd_codes_4_0}
return sd_codes
if n == 6:
genmat = I2(n).augment(I2(n))
spectrum = [1, 0, 3, 0, 3, 0, 1]
sd_codes_6_0 = {"order autgp":48,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Unique"}
sd_codes["6"] = {"0":sd_codes_6_0}
return sd_codes
if n == 8:
genmat = I2(n).augment(I2(n))
spectrum = [1, 0, 4, 0, 6, 0, 4, 0, 1]
sd_codes_8_0 = {"order autgp":384,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Unique Type I of this length."}
genmat = I2(n).augment(matA(n)[4])
spectrum = [1, 0, 0, 0, 14, 0, 0, 0, 1]
sd_codes_8_1 = {"order autgp":1344,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"II","Comment":"Unique Type II of this length."}
sd_codes["8"] = {"0":sd_codes_8_0,"1":sd_codes_8_1}
return sd_codes
if n == 10:
genmat = I2(n).augment(I2(n))
spectrum = [1, 0, 5, 0, 10, 0, 10, 0, 5, 0, 1]
sd_codes_10_0 = {"order autgp":3840,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"No Type II of this length."}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[4],matId(n)[4]]))
spectrum = [1, 0, 1, 0, 14, 0, 14, 0, 1, 0, 1]
sd_codes_10_1 = {"order autgp":2688,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Unique lowest weight nonzero codeword."}
sd_codes["10"] = {"0":sd_codes_10_0,"1":sd_codes_10_1}
return sd_codes
if n == 12:
genmat = I2(n).augment(I2(n))
spectrum = [1, 0, 6, 0, 15, 0, 20, 0, 15, 0, 6, 0, 1]
sd_codes_12_0 = {"order autgp":48080,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"No Type II of this length."}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[4],matId(n)[4]]))
spectrum = [1, 0, 2, 0, 15, 0, 28, 0, 15, 0, 2, 0, 1]
sd_codes_12_1 = {"order autgp":10752,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Smallest automorphism group of these."}
genmat = I2(n).augment(matA(n)[6])
spectrum = [1, 0, 0, 0, 15, 0, 32, 0, 15, 0, 0, 0, 1]
sd_codes_12_2 = {"order autgp":23040,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Largest minimum distance of these."}
sd_codes["12"] = {"0":sd_codes_12_0,"1":sd_codes_12_1,"2":sd_codes_12_2}
return sd_codes
if n == 14:
genmat = I2(n).augment(I2(n))
spectrum = [1, 0, 7, 0, 21, 0, 35, 0, 35, 0, 21, 0, 7, 0, 1]
sd_codes_14_0 = {"order autgp":645120,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"No Type II of this length. Huge aut gp."}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[4],matId(n)[4]]))
spectrum = [1, 0, 3, 0, 17, 0, 43, 0, 43, 0, 17, 0, 3, 0, 1]
sd_codes_14_1 = {"order autgp":64512,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Automorphism group has order 64512."}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[6],matId(n)[6]]))
spectrum = [1, 0, 1, 0, 15, 0, 47, 0, 47, 0, 15, 0, 1, 0, 1]
sd_codes_14_2 = {"order autgp":46080,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Unique codeword of weight 2."}
genmat = I2(n).augment(And7)
spectrum = [1, 0, 0, 0, 14, 0, 49, 0, 49, 0, 14, 0, 0, 0, 1]
sd_codes_14_3 = {"order autgp":56448,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Largest minimum distance of these."}
sd_codes["14"] = {"0":sd_codes_14_0,"1":sd_codes_14_1,"2":sd_codes_14_2,\
"3":sd_codes_14_3}
return sd_codes
if n == 16:
genmat = I2(n).augment(I2(n))
spectrum = [1, 0, 8, 0, 28, 0, 56, 0, 70, 0, 56, 0, 28, 0, 8, 0, 1]
sd_codes_16_0 = {"order autgp":10321920,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Huge aut gp."}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[4],matId(n)[4]]))
spectrum = [1, 0, 4, 0, 20, 0, 60, 0, 86, 0, 60, 0, 20, 0, 4, 0, 1]
sd_codes_16_1 = {"order autgp":516096,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":""}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[4],matA(n)[4]]))
spectrum = [1, 0, 0, 0, 28, 0, 0, 0, 198, 0, 0, 0, 28, 0, 0, 0, 1]
sd_codes_16_2 = {"order autgp":3612672,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"II","Comment":"Same spectrum as the other Type II code."}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[6],matId(n)[6]]))
spectrum = [1, 0, 2, 0, 16, 0, 62, 0, 94, 0, 62, 0, 16, 0, 2, 0, 1]
sd_codes_16_3 = {"order autgp":184320,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":""}
genmat = I2(n).augment(matA(n)[8])
spectrum = [1, 0, 0, 0, 28, 0, 0, 0, 198, 0, 0, 0, 28, 0, 0, 0, 1]
sd_codes_16_4 = {"order autgp":5160960,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"II","Comment":"Same spectrum as the other Type II code. Large aut gp."}
genmat = I2(n).augment(block_diagonal_matrix([And7,matId(n)[7]]))
spectrum = [1, 0, 1, 0, 14, 0, 63, 0, 98, 0, 63, 0, 14, 0, 1, 0, 1]
sd_codes_16_5 = {"order autgp":112896,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"'Exceptional' construction."}
J8 = MatrixSpace(ZZ,8,8)(64*[1])
genmat = I2(n).augment(I2(n)+MS2(n)((H8+J8)/2))
spectrum = [1, 0, 0, 0, 12, 0, 64, 0, 102, 0, 64, 0, 12, 0, 0, 0, 1]
sd_codes_16_6 = {"order autgp":73728,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"'Exceptional' construction. Min dist 4."}
sd_codes["16"] = {"0":sd_codes_16_0,"1":sd_codes_16_1,"2":sd_codes_16_2,\
"3":sd_codes_16_3,"4":sd_codes_16_4,"5":sd_codes_16_5,"6":sd_codes_16_6}
return sd_codes
if n == 18:
genmat = I2(n).augment(I2(n))
spectrum = [1, 0, 9, 0, 36, 0, 84, 0, 126, 0, 126, 0, 84, 0, 36, 0, 9, 0, 1]
sd_codes_18_0 = {"order autgp":185794560,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment": "Huge aut gp. S_9x(ZZ/2ZZ)^9?"}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[4],matId(n)[4]]))
spectrum = [1, 0, 5, 0, 24, 0, 80, 0, 146, 0, 146, 0, 80, 0, 24, 0, 5, 0, 1]
sd_codes_18_1 = {"order autgp":5160960,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment": "Large aut gp."}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[6],matId(n)[6]]))
spectrum = [1, 0, 3, 0, 18, 0, 78, 0, 156, 0, 156, 0, 78, 0, 18, 0, 3, 0, 1]
sd_codes_18_2 = {"order autgp":1105920,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment": ""}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[4],matA(n)[4],matId(n)[8]]))
spectrum = [1, 0, 1, 0, 28, 0, 28, 0, 198, 0, 198, 0, 28, 0, 28, 0, 1, 0, 1]
sd_codes_18_3 = {"order autgp":7225344,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment": "Large aut gp. Unique codeword of smallest non-zero wt.\
Same spectrum as '[18,4]' sd code."}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[8],matId(n)[8]]))
spectrum = [1, 0, 1, 0, 28, 0, 28, 0, 198, 0, 198, 0, 28, 0, 28, 0, 1, 0, 1]
sd_codes_18_4 = {"order autgp":10321920,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment": "Huge aut gp. Unique codeword of smallest non-zero wt.\
Same spectrum as '[18,3]' sd code."}
C = self_dual_codes_binary(n-2)["%s"%(n-2)]["5"]["code"]
A0 = C.redundancy_matrix()
genmat = I2(n).augment(block_diagonal_matrix([A0,matId(n)[8]]))
spectrum = [1, 0, 2, 0, 15, 0, 77, 0, 161, 0, 161, 0, 77, 0, 15, 0, 2, 0, 1]
sd_codes_18_5 = {"order autgp":451584,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment": "'Exceptional' construction."}
C = self_dual_codes_binary(n-2)["%s"%(n-2)]["6"]["code"]
A0 = C.redundancy_matrix()
genmat = I2(n).augment(block_diagonal_matrix([A0,matId(n)[8]]))
G = PermutationGroup( [ "(9,18)", "(7,10)(11,17)", "(7,11)(10,17)", "(6,7)(11,12)",\
"(4,6)(12,14)", "(3,5)(13,15)", "(3,13)(5,15)", "(2,3)(15,16)", "(1,2)(8,16)",\
"(1,4)(2,6)(3,7)(5,17)(8,14)(10,13)(11,15)(12,16)" ] )
spectrum = [1, 0, 1, 0, 12, 0, 76, 0, 166, 0, 166, 0, 76, 0, 12, 0, 1, 0, 1]
sd_codes_18_6 = {"order autgp":147456,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment": "'Exceptional'. Unique codeword of smallest non-zero wt."}
genmat = MS(n)([[1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0],\
[0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1],\
[0,0,1,0,0,0,0,0,0,1,1,1,0,0,1,0,0,1],\
[0,0,0,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1],\
[0,0,0,0,1,0,0,0,0,1,1,0,0,1,0,1,1,0],\
[0,0,0,0,0,1,0,0,0,1,0,1,0,1,0,1,1,0],\
[0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,1,0],\
[0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1],\
[0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,1]])
spectrum = [1, 0, 0, 0, 9, 0, 75, 0, 171, 0, 171, 0, 75, 0, 9, 0, 0, 0, 1]
sd_codes_18_7 = {"order autgp":82944,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment": "'Exceptional' construction. Min dist 4."}
I18 = MS(n)([[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\
[0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0],\
[0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0],\
[0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0],\
[1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0],\
[0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0],\
[0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1],\
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]])
genmat = MS(n)([[1,0,0,0,0,0,0,0,0, 1, 1, 1, 1, 1, 0, 0, 0, 0],\
[0,1,0,0,0,0,0,0,0, 1, 0, 1, 1, 1, 0, 1, 1, 1],\
[0,0,1,0,0,0,0,0,0, 0, 1, 1, 0, 0, 0, 1, 1, 1],\
[0,0,0,1,0,0,0,0,0, 0, 1, 0, 0, 1, 0, 1, 1, 1],\
[0,0,0,0,1,0,0,0,0, 0, 1, 0, 1, 0, 0, 1, 1, 1],\
[0,0,0,0,0,1,0,0,0, 1, 1, 0, 0, 0, 0, 1, 1, 1],\
[0,0,0,0,0,0,1,0,0, 0, 0, 0, 0, 0, 1, 0, 1, 1],\
[0,0,0,0,0,0,0,1,0, 0, 0, 0, 0, 0, 1, 1, 0, 1],\
[0,0,0,0,0,0,0,0,1, 0, 0, 0, 0, 0, 1, 1, 1, 0]])
G = PermutationGroup( [ "(9,15)(16,17)", "(9,16)(15,17)", "(8,9)(17,18)",\
"(7,8)(16,17)", "(5,6)(10,13)", "(5,10)(6,13)", "(4,5)(13,14)",\
"(3,4)(12,14)", "(1,2)(6,10)", "(1,3)(2,12)" ] )
spectrum = [1, 0, 0, 0, 17, 0, 51, 0, 187, 0, 187, 0, 51, 0, 17, 0, 0, 0, 1]
sd_codes_18_8 = {"order autgp":322560,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment": "'Exceptional' construction. Min dist 4."}
sd_codes["18"] = {"0":sd_codes_18_0,"1":sd_codes_18_1,"2":sd_codes_18_2,\
"3":sd_codes_18_3,"4":sd_codes_18_4,"5":sd_codes_18_5,\
"6":sd_codes_18_6,"7":sd_codes_18_7,"8":sd_codes_18_8}
return sd_codes
if n == 20:
A10 = MatrixSpace(F,10,10)([[1, 1, 1, 1, 1, 1, 1, 1, 1, 0],\
[1, 1, 1, 0, 1, 0, 1, 0, 1, 1],\
[1, 0, 0, 1, 0, 1, 0, 1, 0, 1],\
[0, 0, 0, 1, 1, 1, 0, 1, 0, 1],\
[0, 0, 1, 1, 0, 1, 0, 1, 0, 1],\
[0, 0, 0, 1, 0, 1, 1, 1, 0, 1],\
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],\
[0, 0, 0, 1, 0, 0, 0, 0, 1, 1],\
[0, 0, 0, 0, 0, 1, 0, 0, 1, 1],\
[0, 0, 0, 0, 0, 0, 0, 1, 1, 1]])
genmat = I2(n).augment(I2(n))
spectrum = [1, 0, 10, 0, 45, 0, 120, 0, 210, 0, 252, 0, 210, 0, 120, 0, 45, 0, 10, 0, 1]
sd_codes_20_0 = {"order autgp":3715891200,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment": "Huge aut gp"}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[4],matId(n)[4]]))
spectrum = [1, 0, 6, 0, 29, 0, 104, 0, 226, 0, 292, 0, 226, 0, 104, 0, 29, 0, 6, 0, 1]
sd_codes_20_1 = {"order autgp":61931520,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":""}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[6],matId(n)[6]]))
spectrum = [1, 0, 4, 0, 21, 0, 96, 0, 234, 0, 312, 0, 234, 0, 96, 0, 21, 0, 4, 0, 1]
sd_codes_20_2 = {"order autgp":8847360,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":""}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[6],matA(n)[4]]))
spectrum =[1, 0, 0, 0, 29, 0, 32, 0, 226, 0, 448, 0, 226, 0, 32, 0, 29, 0, 0, 0, 1]
sd_codes_20_3 = {"order autgp":30965760,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Min dist 4."}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[4],matA(n)[4],matId(n)[8]]))
spectrum =[1, 0, 2, 0, 29, 0, 56, 0, 226, 0, 396, 0, 226, 0, 56, 0, 29, 0, 2, 0, 1]
sd_codes_20_4 = {"order autgp":28901376,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":""}
genmat = I2(n).augment(block_diagonal_matrix([And7,matId(n)[7]]))
spectrum = [1, 0, 3, 0, 17, 0, 92, 0, 238, 0, 322, 0, 238, 0, 92, 0, 17, 0, 3, 0, 1]
sd_codes_20_5 = {"order autgp":2709504,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment": "'Exceptional' construction."}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[8],matId(n)[8]]))
spectrum = [1, 0, 2, 0, 29, 0, 56, 0, 226, 0, 396, 0, 226, 0, 56, 0, 29, 0, 2, 0, 1]
sd_codes_20_6 = {"order autgp":41287680,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":""}
A0 = self_dual_codes_binary(n-4)["16"]["6"]["code"].redundancy_matrix()
genmat = I2(n).augment(block_diagonal_matrix([A0,matId(n)[8]]))
spectrum = [1,0,2,0,13,0,88,0,242,0,332,0,242,0,88,0,13,0,2,0,1]
sd_codes_20_7 = {"order autgp":589824,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"'Exceptional' construction."}
genmat = I2(n).augment(matA(n)[10])
J20 = MS(n)([[1,1,1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0,0,1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0,0,0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0,0,0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\
[0,0,0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],\
[0,0,0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],\
[0,0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],\
[0,0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],\
[0,0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1],\
[1,0,1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]])
genmat2 = MS(n)([[1,0,0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],\
[0,1,0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1],\
[0,0,1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],\
[0,0,0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0],\
[0,0,0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0],\
[0,0,0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0],\
[0,0,0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0],\
[0,0,0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0],\
[0,0,0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0],\
[0,0,0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1]])
spectrum =[1, 0, 0, 0, 45, 0, 0, 0, 210, 0, 512, 0, 210, 0, 0, 0, 45, 0, 0, 0, 1]
sd_codes_20_8 = {"order autgp":1857945600,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Huge aut gp. Min dist 4."}
genmat = I2(n).augment(A10)
K20 = MS(n)([[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\
[0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\
[0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0],\
[0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0],\
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0],\
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1],\
[1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,0,1,0]])
spectrum = [1, 0, 0, 0, 21, 0, 48, 0, 234, 0, 416, 0, 234, 0, 48, 0, 21, 0, 0, 0, 1]
sd_codes_20_9 = {"order autgp":4423680,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment": "Min dist 4."}
L20 = MS(n)([[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\
[0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\
[1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0],\
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1],\
[0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,1,0,0,0,0],\
[0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,1,0]])
genmat = L20
spectrum = [1, 0, 0, 0, 17, 0, 56, 0, 238, 0, 400, 0, 238, 0, 56, 0, 17, 0, 0, 0, 1]
sd_codes_20_10 = {"order autgp":1354752,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment": "Min dist 4."}
S20 = MS(n)([[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\
[0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\
[0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0],\
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1],\
[1,0,1,0,1,0,1,0,1,1,0,0,0,0,0,0,1,1,0,0],\
[1,1,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,0,0],\
[1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,1,0]] )
genmat = S20
spectrum = [1, 0, 0, 0, 13, 0, 64, 0, 242, 0, 384, 0, 242, 0, 64, 0, 13, 0, 0, 0, 1]
sd_codes_20_11 = {"order autgp":294912,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Min dist 4."}
R20 = MS(n)([[0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\
[0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0],\
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1],\
[0,1,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0],\
[1,1,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0],\
[1,1,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1],\
[1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,1,1]])
genmat = R20
spectrum = [1, 0, 0, 0, 9, 0, 72, 0, 246, 0, 368, 0, 246, 0, 72, 0, 9, 0, 0, 0, 1]
sd_codes_20_12 = {"order autgp":82944,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Min dist 4."}
M20 = MS(n)([[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\
[0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0],\
[0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0],\
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1],\
[0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0],\
[1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0],\
[0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1],\
[0,0,1,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0],\
[0,0,0,0,0,0,1,1,0,1,1,0,1,0,0,1,0,0,0,0]])
genmat = M20
spectrum = [1, 0, 0, 0, 5, 0, 80, 0, 250, 0, 352, 0, 250, 0, 80, 0, 5, 0, 0, 0, 1]
sd_codes_20_13 = {"order autgp":122880,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment": "Min dist 4."}
A0 = self_dual_codes_binary(n-2)["18"]["8"]["code"].redundancy_matrix()
genmat = I2(n).augment(block_diagonal_matrix([A0,matId(n)[9]]))
spectrum = [1, 0, 1, 0, 17, 0, 68, 0, 238, 0, 374, 0, 238, 0, 68, 0, 17, 0, 1, 0, 1]
sd_codes_20_14 = {"order autgp":645120,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment": "'Exceptional' construction."}
A0 = self_dual_codes_binary(n-2)["18"]["7"]["code"].redundancy_matrix()
genmat = I2(n).augment(block_diagonal_matrix([A0,matId(n)[9]]))
spectrum = [1, 0, 1, 0, 9, 0, 84, 0, 246, 0, 342, 0, 246, 0, 84, 0, 9, 0, 1, 0, 1]
sd_codes_20_15 = {"order autgp":165888,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"'Exceptional' construction. Unique lowest wt codeword."}
sd_codes["20"] = {"0":sd_codes_20_0,"1":sd_codes_20_1,"2":sd_codes_20_2,\
"3":sd_codes_20_3,"4":sd_codes_20_4,"5":sd_codes_20_5,\
"6":sd_codes_20_6,"7":sd_codes_20_7,"8":sd_codes_20_8,\
"9":sd_codes_20_9,"10":sd_codes_20_10,"11":sd_codes_20_11,\
"12":sd_codes_20_12,"13":sd_codes_20_13,"14":sd_codes_20_14,
"15":sd_codes_20_15}
return sd_codes
if n == 22:
genmat = I2(n).augment(I2(n))
spectrum = [1, 0, 11, 0, 55, 0, 165, 0, 330, 0, 462, 0, 462, 0, 330, 0, 165, 0, 55, 0, 11, 0, 1]
sd_codes_22_0 = {"order autgp":81749606400,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Huge aut gp."}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[4],matId(n)[4]]))
spectrum = [1, 0, 7, 0, 35, 0, 133, 0, 330, 0, 518, 0, 518, 0, 330, 0, 133, 0, 35, 0, 7, 0, 1]
sd_codes_22_1 = {"order autgp":867041280,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":""}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[6],matId(n)[6]]))
spectrum = [1, 0, 5, 0, 25, 0, 117, 0, 330, 0, 546, 0, 546, 0, 330, 0, 117, 0, 25, 0, 5, 0, 1]
sd_codes_22_2 = {"order autgp":88473600,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":""}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[8],matId(n)[8]]))
spectrum = [1, 0, 3, 0, 31, 0, 85, 0, 282, 0, 622, 0, 622, 0, 282, 0, 85, 0, 31, 0, 3, 0, 1]
sd_codes_22_3 = {"order autgp":247726080,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Same spectrum as the '[20,5]' code."}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[10],matId(n)[10]]))
spectrum = [1, 0, 1, 0, 45, 0, 45, 0, 210, 0, 722, 0, 722, 0, 210, 0, 45, 0, 45, 0, 1, 0, 1]
sd_codes_22_4 = {"order autgp":3715891200,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Unique lowest weight codeword."}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[4],matA(n)[4],matId(n)[8]]))
spectrum = [1, 0, 3, 0, 31, 0, 85, 0, 282, 0, 622, 0, 622, 0, 282, 0, 85, 0, 31, 0, 3, 0, 1]
sd_codes_22_5 = {"order autgp":173408256,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Same spectrum as the '[20,3]' code."}
genmat = I2(n).augment(block_diagonal_matrix([matA(n)[6],matA(n)[4],matId(n)[10]]))
spectrum = [1, 0, 1, 0, 29, 0, 61, 0, 258, 0, 674, 0, 674, 0, 258, 0, 61, 0, 29, 0, 1, 0, 1]
sd_codes_22_6 = {"order autgp":61931520,"code":LinearCode(genmat),"spectrum":spectrum,\
"Type":"I","Comment":"Unique lowest weight codeword."}
sd_codes["22"] = {"0":sd_codes_22_0,"1":sd_codes_22_1,"2":sd_codes_22_2,\
"3":sd_codes_22_3,"4":sd_codes_22_4,"5":sd_codes_22_5,\
"6":sd_codes_22_6}
return sd_codes