@@ -45,6 +45,22 @@ class KasamiCode(AbstractLinearCode):
45
45
r """
46
46
Representation of a Kasami Code.
47
47
48
+ The extended Kasami code with parameters `( s,t) ` is defined as
49
+
50
+ .. MATH::
51
+
52
+ \{ v \i n GF( 2) ^ s \m id
53
+ \s um_{a \i n GF( s) } v_a =
54
+ \s um_{a \i n GF( s) } a v_a =
55
+ \s um_{a \i n 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 \l eq j` and `\g cd( 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
+
48
64
INPUT:
49
65
50
66
- ``s,t`` -- ( integer) the parameters of the Kasami code
@@ -56,6 +72,11 @@ class KasamiCode(AbstractLinearCode):
56
72
57
73
sage: codes. KasamiCode( 16,4)
58
74
( 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
59
80
60
81
sage: codes. KasamiCode( 8,4)
61
82
Traceback ( most recent call last) :
@@ -86,7 +107,7 @@ class KasamiCode(AbstractLinearCode):
86
107
True
87
108
sage: C1 == C2
88
109
False
89
- sage: C1. minimum_distance( ) == C2. minimum_distance( ) + 1
110
+ sage: C1. minimum_distance( ) == C2. minimum_distance( ) + 1
90
111
True
91
112
92
113
sage: C = codes. KasamiCode( 4,2)
@@ -149,7 +170,7 @@ class KasamiCode(AbstractLinearCode):
149
170
length = s- 1
150
171
if extended:
151
172
length += 1
152
-
173
+
153
174
super (KasamiCode, self ).__init__(GF(2 ), length, " GeneratorMatrix" , " Syndrome" )
154
175
155
176
def parameters (self ):
@@ -234,187 +255,112 @@ class KasamiCode(AbstractLinearCode):
234
255
[0 0 0 0 0 0 1 0 0 0 1 1 0 1 1 ]
235
256
[0 0 0 0 0 0 0 1 0 1 1 1 0 0 1 ]
236
257
[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 \i n GF( 2) ^ s \m id
251
- \s um_{a \i n GF( s) } v_a =
252
- \s um_{a \i n GF( s) } a v_a =
253
- \s um_{a \i n 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 \l eq j` and `\g cd( 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
269
258
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:
274
260
275
- .. SEEALSO::
261
+ We generate spanning sets for the subspaces:
262
+ * `\{ v \i n GF( 2) ^ s \m id \s um_{a \i n GF( s) } v_a = 0\} `
263
+ * `\{ v \i n GF( 2) ^ s \m id \s um_{a \i n GF( s) } a v_a = 0\} `
264
+ * `\{ v \i n GF( 2) ^ s \m id \s um_{a \i n GF( s) } a^ {t+ 1} v_a = 0\} `
276
265
277
- :class:`sage . coding . kasami_codes . KasamiCode` .
266
+ Then we compute our codebook by taking the intersection of the above subspaces .
278
267
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.
280
270
281
- We generate spanning sets for the subspaces:
282
- * `\{ v \i n GF( 2) ^ s \m id \s um_{a \i n GF( s) } v_a = 0\} `
283
- * `\{ v \i n GF( 2) ^ s \m id \s um_{a \i n GF( s) } a v_a = 0\} `
284
- * `\{ v \i n GF( 2) ^ s \m id \s um_{a \i n GF( s) } a^ {t+ 1} v_a = 0\} `
271
+ TESTS::
285
272
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
+ []
287
276
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
289
282
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
293
288
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
+ []
299
292
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
+ """
303
297
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
357
322
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)
418
364
419
365
420
366
KasamiCode._registered_encoders[" GeneratorMatrix" ] = LinearCodeGeneratorMatrixEncoder
0 commit comments