Goppa code¶
This module implements Goppa codes and an encoder for them.
EXAMPLES:
sage: F = GF(2^6)
sage: R.<x> = F[]
sage: g = x^9 + 1
sage: L = [a for a in F.list() if g(a) != 0]
sage: C = codes.GoppaCode(g, L)
sage: C
[55, 16] Goppa code over GF(2)
sage: E = codes.encoders.GoppaCodeEncoder(C)
sage: E
Encoder for [55, 16] Goppa code over GF(2)
>>> from sage.all import *
>>> F = GF(Integer(2)**Integer(6))
>>> R = F['x']; (x,) = R._first_ngens(1)
>>> g = x**Integer(9) + Integer(1)
>>> L = [a for a in F.list() if g(a) != Integer(0)]
>>> C = codes.GoppaCode(g, L)
>>> C
[55, 16] Goppa code over GF(2)
>>> E = codes.encoders.GoppaCodeEncoder(C)
>>> E
Encoder for [55, 16] Goppa code over GF(2)
AUTHORS:
Filip Ion, Marketa Slukova (2019-06): initial version
- class sage.coding.goppa_code.GoppaCode(generating_pol, defining_set)[source]¶
Bases:
AbstractLinearCode
Implementation of Goppa codes.
Goppa codes are a generalization of narrow-sense BCH codes. These codes are defined by a generating polynomial \(g\) over a finite field \(\GF{p^m}\), and a defining set \(L\) of elements from \(\GF{p^m}\), which are not roots of \(g\). The number of defining elements determines the length of the code.
In binary cases, the minimum distance is \(2t + 1\), where \(t\) is the degree of \(g\).
INPUT:
generating_pol
– a monic polynomial with coefficients in a finite field \(\GF{p^m}\), the code is defined over \(\GF{p}\), \(p\) must be a prime numberdefining_set
– set of elements of \(\GF{p^m}\) that are not roots of \(g\), its cardinality is the length of the code
EXAMPLES:
sage: F = GF(2^6) sage: R.<x> = F[] sage: g = x^9 + 1 sage: L = [a for a in F.list() if g(a) != 0] sage: C = codes.GoppaCode(g, L) sage: C [55, 16] Goppa code over GF(2)
>>> from sage.all import * >>> F = GF(Integer(2)**Integer(6)) >>> R = F['x']; (x,) = R._first_ngens(1) >>> g = x**Integer(9) + Integer(1) >>> L = [a for a in F.list() if g(a) != Integer(0)] >>> C = codes.GoppaCode(g, L) >>> C [55, 16] Goppa code over GF(2)
- distance_bound()[source]¶
Return a lower bound for the minimum distance of the code.
Computed using the degree of the generating polynomial of
self
. The minimum distance is guaranteed to be bigger than or equal to this bound.EXAMPLES:
sage: F = GF(2^3) sage: R.<x> = F[] sage: g = x^2 + x + 1 sage: L = [a for a in F.list() if g(a) != 0] sage: C = codes.GoppaCode(g, L) sage: C [8, 2] Goppa code over GF(2) sage: C.distance_bound() 3 sage: C.minimum_distance() # needs sage.libs.gap 5
>>> from sage.all import * >>> F = GF(Integer(2)**Integer(3)) >>> R = F['x']; (x,) = R._first_ngens(1) >>> g = x**Integer(2) + x + Integer(1) >>> L = [a for a in F.list() if g(a) != Integer(0)] >>> C = codes.GoppaCode(g, L) >>> C [8, 2] Goppa code over GF(2) >>> C.distance_bound() 3 >>> C.minimum_distance() # needs sage.libs.gap 5
- parity_check_matrix()[source]¶
Return a parity check matrix for
self
.The element in row \(t\), column \(i\) is \(h[i](D[i]^t)\), where:
\(h[i]\) – is the inverse of \(g(D[i])\)
\(D[i]\) – is the \(i\)-th element of the defining set
In the resulting \(d \times n\) matrix we interpret each entry as an \(m\)-column vector and return a \(dm \times n\) matrix.
EXAMPLES:
sage: F = GF(2^3) sage: R.<x> = F[] sage: g = x^2 + x+ 1 sage: L = [a for a in F.list() if g(a) != 0] sage: C = codes.GoppaCode(g, L) sage: C [8, 2] Goppa code over GF(2) sage: C.parity_check_matrix() [1 0 0 0 0 0 0 1] [0 0 1 0 1 1 1 0] [0 1 1 1 0 0 1 0] [0 1 1 1 1 1 1 1] [0 1 0 1 1 0 1 0] [0 0 1 1 1 1 0 0]
>>> from sage.all import * >>> F = GF(Integer(2)**Integer(3)) >>> R = F['x']; (x,) = R._first_ngens(1) >>> g = x**Integer(2) + x+ Integer(1) >>> L = [a for a in F.list() if g(a) != Integer(0)] >>> C = codes.GoppaCode(g, L) >>> C [8, 2] Goppa code over GF(2) >>> C.parity_check_matrix() [1 0 0 0 0 0 0 1] [0 0 1 0 1 1 1 0] [0 1 1 1 0 0 1 0] [0 1 1 1 1 1 1 1] [0 1 0 1 1 0 1 0] [0 0 1 1 1 1 0 0]
- class sage.coding.goppa_code.GoppaCodeEncoder(code)[source]¶
Bases:
Encoder
Encoder for Goppa codes.
Encodes words represented as vectors of length \(k\), where \(k\) is the dimension of
self
, with entries from \(\GF{p}\), the prime field of the base field of the generating polynomial ofself
, into codewords of length \(n\), with entries from \(\GF{p}\).EXAMPLES:
sage: F = GF(2^3) sage: R.<x> = F[] sage: g = x^2 + x + 1 sage: L = [a for a in F.list() if g(a) != 0] sage: C = codes.GoppaCode(g, L) sage: C [8, 2] Goppa code over GF(2) sage: E = codes.encoders.GoppaCodeEncoder(C) sage: E Encoder for [8, 2] Goppa code over GF(2) sage: word = vector(GF(2), (0, 1)) sage: c = E.encode(word) sage: c (0, 1, 1, 1, 1, 1, 1, 0) sage: c in C True
>>> from sage.all import * >>> F = GF(Integer(2)**Integer(3)) >>> R = F['x']; (x,) = R._first_ngens(1) >>> g = x**Integer(2) + x + Integer(1) >>> L = [a for a in F.list() if g(a) != Integer(0)] >>> C = codes.GoppaCode(g, L) >>> C [8, 2] Goppa code over GF(2) >>> E = codes.encoders.GoppaCodeEncoder(C) >>> E Encoder for [8, 2] Goppa code over GF(2) >>> word = vector(GF(Integer(2)), (Integer(0), Integer(1))) >>> c = E.encode(word) >>> c (0, 1, 1, 1, 1, 1, 1, 0) >>> c in C True
- generator_matrix()[source]¶
A generator matrix for
self
.Dimension of resulting matrix is \(k \times n\), where \(k\) is the dimension of
self
and \(n\) is the length ofself
.EXAMPLES:
sage: F = GF(2^3) sage: R.<x> = F[] sage: g = (x^2 + x + 1)^2 sage: L = [a for a in F.list() if g(a) != 0] sage: C = codes.GoppaCode(g, L) sage: C [8, 2] Goppa code over GF(2) sage: C.generator_matrix() [1 0 0 1 0 1 1 1] [0 1 1 1 1 1 1 0]
>>> from sage.all import * >>> F = GF(Integer(2)**Integer(3)) >>> R = F['x']; (x,) = R._first_ngens(1) >>> g = (x**Integer(2) + x + Integer(1))**Integer(2) >>> L = [a for a in F.list() if g(a) != Integer(0)] >>> C = codes.GoppaCode(g, L) >>> C [8, 2] Goppa code over GF(2) >>> C.generator_matrix() [1 0 0 1 0 1 1 1] [0 1 1 1 1 1 1 0]