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

Commit fe8d9a6

Browse files
committed
incorporated auxiliary functions
1 parent babe9ad commit fe8d9a6

File tree

1 file changed

+117
-171
lines changed

1 file changed

+117
-171
lines changed

src/sage/coding/kasami_codes.pyx

+117-171
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,22 @@ class KasamiCode(AbstractLinearCode):
4545
r"""
4646
Representation of a Kasami Code.
4747
48+
The extended Kasami code with parameters `(s,t)` is defined as
49+
50+
.. MATH::
51+
52+
\{ v \in GF(2)^s \mid
53+
\sum_{a \in GF(s)} v_a =
54+
\sum_{a \in GF(s)} a v_a =
55+
\sum_{a \in GF(s)} a^{t+1} v_a = 0 \}
56+
57+
The only valid parameters `s,t` are given by the below, where `q` is a power of 2:
58+
* `s = q^{2j+1}`, `t = q^m` with `m \leq j` and `\gcd(m,2j+1) = 1`
59+
* `s = q^2`, `t=q`
60+
61+
The Kasami code `(s,t)` is obtained from the extended
62+
Kasami code `(s,t)`, via truncation of all words.
63+
4864
INPUT:
4965
5066
- ``s,t`` -- (integer) the parameters of the Kasami code
@@ -56,6 +72,11 @@ class KasamiCode(AbstractLinearCode):
5672
5773
sage: codes.KasamiCode(16,4)
5874
(16, 4) Extended Kasami code
75+
sage: _.minimum_distance()
76+
4
77+
78+
sage: codes.KasamiCode(8, 2, extended=False)
79+
(8, 2) Kasami code
5980
6081
sage: codes.KasamiCode(8,4)
6182
Traceback (most recent call last):
@@ -86,7 +107,7 @@ class KasamiCode(AbstractLinearCode):
86107
True
87108
sage: C1 == C2
88109
False
89-
sage: C1.minimum_distance() == C2.minimum_distance()+1
110+
sage: C1.minimum_distance() == C2.minimum_distance()+1
90111
True
91112
92113
sage: C = codes.KasamiCode(4,2)
@@ -149,7 +170,7 @@ class KasamiCode(AbstractLinearCode):
149170
length = s-1
150171
if extended:
151172
length += 1
152-
173+
153174
super(KasamiCode, self).__init__(GF(2), length, "GeneratorMatrix", "Syndrome")
154175

155176
def parameters(self):
@@ -234,187 +255,112 @@ class KasamiCode(AbstractLinearCode):
234255
[0 0 0 0 0 0 1 0 0 0 1 1 0 1 1]
235256
[0 0 0 0 0 0 0 1 0 1 1 1 0 0 1]
236257
[0 0 0 0 0 0 0 0 1 1 0 1 0 0 0]
237-
"""
238-
if self.length() == self._s:
239-
return _extended_Kasami_code(self._s,self._t)
240-
return _Kasami_code(self._s,self._t)
241-
242-
def _extended_Kasami_code(const int s, const int t):
243-
r"""
244-
Return a generator matrix for the extended Kasami code with parameters `s,t`.
245-
246-
The extended Kasami code with parameters `(s,t)` is defined as
247-
248-
.. MATH::
249-
250-
\{ v \in GF(2)^s \mid
251-
\sum_{a \in GF(s)} v_a =
252-
\sum_{a \in GF(s)} a v_a =
253-
\sum_{a \in GF(s)} a^{t+1} v_a = 0 \}
254-
255-
The only valid parameters `s,t` are given by the below, where `q` is a power of 2:
256-
* `s = q^{2j+1}`, `t = q^m` with `m \leq j` and `\gcd(m,2j+1) = 1`
257-
* `s = q^2`, `t=q`
258-
259-
INPUT:
260-
261-
- ``s,t`` -- (integers); powers of 2; parameters of the code
262-
263-
264-
EXAMPLES::
265-
266-
sage: C = codes.KasamiCode(16,4)
267-
sage: C.minimum_distance()
268-
4
269258
270-
sage: codes.KasamiCode(8,4)
271-
Traceback (most recent call last):
272-
...
273-
ValueError: The parameters(=8,4) are invalid. Check the documentation
259+
ALGORITHM:
274260
275-
.. SEEALSO::
261+
We generate spanning sets for the subspaces:
262+
* `\{v \in GF(2)^s \mid \sum_{a \in GF(s)} v_a = 0\}`
263+
* `\{v \in GF(2)^s \mid \sum_{a \in GF(s)} a v_a = 0\}`
264+
* `\{v \in GF(2)^s \mid \sum_{a \in GF(s)} a^{t+1} v_a = 0\}`
276265
277-
:class:`sage.coding.kasami_codes.KasamiCode`.
266+
Then we compute our codebook by taking the intersection of the above subspaces.
278267
279-
ALGORITHM:
268+
For the extened Kasami codes, we return the basis matrix of the codebook.
269+
For the Kasami codes, we truncate the last entry of all vectors.
280270
281-
We generate spanning sets for the subspaces:
282-
* `\{v \in GF(2)^s \mid \sum_{a \in GF(s)} v_a = 0\}`
283-
* `\{v \in GF(2)^s \mid \sum_{a \in GF(s)} a v_a = 0\}`
284-
* `\{v \in GF(2)^s \mid \sum_{a \in GF(s)} a^{t+1} v_a = 0\}`
271+
TESTS::
285272
286-
Then we compute our codebook by taking the intersection of the above subspaces.
273+
sage: C = codes.KasamiCode(4,2)
274+
sage: C.generator_matrix()
275+
[]
287276
288-
TESTS::
277+
sage: C = codes.KasamiCode(8,2)
278+
sage: C.generator_matrix()
279+
[1 1 1 1 1 1 1 1]
280+
sage: C.minimum_distance()
281+
8
289282
290-
sage: C = codes.KasamiCode(4,2)
291-
sage: C.generator_matrix()
292-
[]
283+
sage: C = codes.KasamiCode(8, 2, extended=False)
284+
sage: C.generator_matrix()
285+
[1 1 1 1 1 1 1]
286+
sage: C.minimum_distance()
287+
7
293288
294-
sage: C = codes.KasamiCode(8,2)
295-
sage: C.generator_matrix()
296-
[1 1 1 1 1 1 1 1]
297-
sage: C.minimum_distance()
298-
8
289+
sage: C = codes.KasamiCode(4, 2, extended=False)
290+
sage: C.generator_matrix()
291+
[]
299292
300-
sage: C = codes.KasamiCode(16,4)
301-
sage: C.minimum_distance()
302-
4
293+
sage: C = codes.KasamiCode(16, 4, extended=False)
294+
sage: C.minimum_distance()
295+
3
296+
"""
303297

