Decoders for AG codes¶
This module implements decoders for evaluation and differential AG codes.
The implemented algorithm for unique decoding of AG codes, named K, is from [LBO2014] and [Lee2016].
EXAMPLES:
sage: F.<a> = GF(9)
sage: A2.<x,y> = AffineSpace(F, 2)
sage: C = Curve(y^3 + y - x^4)
sage: Q, = C.places_at_infinity()
sage: O = C(0,0).place()
sage: pls = C.places()
sage: pls.remove(Q)
sage: pls.remove(O)
sage: G = -O + 18*Q
sage: code = codes.EvaluationAGCode(pls, G) # long time
sage: code # long time
[26, 15] evaluation AG code over GF(9)
sage: decoder = code.decoder('K') # long time
sage: tau = decoder.decoding_radius() # long time
sage: tau # long time
4
>>> from sage.all import *
>>> F = GF(Integer(9), names=('a',)); (a,) = F._first_ngens(1)
>>> A2 = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = A2._first_ngens(2)
>>> C = Curve(y**Integer(3) + y - x**Integer(4))
>>> Q, = C.places_at_infinity()
>>> O = C(Integer(0),Integer(0)).place()
>>> pls = C.places()
>>> pls.remove(Q)
>>> pls.remove(O)
>>> G = -O + Integer(18)*Q
>>> code = codes.EvaluationAGCode(pls, G) # long time
>>> code # long time
[26, 15] evaluation AG code over GF(9)
>>> decoder = code.decoder('K') # long time
>>> tau = decoder.decoding_radius() # long time
>>> tau # long time
4
The decoder
is now ready for correcting vectors received from a noisy
channel:
sage: # long time
sage: channel = channels.StaticErrorRateChannel(code.ambient_space(), tau)
sage: message_space = decoder.message_space()
sage: message = message_space.random_element()
sage: encoder = decoder.connected_encoder()
sage: sent_codeword = encoder.encode(message)
sage: received_vector = channel(sent_codeword)
sage: (received_vector - sent_codeword).hamming_weight()
4
sage: decoder.decode_to_code(received_vector) == sent_codeword
True
sage: decoder.decode_to_message(received_vector) == message
True
>>> from sage.all import *
>>> # long time
>>> channel = channels.StaticErrorRateChannel(code.ambient_space(), tau)
>>> message_space = decoder.message_space()
>>> message = message_space.random_element()
>>> encoder = decoder.connected_encoder()
>>> sent_codeword = encoder.encode(message)
>>> received_vector = channel(sent_codeword)
>>> (received_vector - sent_codeword).hamming_weight()
4
>>> decoder.decode_to_code(received_vector) == sent_codeword
True
>>> decoder.decode_to_message(received_vector) == message
True
AUTHORS:
Kwankyu Lee (2019-03): initial version
- class sage.coding.ag_code_decoders.Decoder_K[source]¶
Bases:
object
Common base class for the implementation of decoding algorithm K for AG codes.
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2); sage: C = Curve(y^2 + y - x^3) sage: pls = C.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: from sage.coding.ag_code_decoders import EvaluationAGCodeDecoder_K sage: circuit = EvaluationAGCodeDecoder_K(D, G, Q)
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2); >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> pls = C.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> from sage.coding.ag_code_decoders import EvaluationAGCodeDecoder_K >>> circuit = EvaluationAGCodeDecoder_K(D, G, Q)
- decode(received_vector, verbose=False, detect_decoding_failure=True, detect_Q_polynomial=True)[source]¶
Return the message vector that corresponds to the corrected codeword from the received vector.
INPUT:
received_vector
– a received vector in the ambient space of the codeverbose
– boolean; ifTrue
, verbose information is printeddetect_decoding_failure
– boolean; ifTrue
, early failure detection is activateddetect_Q_polynomial
– boolean; ifTrue
, a Q-polynomial is detected for fast decoding
If decoding fails for some reason,
DecodingError
is raised. The message contained in the exception indicates the type of the decoding failure.
- class sage.coding.ag_code_decoders.Decoder_K_extension[source]¶
Bases:
object
Common base class for decoding algorithm K for AG codes via constant field extension.
INPUT:
pls
– list of places of a function fieldG
– a divisor of the function fieldQ
– a non-rational placeverbose
– ifTrue
, verbose information is printed
EXAMPLES:
sage: A.<x,y> = AffineSpace(GF(4), 2) sage: C = Curve(y^2 + y - x^3) sage: pls = C.places() sage: F = C.function_field() sage: G = 1*F.get_place(4) sage: code = codes.EvaluationAGCode(pls, G) sage: dec = code.decoder('K'); dec # long time Unique decoder for [9, 4] evaluation AG code over GF(4)
>>> from sage.all import * >>> A = AffineSpace(GF(Integer(4)), Integer(2), names=('x', 'y',)); (x, y,) = A._first_ngens(2) >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> pls = C.places() >>> F = C.function_field() >>> G = Integer(1)*F.get_place(Integer(4)) >>> code = codes.EvaluationAGCode(pls, G) >>> dec = code.decoder('K'); dec # long time Unique decoder for [9, 4] evaluation AG code over GF(4)
sage: P.<x,y> = ProjectiveSpace(GF(4), 1) sage: C = Curve(P) sage: pls = C.places() sage: len(pls) 5 sage: F = C.function_field() sage: G = F.get_place(2).divisor() sage: code = codes.EvaluationAGCode(pls, G) sage: code.decoder('K') Unique decoder for [5, 3] evaluation AG code over GF(4)
>>> from sage.all import * >>> P = ProjectiveSpace(GF(Integer(4)), Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2) >>> C = Curve(P) >>> pls = C.places() >>> len(pls) 5 >>> F = C.function_field() >>> G = F.get_place(Integer(2)).divisor() >>> code = codes.EvaluationAGCode(pls, G) >>> code.decoder('K') Unique decoder for [5, 3] evaluation AG code over GF(4)
- class sage.coding.ag_code_decoders.DifferentialAGCodeDecoder_K[source]¶
Bases:
Decoder_K
This class implements the decoding algorithm K for differential AG codes.
INPUT:
pls
– list of places of a function fieldG
– a divisor of the function fieldQ
– a rational place not inpls
verbose
– ifTrue
, verbose information is printed
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2); sage: C = Curve(y^2 + y - x^3) sage: pls = C.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: from sage.coding.ag_code_decoders import DifferentialAGCodeDecoder_K sage: circuit = DifferentialAGCodeDecoder_K(D, G, Q) # long time sage: rv = vector([1, a, 1, a, 1, a, a, a + 1]) sage: cw = circuit.encode(circuit.decode(rv)) # long time sage: rv - cw # long time (0, 0, 0, a + 1, 1, 0, 0, 0) sage: circuit.info['designed_distance'] # long time 5 sage: circuit.info['decoding_radius'] # long time 2
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2); >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> pls = C.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> from sage.coding.ag_code_decoders import DifferentialAGCodeDecoder_K >>> circuit = DifferentialAGCodeDecoder_K(D, G, Q) # long time >>> rv = vector([Integer(1), a, Integer(1), a, Integer(1), a, a, a + Integer(1)]) >>> cw = circuit.encode(circuit.decode(rv)) # long time >>> rv - cw # long time (0, 0, 0, a + 1, 1, 0, 0, 0) >>> circuit.info['designed_distance'] # long time 5 >>> circuit.info['decoding_radius'] # long time 2
- class sage.coding.ag_code_decoders.DifferentialAGCodeDecoder_K_extension[source]¶
Bases:
Decoder_K_extension
This class implements the decoding algorithm K for differential AG codes via constant field extension.
INPUT:
pls
– list of places of a function fieldG
– a divisor of the function fieldQ
– a non-rational placeverbose
– ifTrue
, verbose information is printed
EXAMPLES:
sage: F.<a> = GF(4) sage: A.<x,y> = AffineSpace(F, 2) sage: C = Curve(y^2 + y - x^3) sage: pls = C.places() sage: F = C.function_field() sage: G = 1*F.get_place(4) sage: code = codes.DifferentialAGCode(pls, G) sage: Q = F.get_place(3) sage: from sage.coding.ag_code_decoders import DifferentialAGCodeDecoder_K_extension sage: circuit = DifferentialAGCodeDecoder_K_extension(pls, G, Q) # long time sage: cw = code.random_element() sage: rv = cw + vector([0,0,a,0,0,0,0,0,0]) sage: circuit.encode(circuit.decode(circuit._lift(rv))) == circuit._lift(cw) # long time True
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> A = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = A._first_ngens(2) >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> pls = C.places() >>> F = C.function_field() >>> G = Integer(1)*F.get_place(Integer(4)) >>> code = codes.DifferentialAGCode(pls, G) >>> Q = F.get_place(Integer(3)) >>> from sage.coding.ag_code_decoders import DifferentialAGCodeDecoder_K_extension >>> circuit = DifferentialAGCodeDecoder_K_extension(pls, G, Q) # long time >>> cw = code.random_element() >>> rv = cw + vector([Integer(0),Integer(0),a,Integer(0),Integer(0),Integer(0),Integer(0),Integer(0),Integer(0)]) >>> circuit.encode(circuit.decode(circuit._lift(rv))) == circuit._lift(cw) # long time True
- class sage.coding.ag_code_decoders.DifferentialAGCodeEncoder(code, decoder=None)[source]¶
Bases:
Encoder
Encoder of a differential AG code.
INPUT:
code
– a differential AG codedecoder
– a decoder of the code
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2); sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.DifferentialAGCode(D, G) sage: dec = code.decoder('K', Q) # long time sage: enc = dec.connected_encoder(); enc # long time Encoder for [8, 3] differential AG code over GF(4)
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2); >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.DifferentialAGCode(D, G) >>> dec = code.decoder('K', Q) # long time >>> enc = dec.connected_encoder(); enc # long time Encoder for [8, 3] differential AG code over GF(4)
- encode(message)[source]¶
Return the codeword encoded from the message.
INPUT:
message
– a vector in the message space
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2) sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.DifferentialAGCode(D, G) # long time sage: dec = code.decoder('K', Q) # long time sage: enc = dec.connected_encoder() # long time sage: msg = enc.message_space().random_element() # long time sage: codeword = enc.encode(msg) # long time sage: enc.unencode(codeword) == msg # long time True
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2) >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.DifferentialAGCode(D, G) # long time >>> dec = code.decoder('K', Q) # long time >>> enc = dec.connected_encoder() # long time >>> msg = enc.message_space().random_element() # long time >>> codeword = enc.encode(msg) # long time >>> enc.unencode(codeword) == msg # long time True
- unencode_nocheck(codeword)[source]¶
Return the message unencoded from
codeword
.INPUT:
codeword
– a vector in the code
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2) sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.DifferentialAGCode(D, G) # long time sage: dec = code.decoder('K', Q) # long time sage: enc = dec.connected_encoder() # long time sage: msg = enc.message_space().random_element() # long time sage: codeword = enc.encode(msg) # long time sage: enc.unencode(codeword) in enc.message_space() # indirect doctest, long time True
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2) >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.DifferentialAGCode(D, G) # long time >>> dec = code.decoder('K', Q) # long time >>> enc = dec.connected_encoder() # long time >>> msg = enc.message_space().random_element() # long time >>> codeword = enc.encode(msg) # long time >>> enc.unencode(codeword) in enc.message_space() # indirect doctest, long time True
- class sage.coding.ag_code_decoders.DifferentialAGCodeUniqueDecoder(code, Q=None, basis=None, verbose=False)[source]¶
Bases:
Decoder
Unique decoder for a differential AG codes.
INPUT:
code
– an evaluation AG codeQ
– (optional) a place, not one of the places supporting the codebasis
– (optional) a basis of the space of differentials to take residuesverbose
– ifTrue
, verbose information is printed
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2); sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C(0,0) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.DifferentialAGCode(D, G) sage: chan = channels.StaticErrorRateChannel(code.ambient_space(), 2) sage: rv = chan.transmit(code.random_element()) # long time sage: dec = code.decoder('K', Q) # long time sage: enc = dec.connected_encoder() # long time sage: enc.encode(dec.decode_to_message(rv)) in code # long time True
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2); >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C(Integer(0),Integer(0)) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.DifferentialAGCode(D, G) >>> chan = channels.StaticErrorRateChannel(code.ambient_space(), Integer(2)) >>> rv = chan.transmit(code.random_element()) # long time >>> dec = code.decoder('K', Q) # long time >>> enc = dec.connected_encoder() # long time >>> enc.encode(dec.decode_to_message(rv)) in code # long time True
If
basis
is given, that defines the associated residue encoding map:sage: basis = tuple((G - sum(D)).basis_differential_space()) sage: w = basis[0] sage: cw = vector(w.residue(p) for p in D) sage: dec2 = code.decoder('K', Q, basis) # long time sage: enc2 = dec2.connected_encoder() # long time sage: temp = enc2.unencode(cw); temp # long time (1, 0, 0) sage: enc2.encode(temp) == cw # long time True sage: w = basis[1] sage: cw = vector(w.residue(p) for p in D) sage: temp = enc2.unencode(cw); temp # long time (0, 1, 0) sage: enc2.encode(temp) == cw # long time True
>>> from sage.all import * >>> basis = tuple((G - sum(D)).basis_differential_space()) >>> w = basis[Integer(0)] >>> cw = vector(w.residue(p) for p in D) >>> dec2 = code.decoder('K', Q, basis) # long time >>> enc2 = dec2.connected_encoder() # long time >>> temp = enc2.unencode(cw); temp # long time (1, 0, 0) >>> enc2.encode(temp) == cw # long time True >>> w = basis[Integer(1)] >>> cw = vector(w.residue(p) for p in D) >>> temp = enc2.unencode(cw); temp # long time (0, 1, 0) >>> enc2.encode(temp) == cw # long time True
The default
basis
is given bycode.basis_differentials()
.- connected_encoder(*args, **kwargs)[source]¶
Return the connected encoder for this decoder.
INPUT:
args
,kwargs
– all additional arguments are forwarded to the constructor of the connected encoder
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2); sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.DifferentialAGCode(D, G) # long time sage: dec = code.decoder('K', Q) # long time sage: dec.connected_encoder() # long time Encoder for [8, 3] differential AG code over GF(4)
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2); >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.DifferentialAGCode(D, G) # long time >>> dec = code.decoder('K', Q) # long time >>> dec.connected_encoder() # long time Encoder for [8, 3] differential AG code over GF(4)
- decode_to_code(received_vector, **kwargs)[source]¶
Return the codeword decoded from
received_vector
.INPUT:
received_vector
– a vector in the ambient space of the codeverbose
– boolean; ifTrue
, verbose information on the decoding process is printed
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2); sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.DifferentialAGCode(D, G) # long time sage: dec = code.decoder('K', Q) # long time sage: enc = dec.connected_encoder() # long time sage: code = dec.code() # long time sage: chan = channels.StaticErrorRateChannel(code.ambient_space(), 2) # long time sage: rv = chan.transmit(code.random_element()) # long time sage: cw = dec.decode_to_code(rv) # long time sage: (cw - rv).hamming_weight() == 2 # long time True
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2); >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.DifferentialAGCode(D, G) # long time >>> dec = code.decoder('K', Q) # long time >>> enc = dec.connected_encoder() # long time >>> code = dec.code() # long time >>> chan = channels.StaticErrorRateChannel(code.ambient_space(), Integer(2)) # long time >>> rv = chan.transmit(code.random_element()) # long time >>> cw = dec.decode_to_code(rv) # long time >>> (cw - rv).hamming_weight() == Integer(2) # long time True
- decode_to_message(received_vector, **kwargs)[source]¶
Return the message decoded from
received_vector
.INPUT:
received_vector
– a vector in the ambient space of the codeverbose
– boolean; ifTrue
, verbose information on the decoding process is printed
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2); sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.DifferentialAGCode(D, G) # long time sage: dec = code.decoder('K', Q) # long time sage: enc = dec.connected_encoder() # long time sage: code = dec.code() # long time sage: chan = channels.StaticErrorRateChannel(code.ambient_space(), 2) # long time sage: rv = chan.transmit(code.random_element()) # long time sage: msg = dec.decode_to_message(rv) # long time sage: cw = enc.encode(msg) # long time sage: (cw - rv).hamming_weight() == 2 # long time True
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2); >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.DifferentialAGCode(D, G) # long time >>> dec = code.decoder('K', Q) # long time >>> enc = dec.connected_encoder() # long time >>> code = dec.code() # long time >>> chan = channels.StaticErrorRateChannel(code.ambient_space(), Integer(2)) # long time >>> rv = chan.transmit(code.random_element()) # long time >>> msg = dec.decode_to_message(rv) # long time >>> cw = enc.encode(msg) # long time >>> (cw - rv).hamming_weight() == Integer(2) # long time True
- decoding_radius()[source]¶
Return the decoding radius of the decoder.
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2); sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.DifferentialAGCode(D, G) # long time sage: dec = code.decoder('K', Q) # long time sage: dec.decoding_radius() # long time 2
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2); >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.DifferentialAGCode(D, G) # long time >>> dec = code.decoder('K', Q) # long time >>> dec.decoding_radius() # long time 2
- class sage.coding.ag_code_decoders.EvaluationAGCodeDecoder_K[source]¶
Bases:
Decoder_K
This class implements the decoding algorithm K for evaluation AG codes.
INPUT:
pls
– list of places of a function fieldG
– a divisor of the function fieldQ
– a rational place not inpls
verbose
– ifTrue
, verbose information is printed
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2); sage: C = Curve(y^2 + y - x^3) sage: pls = C.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: from sage.coding.ag_code_decoders import EvaluationAGCodeDecoder_K sage: circuit = EvaluationAGCodeDecoder_K(D, G, Q) sage: rv = vector([a, 0, 0, a, 1, 1, a + 1, 0]) sage: cw = circuit.encode(circuit.decode(rv)) sage: rv - cw (a + 1, 0, 0, 0, 0, 0, 0, 0) sage: circuit.info['designed_distance'] 3 sage: circuit.info['decoding_radius'] 1
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2); >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> pls = C.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> from sage.coding.ag_code_decoders import EvaluationAGCodeDecoder_K >>> circuit = EvaluationAGCodeDecoder_K(D, G, Q) >>> rv = vector([a, Integer(0), Integer(0), a, Integer(1), Integer(1), a + Integer(1), Integer(0)]) >>> cw = circuit.encode(circuit.decode(rv)) >>> rv - cw (a + 1, 0, 0, 0, 0, 0, 0, 0) >>> circuit.info['designed_distance'] 3 >>> circuit.info['decoding_radius'] 1
- class sage.coding.ag_code_decoders.EvaluationAGCodeDecoder_K_extension[source]¶
Bases:
Decoder_K_extension
This class implements the decoding algorithm K for evaluation AG codes via constant field extension.
INPUT:
pls
– list of places of a function fieldG
– a divisor of the function fieldQ
– a non-rational placeverbose
– ifTrue
, verbose information is printed
EXAMPLES:
sage: F.<a> = GF(4) sage: A.<x,y> = AffineSpace(F, 2) sage: C = Curve(y^2 + y - x^3) sage: pls = C.places() sage: F = C.function_field() sage: G = 1*F.get_place(4) sage: code = codes.EvaluationAGCode(pls, G) sage: Q = F.get_place(3) sage: from sage.coding.ag_code_decoders import EvaluationAGCodeDecoder_K_extension sage: circuit = EvaluationAGCodeDecoder_K_extension(pls, G, Q) sage: cw = code.random_element() sage: rv = cw + vector([0,1,1,0,0,0,0,0,0]) sage: circuit.encode(circuit.decode(circuit._lift(rv))) == circuit._lift(cw) True
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> A = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = A._first_ngens(2) >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> pls = C.places() >>> F = C.function_field() >>> G = Integer(1)*F.get_place(Integer(4)) >>> code = codes.EvaluationAGCode(pls, G) >>> Q = F.get_place(Integer(3)) >>> from sage.coding.ag_code_decoders import EvaluationAGCodeDecoder_K_extension >>> circuit = EvaluationAGCodeDecoder_K_extension(pls, G, Q) >>> cw = code.random_element() >>> rv = cw + vector([Integer(0),Integer(1),Integer(1),Integer(0),Integer(0),Integer(0),Integer(0),Integer(0),Integer(0)]) >>> circuit.encode(circuit.decode(circuit._lift(rv))) == circuit._lift(cw) True
- class sage.coding.ag_code_decoders.EvaluationAGCodeEncoder(code, decoder=None)[source]¶
Bases:
Encoder
Encoder of an evaluation AG code.
INPUT:
code
– an evaluation AG codedecoder
– a decoder of the code
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2); sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.EvaluationAGCode(D, G) sage: dec = code.decoder('K', Q) sage: enc = dec.connected_encoder() sage: enc Encoder for [8, 5] evaluation AG code over GF(4)
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2); >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.EvaluationAGCode(D, G) >>> dec = code.decoder('K', Q) >>> enc = dec.connected_encoder() >>> enc Encoder for [8, 5] evaluation AG code over GF(4)
- encode(message)[source]¶
Return the codeword encoded from the message.
INPUT:
message
– a vector in the message space
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2) sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.EvaluationAGCode(D, G) # long time sage: dec = code.decoder('K', Q) # long time sage: enc = dec.connected_encoder() # long time sage: msg = enc.message_space().random_element() # long time sage: codeword = enc.encode(msg) # long time sage: enc.unencode(codeword) == msg # long time True
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2) >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.EvaluationAGCode(D, G) # long time >>> dec = code.decoder('K', Q) # long time >>> enc = dec.connected_encoder() # long time >>> msg = enc.message_space().random_element() # long time >>> codeword = enc.encode(msg) # long time >>> enc.unencode(codeword) == msg # long time True
- unencode_nocheck(codeword)[source]¶
Return the message unencoded from
codeword
.INPUT:
codeword
– a vector in the code
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2) sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.EvaluationAGCode(D, G) # long time sage: dec = code.decoder('K', Q) # long time sage: enc = dec.connected_encoder() # long time sage: msg = enc.message_space().random_element() # long time sage: codeword = enc.encode(msg) # long time sage: enc.unencode(codeword) in enc.message_space() # long time, indirect doctest True
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2) >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.EvaluationAGCode(D, G) # long time >>> dec = code.decoder('K', Q) # long time >>> enc = dec.connected_encoder() # long time >>> msg = enc.message_space().random_element() # long time >>> codeword = enc.encode(msg) # long time >>> enc.unencode(codeword) in enc.message_space() # long time, indirect doctest True
- class sage.coding.ag_code_decoders.EvaluationAGCodeUniqueDecoder(code, Q=None, basis=None, verbose=False)[source]¶
Bases:
Decoder
Unique decoder for evaluation AG codes.
INPUT:
code
– an evaluation AG codeQ
– (optional) a place, not one of the places supporting the codebasis
– (optional) a basis of the space of functions to evaluateverbose
– ifTrue
, verbose information is printed
EXAMPLES:
sage: k.<a> = GF(4) sage: P.<x,y> = AffineSpace(k, 2); sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C(0,0) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.EvaluationAGCode(D, G) sage: dec = code.decoder('K', Q) sage: enc = dec.connected_encoder() sage: chan = channels.StaticErrorRateChannel(code.ambient_space(), 1) sage: rv = chan.transmit(code.random_element()) sage: enc.encode(dec.decode_to_message(rv)) in code True
>>> from sage.all import * >>> k = GF(Integer(4), names=('a',)); (a,) = k._first_ngens(1) >>> P = AffineSpace(k, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2); >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C(Integer(0),Integer(0)) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.EvaluationAGCode(D, G) >>> dec = code.decoder('K', Q) >>> enc = dec.connected_encoder() >>> chan = channels.StaticErrorRateChannel(code.ambient_space(), Integer(1)) >>> rv = chan.transmit(code.random_element()) >>> enc.encode(dec.decode_to_message(rv)) in code True
If
basis
is given, that defines the associated evaluation encoding map:sage: basis = tuple(G.basis_function_space()) sage: dec2 = code.decoder('K', Q, basis) sage: enc2 = dec2.connected_encoder() sage: f = basis[0] sage: cw = vector(f.evaluate(p) for p in D) sage: enc2.unencode(cw) (1, 0, 0, 0, 0) sage: enc2.encode(_) == cw True sage: f = basis[1] sage: cw = vector(f.evaluate(p) for p in D) sage: enc2.unencode(cw) (0, 1, 0, 0, 0) sage: enc2.encode(_) == cw True
>>> from sage.all import * >>> basis = tuple(G.basis_function_space()) >>> dec2 = code.decoder('K', Q, basis) >>> enc2 = dec2.connected_encoder() >>> f = basis[Integer(0)] >>> cw = vector(f.evaluate(p) for p in D) >>> enc2.unencode(cw) (1, 0, 0, 0, 0) >>> enc2.encode(_) == cw True >>> f = basis[Integer(1)] >>> cw = vector(f.evaluate(p) for p in D) >>> enc2.unencode(cw) (0, 1, 0, 0, 0) >>> enc2.encode(_) == cw True
The default
basis
is given bycode.basis_functions()
.- connected_encoder(*args, **kwargs)[source]¶
Return the connected encoder for this decoder.
INPUT:
args
,kwargs
– all additional arguments are forwarded to the constructor of the connected encoder
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2) sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.EvaluationAGCode(D, G) # long time sage: dec = code.decoder('K', Q) # long time sage: dec.connected_encoder() # long time Encoder for [8, 5] evaluation AG code over GF(4)
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2) >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.EvaluationAGCode(D, G) # long time >>> dec = code.decoder('K', Q) # long time >>> dec.connected_encoder() # long time Encoder for [8, 5] evaluation AG code over GF(4)
- decode_to_code(received_vector, **kwargs)[source]¶
Return the codeword decoded from
received_vector
.INPUT:
received_vector
– a vector in the ambient space of the codeverbose
– boolean; ifTrue
, verbose information on the decoding process is printed
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2) sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.EvaluationAGCode(D, G) # long time sage: dec = code.decoder('K', Q) # long time sage: code = dec.code() # long time sage: chan = channels.StaticErrorRateChannel(code.ambient_space(), 1) # long time sage: rv = chan.transmit(code.random_element()) # long time sage: cw = dec.decode_to_code(rv) # long time sage: (cw - rv).hamming_weight() == 1 # long time True
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2) >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.EvaluationAGCode(D, G) # long time >>> dec = code.decoder('K', Q) # long time >>> code = dec.code() # long time >>> chan = channels.StaticErrorRateChannel(code.ambient_space(), Integer(1)) # long time >>> rv = chan.transmit(code.random_element()) # long time >>> cw = dec.decode_to_code(rv) # long time >>> (cw - rv).hamming_weight() == Integer(1) # long time True
- decode_to_message(received_vector, **kwargs)[source]¶
Return the message decoded from
received_vector
.INPUT:
received_vector
– a vector in the ambient space of the codeverbose
– boolean; ifTrue
, verbose information on the decoding process is printed
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2) sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.EvaluationAGCode(D, G) # long time sage: dec = code.decoder('K', Q) # long time sage: enc = dec.connected_encoder() # long time sage: code = dec.code() # long time sage: chan = channels.StaticErrorRateChannel(code.ambient_space(), 1) # long time sage: rv = chan.transmit(code.random_element()) # long time sage: msg = dec.decode_to_message(rv) # long time sage: cw = enc.encode(msg) # long time sage: (cw - rv).hamming_weight() == 1 # long time True
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2) >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.EvaluationAGCode(D, G) # long time >>> dec = code.decoder('K', Q) # long time >>> enc = dec.connected_encoder() # long time >>> code = dec.code() # long time >>> chan = channels.StaticErrorRateChannel(code.ambient_space(), Integer(1)) # long time >>> rv = chan.transmit(code.random_element()) # long time >>> msg = dec.decode_to_message(rv) # long time >>> cw = enc.encode(msg) # long time >>> (cw - rv).hamming_weight() == Integer(1) # long time True
- decoding_radius()[source]¶
Return the decoding radius of the decoder.
EXAMPLES:
sage: F.<a> = GF(4) sage: P.<x,y> = AffineSpace(F, 2) sage: C = Curve(y^2 + y - x^3) sage: F = C.function_field() sage: pls = F.places() sage: p = C([0,0]) sage: Q, = p.places() sage: D = [pl for pl in pls if pl != Q] sage: G = 5*Q sage: code = codes.EvaluationAGCode(D, G) # long time sage: dec = code.decoder('K', Q) # long time sage: dec.decoding_radius() # long time 1
>>> from sage.all import * >>> F = GF(Integer(4), names=('a',)); (a,) = F._first_ngens(1) >>> P = AffineSpace(F, Integer(2), names=('x', 'y',)); (x, y,) = P._first_ngens(2) >>> C = Curve(y**Integer(2) + y - x**Integer(3)) >>> F = C.function_field() >>> pls = F.places() >>> p = C([Integer(0),Integer(0)]) >>> Q, = p.places() >>> D = [pl for pl in pls if pl != Q] >>> G = Integer(5)*Q >>> code = codes.EvaluationAGCode(D, G) # long time >>> dec = code.decoder('K', Q) # long time >>> dec.decoding_radius() # long time 1