passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-0cd532bd.so.1 +0 -0
- passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-x86_64-linux-musl.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-x86_64-linux-musl.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,1329 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.modules sage.rings.finite_rings
|
|
3
|
+
r"""
|
|
4
|
+
Cyclic code
|
|
5
|
+
|
|
6
|
+
Let `F` be a field. A `[n, k]` code `C` over `F` is called cyclic if every
|
|
7
|
+
cyclic shift of a codeword is also a codeword [Rot2006]_:
|
|
8
|
+
|
|
9
|
+
.. MATH::
|
|
10
|
+
|
|
11
|
+
\forall c \in C,
|
|
12
|
+
c = (c_{0}, c_{1}, \dots , c_{n-1}) \in C
|
|
13
|
+
\Rightarrow (c_{n-1}, c_{0}, \dots , c_{n-2}) \in C
|
|
14
|
+
|
|
15
|
+
Let `c = (c_0, c_1, \dots, c_{n-1})` be a codeword of `C`.
|
|
16
|
+
This codeword can be seen as a polynomial over `F_q[x]` as follows:
|
|
17
|
+
`\Sigma_{i=0}^{n-1} c_i x^i`.
|
|
18
|
+
There is a unique monic polynomial `g(x)` such that for every
|
|
19
|
+
`c(x) \in F_q[x]` of degree less than `n-1`, we have
|
|
20
|
+
`c(x) \in C \Leftrightarrow g(x) | c(x)`.
|
|
21
|
+
This polynomial is called the generator polynomial of `C`.
|
|
22
|
+
|
|
23
|
+
For now, only single-root cyclic codes (i.e. whose length `n` and field order
|
|
24
|
+
`q` are coprimes) are implemented.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
# *****************************************************************************
|
|
28
|
+
# Copyright (C) 2015 David Lucas <david.lucas@inria.fr>
|
|
29
|
+
# 2016 Julien Lavauzelle <julien.lavauzelle@inria.fr>
|
|
30
|
+
#
|
|
31
|
+
# This program is free software: you can redistribute it and/or modify
|
|
32
|
+
# it under the terms of the GNU General Public License as published by
|
|
33
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
34
|
+
# (at your option) any later version.
|
|
35
|
+
# http://www.gnu.org/licenses/
|
|
36
|
+
# *****************************************************************************
|
|
37
|
+
|
|
38
|
+
from .linear_code import (AbstractLinearCode,
|
|
39
|
+
LinearCodeSyndromeDecoder,
|
|
40
|
+
LinearCodeNearestNeighborDecoder)
|
|
41
|
+
from .encoder import Encoder
|
|
42
|
+
from .decoder import Decoder
|
|
43
|
+
from copy import copy
|
|
44
|
+
from sage.rings.integer import Integer
|
|
45
|
+
from sage.categories.homset import Hom
|
|
46
|
+
from sage.arith.misc import gcd
|
|
47
|
+
from sage.modules.free_module_element import vector
|
|
48
|
+
from sage.matrix.constructor import matrix
|
|
49
|
+
from sage.misc.cachefunc import cached_method
|
|
50
|
+
from sage.rings.finite_rings.integer_mod_ring import IntegerModRing as Zmod
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def find_generator_polynomial(code, check=True):
|
|
54
|
+
r"""
|
|
55
|
+
Return a possible generator polynomial for ``code``.
|
|
56
|
+
|
|
57
|
+
If the code is cyclic, the generator polynomial is the gcd of all the
|
|
58
|
+
polynomial forms of the codewords. Conversely, if this gcd exactly
|
|
59
|
+
generates the code ``code``, then ``code`` is cyclic.
|
|
60
|
+
|
|
61
|
+
If ``check`` is set to ``True``, then it also checks that the code is
|
|
62
|
+
indeed cyclic. Otherwise it doesn't.
|
|
63
|
+
|
|
64
|
+
INPUT:
|
|
65
|
+
|
|
66
|
+
- ``code`` -- a linear code
|
|
67
|
+
|
|
68
|
+
- ``check`` -- whether the cyclicity should be checked
|
|
69
|
+
|
|
70
|
+
OUTPUT:
|
|
71
|
+
|
|
72
|
+
- the generator polynomial of ``code`` (if the code is cyclic).
|
|
73
|
+
|
|
74
|
+
EXAMPLES::
|
|
75
|
+
|
|
76
|
+
sage: from sage.coding.cyclic_code import find_generator_polynomial
|
|
77
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(8, 'a').list()[1:], 4)
|
|
78
|
+
sage: find_generator_polynomial(C)
|
|
79
|
+
x^3 + (a^2 + 1)*x^2 + a*x + a^2 + 1
|
|
80
|
+
"""
|
|
81
|
+
G = code.generator_matrix()
|
|
82
|
+
F = code.base_ring()
|
|
83
|
+
R = F['x']
|
|
84
|
+
g = gcd(R(row.list()) for row in G)
|
|
85
|
+
|
|
86
|
+
if check:
|
|
87
|
+
n = code.length()
|
|
88
|
+
k = code.dimension()
|
|
89
|
+
if (g.degree() != n - k):
|
|
90
|
+
raise ValueError("The code is not cyclic.")
|
|
91
|
+
c = _to_complete_list(g, n)
|
|
92
|
+
if any(vector(c[i:] + c[:i]) not in code for i in range(n)):
|
|
93
|
+
raise ValueError("The code is not cyclic.")
|
|
94
|
+
|
|
95
|
+
return g.monic()
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _to_complete_list(poly, length):
|
|
99
|
+
r"""
|
|
100
|
+
Return the vector of length exactly ``length`` corresponding to the
|
|
101
|
+
coefficients of the provided polynomial. If needed, zeros are added.
|
|
102
|
+
|
|
103
|
+
INPUT:
|
|
104
|
+
|
|
105
|
+
- ``poly`` -- a polynomial
|
|
106
|
+
|
|
107
|
+
- ``length`` -- integer
|
|
108
|
+
|
|
109
|
+
OUTPUT: the list of coefficients
|
|
110
|
+
|
|
111
|
+
EXAMPLES::
|
|
112
|
+
|
|
113
|
+
sage: R = PolynomialRing(GF(2), 'X')
|
|
114
|
+
sage: X = R.gen()
|
|
115
|
+
sage: poly = X**4 + X + 1
|
|
116
|
+
sage: sage.coding.cyclic_code._to_complete_list(poly, 7)
|
|
117
|
+
[1, 1, 0, 0, 1, 0, 0]
|
|
118
|
+
"""
|
|
119
|
+
L = poly.coefficients(sparse=False)
|
|
120
|
+
return L + [poly.base_ring().zero()] * (length - len(L))
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def bch_bound(n, D, arithmetic=False):
|
|
124
|
+
r"""
|
|
125
|
+
Return the BCH bound obtained for a cyclic code of length ``n`` and
|
|
126
|
+
defining set ``D``.
|
|
127
|
+
|
|
128
|
+
Consider a cyclic code `C`, with defining set `D`, length `n`, and minimum
|
|
129
|
+
distance `d`. We have the following bound, called BCH bound, on `d`:
|
|
130
|
+
`d \geq \delta + 1`, where `\delta` is the length of the longest arithmetic
|
|
131
|
+
sequence (modulo `n`) of elements in `D`.
|
|
132
|
+
|
|
133
|
+
That is, if `\exists c, \gcd(c,n) = 1` such that
|
|
134
|
+
`\{l, l+c, \dots, l + (\delta - 1) \times c\} \subseteq D`,
|
|
135
|
+
then `d \geq \delta + 1` [1]
|
|
136
|
+
|
|
137
|
+
The BCH bound is often known in the particular case `c = 1`. The user can
|
|
138
|
+
specify by setting ``arithmetic = False``.
|
|
139
|
+
|
|
140
|
+
.. NOTE::
|
|
141
|
+
|
|
142
|
+
As this is a specific use case of the BCH bound, it is *not* available
|
|
143
|
+
in the global namespace.
|
|
144
|
+
Call it by using ``sage.coding.cyclic_code.bch_bound``. You can also
|
|
145
|
+
load it into the global namespace by typing
|
|
146
|
+
``from sage.coding.cyclic_code import bch_bound``.
|
|
147
|
+
|
|
148
|
+
INPUT:
|
|
149
|
+
|
|
150
|
+
- ``n`` -- integer
|
|
151
|
+
|
|
152
|
+
- ``D`` -- list of integers
|
|
153
|
+
|
|
154
|
+
- ``arithmetic`` -- (default: ``False``) if it is set to ``True``, then it
|
|
155
|
+
computes the BCH bound using the longest arithmetic sequence definition
|
|
156
|
+
|
|
157
|
+
OUTPUT:
|
|
158
|
+
|
|
159
|
+
- ``(delta + 1, (l, c))`` -- such that ``delta + 1`` is the BCH bound, and
|
|
160
|
+
``l, c`` are the parameters of the longest arithmetic sequence
|
|
161
|
+
(see below)
|
|
162
|
+
|
|
163
|
+
EXAMPLES::
|
|
164
|
+
|
|
165
|
+
sage: n = 15
|
|
166
|
+
sage: D = [14,1,2,11,12]
|
|
167
|
+
sage: sage.coding.cyclic_code.bch_bound(n, D)
|
|
168
|
+
(3, (1, 1))
|
|
169
|
+
|
|
170
|
+
sage: n = 15
|
|
171
|
+
sage: D = [14,1,2,11,12]
|
|
172
|
+
sage: sage.coding.cyclic_code.bch_bound(n, D, True)
|
|
173
|
+
(4, (2, 12))
|
|
174
|
+
"""
|
|
175
|
+
def longest_streak(step):
|
|
176
|
+
max_len = 1
|
|
177
|
+
max_offset = 0
|
|
178
|
+
j = 0
|
|
179
|
+
while j < n:
|
|
180
|
+
h = j
|
|
181
|
+
while isD[h * step % n]:
|
|
182
|
+
h += 1
|
|
183
|
+
if h - j > max_len:
|
|
184
|
+
max_offset = j * step % n
|
|
185
|
+
max_len = h - j
|
|
186
|
+
j = h + 1
|
|
187
|
+
return (max_len, max_offset)
|
|
188
|
+
|
|
189
|
+
isD = [0] * n
|
|
190
|
+
for d in D:
|
|
191
|
+
try:
|
|
192
|
+
isD[d] = 1
|
|
193
|
+
except IndexError:
|
|
194
|
+
raise ValueError("%s must contains integers between 0 and %s" %
|
|
195
|
+
(D, n - 1))
|
|
196
|
+
if 0 not in isD:
|
|
197
|
+
return (n + 1, (1, 0))
|
|
198
|
+
|
|
199
|
+
if not arithmetic:
|
|
200
|
+
one_len, offset = longest_streak(1)
|
|
201
|
+
return (one_len + 1, (1, offset))
|
|
202
|
+
else:
|
|
203
|
+
n = Integer(n)
|
|
204
|
+
longest_streak_list = [(longest_streak(step), step)
|
|
205
|
+
for step in n.coprime_integers(n // 2 + 1)
|
|
206
|
+
if step >= 1]
|
|
207
|
+
(max_len, offset), step = max(longest_streak_list)
|
|
208
|
+
return (max_len + 1, (step, offset))
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
class CyclicCode(AbstractLinearCode):
|
|
212
|
+
r"""
|
|
213
|
+
Representation of a cyclic code.
|
|
214
|
+
|
|
215
|
+
We propose three different ways to create a new :class:`CyclicCode`, either by
|
|
216
|
+
providing:
|
|
217
|
+
|
|
218
|
+
- the generator polynomial and the length (1)
|
|
219
|
+
- an existing linear code. In that case, a generator polynomial will be
|
|
220
|
+
computed from the provided linear code's parameters (2)
|
|
221
|
+
- (a subset of) the defining set of the cyclic code (3)
|
|
222
|
+
|
|
223
|
+
For now, only single-root cyclic codes are implemented. That is, only
|
|
224
|
+
cyclic codes such that its length `n` and field order `q` are coprimes.
|
|
225
|
+
|
|
226
|
+
Depending on which behaviour you want, you need to specify the names of the
|
|
227
|
+
arguments to :class:`CyclicCode`. See EXAMPLES section below for details.
|
|
228
|
+
|
|
229
|
+
INPUT:
|
|
230
|
+
|
|
231
|
+
- ``generator_pol`` -- (default: ``None``) the generator polynomial
|
|
232
|
+
of ``self``; that is, the highest-degree monic polynomial which divides
|
|
233
|
+
every polynomial representation of a codeword in ``self``
|
|
234
|
+
|
|
235
|
+
- ``length`` -- (default: ``None``) the length of ``self``; it has to be
|
|
236
|
+
bigger than the degree of ``generator_pol``
|
|
237
|
+
|
|
238
|
+
- ``code`` -- (default: ``None``) a linear code
|
|
239
|
+
|
|
240
|
+
- ``check`` -- boolean (default: ``False``); whether the cyclicity of
|
|
241
|
+
``self`` must be checked while finding the generator polynomial. See
|
|
242
|
+
:meth:`find_generator_polynomial` for details.
|
|
243
|
+
|
|
244
|
+
- ``D`` -- (default: ``None``) a list of integers between ``0`` and
|
|
245
|
+
``length-1``, corresponding to (a subset of) the defining set of the code.
|
|
246
|
+
Will be modified if it is not cyclotomic-closed.
|
|
247
|
+
|
|
248
|
+
- ``field`` -- (default: ``None``) the base field of ``self``
|
|
249
|
+
|
|
250
|
+
- ``primitive_root`` -- (default: ``None``) the primitive root of
|
|
251
|
+
the splitting field which contains the roots of the generator polynomial.
|
|
252
|
+
It has to be of multiplicative order ``length`` over this field.
|
|
253
|
+
If the splitting field is not ``field``, it also have to be a polynomial
|
|
254
|
+
in ``zx``, where ``x`` is the degree of the extension over the prime
|
|
255
|
+
field. For instance, over ``GF(16)``, it must be a polynomial in ``z4``.
|
|
256
|
+
|
|
257
|
+
EXAMPLES:
|
|
258
|
+
|
|
259
|
+
We can construct a :class:`CyclicCode` object using three different methods.
|
|
260
|
+
First (1), we provide a generator polynomial and a code length::
|
|
261
|
+
|
|
262
|
+
sage: F.<x> = GF(2)[]
|
|
263
|
+
sage: n = 7
|
|
264
|
+
sage: g = x ** 3 + x + 1
|
|
265
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
266
|
+
sage: C
|
|
267
|
+
[7, 4] Cyclic Code over GF(2)
|
|
268
|
+
|
|
269
|
+
We can also provide a code (2). In that case, the program will try to
|
|
270
|
+
extract a generator polynomial (see :meth:`find_generator_polynomial`
|
|
271
|
+
for details)::
|
|
272
|
+
|
|
273
|
+
sage: C = codes.GeneralizedReedSolomonCode(GF(8, 'a').list()[1:], 4)
|
|
274
|
+
sage: Cc = codes.CyclicCode(code = C)
|
|
275
|
+
sage: Cc
|
|
276
|
+
[7, 4] Cyclic Code over GF(8)
|
|
277
|
+
|
|
278
|
+
Finally, we can give (a subset of) a defining set for the code (3).
|
|
279
|
+
In this case, the generator polynomial will be computed::
|
|
280
|
+
|
|
281
|
+
sage: F = GF(16, 'a')
|
|
282
|
+
sage: n = 15
|
|
283
|
+
sage: Cc = codes.CyclicCode(length=n, field=F, D = [1,2])
|
|
284
|
+
sage: Cc
|
|
285
|
+
[15, 13] Cyclic Code over GF(16)
|
|
286
|
+
"""
|
|
287
|
+
|
|
288
|
+
_registered_encoders = {}
|
|
289
|
+
_registered_decoders = {}
|
|
290
|
+
|
|
291
|
+
def __init__(self, generator_pol=None, length=None, code=None, check=True,
|
|
292
|
+
D=None, field=None, primitive_root=None):
|
|
293
|
+
r"""
|
|
294
|
+
TESTS:
|
|
295
|
+
|
|
296
|
+
If one provides a generator polynomial and a length, we check that
|
|
297
|
+
the length is bigger than the degree of the polynomial::
|
|
298
|
+
|
|
299
|
+
sage: F.<x> = GF(2)[]
|
|
300
|
+
sage: n = 2
|
|
301
|
+
sage: g = x ** 3 + x + 1
|
|
302
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
303
|
+
Traceback (most recent call last):
|
|
304
|
+
...
|
|
305
|
+
ValueError: Only cyclic codes whose length and field order are coprimes are implemented.
|
|
306
|
+
|
|
307
|
+
We also check that the polynomial is defined over a finite field::
|
|
308
|
+
|
|
309
|
+
sage: F.<x> = RR[]
|
|
310
|
+
sage: n = 7
|
|
311
|
+
sage: g = x ** 3 + x + 1
|
|
312
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
313
|
+
Traceback (most recent call last):
|
|
314
|
+
...
|
|
315
|
+
ValueError: The generator polynomial must be defined over a finite field.
|
|
316
|
+
|
|
317
|
+
And we check that the generator polynomial divides `x^{n} - 1`,
|
|
318
|
+
where `n` is provided length::
|
|
319
|
+
|
|
320
|
+
sage: F.<x> = GF(2)[]
|
|
321
|
+
sage: n = 7
|
|
322
|
+
sage: g = x ** 2 + x + 1
|
|
323
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
324
|
+
Traceback (most recent call last):
|
|
325
|
+
...
|
|
326
|
+
ValueError: Provided polynomial must divide x^n - 1, where n is the provided length.
|
|
327
|
+
|
|
328
|
+
In the case of a code is passed as argument, if it's not possible
|
|
329
|
+
to extract a generator polynomial, an exception is raised::
|
|
330
|
+
|
|
331
|
+
sage: G = matrix(GF(2), [[1, 1, 1], [0, 1, 1]])
|
|
332
|
+
sage: C = codes.LinearCode(G)
|
|
333
|
+
sage: Cc = codes.CyclicCode(code=C)
|
|
334
|
+
Traceback (most recent call last):
|
|
335
|
+
...
|
|
336
|
+
ValueError: The code is not cyclic.
|
|
337
|
+
|
|
338
|
+
If the ``primitive_root`` does not lie in an extension of ``field``,
|
|
339
|
+
or is not a primitive `n`-th root of unity, then
|
|
340
|
+
an exception is raised::
|
|
341
|
+
|
|
342
|
+
sage: F = GF(2)
|
|
343
|
+
sage: n = 15
|
|
344
|
+
sage: Dset = [1, 2, 4, 8]
|
|
345
|
+
sage: alpha = GF(3).one()
|
|
346
|
+
sage: Cc = codes.CyclicCode(D=Dset, field=F, length=n, primitive_root=alpha)
|
|
347
|
+
Traceback (most recent call last):
|
|
348
|
+
...
|
|
349
|
+
ValueError: primitive_root must belong to an extension of the base field
|
|
350
|
+
sage: alpha = GF(16).one()
|
|
351
|
+
sage: Cc = codes.CyclicCode(D=Dset, field=F, length=n, primitive_root=alpha)
|
|
352
|
+
Traceback (most recent call last):
|
|
353
|
+
...
|
|
354
|
+
ValueError: primitive_root must be a primitive n-th root of unity
|
|
355
|
+
sage: alpha = GF(32).gen()
|
|
356
|
+
sage: Cc = codes.CyclicCode(D=Dset, field=F, length=n, primitive_root=alpha)
|
|
357
|
+
Traceback (most recent call last):
|
|
358
|
+
...
|
|
359
|
+
ValueError: primitive_root must be a primitive n-th root of unity
|
|
360
|
+
"""
|
|
361
|
+
# Case (1) : generator polynomial and length are provided.
|
|
362
|
+
if (generator_pol is not None and length is not None and
|
|
363
|
+
code is None and D is None and field is None and
|
|
364
|
+
primitive_root is None):
|
|
365
|
+
F = generator_pol.base_ring()
|
|
366
|
+
if not F.is_finite() or not F.is_field():
|
|
367
|
+
raise ValueError("The generator polynomial must be defined "
|
|
368
|
+
"over a finite field.")
|
|
369
|
+
q = F.cardinality()
|
|
370
|
+
if not gcd(length, q) == 1:
|
|
371
|
+
raise ValueError("Only cyclic codes whose length and field "
|
|
372
|
+
"order are coprimes are implemented.")
|
|
373
|
+
R = generator_pol.parent()
|
|
374
|
+
deg = generator_pol.degree()
|
|
375
|
+
if not isinstance(length, Integer):
|
|
376
|
+
length = Integer(length)
|
|
377
|
+
if not generator_pol.divides(R.gen() ** length - 1):
|
|
378
|
+
raise ValueError("Provided polynomial must divide x^n - 1, "
|
|
379
|
+
"where n is the provided length.")
|
|
380
|
+
self._polynomial_ring = R
|
|
381
|
+
self._dimension = length - deg
|
|
382
|
+
if not generator_pol.is_monic():
|
|
383
|
+
self._generator_polynomial = generator_pol.monic()
|
|
384
|
+
else:
|
|
385
|
+
self._generator_polynomial = generator_pol
|
|
386
|
+
super().__init__(F, length, "Vector", "Syndrome")
|
|
387
|
+
|
|
388
|
+
# Case (2) : a code is provided.
|
|
389
|
+
elif (code is not None and
|
|
390
|
+
generator_pol is None and length is None and D is None and
|
|
391
|
+
field is None and primitive_root is None):
|
|
392
|
+
if not isinstance(code, AbstractLinearCode):
|
|
393
|
+
raise ValueError("code must be an AbstractLinearCode")
|
|
394
|
+
F = code.base_ring()
|
|
395
|
+
q = F.cardinality()
|
|
396
|
+
n = code.length()
|
|
397
|
+
if not gcd(n, q) == 1:
|
|
398
|
+
raise ValueError("Only cyclic codes whose length and field "
|
|
399
|
+
"order are coprimes are implemented.")
|
|
400
|
+
g = find_generator_polynomial(code, check)
|
|
401
|
+
self._polynomial_ring = g.parent()
|
|
402
|
+
self._generator_polynomial = g
|
|
403
|
+
self._dimension = code.dimension()
|
|
404
|
+
super().__init__(code.base_ring(), n, "Vector", "Syndrome")
|
|
405
|
+
|
|
406
|
+
# Case (3) : a defining set, a length and a field are provided
|
|
407
|
+
elif (D is not None and length is not None and field is not None and
|
|
408
|
+
generator_pol is None and code is None):
|
|
409
|
+
F = field
|
|
410
|
+
if not F.is_finite() or not F.is_field():
|
|
411
|
+
raise ValueError("You must provide a finite field.")
|
|
412
|
+
n = length
|
|
413
|
+
q = F.cardinality()
|
|
414
|
+
if not gcd(n, q) == 1:
|
|
415
|
+
raise ValueError("Only cyclic codes whose length and field "
|
|
416
|
+
"order are coprimes are implemented.")
|
|
417
|
+
|
|
418
|
+
R = F['x']
|
|
419
|
+
s = Zmod(n)(q).multiplicative_order()
|
|
420
|
+
|
|
421
|
+
if primitive_root is not None:
|
|
422
|
+
Fsplit = primitive_root.parent()
|
|
423
|
+
try:
|
|
424
|
+
FE = Hom(F, Fsplit)[0]
|
|
425
|
+
except Exception:
|
|
426
|
+
raise ValueError("primitive_root must belong to an "
|
|
427
|
+
"extension of the base field")
|
|
428
|
+
extension_degree = Fsplit.degree() // F.degree()
|
|
429
|
+
if (extension_degree != s or
|
|
430
|
+
primitive_root.multiplicative_order() != n):
|
|
431
|
+
raise ValueError("primitive_root must be a primitive "
|
|
432
|
+
"n-th root of unity")
|
|
433
|
+
alpha = primitive_root
|
|
434
|
+
else:
|
|
435
|
+
Fsplit, FE = F.extension(Integer(s), map=True)
|
|
436
|
+
alpha = Fsplit.zeta(n)
|
|
437
|
+
|
|
438
|
+
Rsplit = Fsplit['xx']
|
|
439
|
+
xx = Rsplit.gen()
|
|
440
|
+
|
|
441
|
+
cosets = Zmod(n).cyclotomic_cosets(q, D)
|
|
442
|
+
pows = [item for l in cosets for item in l]
|
|
443
|
+
|
|
444
|
+
sec = FE.section()
|
|
445
|
+
g = R.one()
|
|
446
|
+
for J in cosets:
|
|
447
|
+
pol = Rsplit.one()
|
|
448
|
+
for j in J:
|
|
449
|
+
pol *= xx - alpha**j
|
|
450
|
+
g *= R([sec(coeff) for coeff in pol])
|
|
451
|
+
|
|
452
|
+
# we set class variables
|
|
453
|
+
self._field_embedding = FE
|
|
454
|
+
self._primitive_root = alpha
|
|
455
|
+
self._defining_set = sorted(pows)
|
|
456
|
+
self._polynomial_ring = R
|
|
457
|
+
self._generator_polynomial = g
|
|
458
|
+
self._dimension = n - g.degree()
|
|
459
|
+
super().__init__(F, n, "Vector", "SurroundingBCH")
|
|
460
|
+
|
|
461
|
+
else:
|
|
462
|
+
raise AttributeError("You must provide either a code, or a list "
|
|
463
|
+
"of powers and the length and the field, or "
|
|
464
|
+
"a generator polynomial and the code length")
|
|
465
|
+
|
|
466
|
+
def __contains__(self, word):
|
|
467
|
+
r"""
|
|
468
|
+
Return ``True`` if ``word`` belongs to ``self``, ``False`` otherwise.
|
|
469
|
+
|
|
470
|
+
INPUT:
|
|
471
|
+
|
|
472
|
+
- ``word`` -- the word to test
|
|
473
|
+
|
|
474
|
+
EXAMPLES::
|
|
475
|
+
|
|
476
|
+
sage: F.<x> = GF(2)[]
|
|
477
|
+
sage: n = 7
|
|
478
|
+
sage: g = x ** 3 + x + 1
|
|
479
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
480
|
+
sage: c = vector(GF(2), (1, 1, 1, 0, 0, 1, 0))
|
|
481
|
+
sage: c in C
|
|
482
|
+
True
|
|
483
|
+
"""
|
|
484
|
+
g = self.generator_polynomial()
|
|
485
|
+
R = self._polynomial_ring
|
|
486
|
+
return (g.divides(R(word.list())) and word in self.ambient_space())
|
|
487
|
+
|
|
488
|
+
def __eq__(self, other):
|
|
489
|
+
r"""
|
|
490
|
+
Test equality between CyclicCode objects.
|
|
491
|
+
|
|
492
|
+
INPUT:
|
|
493
|
+
|
|
494
|
+
- ``other`` -- the code to test
|
|
495
|
+
|
|
496
|
+
EXAMPLES::
|
|
497
|
+
|
|
498
|
+
sage: F.<x> = GF(2)[]
|
|
499
|
+
sage: n = 7
|
|
500
|
+
sage: g = x ** 3 + x + 1
|
|
501
|
+
sage: C1 = codes.CyclicCode(generator_pol=g, length=n)
|
|
502
|
+
sage: C2 = codes.CyclicCode(generator_pol=g, length=n)
|
|
503
|
+
sage: C1 == C2
|
|
504
|
+
True
|
|
505
|
+
"""
|
|
506
|
+
if not isinstance(other, CyclicCode):
|
|
507
|
+
return False
|
|
508
|
+
else:
|
|
509
|
+
R = self._polynomial_ring
|
|
510
|
+
return (self.base_field() == other.base_field() and
|
|
511
|
+
self.length() == other.length() and
|
|
512
|
+
self.generator_polynomial() == R(other.generator_polynomial()))
|
|
513
|
+
|
|
514
|
+
def _repr_(self):
|
|
515
|
+
r"""
|
|
516
|
+
Return a string representation of ``self``.
|
|
517
|
+
|
|
518
|
+
EXAMPLES::
|
|
519
|
+
|
|
520
|
+
sage: F.<x> = GF(2)[]
|
|
521
|
+
sage: n = 7
|
|
522
|
+
sage: g = x ** 3 + x + 1
|
|
523
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
524
|
+
sage: C
|
|
525
|
+
[7, 4] Cyclic Code over GF(2)
|
|
526
|
+
"""
|
|
527
|
+
return ("[%s, %s] Cyclic Code over GF(%s)"
|
|
528
|
+
% (self.length(), self.dimension(),
|
|
529
|
+
self.base_field().cardinality()))
|
|
530
|
+
|
|
531
|
+
def _latex_(self):
|
|
532
|
+
r"""
|
|
533
|
+
Return a latex representation of ``self``.
|
|
534
|
+
|
|
535
|
+
EXAMPLES::
|
|
536
|
+
|
|
537
|
+
sage: F.<x> = GF(2)[]
|
|
538
|
+
sage: n = 7
|
|
539
|
+
sage: g = x ** 3 + x + 1
|
|
540
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
541
|
+
sage: latex(C)
|
|
542
|
+
[7, 4] \textnormal{ Cyclic Code over } \Bold{F}_{2}
|
|
543
|
+
"""
|
|
544
|
+
return ("[%s, %s] \\textnormal{ Cyclic Code over } %s"
|
|
545
|
+
% (self.length(), self.dimension(),
|
|
546
|
+
self.base_field()._latex_()))
|
|
547
|
+
|
|
548
|
+
def generator_polynomial(self):
|
|
549
|
+
r"""
|
|
550
|
+
Return the generator polynomial of ``self``.
|
|
551
|
+
|
|
552
|
+
EXAMPLES::
|
|
553
|
+
|
|
554
|
+
sage: F.<x> = GF(2)[]
|
|
555
|
+
sage: n = 7
|
|
556
|
+
sage: g = x ** 3 + x + 1
|
|
557
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
558
|
+
sage: C.generator_polynomial()
|
|
559
|
+
x^3 + x + 1
|
|
560
|
+
"""
|
|
561
|
+
return self._generator_polynomial
|
|
562
|
+
|
|
563
|
+
def field_embedding(self):
|
|
564
|
+
r"""
|
|
565
|
+
Return the base field embedding into the splitting field.
|
|
566
|
+
|
|
567
|
+
EXAMPLES::
|
|
568
|
+
|
|
569
|
+
sage: F.<x> = GF(2)[]
|
|
570
|
+
sage: n = 7
|
|
571
|
+
sage: g = x ** 3 + x + 1
|
|
572
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
573
|
+
sage: C.field_embedding()
|
|
574
|
+
Ring morphism:
|
|
575
|
+
From: Finite Field of size 2
|
|
576
|
+
To: Finite Field in z3 of size 2^3
|
|
577
|
+
Defn: 1 |--> 1
|
|
578
|
+
"""
|
|
579
|
+
if not hasattr(self, "_field_embedding"):
|
|
580
|
+
self.defining_set()
|
|
581
|
+
return self._field_embedding
|
|
582
|
+
|
|
583
|
+
def defining_set(self, primitive_root=None):
|
|
584
|
+
r"""
|
|
585
|
+
Return the set of exponents of the roots of ``self``'s generator
|
|
586
|
+
polynomial over the extension field.
|
|
587
|
+
|
|
588
|
+
Of course, it depends on the choice of the primitive root of
|
|
589
|
+
the splitting field.
|
|
590
|
+
|
|
591
|
+
INPUT:
|
|
592
|
+
|
|
593
|
+
- ``primitive_root`` -- (optional) a primitive root of the extension
|
|
594
|
+
field
|
|
595
|
+
|
|
596
|
+
EXAMPLES:
|
|
597
|
+
|
|
598
|
+
We provide a defining set at construction time::
|
|
599
|
+
|
|
600
|
+
sage: F = GF(16, 'a')
|
|
601
|
+
sage: n = 15
|
|
602
|
+
sage: C = codes.CyclicCode(length=n, field=F, D=[1,2])
|
|
603
|
+
sage: C.defining_set()
|
|
604
|
+
[1, 2]
|
|
605
|
+
|
|
606
|
+
If the defining set was provided by the user, it might have been
|
|
607
|
+
expanded at construction time. In this case, the expanded defining set
|
|
608
|
+
will be returned::
|
|
609
|
+
|
|
610
|
+
sage: C = codes.CyclicCode(length=13, field=F, D=[1, 2])
|
|
611
|
+
sage: C.defining_set()
|
|
612
|
+
[1, 2, 3, 5, 6, 9]
|
|
613
|
+
|
|
614
|
+
If a generator polynomial was passed at construction time,
|
|
615
|
+
the defining set is computed using this polynomial::
|
|
616
|
+
|
|
617
|
+
sage: R.<x> = F[]
|
|
618
|
+
sage: n = 7
|
|
619
|
+
sage: g = x ** 3 + x + 1
|
|
620
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
621
|
+
sage: C.defining_set()
|
|
622
|
+
[1, 2, 4]
|
|
623
|
+
|
|
624
|
+
Both operations give the same result::
|
|
625
|
+
|
|
626
|
+
sage: C1 = codes.CyclicCode(length=n, field=F, D=[1, 2, 4])
|
|
627
|
+
sage: C1.generator_polynomial() == g
|
|
628
|
+
True
|
|
629
|
+
|
|
630
|
+
Another one, in a reversed order::
|
|
631
|
+
|
|
632
|
+
sage: n = 13
|
|
633
|
+
sage: C1 = codes.CyclicCode(length=n, field=F, D=[1, 2])
|
|
634
|
+
sage: g = C1.generator_polynomial()
|
|
635
|
+
sage: C2 = codes.CyclicCode(generator_pol=g, length=n)
|
|
636
|
+
sage: C1.defining_set() == C2.defining_set()
|
|
637
|
+
True
|
|
638
|
+
"""
|
|
639
|
+
if (hasattr(self, "_defining_set") and
|
|
640
|
+
(primitive_root is None or
|
|
641
|
+
primitive_root == self._primitive_root)):
|
|
642
|
+
return self._defining_set
|
|
643
|
+
else:
|
|
644
|
+
F = self.base_field()
|
|
645
|
+
n = self.length()
|
|
646
|
+
q = F.cardinality()
|
|
647
|
+
g = self.generator_polynomial()
|
|
648
|
+
|
|
649
|
+
s = Zmod(n)(q).multiplicative_order()
|
|
650
|
+
|
|
651
|
+
if primitive_root is None:
|
|
652
|
+
Fsplit, FE = F.extension(Integer(s), map=True)
|
|
653
|
+
alpha = Fsplit.zeta(n)
|
|
654
|
+
else:
|
|
655
|
+
try:
|
|
656
|
+
alpha = primitive_root
|
|
657
|
+
Fsplit = alpha.parent()
|
|
658
|
+
FE = Hom(Fsplit, F)[0]
|
|
659
|
+
except ValueError:
|
|
660
|
+
raise ValueError("primitive_root does not belong to the "
|
|
661
|
+
"right splitting field")
|
|
662
|
+
if alpha.multiplicative_order() != n:
|
|
663
|
+
raise ValueError("primitive_root must have multiplicative "
|
|
664
|
+
"order equal to the code length")
|
|
665
|
+
|
|
666
|
+
Rsplit = Fsplit['xx']
|
|
667
|
+
gsplit = Rsplit([FE(coeff) for coeff in g])
|
|
668
|
+
roots = gsplit.roots(multiplicities=False)
|
|
669
|
+
D = [root.log(alpha) for root in roots]
|
|
670
|
+
|
|
671
|
+
self._field_embedding = FE
|
|
672
|
+
self._primitive_root = alpha
|
|
673
|
+
self._defining_set = sorted(D)
|
|
674
|
+
return self._defining_set
|
|
675
|
+
|
|
676
|
+
def primitive_root(self):
|
|
677
|
+
r"""
|
|
678
|
+
Return the primitive root of the splitting field that is used
|
|
679
|
+
to build the defining set of the code.
|
|
680
|
+
|
|
681
|
+
If it has not been specified by the user, it is set by default with the
|
|
682
|
+
output of the ``zeta`` method of the splitting field.
|
|
683
|
+
|
|
684
|
+
EXAMPLES::
|
|
685
|
+
|
|
686
|
+
sage: F.<x> = GF(2)[]
|
|
687
|
+
sage: n = 7
|
|
688
|
+
sage: g = x ** 3 + x + 1
|
|
689
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
690
|
+
sage: C.primitive_root()
|
|
691
|
+
z3
|
|
692
|
+
|
|
693
|
+
sage: F = GF(16, 'a')
|
|
694
|
+
sage: n = 15
|
|
695
|
+
sage: a = F.gen()
|
|
696
|
+
sage: Cc = codes.CyclicCode(length=n, field=F, D=[1,2],
|
|
697
|
+
....: primitive_root=a^2 + 1)
|
|
698
|
+
sage: Cc.primitive_root()
|
|
699
|
+
a^2 + 1
|
|
700
|
+
"""
|
|
701
|
+
if hasattr(self, "_primitive_root"):
|
|
702
|
+
return self._primitive_root
|
|
703
|
+
else:
|
|
704
|
+
self.defining_set()
|
|
705
|
+
return self._primitive_root
|
|
706
|
+
|
|
707
|
+
@cached_method
|
|
708
|
+
def check_polynomial(self):
|
|
709
|
+
r"""
|
|
710
|
+
Return the check polynomial of ``self``.
|
|
711
|
+
|
|
712
|
+
Let `C` be a cyclic code of length `n` and `g` its generator
|
|
713
|
+
polynomial. The following: `h = \frac{x^n - 1}{g(x)}` is called `C`'s
|
|
714
|
+
check polynomial.
|
|
715
|
+
|
|
716
|
+
EXAMPLES::
|
|
717
|
+
|
|
718
|
+
sage: F.<x> = GF(2)[]
|
|
719
|
+
sage: n = 7
|
|
720
|
+
sage: g = x ** 3 + x + 1
|
|
721
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
722
|
+
sage: h = C.check_polynomial()
|
|
723
|
+
sage: h == (x**n - 1)/C.generator_polynomial()
|
|
724
|
+
True
|
|
725
|
+
"""
|
|
726
|
+
R = self._polynomial_ring
|
|
727
|
+
n = self.length()
|
|
728
|
+
self._check_polynomial = (R.gen() ** n - 1) // self.generator_polynomial()
|
|
729
|
+
return self._check_polynomial
|
|
730
|
+
|
|
731
|
+
@cached_method
|
|
732
|
+
def parity_check_matrix(self):
|
|
733
|
+
r"""
|
|
734
|
+
Return the parity check matrix of ``self``.
|
|
735
|
+
|
|
736
|
+
The parity check matrix of a linear code `C` corresponds to the
|
|
737
|
+
generator matrix of the dual code of `C`.
|
|
738
|
+
|
|
739
|
+
EXAMPLES::
|
|
740
|
+
|
|
741
|
+
sage: F.<x> = GF(2)[]
|
|
742
|
+
sage: n = 7
|
|
743
|
+
sage: g = x ** 3 + x + 1
|
|
744
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
745
|
+
sage: C.parity_check_matrix()
|
|
746
|
+
[1 0 1 1 1 0 0]
|
|
747
|
+
[0 1 0 1 1 1 0]
|
|
748
|
+
[0 0 1 0 1 1 1]
|
|
749
|
+
"""
|
|
750
|
+
k = self.dimension()
|
|
751
|
+
n = self.length()
|
|
752
|
+
h = self.check_polynomial().reverse()
|
|
753
|
+
l = _to_complete_list(h, n)
|
|
754
|
+
M = matrix([l[-i:] + l[:-i] for i in range(n - k)])
|
|
755
|
+
M.set_immutable()
|
|
756
|
+
return M
|
|
757
|
+
|
|
758
|
+
def bch_bound(self, arithmetic=False):
|
|
759
|
+
r"""
|
|
760
|
+
Return the BCH bound of ``self`` which is a bound on ``self``
|
|
761
|
+
minimum distance.
|
|
762
|
+
|
|
763
|
+
See :meth:`sage.coding.cyclic_code.bch_bound` for details.
|
|
764
|
+
|
|
765
|
+
INPUT:
|
|
766
|
+
|
|
767
|
+
- ``arithmetic`` -- (default: ``False``) if it is set to ``True``,
|
|
768
|
+
then it computes the BCH bound using the longest arithmetic sequence
|
|
769
|
+
definition
|
|
770
|
+
|
|
771
|
+
OUTPUT:
|
|
772
|
+
|
|
773
|
+
- ``(delta + 1, (l, c))`` -- such that ``delta + 1`` is the BCH bound,
|
|
774
|
+
and ``l, c`` are the parameters of the largest arithmetic sequence
|
|
775
|
+
|
|
776
|
+
EXAMPLES::
|
|
777
|
+
|
|
778
|
+
sage: F = GF(16, 'a')
|
|
779
|
+
sage: n = 15
|
|
780
|
+
sage: D = [14,1,2,11,12]
|
|
781
|
+
sage: C = codes.CyclicCode(field=F, length=n, D = D)
|
|
782
|
+
sage: C.bch_bound()
|
|
783
|
+
(3, (1, 1))
|
|
784
|
+
|
|
785
|
+
sage: F = GF(16, 'a')
|
|
786
|
+
sage: n = 15
|
|
787
|
+
sage: D = [14,1,2,11,12]
|
|
788
|
+
sage: C = codes.CyclicCode(field=F, length=n, D = D)
|
|
789
|
+
sage: C.bch_bound(True)
|
|
790
|
+
(4, (2, 12))
|
|
791
|
+
"""
|
|
792
|
+
return bch_bound(self.length(), self.defining_set(), arithmetic)
|
|
793
|
+
|
|
794
|
+
def surrounding_bch_code(self):
|
|
795
|
+
r"""
|
|
796
|
+
Return the surrounding BCH code of ``self``.
|
|
797
|
+
|
|
798
|
+
EXAMPLES::
|
|
799
|
+
|
|
800
|
+
sage: C = codes.CyclicCode(field=GF(2), length=63, D=[1, 7, 17])
|
|
801
|
+
sage: C.dimension()
|
|
802
|
+
45
|
|
803
|
+
sage: CC = C.surrounding_bch_code()
|
|
804
|
+
sage: CC
|
|
805
|
+
[63, 51] BCH Code over GF(2) with designed distance 3
|
|
806
|
+
sage: all(r in CC for r in C.generator_matrix())
|
|
807
|
+
True
|
|
808
|
+
"""
|
|
809
|
+
from .bch_code import BCHCode
|
|
810
|
+
delta, params = self.bch_bound(arithmetic=True)
|
|
811
|
+
return BCHCode(self.base_field(), self.length(), delta,
|
|
812
|
+
offset=params[1], jump_size=params[0])
|
|
813
|
+
|
|
814
|
+
|
|
815
|
+
class CyclicCodePolynomialEncoder(Encoder):
|
|
816
|
+
r"""
|
|
817
|
+
An encoder encoding polynomials into codewords.
|
|
818
|
+
|
|
819
|
+
Let `C` be a cyclic code over some finite field `F`,
|
|
820
|
+
and let `g` be its generator polynomial.
|
|
821
|
+
|
|
822
|
+
This encoder encodes any polynomial `p \in F[x]_{<k}` by computing
|
|
823
|
+
`c = p g` and returning the vector of its coefficients.
|
|
824
|
+
|
|
825
|
+
INPUT:
|
|
826
|
+
|
|
827
|
+
- ``code`` -- the associated code of this encoder
|
|
828
|
+
|
|
829
|
+
EXAMPLES::
|
|
830
|
+
|
|
831
|
+
sage: F.<x> = GF(2)[]
|
|
832
|
+
sage: n = 7
|
|
833
|
+
sage: g = x ** 3 + x + 1
|
|
834
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
835
|
+
sage: E = codes.encoders.CyclicCodePolynomialEncoder(C)
|
|
836
|
+
sage: E
|
|
837
|
+
Polynomial-style encoder for [7, 4] Cyclic Code over GF(2)
|
|
838
|
+
"""
|
|
839
|
+
|
|
840
|
+
def __init__(self, code):
|
|
841
|
+
r"""
|
|
842
|
+
EXAMPLES::
|
|
843
|
+
|
|
844
|
+
sage: F.<x> = GF(2)[]
|
|
845
|
+
sage: n = 7
|
|
846
|
+
sage: g = x ** 3 + x + 1
|
|
847
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
848
|
+
sage: E = codes.encoders.CyclicCodePolynomialEncoder(C)
|
|
849
|
+
sage: E
|
|
850
|
+
Polynomial-style encoder for [7, 4] Cyclic Code over GF(2)
|
|
851
|
+
"""
|
|
852
|
+
if not isinstance(code, CyclicCode):
|
|
853
|
+
raise ValueError("code has to be a CyclicCode")
|
|
854
|
+
self._polynomial_ring = code._polynomial_ring
|
|
855
|
+
super().__init__(code)
|
|
856
|
+
|
|
857
|
+
def __eq__(self, other):
|
|
858
|
+
r"""
|
|
859
|
+
Test equality between CyclicCodePolynomialEncoder objects.
|
|
860
|
+
|
|
861
|
+
EXAMPLES::
|
|
862
|
+
|
|
863
|
+
sage: F.<x> = GF(2)[]
|
|
864
|
+
sage: n = 7
|
|
865
|
+
sage: g = x ** 3 + x + 1
|
|
866
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
867
|
+
sage: E1 = codes.encoders.CyclicCodePolynomialEncoder(C)
|
|
868
|
+
sage: E2 = codes.encoders.CyclicCodePolynomialEncoder(C)
|
|
869
|
+
sage: E1 == E2
|
|
870
|
+
True
|
|
871
|
+
"""
|
|
872
|
+
return (isinstance(other, CyclicCodePolynomialEncoder) and
|
|
873
|
+
self.code() == other.code())
|
|
874
|
+
|
|
875
|
+
def _repr_(self):
|
|
876
|
+
r"""
|
|
877
|
+
Return a string representation of ``self``.
|
|
878
|
+
|
|
879
|
+
EXAMPLES::
|
|
880
|
+
|
|
881
|
+
sage: F.<x> = GF(2)[]
|
|
882
|
+
sage: n = 7
|
|
883
|
+
sage: g = x ** 3 + x + 1
|
|
884
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
885
|
+
sage: E = codes.encoders.CyclicCodePolynomialEncoder(C)
|
|
886
|
+
sage: E
|
|
887
|
+
Polynomial-style encoder for [7, 4] Cyclic Code over GF(2)
|
|
888
|
+
"""
|
|
889
|
+
return "Polynomial-style encoder for %s" % self.code()
|
|
890
|
+
|
|
891
|
+
def _latex_(self):
|
|
892
|
+
r"""
|
|
893
|
+
Return a latex representation of ``self``.
|
|
894
|
+
|
|
895
|
+
EXAMPLES::
|
|
896
|
+
|
|
897
|
+
sage: F.<x> = GF(2)[]
|
|
898
|
+
sage: n = 7
|
|
899
|
+
sage: g = x ** 3 + x + 1
|
|
900
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
901
|
+
sage: E = codes.encoders.CyclicCodePolynomialEncoder(C)
|
|
902
|
+
sage: latex(E)
|
|
903
|
+
\textnormal{Polynomial-style encoder for }[7, 4] \textnormal{ Cyclic Code over } \Bold{F}_{2}
|
|
904
|
+
"""
|
|
905
|
+
return ("\\textnormal{Polynomial-style encoder for }%s" %
|
|
906
|
+
self.code()._latex_())
|
|
907
|
+
|
|
908
|
+
def encode(self, p):
|
|
909
|
+
r"""
|
|
910
|
+
Transform `p` into an element of the associated code of ``self``.
|
|
911
|
+
|
|
912
|
+
INPUT:
|
|
913
|
+
|
|
914
|
+
- ``p`` -- a polynomial from ``self`` message space
|
|
915
|
+
|
|
916
|
+
OUTPUT: a codeword in associated code of ``self``
|
|
917
|
+
|
|
918
|
+
EXAMPLES::
|
|
919
|
+
|
|
920
|
+
sage: F.<x> = GF(2)[]
|
|
921
|
+
sage: n = 7
|
|
922
|
+
sage: g = x ** 3 + x + 1
|
|
923
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
924
|
+
sage: E = codes.encoders.CyclicCodePolynomialEncoder(C)
|
|
925
|
+
sage: m = x ** 2 + 1
|
|
926
|
+
sage: E.encode(m)
|
|
927
|
+
(1, 1, 1, 0, 0, 1, 0)
|
|
928
|
+
"""
|
|
929
|
+
C = self.code()
|
|
930
|
+
k = C.dimension()
|
|
931
|
+
n = C.length()
|
|
932
|
+
if p.degree() >= k:
|
|
933
|
+
raise ValueError("Degree of the message must be at most %s" % k - 1)
|
|
934
|
+
res = _to_complete_list(p * C.generator_polynomial(), n)
|
|
935
|
+
return vector(C.base_field(), res)
|
|
936
|
+
|
|
937
|
+
def unencode_nocheck(self, c):
|
|
938
|
+
r"""
|
|
939
|
+
Return the message corresponding to ``c``.
|
|
940
|
+
Does not check if ``c`` belongs to the code.
|
|
941
|
+
|
|
942
|
+
INPUT:
|
|
943
|
+
|
|
944
|
+
- ``c`` -- a vector with the same length as the code
|
|
945
|
+
|
|
946
|
+
OUTPUT: an element of the message space
|
|
947
|
+
|
|
948
|
+
EXAMPLES::
|
|
949
|
+
|
|
950
|
+
sage: F.<x> = GF(2)[]
|
|
951
|
+
sage: n = 7
|
|
952
|
+
sage: g = x ** 3 + x + 1
|
|
953
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
954
|
+
sage: E = codes.encoders.CyclicCodePolynomialEncoder(C)
|
|
955
|
+
sage: c = vector(GF(2), (1, 1, 1, 0, 0, 1, 0))
|
|
956
|
+
sage: E.unencode_nocheck(c)
|
|
957
|
+
x^2 + 1
|
|
958
|
+
"""
|
|
959
|
+
R = self.message_space()
|
|
960
|
+
g = self.code().generator_polynomial()
|
|
961
|
+
p = R(c.list())
|
|
962
|
+
return p // g
|
|
963
|
+
|
|
964
|
+
def message_space(self):
|
|
965
|
+
r"""
|
|
966
|
+
Return the message space of ``self``.
|
|
967
|
+
|
|
968
|
+
EXAMPLES::
|
|
969
|
+
|
|
970
|
+
sage: F.<x> = GF(2)[]
|
|
971
|
+
sage: n = 7
|
|
972
|
+
sage: g = x ** 3 + x + 1
|
|
973
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
974
|
+
sage: E = codes.encoders.CyclicCodePolynomialEncoder(C)
|
|
975
|
+
sage: E.message_space() # needs sage.libs.ntl
|
|
976
|
+
Univariate Polynomial Ring in x over Finite Field of size 2 (using GF2X)
|
|
977
|
+
"""
|
|
978
|
+
return self._polynomial_ring
|
|
979
|
+
|
|
980
|
+
|
|
981
|
+
class CyclicCodeVectorEncoder(Encoder):
|
|
982
|
+
r"""
|
|
983
|
+
An encoder which can encode vectors into codewords.
|
|
984
|
+
|
|
985
|
+
Let `C` be a cyclic code over some finite field `F`,
|
|
986
|
+
and let `g` be its generator polynomial.
|
|
987
|
+
|
|
988
|
+
Let `m = (m_1, m_2, \dots, m_k)` be a vector in `F^{k}`.
|
|
989
|
+
This codeword can be seen as a polynomial over `F[x]`, as follows:
|
|
990
|
+
`P_m = \Sigma_{i=0}^{k-1} m_i \times x^i`.
|
|
991
|
+
|
|
992
|
+
To encode `m`, this encoder does the multiplication `P_m g`.
|
|
993
|
+
|
|
994
|
+
INPUT:
|
|
995
|
+
|
|
996
|
+
- ``code`` -- the associated code of this encoder
|
|
997
|
+
|
|
998
|
+
EXAMPLES::
|
|
999
|
+
|
|
1000
|
+
sage: F.<x> = GF(2)[]
|
|
1001
|
+
sage: n = 7
|
|
1002
|
+
sage: g = x ** 3 + x + 1
|
|
1003
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
1004
|
+
sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
|
|
1005
|
+
sage: E
|
|
1006
|
+
Vector-style encoder for [7, 4] Cyclic Code over GF(2)
|
|
1007
|
+
"""
|
|
1008
|
+
|
|
1009
|
+
def __init__(self, code):
|
|
1010
|
+
r"""
|
|
1011
|
+
|
|
1012
|
+
EXAMPLES::
|
|
1013
|
+
|
|
1014
|
+
sage: F.<x> = GF(2)[]
|
|
1015
|
+
sage: n = 7
|
|
1016
|
+
sage: g = x ** 3 + x + 1
|
|
1017
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
1018
|
+
sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
|
|
1019
|
+
sage: E
|
|
1020
|
+
Vector-style encoder for [7, 4] Cyclic Code over GF(2)
|
|
1021
|
+
"""
|
|
1022
|
+
if not isinstance(code, CyclicCode):
|
|
1023
|
+
raise ValueError("code has to be a CyclicCode")
|
|
1024
|
+
self._polynomial_ring = code._polynomial_ring
|
|
1025
|
+
super().__init__(code)
|
|
1026
|
+
|
|
1027
|
+
def __eq__(self, other):
|
|
1028
|
+
r"""
|
|
1029
|
+
Test equality between CyclicCodeVectorEncoder objects.
|
|
1030
|
+
|
|
1031
|
+
EXAMPLES::
|
|
1032
|
+
|
|
1033
|
+
sage: F.<x> = GF(2)[]
|
|
1034
|
+
sage: n = 7
|
|
1035
|
+
sage: g = x ** 3 + x + 1
|
|
1036
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
1037
|
+
sage: E1 = codes.encoders.CyclicCodeVectorEncoder(C)
|
|
1038
|
+
sage: E2 = codes.encoders.CyclicCodeVectorEncoder(C)
|
|
1039
|
+
sage: E1 == E2
|
|
1040
|
+
True
|
|
1041
|
+
"""
|
|
1042
|
+
return (isinstance(other, CyclicCodeVectorEncoder) and
|
|
1043
|
+
self.code() == other.code())
|
|
1044
|
+
|
|
1045
|
+
def _repr_(self):
|
|
1046
|
+
r"""
|
|
1047
|
+
Return a string representation of ``self``.
|
|
1048
|
+
|
|
1049
|
+
EXAMPLES::
|
|
1050
|
+
|
|
1051
|
+
sage: F.<x> = GF(2)[]
|
|
1052
|
+
sage: n = 7
|
|
1053
|
+
sage: g = x ** 3 + x + 1
|
|
1054
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
1055
|
+
sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
|
|
1056
|
+
sage: E
|
|
1057
|
+
Vector-style encoder for [7, 4] Cyclic Code over GF(2)
|
|
1058
|
+
"""
|
|
1059
|
+
return "Vector-style encoder for %s" % self.code()
|
|
1060
|
+
|
|
1061
|
+
def _latex_(self):
|
|
1062
|
+
r"""
|
|
1063
|
+
Return a latex representation of ``self``.
|
|
1064
|
+
|
|
1065
|
+
EXAMPLES::
|
|
1066
|
+
|
|
1067
|
+
sage: F.<x> = GF(2)[]
|
|
1068
|
+
sage: n = 7
|
|
1069
|
+
sage: g = x ** 3 + x + 1
|
|
1070
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
1071
|
+
sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
|
|
1072
|
+
sage: latex(E)
|
|
1073
|
+
\textnormal{Vector-style encoder for }[7, 4] \textnormal{ Cyclic Code over } \Bold{F}_{2}
|
|
1074
|
+
"""
|
|
1075
|
+
return ("\\textnormal{Vector-style encoder for }%s" %
|
|
1076
|
+
self.code()._latex_())
|
|
1077
|
+
|
|
1078
|
+
def encode(self, m):
|
|
1079
|
+
r"""
|
|
1080
|
+
Transform `m` into an element of the associated code of ``self``.
|
|
1081
|
+
|
|
1082
|
+
INPUT:
|
|
1083
|
+
|
|
1084
|
+
- ``m`` -- an element from ``self``'s message space
|
|
1085
|
+
|
|
1086
|
+
OUTPUT: a codeword in the associated code of ``self``
|
|
1087
|
+
|
|
1088
|
+
EXAMPLES::
|
|
1089
|
+
|
|
1090
|
+
sage: F.<x> = GF(2)[]
|
|
1091
|
+
sage: n = 7
|
|
1092
|
+
sage: g = x ** 3 + x + 1
|
|
1093
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
1094
|
+
sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
|
|
1095
|
+
sage: m = vector(GF(2), (1, 0, 1, 0))
|
|
1096
|
+
sage: E.encode(m)
|
|
1097
|
+
(1, 1, 1, 0, 0, 1, 0)
|
|
1098
|
+
"""
|
|
1099
|
+
if self.generator_matrix.cache is not None:
|
|
1100
|
+
return super().encode(m)
|
|
1101
|
+
|
|
1102
|
+
k = self.code().dimension()
|
|
1103
|
+
n = self.code().length()
|
|
1104
|
+
F = self.code().base_field()
|
|
1105
|
+
R = self._polynomial_ring
|
|
1106
|
+
p = R(m.list())
|
|
1107
|
+
if p.degree() >= k:
|
|
1108
|
+
raise ValueError("Degree of the message must be at most %s" % k - 1)
|
|
1109
|
+
res = _to_complete_list(p * self.code().generator_polynomial(), n)
|
|
1110
|
+
return vector(F, res)
|
|
1111
|
+
|
|
1112
|
+
def unencode_nocheck(self, c):
|
|
1113
|
+
r"""
|
|
1114
|
+
Return the message corresponding to ``c``.
|
|
1115
|
+
Does not check if ``c`` belongs to the code.
|
|
1116
|
+
|
|
1117
|
+
INPUT:
|
|
1118
|
+
|
|
1119
|
+
- ``c`` -- a vector with the same length as the code
|
|
1120
|
+
|
|
1121
|
+
OUTPUT: an element of the message space
|
|
1122
|
+
|
|
1123
|
+
EXAMPLES::
|
|
1124
|
+
|
|
1125
|
+
sage: F.<x> = GF(2)[]
|
|
1126
|
+
sage: n = 7
|
|
1127
|
+
sage: g = x ** 3 + x + 1
|
|
1128
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
1129
|
+
sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
|
|
1130
|
+
sage: c = vector(GF(2), (1, 1, 1, 0, 0, 1, 0))
|
|
1131
|
+
sage: E.unencode_nocheck(c)
|
|
1132
|
+
(1, 0, 1, 0)
|
|
1133
|
+
"""
|
|
1134
|
+
|
|
1135
|
+
R = self._polynomial_ring
|
|
1136
|
+
g = self.code().generator_polynomial()
|
|
1137
|
+
p = R(c.list())
|
|
1138
|
+
l = _to_complete_list(p // g, self.message_space().dimension())
|
|
1139
|
+
return vector(self.code().base_field(), l)
|
|
1140
|
+
|
|
1141
|
+
@cached_method
|
|
1142
|
+
def generator_matrix(self):
|
|
1143
|
+
r"""
|
|
1144
|
+
Return a generator matrix of ``self``.
|
|
1145
|
+
|
|
1146
|
+
EXAMPLES::
|
|
1147
|
+
|
|
1148
|
+
sage: F.<x> = GF(2)[]
|
|
1149
|
+
sage: n = 7
|
|
1150
|
+
sage: g = x ** 3 + x + 1
|
|
1151
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
1152
|
+
sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
|
|
1153
|
+
sage: E.generator_matrix()
|
|
1154
|
+
[1 1 0 1 0 0 0]
|
|
1155
|
+
[0 1 1 0 1 0 0]
|
|
1156
|
+
[0 0 1 1 0 1 0]
|
|
1157
|
+
[0 0 0 1 1 0 1]
|
|
1158
|
+
"""
|
|
1159
|
+
C = self.code()
|
|
1160
|
+
k = C.dimension()
|
|
1161
|
+
n = C.length()
|
|
1162
|
+
l = _to_complete_list(C.generator_polynomial(), n)
|
|
1163
|
+
M = matrix([l[-i:] + l[:-i] for i in range(k)])
|
|
1164
|
+
M.set_immutable()
|
|
1165
|
+
return M
|
|
1166
|
+
|
|
1167
|
+
def message_space(self):
|
|
1168
|
+
r"""
|
|
1169
|
+
Return the message space of ``self``.
|
|
1170
|
+
|
|
1171
|
+
EXAMPLES::
|
|
1172
|
+
|
|
1173
|
+
sage: F.<x> = GF(2)[]
|
|
1174
|
+
sage: n = 7
|
|
1175
|
+
sage: g = x ** 3 + x + 1
|
|
1176
|
+
sage: C = codes.CyclicCode(generator_pol=g, length=n)
|
|
1177
|
+
sage: E = codes.encoders.CyclicCodeVectorEncoder(C)
|
|
1178
|
+
sage: E.message_space()
|
|
1179
|
+
Vector space of dimension 4 over Finite Field of size 2
|
|
1180
|
+
"""
|
|
1181
|
+
return self.code().base_ring() ** self.code().dimension()
|
|
1182
|
+
|
|
1183
|
+
|
|
1184
|
+
class CyclicCodeSurroundingBCHDecoder(Decoder):
|
|
1185
|
+
r"""
|
|
1186
|
+
A decoder which decodes through the surrounding BCH code of the cyclic
|
|
1187
|
+
code.
|
|
1188
|
+
|
|
1189
|
+
INPUT:
|
|
1190
|
+
|
|
1191
|
+
- ``code`` -- the associated code of this decoder
|
|
1192
|
+
|
|
1193
|
+
- ``**kwargs`` -- all extra arguments are forwarded to the BCH decoder
|
|
1194
|
+
|
|
1195
|
+
EXAMPLES::
|
|
1196
|
+
|
|
1197
|
+
sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
|
|
1198
|
+
sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
|
|
1199
|
+
sage: D
|
|
1200
|
+
Decoder through the surrounding BCH code of the [15, 10] Cyclic Code over GF(16)
|
|
1201
|
+
"""
|
|
1202
|
+
def __init__(self, code, **kwargs):
|
|
1203
|
+
r"""
|
|
1204
|
+
|
|
1205
|
+
EXAMPLES::
|
|
1206
|
+
|
|
1207
|
+
sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
|
|
1208
|
+
sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
|
|
1209
|
+
sage: D
|
|
1210
|
+
Decoder through the surrounding BCH code of the [15, 10] Cyclic Code over GF(16)
|
|
1211
|
+
"""
|
|
1212
|
+
self._bch_code = code.surrounding_bch_code()
|
|
1213
|
+
self._bch_decoder = self._bch_code.decoder(**kwargs)
|
|
1214
|
+
self._decoder_type = copy(self._bch_decoder.decoder_type())
|
|
1215
|
+
super().__init__(code, code.ambient_space(), "Vector")
|
|
1216
|
+
|
|
1217
|
+
def __eq__(self, other):
|
|
1218
|
+
r"""
|
|
1219
|
+
Test equality between CyclicCodeSurroundingBCHDecoder objects.
|
|
1220
|
+
|
|
1221
|
+
EXAMPLES::
|
|
1222
|
+
|
|
1223
|
+
sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
|
|
1224
|
+
sage: D1 = C.decoder()
|
|
1225
|
+
sage: D2 = C.decoder()
|
|
1226
|
+
sage: D1 == D2
|
|
1227
|
+
True
|
|
1228
|
+
"""
|
|
1229
|
+
return (isinstance(other, CyclicCodeSurroundingBCHDecoder) and
|
|
1230
|
+
self.code() == other.code() and
|
|
1231
|
+
self.bch_decoder() == other.bch_decoder())
|
|
1232
|
+
|
|
1233
|
+
def _repr_(self):
|
|
1234
|
+
r"""
|
|
1235
|
+
Return a string representation of ``self``.
|
|
1236
|
+
|
|
1237
|
+
EXAMPLES::
|
|
1238
|
+
|
|
1239
|
+
sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
|
|
1240
|
+
sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
|
|
1241
|
+
sage: D
|
|
1242
|
+
Decoder through the surrounding BCH code of the [15, 10] Cyclic Code over GF(16)
|
|
1243
|
+
"""
|
|
1244
|
+
return ("Decoder through the surrounding BCH code of the %s" %
|
|
1245
|
+
self.code())
|
|
1246
|
+
|
|
1247
|
+
def _latex_(self):
|
|
1248
|
+
r"""
|
|
1249
|
+
Return a latex representation of ``self``.
|
|
1250
|
+
|
|
1251
|
+
EXAMPLES::
|
|
1252
|
+
|
|
1253
|
+
sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
|
|
1254
|
+
sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
|
|
1255
|
+
sage: latex(D)
|
|
1256
|
+
\textnormal{Decoder through the surrounding BCH code of the }[15, 10] \textnormal{ Cyclic Code over } \Bold{F}_{2^{4}}
|
|
1257
|
+
"""
|
|
1258
|
+
return ("\\textnormal{Decoder through the surrounding BCH code of "
|
|
1259
|
+
"the }%s" % self.code()._latex_())
|
|
1260
|
+
|
|
1261
|
+
def bch_code(self):
|
|
1262
|
+
r"""
|
|
1263
|
+
Return the surrounding BCH code of
|
|
1264
|
+
:meth:`sage.coding.encoder.Encoder.code`.
|
|
1265
|
+
|
|
1266
|
+
EXAMPLES::
|
|
1267
|
+
|
|
1268
|
+
sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
|
|
1269
|
+
sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
|
|
1270
|
+
sage: D.bch_code()
|
|
1271
|
+
[15, 12] BCH Code over GF(16) with designed distance 4
|
|
1272
|
+
"""
|
|
1273
|
+
return self._bch_code
|
|
1274
|
+
|
|
1275
|
+
def bch_decoder(self):
|
|
1276
|
+
r"""
|
|
1277
|
+
Return the decoder that will be used over the surrounding BCH code.
|
|
1278
|
+
|
|
1279
|
+
EXAMPLES::
|
|
1280
|
+
|
|
1281
|
+
sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
|
|
1282
|
+
sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
|
|
1283
|
+
sage: D.bch_decoder()
|
|
1284
|
+
Decoder through the underlying GRS code of [15, 12] BCH Code
|
|
1285
|
+
over GF(16) with designed distance 4
|
|
1286
|
+
"""
|
|
1287
|
+
return self._bch_decoder
|
|
1288
|
+
|
|
1289
|
+
def decode_to_code(self, y):
|
|
1290
|
+
r"""
|
|
1291
|
+
Decodes ``r`` to an element in :meth:`sage.coding.encoder.Encoder.code`.
|
|
1292
|
+
|
|
1293
|
+
EXAMPLES::
|
|
1294
|
+
|
|
1295
|
+
sage: F = GF(16, 'a')
|
|
1296
|
+
sage: C = codes.CyclicCode(field=F, length=15, D=[14, 1, 2, 11, 12])
|
|
1297
|
+
sage: a = F.gen()
|
|
1298
|
+
sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
|
|
1299
|
+
sage: y = vector(F, [0, a^3, a^3 + a^2 + a, 1, a^2 + 1, a^3 + a^2 + 1,
|
|
1300
|
+
....: a^3 + a^2 + a, a^3 + a^2 + a, a^2 + a, a^2 + 1,
|
|
1301
|
+
....: a^2 + a + 1, a^3 + 1, a^2, a^3 + a, a^3 + a])
|
|
1302
|
+
sage: D.decode_to_code(y) in C
|
|
1303
|
+
True
|
|
1304
|
+
"""
|
|
1305
|
+
return self.bch_code().decode_to_code(y)
|
|
1306
|
+
|
|
1307
|
+
def decoding_radius(self):
|
|
1308
|
+
r"""
|
|
1309
|
+
Return maximal number of errors that ``self`` can decode.
|
|
1310
|
+
|
|
1311
|
+
EXAMPLES::
|
|
1312
|
+
|
|
1313
|
+
sage: C = codes.CyclicCode(field=GF(16), length=15, D=[14, 1, 2, 11, 12])
|
|
1314
|
+
sage: D = codes.decoders.CyclicCodeSurroundingBCHDecoder(C)
|
|
1315
|
+
sage: D.decoding_radius()
|
|
1316
|
+
1
|
|
1317
|
+
"""
|
|
1318
|
+
return self._bch_decoder.decoding_radius()
|
|
1319
|
+
|
|
1320
|
+
|
|
1321
|
+
# ###################### registration ##############################
|
|
1322
|
+
|
|
1323
|
+
CyclicCode._registered_encoders["Polynomial"] = CyclicCodePolynomialEncoder
|
|
1324
|
+
CyclicCode._registered_encoders["Vector"] = CyclicCodeVectorEncoder
|
|
1325
|
+
CyclicCode._registered_decoders["Syndrome"] = LinearCodeSyndromeDecoder
|
|
1326
|
+
CyclicCode._registered_decoders["NearestNeighbor"] = LinearCodeNearestNeighborDecoder
|
|
1327
|
+
|
|
1328
|
+
CyclicCode._registered_decoders["SurroundingBCH"] = CyclicCodeSurroundingBCHDecoder
|
|
1329
|
+
CyclicCodeSurroundingBCHDecoder._decoder_type = {"dynamic"}
|