Skip to content
This repository was archived by the owner on Jan 30, 2023. It is now read-only.

Commit b83ade8

Browse files
committed
moving ReedSolomonSupercode to individual classes and adding to documentation
1 parent d158aad commit b83ade8

File tree

2 files changed

+116
-26
lines changed

2 files changed

+116
-26
lines changed

src/sage/coding/codes_catalog.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
ToricCode, TrivialCode, WalshCode)
3232

3333
from .grs import GeneralizedReedSolomonCode
34-
from .reed_muller_code import ReedMullerCode, BinaryReedMullerCode, ReedSolomonSupercode
34+
from .reed_muller_code import ReedMullerCode, BinaryReedMullerCode
3535
from .extended_code import ExtendedCode
3636

3737
from .guava import QuasiQuadraticResidueCode, RandomLinearCodeGuava

src/sage/coding/reed_muller_code.py

+115-25
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
from sage.misc.cachefunc import cached_method
4747
from sage.sets.set import Set
4848
from functools import reduce
49+
from copy import copy
4950

5051

5152
def _binomial_sum(n, k):
@@ -138,7 +139,8 @@ def _interpolate(evaluation, num_of_var, order):
138139

139140
def _set_to_mask(s, m):
140141
r"""
141-
Maps the set to a vector over GF(2) to an integer.
142+
Maps the set to an integer.
143+
The integer is given by `\sum^{m-1}_{i=0} 2^i\delta(i\in s)`.
142144
143145
INPUT::
144146
@@ -160,10 +162,10 @@ def _set_to_mask(s, m):
160162
p <<= 1
161163
return ans
162164

163-
165+
@cached_method
164166
def _list_polynomial(base_field, y, dim):
165167
r"""
166-
Lists all polynomials of degree ``dim-1`` over ``base_field``.
168+
Returns the list of all polynomials of degree ``dim-1`` over ``base_field``.
167169
168170
INPUT::
169171
@@ -195,42 +197,40 @@ def _list_polynomial(base_field, y, dim):
195197
return v
196198

197199

