passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_aarch64.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 +807 -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-2d945d6c.so.1 +0 -0
- passagemath_modules.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-23768756.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7897025b.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-e34bb864.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-503f0c35.3.29.so +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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-aarch64-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-aarch64-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-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-aarch64-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-aarch64-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,1058 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.modules sage.rings.finite_rings
|
|
3
|
+
r"""
|
|
4
|
+
Gabidulin Code
|
|
5
|
+
|
|
6
|
+
This module provides the :class:`~sage.coding.gabidulin.GabidulinCode`, which constructs
|
|
7
|
+
Gabidulin Codes that are the rank metric equivalent of Reed Solomon codes and are
|
|
8
|
+
defined as the evaluation codes of degree-restricted skew polynomials.
|
|
9
|
+
|
|
10
|
+
This module also provides :class:`~sage.coding.gabidulin.GabidulinPolynomialEvaluationEncoder`,
|
|
11
|
+
an encoder with a skew polynomial message space and :class:`~sage.coding.gabidulin.GabidulinVectorEvaluationEncoder`,
|
|
12
|
+
an encoder based on the generator matrix. It also provides a decoder
|
|
13
|
+
:class:`~sage.coding.gabidulin.GabidulinGaoDecoder` which corrects errors using
|
|
14
|
+
the Gao algorithm in the rank metric.
|
|
15
|
+
|
|
16
|
+
AUTHOR:
|
|
17
|
+
|
|
18
|
+
- Arpit Merchant (2016-08-16)
|
|
19
|
+
- Marketa Slukova (2019-08-19): initial version
|
|
20
|
+
"""
|
|
21
|
+
from sage.matrix.constructor import matrix
|
|
22
|
+
from sage.modules.free_module_element import vector
|
|
23
|
+
from sage.coding.encoder import Encoder
|
|
24
|
+
from sage.coding.decoder import Decoder, DecodingError
|
|
25
|
+
from sage.coding.linear_rank_metric import AbstractLinearRankMetricCode
|
|
26
|
+
from sage.categories.fields import Fields
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class GabidulinCode(AbstractLinearRankMetricCode):
|
|
30
|
+
r"""
|
|
31
|
+
A Gabidulin Code.
|
|
32
|
+
|
|
33
|
+
DEFINITION:
|
|
34
|
+
|
|
35
|
+
A linear Gabidulin code Gab[n, k] over `F_{q^m}` of length `n` (at most
|
|
36
|
+
`m`) and dimension `k` (at most `n`) is the set of all codewords, that
|
|
37
|
+
are the evaluation of a `q`-degree restricted skew polynomial `f(x)`
|
|
38
|
+
belonging to the skew polynomial constructed over the base ring `F_{q^m}`
|
|
39
|
+
and the twisting homomorphism `\sigma`.
|
|
40
|
+
|
|
41
|
+
.. math::
|
|
42
|
+
|
|
43
|
+
\{ \text{Gab[n, k]} = \big\{ (f(g_0) f(g_1) ... f(g_{n-1})) = f(\textbf{g}) : \text{deg}_{q}f(x) < k \big\} \}
|
|
44
|
+
|
|
45
|
+
where the fixed evaluation points `g_0, g_1,..., g_{n-1}` are linearly
|
|
46
|
+
independent over `F_{q^m}`.
|
|
47
|
+
|
|
48
|
+
EXAMPLES:
|
|
49
|
+
|
|
50
|
+
A Gabidulin Code can be constructed in the following way::
|
|
51
|
+
|
|
52
|
+
sage: Fqm = GF(16)
|
|
53
|
+
sage: Fq = GF(4)
|
|
54
|
+
sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
55
|
+
sage: C
|
|
56
|
+
[2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
|
|
57
|
+
"""
|
|
58
|
+
_registered_encoders = {}
|
|
59
|
+
_registered_decoders = {}
|
|
60
|
+
|
|
61
|
+
def __init__(self, base_field, length, dimension, sub_field=None,
|
|
62
|
+
twisting_homomorphism=None, evaluation_points=None):
|
|
63
|
+
r"""
|
|
64
|
+
Representation of a Gabidulin Code.
|
|
65
|
+
|
|
66
|
+
INPUT:
|
|
67
|
+
|
|
68
|
+
- ``base_field`` -- finite field of order `q^m` where `q` is a prime power
|
|
69
|
+
and `m` is an integer
|
|
70
|
+
|
|
71
|
+
- ``length`` -- length of the resulting code
|
|
72
|
+
|
|
73
|
+
- ``dimension`` -- dimension of the resulting code
|
|
74
|
+
|
|
75
|
+
- ``sub_field`` -- (default: ``None``) finite field of order `q`
|
|
76
|
+
which is a subfield of the ``base_field``. If not given, it is the
|
|
77
|
+
prime subfield of the ``base_field``.
|
|
78
|
+
|
|
79
|
+
- ``twisting_homomorphism`` -- (default: ``None``) homomorphism of the
|
|
80
|
+
underlying skew polynomial ring. If not given, it is the Frobenius
|
|
81
|
+
endomorphism on ``base_field``, which sends an element `x` to `x^{q}`.
|
|
82
|
+
|
|
83
|
+
- ``evaluation_points`` -- (default: ``None``) list of elements
|
|
84
|
+
`g_0, g_1,...,g_{n-1}` of the ``base_field`` that are linearly
|
|
85
|
+
independent over the ``sub_field``. These elements form the first row
|
|
86
|
+
of the generator matrix. If not specified, these are the `nth` powers
|
|
87
|
+
of the generator of the ``base_field``.
|
|
88
|
+
|
|
89
|
+
Both parameters ``sub_field`` and ``twisting_homomorphism`` are optional.
|
|
90
|
+
Since they are closely related, here is a complete list of behaviours:
|
|
91
|
+
|
|
92
|
+
- both ``sub_field`` and ``twisting_homomorphism`` given -- in this case
|
|
93
|
+
we only check that given that ``twisting_homomorphism`` has a fixed
|
|
94
|
+
field method, it returns ``sub_field``
|
|
95
|
+
|
|
96
|
+
- only ``twisting_homomorphism`` given -- we set ``sub_field`` to be the
|
|
97
|
+
fixed field of the ``twisting_homomorphism``. If such method does not
|
|
98
|
+
exist, an error is raised.
|
|
99
|
+
|
|
100
|
+
- only ``sub_field`` given -- we set ``twisting_homomorphism`` to be the
|
|
101
|
+
Frobenius of the field extension
|
|
102
|
+
|
|
103
|
+
- neither ``sub_field`` or ``twisting_homomorphism`` given -- we take
|
|
104
|
+
``sub_field`` to be the prime field of ``base_field`` and the
|
|
105
|
+
``twisting_homomorphism`` to be the Frobenius wrt. the prime field
|
|
106
|
+
|
|
107
|
+
TESTS:
|
|
108
|
+
|
|
109
|
+
If ``length`` is bigger than the degree of the extension, an error is
|
|
110
|
+
raised::
|
|
111
|
+
|
|
112
|
+
sage: C = codes.GabidulinCode(GF(64), 4, 3, GF(4))
|
|
113
|
+
Traceback (most recent call last):
|
|
114
|
+
...
|
|
115
|
+
ValueError: 'length' can be at most the degree of the extension, 3
|
|
116
|
+
|
|
117
|
+
If the number of evaluation points is not equal to the length
|
|
118
|
+
of the code, an error is raised::
|
|
119
|
+
|
|
120
|
+
sage: Fqm = GF(5^20)
|
|
121
|
+
sage: Fq = GF(5)
|
|
122
|
+
sage: aa = Fqm.gen()
|
|
123
|
+
sage: evals = [ aa^i for i in range(21) ]
|
|
124
|
+
sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq, None, evals)
|
|
125
|
+
Traceback (most recent call last):
|
|
126
|
+
...
|
|
127
|
+
ValueError: the number of evaluation points should be equal to the length of the code
|
|
128
|
+
|
|
129
|
+
If evaluation points are not linearly independent over the ``base_field``,
|
|
130
|
+
an error is raised::
|
|
131
|
+
|
|
132
|
+
sage: evals = [ aa*i for i in range(2) ]
|
|
133
|
+
sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq, None, evals)
|
|
134
|
+
Traceback (most recent call last):
|
|
135
|
+
...
|
|
136
|
+
ValueError: the evaluation points provided are not linearly independent
|
|
137
|
+
|
|
138
|
+
If an evaluation point does not belong to the ``base_field``, an error
|
|
139
|
+
is raised::
|
|
140
|
+
|
|
141
|
+
sage: a = GF(3).gen()
|
|
142
|
+
sage: evals = [ a*i for i in range(2) ]
|
|
143
|
+
sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq, None, evals)
|
|
144
|
+
Traceback (most recent call last):
|
|
145
|
+
...
|
|
146
|
+
ValueError: evaluation point does not belong to the 'base field'
|
|
147
|
+
|
|
148
|
+
Given that both ``sub_field`` and ``twisting_homomorphism`` are specified
|
|
149
|
+
and ``twisting_homomorphism`` has a fixed field method. If the fixed
|
|
150
|
+
field of ``twisting_homomorphism`` is not ``sub_field``, an error is
|
|
151
|
+
raised::
|
|
152
|
+
|
|
153
|
+
sage: Fqm = GF(64)
|
|
154
|
+
sage: Fq = GF(8)
|
|
155
|
+
sage: twist = GF(64).frobenius_endomorphism(n=2)
|
|
156
|
+
sage: C = codes.GabidulinCode(Fqm, 3, 2, Fq, twist)
|
|
157
|
+
Traceback (most recent call last):
|
|
158
|
+
...
|
|
159
|
+
ValueError: the fixed field of the twisting homomorphism has to be the relative field of the extension
|
|
160
|
+
|
|
161
|
+
If ``twisting_homomorphism`` is given, but ``sub_field`` is not. In case
|
|
162
|
+
``twisting_homomorphism`` does not have a fixed field method, and error
|
|
163
|
+
is raised::
|
|
164
|
+
|
|
165
|
+
sage: Fqm.<z6> = GF(64)
|
|
166
|
+
sage: sigma = Hom(Fqm, Fqm)[1]; sigma
|
|
167
|
+
Ring endomorphism of Finite Field in z6 of size 2^6
|
|
168
|
+
Defn: z6 |--> z6^2
|
|
169
|
+
sage: C = codes.GabidulinCode(Fqm, 3, 2, None, sigma)
|
|
170
|
+
Traceback (most recent call last):
|
|
171
|
+
...
|
|
172
|
+
ValueError: if 'sub_field' is not given, the twisting homomorphism has to have a 'fixed_field' method
|
|
173
|
+
"""
|
|
174
|
+
twist_fix_field = None
|
|
175
|
+
have_twist = (twisting_homomorphism is not None)
|
|
176
|
+
have_subfield = (sub_field is not None)
|
|
177
|
+
|
|
178
|
+
if have_twist and have_subfield:
|
|
179
|
+
try:
|
|
180
|
+
twist_fix_field = twisting_homomorphism.fixed_field()[0]
|
|
181
|
+
except AttributeError:
|
|
182
|
+
pass
|
|
183
|
+
if twist_fix_field and twist_fix_field.order() != sub_field.order():
|
|
184
|
+
raise ValueError("the fixed field of the twisting homomorphism has to be the relative field of the extension")
|
|
185
|
+
|
|
186
|
+
if have_twist and not have_subfield:
|
|
187
|
+
if not twist_fix_field:
|
|
188
|
+
raise ValueError("if 'sub_field' is not given, the twisting homomorphism has to have a 'fixed_field' method")
|
|
189
|
+
else:
|
|
190
|
+
sub_field = twist_fix_field
|
|
191
|
+
|
|
192
|
+
if (not have_twist) and have_subfield:
|
|
193
|
+
twisting_homomorphism = base_field.frobenius_endomorphism(n=sub_field.degree())
|
|
194
|
+
|
|
195
|
+
if (not have_twist) and not have_subfield:
|
|
196
|
+
sub_field = base_field.base_ring()
|
|
197
|
+
twisting_homomorphism = base_field.frobenius_endomorphism()
|
|
198
|
+
|
|
199
|
+
self._twisting_homomorphism = twisting_homomorphism
|
|
200
|
+
|
|
201
|
+
super().__init__(base_field, sub_field, length, "VectorEvaluation", "Gao")
|
|
202
|
+
|
|
203
|
+
if length > self.extension_degree():
|
|
204
|
+
raise ValueError("'length' can be at most the degree of the extension, {}".format(self.extension_degree()))
|
|
205
|
+
if evaluation_points is None:
|
|
206
|
+
evaluation_points = [base_field.gen()**i for i in range(base_field.degree())][:length]
|
|
207
|
+
else:
|
|
208
|
+
if not len(evaluation_points) == length:
|
|
209
|
+
raise ValueError("the number of evaluation points should be equal to the length of the code")
|
|
210
|
+
for i in range(length):
|
|
211
|
+
if evaluation_points[i] not in base_field:
|
|
212
|
+
raise ValueError("evaluation point does not belong to the 'base field'")
|
|
213
|
+
basis = self.matrix_form_of_vector(vector(evaluation_points))
|
|
214
|
+
if basis.rank() != length:
|
|
215
|
+
raise ValueError("the evaluation points provided are not linearly independent")
|
|
216
|
+
self._evaluation_points = evaluation_points
|
|
217
|
+
self._dimension = dimension
|
|
218
|
+
|
|
219
|
+
def _repr_(self):
|
|
220
|
+
"""
|
|
221
|
+
Return a string representation of ``self``.
|
|
222
|
+
|
|
223
|
+
EXAMPLES::
|
|
224
|
+
|
|
225
|
+
sage: Fqm = GF(16)
|
|
226
|
+
sage: Fq = GF(4)
|
|
227
|
+
sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq); C
|
|
228
|
+
[2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
|
|
229
|
+
"""
|
|
230
|
+
R = self.base_field()
|
|
231
|
+
S = self.sub_field()
|
|
232
|
+
if R and S in Fields():
|
|
233
|
+
return "[%s, %s, %s] linear Gabidulin code over GF(%s)/GF(%s)" % (self.length(), self.dimension(), self.minimum_distance(), R.cardinality(), S.cardinality())
|
|
234
|
+
else:
|
|
235
|
+
return "[%s, %s, %s] linear Gabidulin code over %s/%s" % (self.length(), self.dimension(), self.minimum_distance(), R, S)
|
|
236
|
+
|
|
237
|
+
def _latex_(self):
|
|
238
|
+
r"""
|
|
239
|
+
Return a latex representation of ``self``.
|
|
240
|
+
|
|
241
|
+
EXAMPLES::
|
|
242
|
+
|
|
243
|
+
sage: Fqm = GF(16)
|
|
244
|
+
sage: Fq = GF(4)
|
|
245
|
+
sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq);
|
|
246
|
+
sage: latex(C)
|
|
247
|
+
[2, 2, 1] \textnormal{ linear Gabidulin code over } \Bold{F}_{2^{4}}/\Bold{F}_{2^{2}}
|
|
248
|
+
"""
|
|
249
|
+
txt = "[%s, %s, %s] \\textnormal{ linear Gabidulin code over } %s/%s"
|
|
250
|
+
return txt % (self.length(), self.dimension(), self.minimum_distance(),
|
|
251
|
+
self.base_field()._latex_(), self.sub_field()._latex_())
|
|
252
|
+
|
|
253
|
+
def __eq__(self, other):
|
|
254
|
+
"""
|
|
255
|
+
Test equality between Gabidulin Code objects.
|
|
256
|
+
|
|
257
|
+
INPUT:
|
|
258
|
+
|
|
259
|
+
- ``other`` -- another Gabidulin Code object
|
|
260
|
+
|
|
261
|
+
OUTPUT: boolean
|
|
262
|
+
|
|
263
|
+
EXAMPLES::
|
|
264
|
+
|
|
265
|
+
sage: Fqm = GF(16)
|
|
266
|
+
sage: Fq = GF(4)
|
|
267
|
+
sage: C1 = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
268
|
+
sage: C2 = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
269
|
+
sage: C1.__eq__(C2)
|
|
270
|
+
True
|
|
271
|
+
|
|
272
|
+
sage: Fqmm = GF(64)
|
|
273
|
+
sage: C3 = codes.GabidulinCode(Fqmm, 2, 2, Fq)
|
|
274
|
+
sage: C3.__eq__(C2)
|
|
275
|
+
False
|
|
276
|
+
"""
|
|
277
|
+
return isinstance(other, GabidulinCode) \
|
|
278
|
+
and self.base_field() == other.base_field() \
|
|
279
|
+
and self.sub_field() == other.sub_field() \
|
|
280
|
+
and self.length() == other.length() \
|
|
281
|
+
and self.dimension() == other.dimension() \
|
|
282
|
+
and self.evaluation_points() == other.evaluation_points()
|
|
283
|
+
|
|
284
|
+
def twisting_homomorphism(self):
|
|
285
|
+
r"""
|
|
286
|
+
Return the twisting homomorphism of ``self``.
|
|
287
|
+
|
|
288
|
+
EXAMPLES::
|
|
289
|
+
|
|
290
|
+
sage: Fqm = GF(5^20)
|
|
291
|
+
sage: Fq = GF(5^4)
|
|
292
|
+
sage: C = codes.GabidulinCode(Fqm, 5, 3, Fq)
|
|
293
|
+
sage: C.twisting_homomorphism()
|
|
294
|
+
Frobenius endomorphism z20 |--> z20^(5^4) on Finite Field in z20 of size 5^20
|
|
295
|
+
"""
|
|
296
|
+
return self._twisting_homomorphism
|
|
297
|
+
|
|
298
|
+
def minimum_distance(self):
|
|
299
|
+
r"""
|
|
300
|
+
Return the minimum distance of ``self``.
|
|
301
|
+
|
|
302
|
+
Since Gabidulin Codes are Maximum-Distance-Separable (MDS), this returns
|
|
303
|
+
``self.length() - self.dimension() + 1``.
|
|
304
|
+
|
|
305
|
+
EXAMPLES::
|
|
306
|
+
|
|
307
|
+
sage: Fqm = GF(5^20)
|
|
308
|
+
sage: Fq = GF(5)
|
|
309
|
+
sage: C = codes.GabidulinCode(Fqm, 20, 15, Fq)
|
|
310
|
+
sage: C.minimum_distance()
|
|
311
|
+
6
|
|
312
|
+
"""
|
|
313
|
+
return self.length() - self.dimension() + 1
|
|
314
|
+
|
|
315
|
+
def parity_evaluation_points(self):
|
|
316
|
+
r"""
|
|
317
|
+
Return the parity evaluation points of ``self``.
|
|
318
|
+
|
|
319
|
+
These form the first row of the parity check matrix of ``self``.
|
|
320
|
+
|
|
321
|
+
EXAMPLES::
|
|
322
|
+
|
|
323
|
+
sage: C = codes.GabidulinCode(GF(2^10), 5, 2)
|
|
324
|
+
sage: list(C.parity_check_matrix().row(0)) == C.parity_evaluation_points() #indirect_doctest
|
|
325
|
+
True
|
|
326
|
+
"""
|
|
327
|
+
eval_pts = self.evaluation_points()
|
|
328
|
+
n = self.length()
|
|
329
|
+
k = self.dimension()
|
|
330
|
+
sigma = self.twisting_homomorphism()
|
|
331
|
+
|
|
332
|
+
coefficient_matrix = matrix(self.base_field(), n - 1, n,
|
|
333
|
+
lambda i, j: (sigma**(-n + k + 1 + i))(eval_pts[j]))
|
|
334
|
+
solution_space = coefficient_matrix.right_kernel()
|
|
335
|
+
return list(solution_space.basis()[0])
|
|
336
|
+
|
|
337
|
+
def dual_code(self):
|
|
338
|
+
r"""
|
|
339
|
+
Return the dual code `C^{\perp}` of ``self``, the code `C`,
|
|
340
|
+
|
|
341
|
+
.. MATH::
|
|
342
|
+
|
|
343
|
+
C^{\perp} = \{ v \in V\ |\ v\cdot c = 0,\ \forall c \in C \}.
|
|
344
|
+
|
|
345
|
+
EXAMPLES::
|
|
346
|
+
|
|
347
|
+
sage: C = codes.GabidulinCode(GF(2^10), 5, 2)
|
|
348
|
+
sage: C1 = C.dual_code(); C1
|
|
349
|
+
[5, 3, 3] linear Gabidulin code over GF(1024)/GF(2)
|
|
350
|
+
sage: C == C1.dual_code()
|
|
351
|
+
True
|
|
352
|
+
"""
|
|
353
|
+
return GabidulinCode(self.base_field(), self.length(),
|
|
354
|
+
self.length() - self.dimension(),
|
|
355
|
+
self.sub_field(),
|
|
356
|
+
self.twisting_homomorphism(),
|
|
357
|
+
self.parity_evaluation_points())
|
|
358
|
+
|
|
359
|
+
def parity_check_matrix(self):
|
|
360
|
+
r"""
|
|
361
|
+
Return the parity check matrix of ``self``.
|
|
362
|
+
|
|
363
|
+
This is the generator matrix of the dual code of ``self``.
|
|
364
|
+
|
|
365
|
+
EXAMPLES::
|
|
366
|
+
|
|
367
|
+
sage: C = codes.GabidulinCode(GF(2^3), 3, 2)
|
|
368
|
+
sage: C.parity_check_matrix()
|
|
369
|
+
[ 1 z3 z3^2 + z3]
|
|
370
|
+
sage: C.parity_check_matrix() == C.dual_code().generator_matrix()
|
|
371
|
+
True
|
|
372
|
+
"""
|
|
373
|
+
return self.dual_code().generator_matrix()
|
|
374
|
+
|
|
375
|
+
def evaluation_points(self):
|
|
376
|
+
"""
|
|
377
|
+
Return the evaluation points of ``self``.
|
|
378
|
+
|
|
379
|
+
EXAMPLES::
|
|
380
|
+
|
|
381
|
+
sage: Fqm = GF(5^20)
|
|
382
|
+
sage: Fq = GF(5^4)
|
|
383
|
+
sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
|
|
384
|
+
sage: C.evaluation_points()
|
|
385
|
+
[1, z20, z20^2, z20^3]
|
|
386
|
+
"""
|
|
387
|
+
return self._evaluation_points
|
|
388
|
+
|
|
389
|
+
# ---------------------- encoders ------------------------------
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
class GabidulinVectorEvaluationEncoder(Encoder):
|
|
393
|
+
|
|
394
|
+
def __init__(self, code):
|
|
395
|
+
"""
|
|
396
|
+
This method constructs the vector evaluation encoder for
|
|
397
|
+
Gabidulin Codes.
|
|
398
|
+
|
|
399
|
+
INPUT:
|
|
400
|
+
|
|
401
|
+
- ``code`` -- the associated code of this encoder
|
|
402
|
+
|
|
403
|
+
EXAMPLES::
|
|
404
|
+
|
|
405
|
+
sage: Fqm = GF(16)
|
|
406
|
+
sage: Fq = GF(4)
|
|
407
|
+
sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
408
|
+
sage: E = codes.encoders.GabidulinVectorEvaluationEncoder(C)
|
|
409
|
+
sage: E
|
|
410
|
+
Vector evaluation style encoder for [2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
|
|
411
|
+
|
|
412
|
+
Alternatively, we can construct the encoder from ``C`` directly::
|
|
413
|
+
|
|
414
|
+
sage: E = C.encoder("VectorEvaluation")
|
|
415
|
+
sage: E
|
|
416
|
+
Vector evaluation style encoder for [2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
|
|
417
|
+
|
|
418
|
+
TESTS:
|
|
419
|
+
|
|
420
|
+
If the code is not a Gabidulin code, an error is raised::
|
|
421
|
+
|
|
422
|
+
sage: C = codes.HammingCode(GF(4), 2)
|
|
423
|
+
sage: E = codes.encoders.GabidulinVectorEvaluationEncoder(C)
|
|
424
|
+
Traceback (most recent call last):
|
|
425
|
+
...
|
|
426
|
+
ValueError: code has to be a Gabidulin code
|
|
427
|
+
"""
|
|
428
|
+
if not isinstance(code, GabidulinCode):
|
|
429
|
+
raise ValueError("code has to be a Gabidulin code")
|
|
430
|
+
super().__init__(code)
|
|
431
|
+
|
|
432
|
+
def _repr_(self):
|
|
433
|
+
"""
|
|
434
|
+
Return a string representation of ``self``.
|
|
435
|
+
|
|
436
|
+
EXAMPLES::
|
|
437
|
+
|
|
438
|
+
sage: Fqm = GF(5^20)
|
|
439
|
+
sage: Fq = GF(5^4)
|
|
440
|
+
sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
|
|
441
|
+
sage: E = codes.encoders.GabidulinVectorEvaluationEncoder(C); E
|
|
442
|
+
Vector evaluation style encoder for [4, 4, 1] linear Gabidulin code over GF(95367431640625)/GF(625)
|
|
443
|
+
"""
|
|
444
|
+
return "Vector evaluation style encoder for %s" % self.code()
|
|
445
|
+
|
|
446
|
+
def _latex_(self):
|
|
447
|
+
r"""
|
|
448
|
+
Return a latex representation of ``self``.
|
|
449
|
+
|
|
450
|
+
EXAMPLES::
|
|
451
|
+
|
|
452
|
+
sage: Fqm = GF(5^20)
|
|
453
|
+
sage: Fq = GF(5^4)
|
|
454
|
+
sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
|
|
455
|
+
sage: E = codes.encoders.GabidulinVectorEvaluationEncoder(C)
|
|
456
|
+
sage: latex(E)
|
|
457
|
+
\textnormal{Vector evaluation style encoder for } [4, 4, 1] \textnormal{ linear Gabidulin code over } \Bold{F}_{5^{20}}/\Bold{F}_{5^{4}}
|
|
458
|
+
"""
|
|
459
|
+
return "\\textnormal{Vector evaluation style encoder for } %s" % self.code()._latex_()
|
|
460
|
+
|
|
461
|
+
def __eq__(self, other):
|
|
462
|
+
"""
|
|
463
|
+
Test equality between Gabidulin Generator Matrix Encoder objects.
|
|
464
|
+
|
|
465
|
+
INPUT:
|
|
466
|
+
|
|
467
|
+
- ``other`` -- another Gabidulin Generator Matrix Encoder
|
|
468
|
+
|
|
469
|
+
OUTPUT: boolean
|
|
470
|
+
|
|
471
|
+
EXAMPLES::
|
|
472
|
+
|
|
473
|
+
sage: Fqm = GF(16)
|
|
474
|
+
sage: Fq = GF(4)
|
|
475
|
+
sage: C1 = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
476
|
+
sage: E1 = codes.encoders.GabidulinVectorEvaluationEncoder(C1)
|
|
477
|
+
sage: C2 = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
478
|
+
sage: E2 = codes.encoders.GabidulinVectorEvaluationEncoder(C2)
|
|
479
|
+
sage: E1.__eq__(E2)
|
|
480
|
+
True
|
|
481
|
+
|
|
482
|
+
sage: Fqmm = GF(64)
|
|
483
|
+
sage: C3 = codes.GabidulinCode(Fqmm, 2, 2, Fq)
|
|
484
|
+
sage: E3 = codes.encoders.GabidulinVectorEvaluationEncoder(C3)
|
|
485
|
+
sage: E3.__eq__(E2)
|
|
486
|
+
False
|
|
487
|
+
"""
|
|
488
|
+
return isinstance(other, GabidulinVectorEvaluationEncoder) \
|
|
489
|
+
and self.code() == other.code()
|
|
490
|
+
|
|
491
|
+
def generator_matrix(self):
|
|
492
|
+
"""
|
|
493
|
+
Return the generator matrix of ``self``.
|
|
494
|
+
|
|
495
|
+
EXAMPLES::
|
|
496
|
+
|
|
497
|
+
sage: Fqm = GF(2^9)
|
|
498
|
+
sage: Fq = GF(2^3)
|
|
499
|
+
sage: C = codes.GabidulinCode(Fqm, 3, 3, Fq)
|
|
500
|
+
sage: (list(C.generator_matrix().row(1))
|
|
501
|
+
....: == [C.evaluation_points()[i]**(2**3) for i in range(3)])
|
|
502
|
+
True
|
|
503
|
+
"""
|
|
504
|
+
from functools import reduce
|
|
505
|
+
C = self.code()
|
|
506
|
+
eval_pts = C.evaluation_points()
|
|
507
|
+
sigma = C.twisting_homomorphism()
|
|
508
|
+
|
|
509
|
+
def create_matrix_elements(A, k, f):
|
|
510
|
+
return reduce(lambda L, x: [x] +
|
|
511
|
+
[list(map(f, l)) for l in L], [A] * k, [])
|
|
512
|
+
return matrix(C.base_field(), C.dimension(), C.length(),
|
|
513
|
+
create_matrix_elements(eval_pts, C.dimension(), sigma))
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
class GabidulinPolynomialEvaluationEncoder(Encoder):
|
|
517
|
+
r"""
|
|
518
|
+
Encoder for Gabidulin codes which uses evaluation of skew polynomials to
|
|
519
|
+
obtain codewords.
|
|
520
|
+
|
|
521
|
+
Let `C` be a Gabidulin code of length `n` and dimension `k` over some
|
|
522
|
+
finite field `F = GF(q^m)`. We denote by `\alpha_i` its evaluations
|
|
523
|
+
points, where `1 \leq i \leq n`. Let `p`, a skew polynomial of degree at
|
|
524
|
+
most `k-1` in `F[x]`, be the message.
|
|
525
|
+
|
|
526
|
+
The encoding of `m` will be the following codeword:
|
|
527
|
+
|
|
528
|
+
.. MATH::
|
|
529
|
+
|
|
530
|
+
(p(\alpha_1), \dots, p(\alpha_n)).
|
|
531
|
+
|
|
532
|
+
TESTS:
|
|
533
|
+
|
|
534
|
+
This module uses the following experimental feature.
|
|
535
|
+
This test block is here only to trigger the experimental warning so it does not
|
|
536
|
+
interferes with doctests::
|
|
537
|
+
|
|
538
|
+
sage: Fqm = GF(2^9)
|
|
539
|
+
sage: Fq = GF(2^3)
|
|
540
|
+
sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
541
|
+
sage: S.<x> = Fqm['x', C.twisting_homomorphism()]
|
|
542
|
+
sage: z9 = Fqm.gen()
|
|
543
|
+
sage: p = (z9^6 + z9^2 + z9 + 1)*x + z9^7 + z9^5 + z9^4 + z9^2
|
|
544
|
+
sage: vector(p.multi_point_evaluation(C.evaluation_points()))
|
|
545
|
+
doctest:...: FutureWarning: This class/method/function is marked as experimental.
|
|
546
|
+
It, its functionality or its interface might change without a formal deprecation.
|
|
547
|
+
See https://github.com/sagemath/sage/issues/13215 for details.
|
|
548
|
+
(z9^7 + z9^6 + z9^5 + z9^4 + z9 + 1, z9^6 + z9^5 + z9^3 + z9)
|
|
549
|
+
|
|
550
|
+
EXAMPLES::
|
|
551
|
+
|
|
552
|
+
sage: Fqm = GF(16)
|
|
553
|
+
sage: Fq = GF(4)
|
|
554
|
+
sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
555
|
+
sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
|
|
556
|
+
sage: E
|
|
557
|
+
Polynomial evaluation style encoder for
|
|
558
|
+
[2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
|
|
559
|
+
|
|
560
|
+
Alternatively, we can construct the encoder from ``C`` directly::
|
|
561
|
+
|
|
562
|
+
sage: E = C.encoder("PolynomialEvaluation")
|
|
563
|
+
sage: E
|
|
564
|
+
Polynomial evaluation style encoder for
|
|
565
|
+
[2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
|
|
566
|
+
"""
|
|
567
|
+
|
|
568
|
+
def __init__(self, code):
|
|
569
|
+
r"""
|
|
570
|
+
INPUT:
|
|
571
|
+
|
|
572
|
+
- ``code`` -- the associated code of this encoder
|
|
573
|
+
|
|
574
|
+
TESTS:
|
|
575
|
+
|
|
576
|
+
If the code is not a Gabidulin code, an error is raised::
|
|
577
|
+
|
|
578
|
+
sage: C = codes.HammingCode(GF(4), 2)
|
|
579
|
+
sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
|
|
580
|
+
Traceback (most recent call last):
|
|
581
|
+
...
|
|
582
|
+
ValueError: code has to be a Gabidulin code
|
|
583
|
+
"""
|
|
584
|
+
if not isinstance(code, GabidulinCode):
|
|
585
|
+
raise ValueError("code has to be a Gabidulin code")
|
|
586
|
+
super().__init__(code)
|
|
587
|
+
|
|
588
|
+
def _repr_(self):
|
|
589
|
+
"""
|
|
590
|
+
Return a string representation of ``self``.
|
|
591
|
+
|
|
592
|
+
EXAMPLES::
|
|
593
|
+
|
|
594
|
+
sage: Fqm = GF(5^20)
|
|
595
|
+
sage: Fq = GF(5^4)
|
|
596
|
+
sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
|
|
597
|
+
sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C); E
|
|
598
|
+
Polynomial evaluation style encoder for [4, 4, 1] linear Gabidulin code over GF(95367431640625)/GF(625)
|
|
599
|
+
"""
|
|
600
|
+
return "Polynomial evaluation style encoder for %s" % self.code()
|
|
601
|
+
|
|
602
|
+
def _latex_(self):
|
|
603
|
+
r"""
|
|
604
|
+
Return a latex representation of ``self``.
|
|
605
|
+
|
|
606
|
+
EXAMPLES::
|
|
607
|
+
|
|
608
|
+
sage: Fqm = GF(5^20)
|
|
609
|
+
sage: Fq = GF(5^4)
|
|
610
|
+
sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
|
|
611
|
+
sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
|
|
612
|
+
sage: latex(E)
|
|
613
|
+
\textnormal{Polynomial evaluation style encoder for } [4, 4, 1] \textnormal{ linear Gabidulin code over } \Bold{F}_{5^{20}}/\Bold{F}_{5^{4}}
|
|
614
|
+
"""
|
|
615
|
+
return "\\textnormal{Polynomial evaluation style encoder for } %s" % self.code()._latex_()
|
|
616
|
+
|
|
617
|
+
def __eq__(self, other):
|
|
618
|
+
"""
|
|
619
|
+
Test equality between Gabidulin Polynomial Evaluation Encoder objects.
|
|
620
|
+
|
|
621
|
+
INPUT:
|
|
622
|
+
|
|
623
|
+
- ``other`` -- another Gabidulin Polynomial Evaluation Encoder
|
|
624
|
+
|
|
625
|
+
OUTPUT: boolean
|
|
626
|
+
|
|
627
|
+
EXAMPLES::
|
|
628
|
+
|
|
629
|
+
sage: Fqm = GF(16)
|
|
630
|
+
sage: Fq = GF(4)
|
|
631
|
+
sage: C1 = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
632
|
+
sage: E1 = codes.encoders.GabidulinPolynomialEvaluationEncoder(C1)
|
|
633
|
+
sage: C2 = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
634
|
+
sage: E2 = codes.encoders.GabidulinPolynomialEvaluationEncoder(C2)
|
|
635
|
+
sage: E1.__eq__(E2)
|
|
636
|
+
True
|
|
637
|
+
|
|
638
|
+
sage: Fqmm = GF(64)
|
|
639
|
+
sage: C3 = codes.GabidulinCode(Fqmm, 2, 2, Fq)
|
|
640
|
+
sage: E3 = codes.encoders.GabidulinPolynomialEvaluationEncoder(C3)
|
|
641
|
+
sage: E3.__eq__(E2)
|
|
642
|
+
False
|
|
643
|
+
"""
|
|
644
|
+
return isinstance(other, GabidulinPolynomialEvaluationEncoder) \
|
|
645
|
+
and self.code() == other.code()
|
|
646
|
+
|
|
647
|
+
def message_space(self):
|
|
648
|
+
r"""
|
|
649
|
+
Return the message space of the associated code of ``self``.
|
|
650
|
+
|
|
651
|
+
EXAMPLES::
|
|
652
|
+
|
|
653
|
+
sage: Fqm = GF(5^20)
|
|
654
|
+
sage: Fq = GF(5^4)
|
|
655
|
+
sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
|
|
656
|
+
sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
|
|
657
|
+
sage: E.message_space()
|
|
658
|
+
Ore Polynomial Ring in x over Finite Field in z20 of size 5^20
|
|
659
|
+
twisted by z20 |--> z20^(5^4)
|
|
660
|
+
"""
|
|
661
|
+
C = self.code()
|
|
662
|
+
return C.base_field()['x', C.twisting_homomorphism()]
|
|
663
|
+
|
|
664
|
+
def encode(self, p, form='vector'):
|
|
665
|
+
"""
|
|
666
|
+
Transform the polynomial ``p`` into a codeword of :meth:`code`.
|
|
667
|
+
|
|
668
|
+
The output codeword can be represented as a vector or a matrix,
|
|
669
|
+
depending on the ``form`` input.
|
|
670
|
+
|
|
671
|
+
INPUT:
|
|
672
|
+
|
|
673
|
+
- ``p`` -- a skew polynomial from the message space of ``self`` of degree
|
|
674
|
+
less than ``self.code().dimension()``
|
|
675
|
+
|
|
676
|
+
- ``form`` -- type parameter taking strings "vector" or "matrix"
|
|
677
|
+
as values and converting the output codeword into the respective form
|
|
678
|
+
(default: ``'vector'``)
|
|
679
|
+
|
|
680
|
+
OUTPUT: a codeword corresponding to `p` in vector or matrix form
|
|
681
|
+
|
|
682
|
+
EXAMPLES::
|
|
683
|
+
|
|
684
|
+
sage: Fqm = GF(2^9)
|
|
685
|
+
sage: Fq = GF(2^3)
|
|
686
|
+
sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
687
|
+
sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
|
|
688
|
+
sage: S.<x> = Fqm['x', C.twisting_homomorphism()]
|
|
689
|
+
sage: z9 = Fqm.gen()
|
|
690
|
+
sage: p = (z9^6 + z9^2 + z9 + 1)*x + z9^7 + z9^5 + z9^4 + z9^2
|
|
691
|
+
sage: codeword_vector = E.encode(p, "vector"); codeword_vector
|
|
692
|
+
(z9^7 + z9^6 + z9^5 + z9^4 + z9 + 1, z9^6 + z9^5 + z9^3 + z9)
|
|
693
|
+
sage: codeword_matrix = E.encode(p, "matrix"); codeword_matrix
|
|
694
|
+
[ z3 z3^2 + z3]
|
|
695
|
+
[ z3 1]
|
|
696
|
+
[ z3^2 z3^2 + z3 + 1]
|
|
697
|
+
|
|
698
|
+
TESTS:
|
|
699
|
+
|
|
700
|
+
If the skew polynomial, `p`, has degree greater than or equal to the
|
|
701
|
+
dimension of the code, an error is raised::
|
|
702
|
+
|
|
703
|
+
sage: t = z9^4*x^2 + z9
|
|
704
|
+
sage: codeword_vector = E.encode(t, "vector"); codeword_vector
|
|
705
|
+
Traceback (most recent call last):
|
|
706
|
+
...
|
|
707
|
+
ValueError: the skew polynomial to encode must have degree at most 1
|
|
708
|
+
|
|
709
|
+
The skew polynomial, `p`, must belong to the message space of the code.
|
|
710
|
+
Otherwise, an error is raised::
|
|
711
|
+
|
|
712
|
+
sage: Fqmm = GF(2^12)
|
|
713
|
+
sage: S.<x> = Fqmm['x', Fqmm.frobenius_endomorphism(n=3)]
|
|
714
|
+
sage: q = S.random_element(degree=2)
|
|
715
|
+
sage: codeword_vector = E.encode(q, "vector"); codeword_vector
|
|
716
|
+
Traceback (most recent call last):
|
|
717
|
+
...
|
|
718
|
+
ValueError: the message to encode must be in Ore Polynomial Ring in x over Finite Field in z9 of size 2^9 twisted by z9 |--> z9^(2^3)
|
|
719
|
+
"""
|
|
720
|
+
C = self.code()
|
|
721
|
+
M = self.message_space()
|
|
722
|
+
if p not in M:
|
|
723
|
+
raise ValueError("the message to encode must be in %s" % M)
|
|
724
|
+
if p.degree() >= C.dimension():
|
|
725
|
+
raise ValueError("the skew polynomial to encode must have degree at most %s" % (C.dimension() - 1))
|
|
726
|
+
eval_pts = C.evaluation_points()
|
|
727
|
+
codeword = p.multi_point_evaluation(eval_pts)
|
|
728
|
+
if form == "vector":
|
|
729
|
+
return vector(codeword)
|
|
730
|
+
elif form == "matrix":
|
|
731
|
+
return C.matrix_form_of_vector(vector(codeword))
|
|
732
|
+
else:
|
|
733
|
+
return ValueError("the argument 'form' takes only either 'vector' or 'matrix' as valid input")
|
|
734
|
+
|
|
735
|
+
def unencode_nocheck(self, c):
|
|
736
|
+
"""
|
|
737
|
+
Return the message corresponding to the codeword ``c``.
|
|
738
|
+
|
|
739
|
+
Use this method with caution: it does not check if ``c``
|
|
740
|
+
belongs to the code, and if this is not the case, the output is
|
|
741
|
+
unspecified.
|
|
742
|
+
|
|
743
|
+
INPUT:
|
|
744
|
+
|
|
745
|
+
- ``c`` -- a codeword of :meth:`code`
|
|
746
|
+
|
|
747
|
+
OUTPUT:
|
|
748
|
+
|
|
749
|
+
- a skew polynomial of degree less than ``self.code().dimension()``
|
|
750
|
+
|
|
751
|
+
EXAMPLES::
|
|
752
|
+
|
|
753
|
+
sage: Fqm = GF(2^9)
|
|
754
|
+
sage: Fq = GF(2^3)
|
|
755
|
+
sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
756
|
+
sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
|
|
757
|
+
sage: S.<x> = Fqm['x', C.twisting_homomorphism()]
|
|
758
|
+
sage: z9 = Fqm.gen()
|
|
759
|
+
sage: p = (z9^6 + z9^4)*x + z9^2 + z9
|
|
760
|
+
sage: codeword_vector = E.encode(p, "vector")
|
|
761
|
+
sage: E.unencode_nocheck(codeword_vector)
|
|
762
|
+
(z9^6 + z9^4)*x + z9^2 + z9
|
|
763
|
+
"""
|
|
764
|
+
C = self.code()
|
|
765
|
+
eval_pts = C.evaluation_points()
|
|
766
|
+
values = [c[i] for i in range(len(c))]
|
|
767
|
+
points = [(eval_pts[i], values[i]) for i in range(len(eval_pts))]
|
|
768
|
+
p = self.message_space().lagrange_polynomial(points)
|
|
769
|
+
return p
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
# ---------------------- decoders ------------------------------
|
|
773
|
+
|
|
774
|
+
|
|
775
|
+
class GabidulinGaoDecoder(Decoder):
|
|
776
|
+
|
|
777
|
+
def __init__(self, code):
|
|
778
|
+
r"""
|
|
779
|
+
Gao style decoder for Gabidulin Codes.
|
|
780
|
+
|
|
781
|
+
INPUT:
|
|
782
|
+
|
|
783
|
+
- ``code`` -- the associated code of this decoder
|
|
784
|
+
|
|
785
|
+
EXAMPLES::
|
|
786
|
+
|
|
787
|
+
sage: Fqm = GF(16)
|
|
788
|
+
sage: Fq = GF(4)
|
|
789
|
+
sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
790
|
+
sage: D = codes.decoders.GabidulinGaoDecoder(C)
|
|
791
|
+
sage: D
|
|
792
|
+
Gao decoder for [2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
|
|
793
|
+
|
|
794
|
+
Alternatively, we can construct the encoder from ``C`` directly::
|
|
795
|
+
|
|
796
|
+
sage: D = C.decoder("Gao")
|
|
797
|
+
sage: D
|
|
798
|
+
Gao decoder for [2, 2, 1] linear Gabidulin code over GF(16)/GF(4)
|
|
799
|
+
|
|
800
|
+
TESTS:
|
|
801
|
+
|
|
802
|
+
If the code is not a Gabidulin code, an error is raised::
|
|
803
|
+
|
|
804
|
+
sage: C = codes.HammingCode(GF(4), 2)
|
|
805
|
+
sage: D = codes.decoders.GabidulinGaoDecoder(C)
|
|
806
|
+
Traceback (most recent call last):
|
|
807
|
+
...
|
|
808
|
+
ValueError: code has to be a Gabidulin code
|
|
809
|
+
"""
|
|
810
|
+
if not isinstance(code, GabidulinCode):
|
|
811
|
+
raise ValueError("code has to be a Gabidulin code")
|
|
812
|
+
super().__init__(code, code.ambient_space(), "PolynomialEvaluation")
|
|
813
|
+
|
|
814
|
+
def _repr_(self):
|
|
815
|
+
"""
|
|
816
|
+
Return a string representation of ``self``.
|
|
817
|
+
|
|
818
|
+
EXAMPLES::
|
|
819
|
+
|
|
820
|
+
sage: Fqm = GF(5^20)
|
|
821
|
+
sage: Fq = GF(5^4)
|
|
822
|
+
sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
|
|
823
|
+
sage: D = codes.decoders.GabidulinGaoDecoder(C); D
|
|
824
|
+
Gao decoder for [4, 4, 1] linear Gabidulin code over GF(95367431640625)/GF(625)
|
|
825
|
+
"""
|
|
826
|
+
return "Gao decoder for %s" % self.code()
|
|
827
|
+
|
|
828
|
+
def _latex_(self):
|
|
829
|
+
r"""
|
|
830
|
+
Return a latex representation of ``self``.
|
|
831
|
+
|
|
832
|
+
EXAMPLES::
|
|
833
|
+
|
|
834
|
+
sage: Fqm = GF(5^20)
|
|
835
|
+
sage: Fq = GF(5^4)
|
|
836
|
+
sage: C = codes.GabidulinCode(Fqm, 4, 4, Fq)
|
|
837
|
+
sage: D = codes.decoders.GabidulinGaoDecoder(C)
|
|
838
|
+
sage: latex(D)
|
|
839
|
+
\textnormal{Gao decoder for } [4, 4, 1] \textnormal{ linear Gabidulin code over } \Bold{F}_{5^{20}}/\Bold{F}_{5^{4}}
|
|
840
|
+
"""
|
|
841
|
+
return "\\textnormal{Gao decoder for } %s" % self.code()._latex_()
|
|
842
|
+
|
|
843
|
+
def __eq__(self, other) -> bool:
|
|
844
|
+
"""
|
|
845
|
+
Test equality between Gabidulin Gao Decoder objects.
|
|
846
|
+
|
|
847
|
+
INPUT:
|
|
848
|
+
|
|
849
|
+
- ``other`` -- another Gabidulin Gao Decoder
|
|
850
|
+
|
|
851
|
+
OUTPUT: boolean
|
|
852
|
+
|
|
853
|
+
EXAMPLES::
|
|
854
|
+
|
|
855
|
+
sage: Fqm = GF(16)
|
|
856
|
+
sage: Fq = GF(4)
|
|
857
|
+
sage: C1 = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
858
|
+
sage: D1 = codes.decoders.GabidulinGaoDecoder(C1)
|
|
859
|
+
sage: C2 = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
860
|
+
sage: D2 = codes.decoders.GabidulinGaoDecoder(C2)
|
|
861
|
+
sage: D1.__eq__(D2)
|
|
862
|
+
True
|
|
863
|
+
|
|
864
|
+
sage: Fqmm = GF(64)
|
|
865
|
+
sage: C3 = codes.GabidulinCode(Fqmm, 2, 2, Fq)
|
|
866
|
+
sage: D3 = codes.decoders.GabidulinGaoDecoder(C3)
|
|
867
|
+
sage: D3.__eq__(D2)
|
|
868
|
+
False
|
|
869
|
+
"""
|
|
870
|
+
return isinstance(other, GabidulinGaoDecoder) \
|
|
871
|
+
and self.code() == other.code()
|
|
872
|
+
|
|
873
|
+
def _partial_xgcd(self, a, b, d_stop):
|
|
874
|
+
"""
|
|
875
|
+
Compute the partial gcd of `a` and `b` using the right linearized
|
|
876
|
+
extended Euclidean algorithm up to the `d_stop` iterations. This
|
|
877
|
+
is a private method for internal use only.
|
|
878
|
+
|
|
879
|
+
INPUT:
|
|
880
|
+
|
|
881
|
+
- ``a`` -- a skew polynomial
|
|
882
|
+
|
|
883
|
+
- ``b`` -- another skew polynomial
|
|
884
|
+
|
|
885
|
+
- ``d_stop`` -- the number of iterations for which the algorithm
|
|
886
|
+
is to be run
|
|
887
|
+
|
|
888
|
+
OUTPUT: ``r_c`` -- right linearized remainder of `a` and `b`
|
|
889
|
+
|
|
890
|
+
- ``u_c`` -- right linearized quotient of `a` and `b`
|
|
891
|
+
|
|
892
|
+
EXAMPLES::
|
|
893
|
+
|
|
894
|
+
sage: Fqm = GF(2^9)
|
|
895
|
+
sage: Fq = GF(2^3)
|
|
896
|
+
sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
897
|
+
sage: D = codes.decoders.GabidulinGaoDecoder(C)
|
|
898
|
+
sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
|
|
899
|
+
sage: S.<x> = Fqm['x', C.twisting_homomorphism()]
|
|
900
|
+
sage: z9 = Fqm.gen()
|
|
901
|
+
sage: p = (z9^6 + z9^4)*x + z9^2 + z9
|
|
902
|
+
sage: codeword_vector = E.encode(p, "vector")
|
|
903
|
+
sage: r = D.decode_to_message(codeword_vector) #indirect_doctest
|
|
904
|
+
sage: r
|
|
905
|
+
(z9^6 + z9^4)*x + z9^2 + z9
|
|
906
|
+
"""
|
|
907
|
+
S = self.message_space()
|
|
908
|
+
if (a not in S) or (b not in S):
|
|
909
|
+
raise ValueError("both the input polynomials must belong to %s" % S)
|
|
910
|
+
if a.degree() < b.degree():
|
|
911
|
+
raise ValueError("degree of first polynomial must be greater than or equal to degree of second polynomial")
|
|
912
|
+
r_p = a
|
|
913
|
+
r_c = b
|
|
914
|
+
u_p = S.zero()
|
|
915
|
+
u_c = S.one()
|
|
916
|
+
v_p = u_c
|
|
917
|
+
v_c = u_p
|
|
918
|
+
|
|
919
|
+
while r_c.degree() >= d_stop:
|
|
920
|
+
(q, r_c), r_p = r_p.right_quo_rem(r_c), r_c
|
|
921
|
+
u_c, u_p = u_p - q * u_c, u_c
|
|
922
|
+
v_c, v_p = v_p - q * v_c, v_c
|
|
923
|
+
return r_c, u_c
|
|
924
|
+
|
|
925
|
+
def _decode_to_code_and_message(self, r):
|
|
926
|
+
"""
|
|
927
|
+
Return the decoded codeword and message (skew polynomial)
|
|
928
|
+
corresponding to the received codeword `r`. This is a
|
|
929
|
+
private method for internal use only.
|
|
930
|
+
|
|
931
|
+
INPUT:
|
|
932
|
+
|
|
933
|
+
- ``r`` -- received codeword
|
|
934
|
+
|
|
935
|
+
OUTPUT:
|
|
936
|
+
|
|
937
|
+
- the decoded codeword and decoded message corresponding to
|
|
938
|
+
the received codeword `r`
|
|
939
|
+
|
|
940
|
+
EXAMPLES::
|
|
941
|
+
|
|
942
|
+
sage: Fqm = GF(2^9)
|
|
943
|
+
sage: Fq = GF(2^3)
|
|
944
|
+
sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
945
|
+
sage: D = codes.decoders.GabidulinGaoDecoder(C)
|
|
946
|
+
sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
|
|
947
|
+
sage: S.<x> = Fqm['x', C.twisting_homomorphism()]
|
|
948
|
+
sage: z9 = Fqm.gen()
|
|
949
|
+
sage: p = (z9^6 + z9^4)*x + z9^2 + z9
|
|
950
|
+
sage: codeword_vector = E.encode(p, "vector")
|
|
951
|
+
sage: r = D.decode_to_message(codeword_vector) #indirect doctest
|
|
952
|
+
sage: r
|
|
953
|
+
(z9^6 + z9^4)*x + z9^2 + z9
|
|
954
|
+
"""
|
|
955
|
+
C = self.code()
|
|
956
|
+
length = len(r)
|
|
957
|
+
eval_pts = C.evaluation_points()
|
|
958
|
+
S = self.message_space()
|
|
959
|
+
|
|
960
|
+
if length == C.dimension() or r in C:
|
|
961
|
+
return r, self.connected_encoder().unencode_nocheck(r)
|
|
962
|
+
|
|
963
|
+
points = [(eval_pts[i], r[i]) for i in range(len(eval_pts))]
|
|
964
|
+
# R = S.lagrange_polynomial(eval_pts, list(r))
|
|
965
|
+
R = S.lagrange_polynomial(points)
|
|
966
|
+
r_out, u_out = self._partial_xgcd(S.minimal_vanishing_polynomial(eval_pts),
|
|
967
|
+
R, (C.length() + C.dimension()) // 2)
|
|
968
|
+
quo, rem = r_out.left_quo_rem(u_out)
|
|
969
|
+
if not rem.is_zero():
|
|
970
|
+
raise DecodingError("Decoding failed because the number of errors exceeded the decoding radius")
|
|
971
|
+
if quo not in S:
|
|
972
|
+
raise DecodingError("Decoding failed because the number of errors exceeded the decoding radius")
|
|
973
|
+
c = self.connected_encoder().encode(quo)
|
|
974
|
+
if C.rank_weight_of_vector(c - r) > self.decoding_radius():
|
|
975
|
+
raise DecodingError("Decoding failed because the number of errors exceeded the decoding radius")
|
|
976
|
+
return c, quo
|
|
977
|
+
|
|
978
|
+
def decode_to_code(self, r):
|
|
979
|
+
"""
|
|
980
|
+
Return the decoded codeword corresponding to the
|
|
981
|
+
received word `r`.
|
|
982
|
+
|
|
983
|
+
INPUT:
|
|
984
|
+
|
|
985
|
+
- ``r`` -- received codeword
|
|
986
|
+
|
|
987
|
+
OUTPUT: the decoded codeword corresponding to the received codeword
|
|
988
|
+
|
|
989
|
+
EXAMPLES::
|
|
990
|
+
|
|
991
|
+
sage: Fqm = GF(3^20)
|
|
992
|
+
sage: Fq = GF(3)
|
|
993
|
+
sage: C = codes.GabidulinCode(Fqm, 5, 3, Fq)
|
|
994
|
+
sage: D = codes.decoders.GabidulinGaoDecoder(C)
|
|
995
|
+
sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
|
|
996
|
+
sage: S.<x> = Fqm['x', C.twisting_homomorphism()]
|
|
997
|
+
sage: z20 = Fqm.gen()
|
|
998
|
+
sage: p = x
|
|
999
|
+
sage: codeword_vector = E.encode(p, "vector")
|
|
1000
|
+
sage: codeword_vector
|
|
1001
|
+
(1, z20^3, z20^6, z20^9, z20^12)
|
|
1002
|
+
sage: l = list(codeword_vector)
|
|
1003
|
+
sage: l[0] = l[1] #make an error
|
|
1004
|
+
sage: D.decode_to_code(vector(l))
|
|
1005
|
+
(1, z20^3, z20^6, z20^9, z20^12)
|
|
1006
|
+
"""
|
|
1007
|
+
return self._decode_to_code_and_message(r)[0]
|
|
1008
|
+
|
|
1009
|
+
def decode_to_message(self, r):
|
|
1010
|
+
"""
|
|
1011
|
+
Return the skew polynomial (message) corresponding to the
|
|
1012
|
+
received word `r`.
|
|
1013
|
+
|
|
1014
|
+
INPUT:
|
|
1015
|
+
|
|
1016
|
+
- ``r`` -- received codeword
|
|
1017
|
+
|
|
1018
|
+
OUTPUT: the message corresponding to the received codeword
|
|
1019
|
+
|
|
1020
|
+
EXAMPLES::
|
|
1021
|
+
|
|
1022
|
+
sage: Fqm = GF(2^9)
|
|
1023
|
+
sage: Fq = GF(2^3)
|
|
1024
|
+
sage: C = codes.GabidulinCode(Fqm, 2, 2, Fq)
|
|
1025
|
+
sage: D = codes.decoders.GabidulinGaoDecoder(C)
|
|
1026
|
+
sage: E = codes.encoders.GabidulinPolynomialEvaluationEncoder(C)
|
|
1027
|
+
sage: S.<x> = Fqm['x', C.twisting_homomorphism()]
|
|
1028
|
+
sage: z9 = Fqm.gen()
|
|
1029
|
+
sage: p = (z9^6 + z9^4)*x + z9^2 + z9
|
|
1030
|
+
sage: codeword_vector = E.encode(p, "vector")
|
|
1031
|
+
sage: r = D.decode_to_message(codeword_vector)
|
|
1032
|
+
sage: r
|
|
1033
|
+
(z9^6 + z9^4)*x + z9^2 + z9
|
|
1034
|
+
"""
|
|
1035
|
+
return self._decode_to_code_and_message(r)[1]
|
|
1036
|
+
|
|
1037
|
+
def decoding_radius(self):
|
|
1038
|
+
"""
|
|
1039
|
+
Return the decoding radius of the Gabidulin Gao Decoder.
|
|
1040
|
+
|
|
1041
|
+
EXAMPLES::
|
|
1042
|
+
|
|
1043
|
+
sage: Fqm = GF(5^20)
|
|
1044
|
+
sage: Fq = GF(5)
|
|
1045
|
+
sage: C = codes.GabidulinCode(Fqm, 20, 4, Fq)
|
|
1046
|
+
sage: D = codes.decoders.GabidulinGaoDecoder(C)
|
|
1047
|
+
sage: D.decoding_radius()
|
|
1048
|
+
8
|
|
1049
|
+
"""
|
|
1050
|
+
return (self.code().minimum_distance() - 1) // 2
|
|
1051
|
+
|
|
1052
|
+
# ----------------------------- registration --------------------------------
|
|
1053
|
+
|
|
1054
|
+
|
|
1055
|
+
GabidulinCode._registered_encoders["PolynomialEvaluation"] = GabidulinPolynomialEvaluationEncoder
|
|
1056
|
+
GabidulinCode._registered_encoders["VectorEvaluation"] = GabidulinVectorEvaluationEncoder
|
|
1057
|
+
|
|
1058
|
+
GabidulinCode._registered_decoders["Gao"] = GabidulinGaoDecoder
|