304-
sage: C = codes.KasamiCode(64,4)
305-
sage: C.minimum_distance() # long time
306-
4
307-
"""
308-
F2 = GF(2)
309-
V = VectorSpace(F2, s)
310-
elemsFs = [x for x in GF(s)]
311-
312-
#we ensure that 0 is the first element of elemsFs
313-
if not elemsFs[0].is_zero():
314-
for i in range(s):
315-
if elemsFs[i].is_zero:
316-
a = elemsFs[0]
317-
elemsFs[0] = elemsFs[i]
318-
elemsFs[i] = a
319-
break
320-
321-
FsToInt = { x : i for i,x in enumerate(elemsFs)}
322-
elemsFsT = [x**(t+1) for x in elemsFs]
323-
FsTToInt = { x: i for i,x in enumerate(elemsFsT)}
324-
325-
e1 = [0]*s
326-
e1[0] = 1
327-
e1 = vector(F2,e1,immutable=True)
328-
329-
W1_basis = []
330-
for i in range(s-1):
331-
v = [0]*s
332-
v[i] = 1
333-
v[s-1] = 1
334-
W1_basis.append(v)
335-
W1 = V.span(W1_basis) #W1 satisfies \sum v[i] = 0
336-
337-
W2_basis = set([e1])#not really a basis...
338-
for i in range(1,s):#avoid x = 0
339-
x = elemsFs[i]
340-
for j in range(i+1,s):
341-
y = elemsFs[j]
342-
v = [0]*s
343-
v[i] = 1
344-
v[j] = 1
345-
v[ FsToInt[(x+y)] ] = 1
346-
v = vector(F2,v,immutable=True)
347-
W2_basis.add(v)
348-
W2 = V.span(W2_basis) #W2 satisfies \sum v[i]elemsFs[i] = 0
349-
350-
351-
W3_basis = set([e1]) #again not really a basis
352-
for i in range(1,s): #avoid x = 0^(t+1) = 0
353-
x = elemsFsT[i]
354-
for j in range(i+1,s):
355-
y = elemsFsT[j]
356-
v = [0]*s
298+
F2 = GF(2)
299+
V = VectorSpace(F2, self._s)
300+
elemsFs = [x for x in GF(self._s)]
301+
302+
# we ensure that 0 is the first element of elemsFs
303+
if not elemsFs[0].is_zero():
304+
for i in range(self._s):
305+
if elemsFs[i].is_zero:
306+
a = elemsFs[0]
307+
elemsFs[0] = elemsFs[i]
308+
elemsFs[i] = a
309+
break
310+
311+
FsToInt = { x : i for i,x in enumerate(elemsFs)}
312+
elemsFsT = [x**(self._t+1) for x in elemsFs]
313+
FsTToInt = { x: i for i,x in enumerate(elemsFsT)}
314+
315+
e1 = [0]*self._s
316+
e1[0] = 1
317+
e1 = vector(F2,e1,immutable=True)
318+
319+
W1_basis = []
320+
for i in range(self._s-1):
321+
v = [0]*self._s
357322
v[i] = 1
358-
v[j] = 1
359-
v[ FsTToInt[(x+y)] ] = 1
360-
v=vector(F2,v,immutable=True)
361-
W3_basis.add(v)
362-
W3 = V.span(W3_basis)
363-
364-
W = W2.intersection(W3)
365-
codebook = W.intersection(W1)
366-
367-
return codebook.basis_matrix()
368-
369-
def _Kasami_code(const int s, const int t):
370-
r"""
371-
Return the generator matrix of the Kasami code with parameters `s,t`.
372-
373-
The Kasami code `(s,t)` is obtained from the extended
374-
Kasami code `(s,t)`, via truncation of all words.
375-
376-
INPUT:
377-
378-
- ``s,t`` -- (integers); powers of 2; parameters of the code
379-
380-
EXAMPLES::
381-
382-
sage: codes.KasamiCode(8, 2, extended=False)
383-
(8, 2) Kasami code
384-
385-
sage: codes.KasamiCode(4, 2, extended=False)
386-
(4, 2) Kasami code
387-
388-
.. SEEALSO::
389-
390-
:class:`sage.coding.kasami_codes.KasamiCode`,
391-
:meth:`sage.coding.kasami_codes._extended_Kasami_code`.
392-
393-
TESTS::
394-
395-
sage: C = codes.KasamiCode(8, 2, extended=False)
396-
sage: C.generator_matrix()
397-
[1 1 1 1 1 1 1]
398-
sage: C.minimum_distance()
399-
7
400-
401-
sage: C = codes.KasamiCode(4, 2, extended=False)
402-
sage: C.generator_matrix()
403-
[]
404-
405-
sage: C = codes.KasamiCode(16, 4, extended=False)
406-
sage: C.minimum_distance()
407-
3
408-
409-
sage: C = codes.KasamiCode(64,4, extended=False)
410-
sage: C.minimum_distance() # long time
411-
3
412-
"""
413-
M = _extended_Kasami_code(s,t)
414-
newM = [v[:-1] for v in M]
415-
416-
return matrix(GF(2), newM)
417-
323+
v[s-1] = 1
324+
W1_basis.append(v)
325+
W1 = V.span(W1_basis) # W1 satisfies \sum v[i] = 0
326+
327+
W2_basis = set([e1]) # not really a basis...
328+
for i in range(1,slef._s): # avoid x = 0
329+
x = elemsFs[i]
330+
for j in range(i+1,self._s):
331+
y = elemsFs[j]
332+
v = [0]*s
333+
v[i] = 1
334+
v[j] = 1
335+
v[ FsToInt[(x+y)] ] = 1
336+
v = vector(F2,v,immutable=True)
337+
W2_basis.add(v)
338+
W2 = V.span(W2_basis) # W2 satisfies \sum v[i]elemsFs[i] = 0
339+
340+
341+
W3_basis = set([e1]) # again not really a basis
342+
for i in range(1,self._s): # avoid x = 0^(t+1) = 0
343+
x = elemsFsT[i]
344+
for j in range(i+1,self._s):
345+
y = elemsFsT[j]
346+
v = [0]*s
347+
v[i] = 1
348+
v[j] = 1
349+
v[ FsTToInt[(x+y)] ] = 1
350+
v=vector(F2,v,immutable=True)
351+
W3_basis.add(v)
352+
W3 = V.span(W3_basis)
353+
354+
W = W2.intersection(W3)
355+
codebook = W.intersection(W1)
356+
357+
if self.length() == self._s: # Extended code
358+
return codebook.basis_matrix()
359+
360+
M = _extended_Kasami_code(s,t)
361+
newM = [v[:-1] for v in M]
362+
363+
return matrix(GF(2), newM)
418364

419365

420366
KasamiCode._registered_encoders["GeneratorMatrix"] = LinearCodeGeneratorMatrixEncoder

0 commit comments

Comments
 (0)