198-
def ReedSolomonSupercode(code, p=None):
200+
def _reed_solomon_supercode(code, p=None):
199201
r"""
200-
Returns the Reed Solomon super code of the given Reed-Muller code.
201-
202+
Returns the Reed Solomon supercode of the given Reed-Muller code.
203+
The Reed Solomon supercode can be obtained my mapping each element of a vector field `\Bold{F}^m_{q}` to `\Bold{F}_{q^m}`
204+
via a linear transformation over `\Bold{F}_q` and then using them as evaluation points of Reed-Solomon code.
205+
This process gives a supercode of the Reed-Muller code which is a Reed-Solomon code.
206+
202207
INPUT::
203208
204-
- ``code`` -- A Reed-Muller code of appropiate order.
209+
- ``code`` -- A Reed-Muller code.
205210
206211
- ``p`` -- An irreducible polynomial over the base field of ``code`` of degree same as number of variables used in ``code``.
207212
208213
EXAMPLES::
209214
215+
sage: from sage.coding.reed_muller_code import _reed_solomon_supercode
210216
sage: C = codes.ReedMullerCode(GF(3), 2, 5)
211-
sage: sC = codes.ReedSolomonSupercode(C)
217+
sage: sC = _reed_solomon_supercode(C)
212218
sage: sC
213219
[243, 163, 81] Generalized Reed-Solomon Code over Finite Field in y of size 3^5
214220
215-
A polynomial ``p`` can be passed to direct the extension field.
221+
A polynomial ``p`` can be passed to direct the extension field::
216222
217223
sage: F = GF(4)
218224
sage: R.<x> = F[]
219225
sage: p = x^4 + x^3 + F.gen()*x^2 + x + 1
220226
sage: p.is_irreducible()
221227
True
222228
sage: C = codes.ReedMullerCode(F, 2, 4)
223-
sage: sC = codes.ReedSolomonSupercode(C, p)
229+
sage: sC = _reed_solomon_supercode(C, p)
224230
sage: sC
225231
[256, 129, 128] Generalized Reed-Solomon Code over Univariate Quotient Polynomial Ring in y over Finite Field in z2 of size 2^2 with modulus y^4 + y^3 + z2*y^2 + y + 1
226232
227233
"""
228-
if not isinstance(code, (QAryReedMullerCode, BinaryReedMullerCode)):
229-
raise ValueError('The code must be a reed muller code')
230-
if isinstance(code, BinaryReedMullerCode):
231-
if code.order() > 1:
232-
raise ValueError(
233-
'For binary reed muller codes, the order must be less than 1')
234234
n = code.length()
235235
order = code.order()
236236
num_of_var = code.number_of_variables()
@@ -247,8 +247,8 @@ def ReedSolomonSupercode(code, p=None):
247247
extended_field = base_field.extension(p, 'y')
248248
evalPoints = _list_polynomial(
249249
base_field, extended_field.gen(), num_of_var)
250-
RS_code = GeneralizedReedSolomonCode(
251-
evalPoints, ((n * order) // q) + 1)
250+
dimension = min(((n * order) // q) + 1, n)
251+
RS_code = GeneralizedReedSolomonCode(evalPoints, dimension)
252252
return RS_code
253253

254254

@@ -490,6 +490,39 @@ def __eq__(self, other):
490490
and self.order() == other.order() \
491491
and self.number_of_variables() == other.number_of_variables()
492492

493+
def reed_solomon_supercode(self, p = None):
494+
r"""
495+
Returns the Reed Solomon supercode of the given Reed-Muller code.
496+
The Reed Solomon supercode can be obtained my mapping each element of a vector field `\Bold{F}^m_{q}` to `\Bold{F}_{q^m}`
497+
via a linear transformation over `\Bold{F}_q` and then using them as evaluation points of Reed-Solomon code.
498+
This process gives a supercode of the Reed-Muller code which is a Reed-Solomon code.
499+
500+
INPUT::
501+
502+
- ``p`` -- An irreducible polynomial over the base field of ``code`` of degree same as number of variables used in ``code``.
503+
504+
EXAMPLES::
505+
506+
sage: C = codes.ReedMullerCode(GF(3), 2, 5)
507+
sage: sC = C.reed_solomon_supercode()
508+
sage: sC
509+
[243, 163, 81] Generalized Reed-Solomon Code over Finite Field in y of size 3^5
510+
511+
A polynomial ``p`` can be passed to direct the extension field::
512+
513+
sage: F = GF(4)
514+
sage: R.<x> = F[]
515+
sage: p = x^4 + x^3 + F.gen()*x^2 + x + 1
516+
sage: p.is_irreducible()
517+
True
518+
sage: C = codes.ReedMullerCode(F, 2, 4)
519+
sage: sC = C.reed_solomon_supercode(p)
520+
sage: sC
521+
[256, 129, 128] Generalized Reed-Solomon Code over Univariate Quotient Polynomial Ring in y over Finite Field in z2 of size 2^2 with modulus y^4 + y^3 + z2*y^2 + y + 1
522+
523+
"""
524+
return _reed_solomon_supercode(self, p)
525+
493526

494527
class BinaryReedMullerCode(AbstractLinearCode):
495528
r"""
@@ -635,6 +668,41 @@ def __eq__(self, other):
635668
and self.order() == other.order() \
636669
and self.number_of_variables() == other.number_of_variables()
637670

671+
def reed_solomon_supercode(self, p = None):
672+
r"""
673+
Returns the Reed Solomon supercode of the given Reed-Muller code.
674+
The Reed Solomon supercode can be obtained my mapping each element of a vector field `\Bold{F}^m_{q}` to `\Bold{F}_{q^m}`
675+
via a linear transformation over `\Bold{F}_q` and then using them as evaluation points of Reed-Solomon code.
676+
This process gives a supercode of the Reed-Muller code which is a Reed-Solomon code.
677+
678+
INPUT::
679+
680+
- ``p`` -- An irreducible polynomial over the base field of ``code`` of degree same as number of variables used in ``code``.
681+
682+
EXAMPLES::
683+
684+
sage: C = codes.ReedMullerCode(GF(2), 2, 5)
685+
sage: sC = C.reed_solomon_supercode()
686+
sage: sC
687+
[32, 32, 1] Generalized Reed-Solomon Code over Finite Field in y of size 2^5
688+
689+
A polynomial ``p`` can be passed to direct the extension field::
690+
691+
sage: F = GF(2)
692+
sage: R.<x> = F[]
693+
sage: p = x^4 + x + 1
694+
sage: p.is_irreducible()
695+
True
696+
sage: C = codes.ReedMullerCode(F, 2, 4)
697+
sage: sC = C.reed_solomon_supercode(p)
698+
sage: sC
699+
[16, 16, 1] Generalized Reed-Solomon Code over Finite Field in y of size 2^4
700+
701+
"""
702+
return _reed_solomon_supercode(self, p)
703+
704+
705+
638706

639707
class ReedMullerVectorEncoder(Encoder):
640708
r"""
@@ -1308,7 +1376,7 @@ class QAryReedMullerRSDecoder(Decoder):
13081376
13091377
We can use other decoders for the Reed-Solomon supercode as well,
13101378
1311-
sage: sC = codes.ReedSolomonSupercode(C)
1379+
sage: sC = C.reed_solomon_supercode()
13121380
sage: D = codes.decoders.QAryReedMullerRSDecoder(C, sC.decoder("BerlekampWelch"))
13131381
sage: D
13141382
Reed Solomon based decoder for Reed-Muller Code of order 2 and 3 variables over Finite Field of size 3 that uses Berlekamp-Welch decoder for [27, 19, 9] Generalized Reed-Solomon Code over Finite Field in y of size 3^3
@@ -1353,7 +1421,7 @@ def __init__(self, code, reed_solomon_decoder=None, irreducible_polynomial=None,
13531421
if code.order() > 1:
13541422
raise ValueError(
13551423
'For binary Reed-Muller codes, the order must be less than 2')
1356-
supercode = ReedSolomonSupercode(code, irreducible_polynomial)
1424+
supercode = code.reed_solomon_supercode(irreducible_polynomial)
13571425
if reed_solomon_decoder is not None:
13581426
if not isinstance(reed_solomon_decoder, Decoder):
13591427
raise TypeError(
@@ -1364,6 +1432,8 @@ def __init__(self, code, reed_solomon_decoder=None, irreducible_polynomial=None,
13641432
self._reed_solomon_decoder = reed_solomon_decoder
13651433
else:
13661434
self._reed_solomon_decoder = supercode.decoder(**kwargs)
1435+
self._decoder_type = copy(self._decoder_type)
1436+
self._decoder_type.remove("dynamic")
13671437
self._decoder_type = self._reed_solomon_decoder.decoder_type()
13681438
self._reed_solomon_supercode = supercode
13691439
super(QAryReedMullerRSDecoder, self).__init__(code, code.ambient_space(),
@@ -1414,7 +1484,7 @@ def __eq__(self, other):
14141484
14151485
Note that using a differnt Reed-Solomon decoder would lead to a different QAryReedMullerRSDecoder.
14161486
1417-
sage: sC = codes.ReedSolomonSupercode(C)
1487+
sage: sC = C.reed_solomon_supercode()
14181488
sage: D3 = codes.decoders.QAryReedMullerRSDecoder(C, sC.decoder("BerlekampWelch"))
14191489
sage: D1.__eq__(D3)
14201490
False
@@ -1450,12 +1520,34 @@ def decode_to_code(self, word):
14501520
return self.reed_solomon_decoder().decode_to_code(word)
14511521

14521522
def reed_solomon_supercode(self):
1523+
r"""
1524+
Returns the Reed-Solomon supercode the Reed-Muller code is embedded in.
1525+
1526+
EXAMPLES::
1527+
1528+
sage: F = GF(3)
1529+
sage: C = codes.ReedMullerCode(F, 2, 5)
1530+
sage: D = codes.decoders.QAryReedMullerRSDecoder(C)
1531+
sage: D.reed_solomon_supercode()
1532+
[243, 163, 81] Generalized Reed-Solomon Code over Finite Field in y of size 3^5
1533+
"""
14531534
return self._reed_solomon_supercode
14541535

14551536
def reed_solomon_decoder(self):
1537+
r"""
1538+
Returns the Reed-Solomon supercode the Reed-Muller code is embedded in.
1539+
1540+
EXAMPLES::
1541+
1542+
sage: F = GF(3)
1543+
sage: C = codes.ReedMullerCode(F, 2, 5)
1544+
sage: D = codes.decoders.QAryReedMullerRSDecoder(C)
1545+
sage: D.reed_solomon_decoder()
1546+
Gao decoder for [243, 163, 81] Generalized Reed-Solomon Code over Finite Field in y of size 3^5
1547+
"""
14561548
return self._reed_solomon_decoder
14571549

1458-
def decoding_radius(self):
1550+
def decoding_radius(self, *args, **kwargs):
14591551
r"""
14601552
Returns maximal number of errors that ``self`` can decode.
14611553
@@ -1471,20 +1563,18 @@ def decoding_radius(self):
14711563
sage: D.decoding_radius()
14721564
40
14731565
"""
1474-
return self.reed_solomon_decoder().decoding_radius()
1566+
return self.reed_solomon_decoder().decoding_radius(*args, **kwargs)
14751567

14761568
####################### registration ###############################
14771569

14781570
QAryReedMullerCode._registered_encoders["EvaluationVector"] = ReedMullerVectorEncoder
14791571
QAryReedMullerCode._registered_encoders["EvaluationPolynomial"] = ReedMullerPolynomialEncoder
14801572

1481-
QAryReedMullerCode._registered_decoders["Syndrome"] = LinearCodeSyndromeDecoder
14821573
QAryReedMullerCode._registered_decoders["ReedSolomon"] = QAryReedMullerRSDecoder
14831574
QAryReedMullerRSDecoder._decoder_type = {"dynamic"}
14841575

14851576
BinaryReedMullerCode._registered_encoders["EvaluationVector"] = ReedMullerVectorEncoder
14861577
BinaryReedMullerCode._registered_encoders["EvaluationPolynomial"] = ReedMullerPolynomialEncoder
14871578

1488-
BinaryReedMullerCode._registered_decoders["Syndrome"] = LinearCodeSyndromeDecoder
14891579
BinaryReedMullerCode._registered_decoders["MajorityVote"] = BinaryReedMullerMajorityDecoder
14901580
BinaryReedMullerMajorityDecoder._decoder_type = {"hard-decision", "unique"}

0 commit comments

Comments
 (0)