passagemath-modules 10.6.31rc3__cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_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 +806 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +6 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgfortran-e1b7dfc8.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-93ebf16a.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-e3525837.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-c5c421e1.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-e0f11cf3.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-4c5b64b1.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-aarch64-linux-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-aarch64-linux-gnu.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-gnu.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-gnu.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-aarch64-linux-gnu.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-aarch64-linux-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-aarch64-linux-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-aarch64-linux-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-aarch64-linux-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.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-gnu.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-aarch64-linux-gnu.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-gnu.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-gnu.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-aarch64-linux-gnu.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-gnu.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,1108 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.modules sage.rings.finite_rings
|
|
3
|
+
r"""
|
|
4
|
+
Codes
|
|
5
|
+
|
|
6
|
+
Class supporting methods available for any type of code (linear, non-linear) and
|
|
7
|
+
over any metric (Hamming, rank).
|
|
8
|
+
|
|
9
|
+
There are further abstract classes representing certain types of codes. For
|
|
10
|
+
linear codes,
|
|
11
|
+
:class:`~sage.coding.linear_code_no_metric.AbstractLinearCodeNoMetric` contains
|
|
12
|
+
all the methods that any linear code can use regardless of its metric.
|
|
13
|
+
Inheriting from this class are base classes for linear codes over specific
|
|
14
|
+
metrics. For example, :class:`~sage.coding.linear_code.AbstractLinearCode` is a
|
|
15
|
+
base class for all linear codes over the Hamming metric.
|
|
16
|
+
|
|
17
|
+
Take the class :class:`~sage.coding.hamming_code.HammingCode`. This
|
|
18
|
+
class inherits from :class:`~sage.coding.linear_code.AbstractLinearCode`, since
|
|
19
|
+
it is a linear code over the Hamming metric.
|
|
20
|
+
:class:`~sage.coding.linear_code.AbstractLinearCode` then inherits from
|
|
21
|
+
:class:`~sage.coding.linear_code_no_metric.AbstractLinearCodeNoMetric`, since it
|
|
22
|
+
is a linear code. Finally, this class inherits from
|
|
23
|
+
:class:`~sage.coding.abstract_code.AbstractCode`, since it is a code.
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
The following diagram shows the inheritance relationship in the coding module::
|
|
27
|
+
|
|
28
|
+
AbstractCode
|
|
29
|
+
+ AbstractLinearCodeNoMetric
|
|
30
|
+
| + AbstractLinearCode
|
|
31
|
+
| | + ParityCheckCode
|
|
32
|
+
| | + HammingCode
|
|
33
|
+
| | + CyclicCode
|
|
34
|
+
| | + BCHCode
|
|
35
|
+
| | + GolayCode
|
|
36
|
+
| | + ReedMullerCode
|
|
37
|
+
| | + GeneralizedReedSolomonCode
|
|
38
|
+
| | + GoppaCode
|
|
39
|
+
| + AbstractLinearRankMetricCode
|
|
40
|
+
|
|
41
|
+
Any class inheriting from AbstractCode can use the encode/decode framework.
|
|
42
|
+
|
|
43
|
+
The encoder/decoder framework within the coding module offers the creation and
|
|
44
|
+
use of encoders/decoders independently of codes. An encoder encodes a message
|
|
45
|
+
into a codeword. A decoder decodes a word into a codeword or a message,
|
|
46
|
+
possibly with error-correction.
|
|
47
|
+
|
|
48
|
+
Instead of creating specific encoders/decoders for every code family, some
|
|
49
|
+
encoders/decoders can be used by multiple code families. The encoder/decoder
|
|
50
|
+
framework enables just that. For example,
|
|
51
|
+
:class:`~sage.coding.linear_code.LinearCodeGeneratorMatrixEncoder`
|
|
52
|
+
can be used by any code that has a generator matrix. Similarly,
|
|
53
|
+
:class:`~sage.coding.linear_code.LinearCodeNearestNeighborDecoder` can be used
|
|
54
|
+
for any linear code with Hamming metric.
|
|
55
|
+
|
|
56
|
+
When creating a new code family, investigate the encoder/decoder catalogs,
|
|
57
|
+
``codes.encoders`` and ``codes.decoders``, to see if there are suitable
|
|
58
|
+
encoders/decoders for your code family already implemented. If this is the case,
|
|
59
|
+
follow the instructions in :class:`AbstractCode` to set these up.
|
|
60
|
+
|
|
61
|
+
A new encoder must have the following methods:
|
|
62
|
+
|
|
63
|
+
- ``encode`` -- method encoding a message into a codeword
|
|
64
|
+
- ``unencode`` -- method decoding a codeword into a message
|
|
65
|
+
- ``message_space`` -- ambient space of messages that can be encoded
|
|
66
|
+
- ``code`` -- code of the encoder
|
|
67
|
+
|
|
68
|
+
For more information about the Encoder class, see
|
|
69
|
+
:class:`~sage.coding.encoder.Encoder`
|
|
70
|
+
|
|
71
|
+
A new decoder must have the following methods:
|
|
72
|
+
|
|
73
|
+
- ``decode_to_code`` or ``decode_to_message`` -- method decoding a word from the
|
|
74
|
+
input space into either a codeword or a message
|
|
75
|
+
- ``input_space`` -- ambient space of words that can be decoded
|
|
76
|
+
- ``code`` -- code of the decoder
|
|
77
|
+
|
|
78
|
+
For more information about the Decoder class, see
|
|
79
|
+
:class:`~sage.coding.decoder.Decoder`
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
from sage.structure.parent import Parent
|
|
83
|
+
from sage.misc.cachefunc import cached_method
|
|
84
|
+
from copy import copy
|
|
85
|
+
from sage.rings.integer import Integer
|
|
86
|
+
|
|
87
|
+
import inspect
|
|
88
|
+
from sage.misc.sageinspect import sage_getargspec
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _explain_constructor(cl):
|
|
92
|
+
r"""
|
|
93
|
+
Internal function for use error messages when constructing encoders and decoders.
|
|
94
|
+
|
|
95
|
+
EXAMPLES::
|
|
96
|
+
|
|
97
|
+
sage: from sage.coding.linear_code import LinearCodeSyndromeDecoder
|
|
98
|
+
sage: from sage.coding.abstract_code import _explain_constructor
|
|
99
|
+
sage: cl = LinearCodeSyndromeDecoder
|
|
100
|
+
sage: _explain_constructor(cl)
|
|
101
|
+
"The constructor requires no arguments.\nIt takes the optional
|
|
102
|
+
arguments ['maximum_error_weight'].\nSee the documentation of
|
|
103
|
+
sage.coding.linear_code.LinearCodeSyndromeDecoder for more details."
|
|
104
|
+
|
|
105
|
+
sage: from sage.coding.information_set_decoder import LinearCodeInformationSetDecoder
|
|
106
|
+
sage: cl = LinearCodeInformationSetDecoder
|
|
107
|
+
sage: _explain_constructor(cl)
|
|
108
|
+
"The constructor requires the arguments ['number_errors'].\nIt takes the optional arguments ['algorithm'].\nIt accepts unspecified arguments as well.\nSee the documentation of sage.coding.information_set_decoder.LinearCodeInformationSetDecoder for more details."
|
|
109
|
+
"""
|
|
110
|
+
if inspect.isclass(cl):
|
|
111
|
+
argspec = sage_getargspec(cl.__init__)
|
|
112
|
+
skip = 2 # skip the self and code arguments
|
|
113
|
+
else:
|
|
114
|
+
# Not a class, assume it's a factory function posing as a class
|
|
115
|
+
argspec = sage_getargspec(cl)
|
|
116
|
+
skip = 1 # skip code argument
|
|
117
|
+
if argspec.defaults:
|
|
118
|
+
args = argspec.args[skip:-len(argspec.defaults)]
|
|
119
|
+
kwargs = argspec.args[-len(argspec.defaults):]
|
|
120
|
+
opts = "It takes the optional arguments {}.".format(kwargs)
|
|
121
|
+
else:
|
|
122
|
+
args = argspec.args[skip:]
|
|
123
|
+
opts = "It takes no optional arguments."
|
|
124
|
+
if args:
|
|
125
|
+
reqs = "The constructor requires the arguments {}.".format(args)
|
|
126
|
+
else:
|
|
127
|
+
reqs = "The constructor requires no arguments."
|
|
128
|
+
if argspec.varargs or argspec.varkw:
|
|
129
|
+
var = "It accepts unspecified arguments as well.\n"
|
|
130
|
+
else:
|
|
131
|
+
var = ""
|
|
132
|
+
return ("{}\n{}\n{}See the documentation of {}.{} for more details."
|
|
133
|
+
.format(reqs, opts, var, cl.__module__, cl.__name__))
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class AbstractCode(Parent):
|
|
137
|
+
r"""
|
|
138
|
+
Abstract class for codes.
|
|
139
|
+
|
|
140
|
+
This class contains all the methods that can be used on any code
|
|
141
|
+
and on any code family. As opposed to
|
|
142
|
+
:class:`sage.coding.linear_code.AbstractLinearCode`, this class makes no
|
|
143
|
+
assumptions about linearity, metric, finiteness or the number of alphabets.
|
|
144
|
+
|
|
145
|
+
The abstract notion of "code" that is implicitly used for this class is any
|
|
146
|
+
enumerable subset of a cartesian product `A_1 \times A_2 \times \ldots
|
|
147
|
+
\times A_n` for some sets `A_i`. Note that this class makes no attempt to
|
|
148
|
+
directly represent the code in this fashion, allowing subclasses to make the
|
|
149
|
+
appropriate choices. The notion of metric is also not mathematically
|
|
150
|
+
enforced in any way, and is simply stored as a string value.
|
|
151
|
+
|
|
152
|
+
Every code-related class should inherit from this abstract class.
|
|
153
|
+
|
|
154
|
+
To implement a code, you need to:
|
|
155
|
+
|
|
156
|
+
- inherit from :class:`AbstractCode`
|
|
157
|
+
|
|
158
|
+
- call :class:`AbstractCode` ``__init__`` method in the subclass constructor.
|
|
159
|
+
Example: ``super().__init__(length, "EncoderName",
|
|
160
|
+
"DecoderName", "metric")``. "EncoderName" and "DecoderName" are set to
|
|
161
|
+
``None`` by default, a generic code class such as AbstractCode does
|
|
162
|
+
not necessarily have to have general encoders/decoders. However, if you
|
|
163
|
+
want to use the encoding/decoding methods, you have to add these.
|
|
164
|
+
|
|
165
|
+
- since this class does not specify any category, it is highly recommended
|
|
166
|
+
to set up the category framework in the subclass. To do this, use the
|
|
167
|
+
``Parent.__init__(self, base, facade, category)`` function in the subclass
|
|
168
|
+
constructor. A good example is in
|
|
169
|
+
:class:`sage.coding.linear_code.AbstractLinearCode`.
|
|
170
|
+
|
|
171
|
+
- it is also recommended to override the ``ambient_space`` method, which is
|
|
172
|
+
required by ``__call__``
|
|
173
|
+
|
|
174
|
+
- to use the encoder/decoder framework, one has to set up the category and
|
|
175
|
+
related functions ``__iter__`` and ``__contains__``. A good example is in
|
|
176
|
+
:class:`sage.coding.linear_code.AbstractLinearCode`.
|
|
177
|
+
|
|
178
|
+
- add the following two lines on the class level::
|
|
179
|
+
|
|
180
|
+
_registered_encoders = {}
|
|
181
|
+
_registered_decoders = {}
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
- fill the dictionary of its encoders in ``sage.coding.__init__.py`` file.
|
|
185
|
+
Example: I want to link the encoder ``MyEncoderClass`` to ``MyNewCodeClass``
|
|
186
|
+
under the name ``MyEncoderName``.
|
|
187
|
+
All I need to do is to write this line in the ``__init__.py`` file:
|
|
188
|
+
``MyNewCodeClass._registered_encoders["NameOfMyEncoder"] = MyEncoderClass``
|
|
189
|
+
and all instances of ``MyNewCodeClass`` will be able to use instances of
|
|
190
|
+
``MyEncoderClass``.
|
|
191
|
+
|
|
192
|
+
- fill the dictionary of its decoders in ``sage.coding.__init__`` file.
|
|
193
|
+
Example: I want to link the encoder ``MyDecoderClass`` to ``MyNewCodeClass``
|
|
194
|
+
under the name ``MyDecoderName``.
|
|
195
|
+
All I need to do is to write this line in the ``__init__.py`` file:
|
|
196
|
+
``MyNewCodeClass._registered_decoders["NameOfMyDecoder"] = MyDecoderClass``
|
|
197
|
+
and all instances of ``MyNewCodeClass`` will be able to use instances of
|
|
198
|
+
``MyDecoderClass``.
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
As the class :class:`AbstractCode` is not designed to be instantiated, it
|
|
202
|
+
does not have any representation methods. You should implement ``_repr_``
|
|
203
|
+
and ``_latex_`` methods in the subclass.
|
|
204
|
+
"""
|
|
205
|
+
|
|
206
|
+
def __init__(self, length, default_encoder_name=None,
|
|
207
|
+
default_decoder_name=None, metric='Hamming'):
|
|
208
|
+
r"""
|
|
209
|
+
Initialize mandatory parameters that any code shares.
|
|
210
|
+
|
|
211
|
+
This method only exists for inheritance purposes as it initializes
|
|
212
|
+
parameters that need to be known by every code. The class
|
|
213
|
+
:class:`sage.coding.abstract_code.AbstractCode` should never be
|
|
214
|
+
directly instantiated.
|
|
215
|
+
|
|
216
|
+
INPUT:
|
|
217
|
+
|
|
218
|
+
- ``length`` -- the length of ``self`` (a Python int or a Sage Integer,
|
|
219
|
+
must be > 0)
|
|
220
|
+
|
|
221
|
+
- ``default_encoder_name`` -- (default: ``None``) the name of
|
|
222
|
+
the default encoder of ``self``
|
|
223
|
+
|
|
224
|
+
- ``default_decoder_name`` -- (default: ``None``) the name of
|
|
225
|
+
the default decoder of ``self``
|
|
226
|
+
|
|
227
|
+
- ``metric`` -- (default: ``Hamming``) the name of the metric of ``self``
|
|
228
|
+
|
|
229
|
+
EXAMPLES:
|
|
230
|
+
|
|
231
|
+
The following example demonstrates how to use a subclass of ``AbstractCode``
|
|
232
|
+
for representing a new family of codes::
|
|
233
|
+
|
|
234
|
+
sage: from sage.coding.abstract_code import AbstractCode
|
|
235
|
+
sage: class MyCodeFamily(AbstractCode):
|
|
236
|
+
....: def __init__(self, length):
|
|
237
|
+
....: super().__init__(length)
|
|
238
|
+
....: def __iter__(self):
|
|
239
|
+
....: for i in range(self.length() + 1):
|
|
240
|
+
....: yield vector([1 for j in range(i)] + [0 for k in range(i, self.length())])
|
|
241
|
+
....: def __contains__(self, word):
|
|
242
|
+
....: return word in list(self)
|
|
243
|
+
....: def _repr_(self):
|
|
244
|
+
....: return "Dummy code of length {}".format(self.length())
|
|
245
|
+
|
|
246
|
+
We now instantiate a member of our newly made code family::
|
|
247
|
+
|
|
248
|
+
sage: C = MyCodeFamily(6)
|
|
249
|
+
|
|
250
|
+
We can check its existence and parameters::
|
|
251
|
+
|
|
252
|
+
sage: C
|
|
253
|
+
Dummy code of length 6
|
|
254
|
+
|
|
255
|
+
We can list its elements and check if an element is in the code::
|
|
256
|
+
|
|
257
|
+
sage: list(C)
|
|
258
|
+
[(0, 0, 0, 0, 0, 0),
|
|
259
|
+
(1, 0, 0, 0, 0, 0),
|
|
260
|
+
(1, 1, 0, 0, 0, 0),
|
|
261
|
+
(1, 1, 1, 0, 0, 0),
|
|
262
|
+
(1, 1, 1, 1, 0, 0),
|
|
263
|
+
(1, 1, 1, 1, 1, 0),
|
|
264
|
+
(1, 1, 1, 1, 1, 1)]
|
|
265
|
+
sage: vector((0, 1, 0, 0, 0, 1)) in C
|
|
266
|
+
False
|
|
267
|
+
sage: vector((1, 1, 1, 0, 0, 0)) in C
|
|
268
|
+
True
|
|
269
|
+
|
|
270
|
+
And coming from AbstractCode code::
|
|
271
|
+
|
|
272
|
+
sage: C.metric()
|
|
273
|
+
'Hamming'
|
|
274
|
+
|
|
275
|
+
TESTS:
|
|
276
|
+
|
|
277
|
+
If the length field is neither a Python int nor a Sage Integer, it will
|
|
278
|
+
raise a exception::
|
|
279
|
+
|
|
280
|
+
sage: C = MyCodeFamily(10.0)
|
|
281
|
+
Traceback (most recent call last):
|
|
282
|
+
...
|
|
283
|
+
ValueError: length must be a Python int or a Sage Integer
|
|
284
|
+
|
|
285
|
+
If the length of the code is not a nonzero positive integer
|
|
286
|
+
(See :issue:`21326`), it will raise an exception::
|
|
287
|
+
|
|
288
|
+
sage: C = MyCodeFamily(0)
|
|
289
|
+
Traceback (most recent call last):
|
|
290
|
+
...
|
|
291
|
+
ValueError: length must be a nonzero positive integer
|
|
292
|
+
"""
|
|
293
|
+
|
|
294
|
+
if not isinstance(length, (int, Integer)):
|
|
295
|
+
raise ValueError("length must be a Python int or a Sage Integer")
|
|
296
|
+
if length <= 0:
|
|
297
|
+
raise ValueError("length must be a nonzero positive integer")
|
|
298
|
+
|
|
299
|
+
self._length = length
|
|
300
|
+
self._metric = metric
|
|
301
|
+
|
|
302
|
+
self._default_decoder_name = default_decoder_name
|
|
303
|
+
self._default_encoder_name = default_encoder_name
|
|
304
|
+
if not self._default_decoder_name:
|
|
305
|
+
self._registered_encoders = {}
|
|
306
|
+
if not self._default_encoder_name:
|
|
307
|
+
self._registered_decoders = {}
|
|
308
|
+
|
|
309
|
+
def __getstate__(self):
|
|
310
|
+
"""
|
|
311
|
+
Used for pickling codes.
|
|
312
|
+
|
|
313
|
+
TESTS::
|
|
314
|
+
|
|
315
|
+
sage: C = codes.HammingCode(GF(2), 3)
|
|
316
|
+
sage: '_registered_encoders' in C.__getstate__()
|
|
317
|
+
True
|
|
318
|
+
"""
|
|
319
|
+
d = super().__getstate__()
|
|
320
|
+
d['_registered_encoders'] = self._registered_encoders
|
|
321
|
+
d['_registered_decoders'] = self._registered_decoders
|
|
322
|
+
return d
|
|
323
|
+
|
|
324
|
+
def __iter__(self):
|
|
325
|
+
r"""
|
|
326
|
+
Return an error message requiring to override ``__iter__`` in ``self``.
|
|
327
|
+
|
|
328
|
+
As one has to implement specific category related methods (``__iter__`` and
|
|
329
|
+
``__contains__``) when writing a new code class which inherits from
|
|
330
|
+
:class:`AbstractCode`, the generic call to ``__iter__`` has to fail.
|
|
331
|
+
|
|
332
|
+
EXAMPLES:
|
|
333
|
+
|
|
334
|
+
We create a new code class::
|
|
335
|
+
|
|
336
|
+
sage: from sage.coding.abstract_code import AbstractCode
|
|
337
|
+
sage: class MyCode(AbstractCode):
|
|
338
|
+
....: def __init__(self):
|
|
339
|
+
....: super().__init__(10)
|
|
340
|
+
|
|
341
|
+
We check we get a sensible error message while asking for an
|
|
342
|
+
iterator over the elements of our new class::
|
|
343
|
+
|
|
344
|
+
sage: C = MyCode()
|
|
345
|
+
sage: list(C)
|
|
346
|
+
Traceback (most recent call last):
|
|
347
|
+
...
|
|
348
|
+
RuntimeError: Please override __iter__ in the implementation of <class '__main__.MyCode'>
|
|
349
|
+
"""
|
|
350
|
+
raise RuntimeError("Please override __iter__ in the implementation of {}".format(self.parent()))
|
|
351
|
+
|
|
352
|
+
def __contains__(self, c):
|
|
353
|
+
r"""
|
|
354
|
+
Return an error message requiring to override ``__contains__`` in ``self``.
|
|
355
|
+
|
|
356
|
+
As one has to implement specific category related methods (``__iter__`` and
|
|
357
|
+
``__contains__``) when writing a new code class which inherits from
|
|
358
|
+
:class:`AbstractCode`, the generic call to ``__contains__`` has to fail.
|
|
359
|
+
|
|
360
|
+
EXAMPLES:
|
|
361
|
+
|
|
362
|
+
We create a new code class::
|
|
363
|
+
|
|
364
|
+
sage: from sage.coding.abstract_code import AbstractCode
|
|
365
|
+
sage: class MyCode(AbstractCode):
|
|
366
|
+
....: def __init__(self, length):
|
|
367
|
+
....: super().__init__(length)
|
|
368
|
+
|
|
369
|
+
We check we get a sensible error message while asking if an element is
|
|
370
|
+
in our new class::
|
|
371
|
+
|
|
372
|
+
sage: C = MyCode(3)
|
|
373
|
+
sage: vector((1, 0, 0, 0, 0, 1, 1)) in C
|
|
374
|
+
Traceback (most recent call last):
|
|
375
|
+
...
|
|
376
|
+
RuntimeError: Please override __contains__ in the implementation of <class '__main__.MyCode'>
|
|
377
|
+
"""
|
|
378
|
+
raise RuntimeError("Please override __contains__ in the implementation of {}".format(self.parent()))
|
|
379
|
+
|
|
380
|
+
def ambient_space(self):
|
|
381
|
+
r"""
|
|
382
|
+
Return an error stating ``ambient_space`` of ``self`` is not implemented.
|
|
383
|
+
|
|
384
|
+
This method is required by :meth:`__call__`.
|
|
385
|
+
|
|
386
|
+
EXAMPLES::
|
|
387
|
+
|
|
388
|
+
sage: from sage.coding.abstract_code import AbstractCode
|
|
389
|
+
sage: class MyCode(AbstractCode):
|
|
390
|
+
....: def __init__(self, length):
|
|
391
|
+
....: super().__init__(length)
|
|
392
|
+
sage: C = MyCode(3)
|
|
393
|
+
sage: C.ambient_space()
|
|
394
|
+
Traceback (most recent call last):
|
|
395
|
+
...
|
|
396
|
+
NotImplementedError: No ambient space implemented for this code.
|
|
397
|
+
"""
|
|
398
|
+
raise NotImplementedError("No ambient space implemented for this code.")
|
|
399
|
+
|
|
400
|
+
def __call__(self, m):
|
|
401
|
+
r"""
|
|
402
|
+
Return either ``m`` if it is a codeword or ``self.encode(m)``
|
|
403
|
+
if it is an element of the message space of the encoder used by
|
|
404
|
+
``encode``.
|
|
405
|
+
|
|
406
|
+
This implementation depends on :meth:`ambient_space`.
|
|
407
|
+
|
|
408
|
+
INPUT:
|
|
409
|
+
|
|
410
|
+
- ``m`` -- a vector whose length equals to code's length or an element
|
|
411
|
+
of the message space used by ``encode``
|
|
412
|
+
|
|
413
|
+
- ``**kwargs`` -- extra arguments are forwarded to ``encode``
|
|
414
|
+
|
|
415
|
+
EXAMPLES::
|
|
416
|
+
|
|
417
|
+
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0],[1,0,0,1,1,0,0],[0,1,0,1,0,1,0],[1,1,0,1,0,0,1]])
|
|
418
|
+
sage: C = LinearCode(G)
|
|
419
|
+
sage: word = vector((0, 1, 1, 0))
|
|
420
|
+
sage: C(word)
|
|
421
|
+
(1, 1, 0, 0, 1, 1, 0)
|
|
422
|
+
|
|
423
|
+
sage: c = C.random_element()
|
|
424
|
+
sage: C(c) == c
|
|
425
|
+
True
|
|
426
|
+
|
|
427
|
+
TESTS:
|
|
428
|
+
|
|
429
|
+
If one passes a vector which belongs to the ambient space, it has to be a codeword.
|
|
430
|
+
Otherwise, an exception is raised::
|
|
431
|
+
|
|
432
|
+
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0],[1,0,0,1,1,0,0],[0,1,0,1,0,1,0],[1,1,0,1,0,0,1]])
|
|
433
|
+
sage: C = LinearCode(G)
|
|
434
|
+
sage: word = vector((0, 1, 1, 0, 0, 1, 0))
|
|
435
|
+
sage: C(word)
|
|
436
|
+
Traceback (most recent call last):
|
|
437
|
+
...
|
|
438
|
+
ValueError: If the input is a vector which belongs to the ambient space, it has to be a codeword
|
|
439
|
+
"""
|
|
440
|
+
if m in self.ambient_space():
|
|
441
|
+
if m in self:
|
|
442
|
+
return m
|
|
443
|
+
else:
|
|
444
|
+
raise ValueError("If the input is a vector which belongs to the ambient space, it has to be a codeword")
|
|
445
|
+
else:
|
|
446
|
+
return self.encode(m)
|
|
447
|
+
|
|
448
|
+
def _repr_(self):
|
|
449
|
+
r"""
|
|
450
|
+
Return an error message requiring to override ``_repr_`` in ``self``.
|
|
451
|
+
|
|
452
|
+
As one has to implement specific representation methods (``_repr_`` and
|
|
453
|
+
``_latex_``) when writing a new code class which inherits from
|
|
454
|
+
:class:`AbstractCode`, the generic call to ``_repr_`` has to fail.
|
|
455
|
+
|
|
456
|
+
EXAMPLES:
|
|
457
|
+
|
|
458
|
+
We create a new code class::
|
|
459
|
+
|
|
460
|
+
sage: from sage.coding.abstract_code import AbstractCode
|
|
461
|
+
sage: class MyCode(AbstractCode):
|
|
462
|
+
....: def __init__(self):
|
|
463
|
+
....: super().__init__(10)
|
|
464
|
+
|
|
465
|
+
We check we get a sensible error message while asking for a string
|
|
466
|
+
representation of an instance of our new class::
|
|
467
|
+
|
|
468
|
+
sage: C = MyCode()
|
|
469
|
+
sage: C #random
|
|
470
|
+
Traceback (most recent call last):
|
|
471
|
+
...
|
|
472
|
+
RuntimeError: Please override _repr_ in the implementation of <class '__main__.MyCode'>
|
|
473
|
+
"""
|
|
474
|
+
raise RuntimeError("Please override _repr_ in the implementation of {}".format(self.parent()))
|
|
475
|
+
|
|
476
|
+
def _latex_(self):
|
|
477
|
+
r"""
|
|
478
|
+
Return an error message requiring to override ``_latex_`` in ``self``.
|
|
479
|
+
|
|
480
|
+
As one has to implement specific representation methods (``_repr_`` and
|
|
481
|
+
``_latex_``) when writing a new code class which inherits from
|
|
482
|
+
:class:`AbstractCode`, the generic call to ``_latex_`` has to fail.
|
|
483
|
+
|
|
484
|
+
EXAMPLES:
|
|
485
|
+
|
|
486
|
+
We create a new code class::
|
|
487
|
+
|
|
488
|
+
sage: from sage.coding.abstract_code import AbstractCode
|
|
489
|
+
sage: class MyCode(AbstractCode):
|
|
490
|
+
....: def __init__(self):
|
|
491
|
+
....: super().__init__(10)
|
|
492
|
+
|
|
493
|
+
We check we get a sensible error message while asking for a string
|
|
494
|
+
representation of an instance of our new class::
|
|
495
|
+
|
|
496
|
+
sage: C = MyCode()
|
|
497
|
+
sage: latex(C)
|
|
498
|
+
Traceback (most recent call last):
|
|
499
|
+
...
|
|
500
|
+
RuntimeError: Please override _latex_ in the implementation of <class '__main__.MyCode'>
|
|
501
|
+
"""
|
|
502
|
+
raise RuntimeError("Please override _latex_ in the implementation of {}".format(self.parent()))
|
|
503
|
+
|
|
504
|
+
def list(self):
|
|
505
|
+
r"""
|
|
506
|
+
Return a list of all elements of this code.
|
|
507
|
+
|
|
508
|
+
EXAMPLES::
|
|
509
|
+
|
|
510
|
+
sage: C = codes.HammingCode(GF(2), 3)
|
|
511
|
+
sage: Clist = C.list()
|
|
512
|
+
sage: Clist[5]; Clist[5] in C
|
|
513
|
+
(1, 0, 1, 0, 1, 0, 1)
|
|
514
|
+
True
|
|
515
|
+
"""
|
|
516
|
+
return list(self)
|
|
517
|
+
|
|
518
|
+
def length(self):
|
|
519
|
+
r"""
|
|
520
|
+
Return the length of this code.
|
|
521
|
+
|
|
522
|
+
EXAMPLES::
|
|
523
|
+
|
|
524
|
+
sage: C = codes.HammingCode(GF(2), 3)
|
|
525
|
+
sage: C.length()
|
|
526
|
+
7
|
|
527
|
+
"""
|
|
528
|
+
return self._length
|
|
529
|
+
|
|
530
|
+
def metric(self):
|
|
531
|
+
"""
|
|
532
|
+
Return the metric of ``self``.
|
|
533
|
+
|
|
534
|
+
EXAMPLES::
|
|
535
|
+
|
|
536
|
+
sage: C = codes.HammingCode(GF(2), 3)
|
|
537
|
+
sage: C.metric()
|
|
538
|
+
'Hamming'
|
|
539
|
+
"""
|
|
540
|
+
return self._metric
|
|
541
|
+
|
|
542
|
+
###################### Encoding-Decoding #######################################
|
|
543
|
+
|
|
544
|
+
def add_decoder(self, name, decoder):
|
|
545
|
+
r"""
|
|
546
|
+
Add an decoder to the list of registered decoders of ``self``.
|
|
547
|
+
|
|
548
|
+
.. NOTE::
|
|
549
|
+
|
|
550
|
+
This method only adds ``decoder`` to ``self``, and not to any member of the class
|
|
551
|
+
of ``self``. To know how to add an :class:`sage.coding.decoder.Decoder`, please refer
|
|
552
|
+
to the documentation of :class:`AbstractCode`.
|
|
553
|
+
|
|
554
|
+
INPUT:
|
|
555
|
+
|
|
556
|
+
- ``name`` -- the string name for the decoder
|
|
557
|
+
|
|
558
|
+
- ``decoder`` -- the class name of the decoder
|
|
559
|
+
|
|
560
|
+
EXAMPLES:
|
|
561
|
+
|
|
562
|
+
First of all, we create a (very basic) new decoder::
|
|
563
|
+
|
|
564
|
+
sage: class MyDecoder(sage.coding.decoder.Decoder):
|
|
565
|
+
....: def __init__(self, code):
|
|
566
|
+
....: super().__init__(code)
|
|
567
|
+
....: def _repr_(self):
|
|
568
|
+
....: return "MyDecoder decoder with associated code %s" % self.code()
|
|
569
|
+
|
|
570
|
+
We now create a new code::
|
|
571
|
+
|
|
572
|
+
sage: C = codes.HammingCode(GF(2), 3)
|
|
573
|
+
|
|
574
|
+
We can add our new decoder to the list of available decoders of C::
|
|
575
|
+
|
|
576
|
+
sage: C.add_decoder("MyDecoder", MyDecoder)
|
|
577
|
+
sage: sorted(C.decoders_available())
|
|
578
|
+
['InformationSet', 'MyDecoder', 'NearestNeighbor', 'Syndrome']
|
|
579
|
+
|
|
580
|
+
We can verify that any new code will not know MyDecoder::
|
|
581
|
+
|
|
582
|
+
sage: C2 = codes.HammingCode(GF(2), 3)
|
|
583
|
+
sage: sorted(C2.decoders_available())
|
|
584
|
+
['InformationSet', 'NearestNeighbor', 'Syndrome']
|
|
585
|
+
|
|
586
|
+
TESTS:
|
|
587
|
+
|
|
588
|
+
It is impossible to use a name which is in the dictionary of available decoders::
|
|
589
|
+
|
|
590
|
+
sage: C.add_decoder("Syndrome", MyDecoder)
|
|
591
|
+
Traceback (most recent call last):
|
|
592
|
+
...
|
|
593
|
+
ValueError: There is already a registered decoder with this name
|
|
594
|
+
"""
|
|
595
|
+
if self._registered_decoders == self.__class__._registered_decoders:
|
|
596
|
+
self._registered_decoders = copy(self._registered_decoders)
|
|
597
|
+
reg_dec = self._registered_decoders
|
|
598
|
+
if name in reg_dec:
|
|
599
|
+
raise ValueError("There is already a registered decoder with this name")
|
|
600
|
+
reg_dec[name] = decoder
|
|
601
|
+
else:
|
|
602
|
+
if name in self._registered_decoders:
|
|
603
|
+
raise ValueError("There is already a registered decoder with this name")
|
|
604
|
+
reg_dec[name] = decoder
|
|
605
|
+
|
|
606
|
+
def add_encoder(self, name, encoder):
|
|
607
|
+
r"""
|
|
608
|
+
Add an encoder to the list of registered encoders of ``self``.
|
|
609
|
+
|
|
610
|
+
.. NOTE::
|
|
611
|
+
|
|
612
|
+
This method only adds ``encoder`` to ``self``, and not to any member of the class
|
|
613
|
+
of ``self``. To know how to add an :class:`sage.coding.encoder.Encoder`, please refer
|
|
614
|
+
to the documentation of :class:`AbstractCode`.
|
|
615
|
+
|
|
616
|
+
INPUT:
|
|
617
|
+
|
|
618
|
+
- ``name`` -- the string name for the encoder
|
|
619
|
+
|
|
620
|
+
- ``encoder`` -- the class name of the encoder
|
|
621
|
+
|
|
622
|
+
EXAMPLES:
|
|
623
|
+
|
|
624
|
+
First of all, we create a (very basic) new encoder::
|
|
625
|
+
|
|
626
|
+
sage: class MyEncoder(sage.coding.encoder.Encoder):
|
|
627
|
+
....: def __init__(self, code):
|
|
628
|
+
....: super().__init__(code)
|
|
629
|
+
....: def _repr_(self):
|
|
630
|
+
....: return "MyEncoder encoder with associated code %s" % self.code()
|
|
631
|
+
|
|
632
|
+
We now create a new code::
|
|
633
|
+
|
|
634
|
+
sage: C = codes.HammingCode(GF(2), 3)
|
|
635
|
+
|
|
636
|
+
We can add our new encoder to the list of available encoders of C::
|
|
637
|
+
|
|
638
|
+
sage: C.add_encoder("MyEncoder", MyEncoder)
|
|
639
|
+
sage: sorted(C.encoders_available())
|
|
640
|
+
['MyEncoder', 'Systematic']
|
|
641
|
+
|
|
642
|
+
We can verify that any new code will not know MyEncoder::
|
|
643
|
+
|
|
644
|
+
sage: C2 = codes.HammingCode(GF(2), 3)
|
|
645
|
+
sage: sorted(C2.encoders_available())
|
|
646
|
+
['Systematic']
|
|
647
|
+
|
|
648
|
+
TESTS:
|
|
649
|
+
|
|
650
|
+
It is impossible to use a name which is in the dictionary of available encoders::
|
|
651
|
+
|
|
652
|
+
sage: C.add_encoder("Systematic", MyEncoder)
|
|
653
|
+
Traceback (most recent call last):
|
|
654
|
+
...
|
|
655
|
+
ValueError: There is already a registered encoder with this name
|
|
656
|
+
"""
|
|
657
|
+
if self._registered_encoders == self.__class__._registered_encoders:
|
|
658
|
+
self._registered_encoders = copy(self._registered_encoders)
|
|
659
|
+
reg_enc = self._registered_encoders
|
|
660
|
+
if name in reg_enc:
|
|
661
|
+
raise ValueError("There is already a registered encoder with this name")
|
|
662
|
+
reg_enc[name] = encoder
|
|
663
|
+
else:
|
|
664
|
+
if name in self._registered_encoders:
|
|
665
|
+
raise ValueError("There is already a registered encoder with this name")
|
|
666
|
+
reg_enc[name] = encoder
|
|
667
|
+
|
|
668
|
+
def decode_to_code(self, word, decoder_name=None, *args, **kwargs):
|
|
669
|
+
r"""
|
|
670
|
+
Correct the errors in ``word`` and returns a codeword.
|
|
671
|
+
|
|
672
|
+
INPUT:
|
|
673
|
+
|
|
674
|
+
- ``word`` -- an element in the ambient space as ``self``
|
|
675
|
+
|
|
676
|
+
- ``decoder_name`` -- (default: ``None``) name of the decoder which will be used
|
|
677
|
+
to decode ``word``. The default decoder of ``self`` will be used if
|
|
678
|
+
default value is kept.
|
|
679
|
+
|
|
680
|
+
- ``args``, ``kwargs`` -- all additional arguments are forwarded to :meth:`decoder`
|
|
681
|
+
|
|
682
|
+
OUTPUT: a vector of ``self``
|
|
683
|
+
|
|
684
|
+
EXAMPLES::
|
|
685
|
+
|
|
686
|
+
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0], [1,0,0,1,1,0,0],
|
|
687
|
+
....: [0,1,0,1,0,1,0], [1,1,0,1,0,0,1]])
|
|
688
|
+
sage: C = LinearCode(G)
|
|
689
|
+
sage: word = vector(GF(2), (1, 1, 0, 0, 1, 1, 0))
|
|
690
|
+
sage: w_err = word + vector(GF(2), (1, 0, 0, 0, 0, 0, 0))
|
|
691
|
+
sage: C.decode_to_code(w_err)
|
|
692
|
+
(1, 1, 0, 0, 1, 1, 0)
|
|
693
|
+
|
|
694
|
+
It is possible to manually choose the decoder amongst the list of the available ones::
|
|
695
|
+
|
|
696
|
+
sage: sorted(C.decoders_available())
|
|
697
|
+
['InformationSet', 'NearestNeighbor', 'Syndrome']
|
|
698
|
+
sage: C.decode_to_code(w_err, 'NearestNeighbor')
|
|
699
|
+
(1, 1, 0, 0, 1, 1, 0)
|
|
700
|
+
"""
|
|
701
|
+
D = self.decoder(decoder_name, *args, **kwargs)
|
|
702
|
+
return D.decode_to_code(word)
|
|
703
|
+
|
|
704
|
+
def decode_to_message(self, word, decoder_name=None, *args, **kwargs):
|
|
705
|
+
r"""
|
|
706
|
+
Correct the errors in word and decodes it to the message space.
|
|
707
|
+
|
|
708
|
+
INPUT:
|
|
709
|
+
|
|
710
|
+
- ``word`` -- an element in the ambient space as ``self``
|
|
711
|
+
|
|
712
|
+
- ``decoder_name`` -- (default: ``None``) name of the decoder which will be used
|
|
713
|
+
to decode ``word``. The default decoder of ``self`` will be used if
|
|
714
|
+
default value is kept.
|
|
715
|
+
|
|
716
|
+
- ``args``, ``kwargs`` -- all additional arguments are forwarded to :meth:`decoder`
|
|
717
|
+
|
|
718
|
+
OUTPUT: a vector of the message space of ``self``
|
|
719
|
+
|
|
720
|
+
EXAMPLES::
|
|
721
|
+
|
|
722
|
+
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0], [1,0,0,1,1,0,0],
|
|
723
|
+
....: [0,1,0,1,0,1,0], [1,1,0,1,0,0,1]])
|
|
724
|
+
sage: C = LinearCode(G)
|
|
725
|
+
sage: word = vector(GF(2), (1, 1, 0, 0, 1, 1, 0))
|
|
726
|
+
sage: C.decode_to_message(word)
|
|
727
|
+
(0, 1, 1, 0)
|
|
728
|
+
|
|
729
|
+
It is possible to manually choose the decoder amongst the list of the available ones::
|
|
730
|
+
|
|
731
|
+
sage: sorted(C.decoders_available())
|
|
732
|
+
['InformationSet', 'NearestNeighbor', 'Syndrome']
|
|
733
|
+
sage: C.decode_to_message(word, 'NearestNeighbor')
|
|
734
|
+
(0, 1, 1, 0)
|
|
735
|
+
"""
|
|
736
|
+
return self.unencode(self.decode_to_code(word, decoder_name, *args, **kwargs), **kwargs)
|
|
737
|
+
|
|
738
|
+
@cached_method
|
|
739
|
+
def decoder(self, decoder_name=None, *args, **kwargs):
|
|
740
|
+
r"""
|
|
741
|
+
Return a decoder of ``self``.
|
|
742
|
+
|
|
743
|
+
INPUT:
|
|
744
|
+
|
|
745
|
+
- ``decoder_name`` -- (default: ``None``) name of the decoder which will be
|
|
746
|
+
returned. The default decoder of ``self`` will be used if
|
|
747
|
+
default value is kept.
|
|
748
|
+
|
|
749
|
+
- ``args``, ``kwargs`` -- all additional arguments will be forwarded to the constructor of the decoder
|
|
750
|
+
that will be returned by this method
|
|
751
|
+
|
|
752
|
+
OUTPUT: a decoder object
|
|
753
|
+
|
|
754
|
+
Besides creating the decoder and returning it, this method also stores
|
|
755
|
+
the decoder in a cache. With this behaviour, each decoder will be created
|
|
756
|
+
at most one time for ``self``.
|
|
757
|
+
|
|
758
|
+
EXAMPLES::
|
|
759
|
+
|
|
760
|
+
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0], [1,0,0,1,1,0,0],
|
|
761
|
+
....: [0,1,0,1,0,1,0], [1,1,0,1,0,0,1]])
|
|
762
|
+
sage: C = LinearCode(G)
|
|
763
|
+
sage: C.decoder()
|
|
764
|
+
Syndrome decoder for [7, 4] linear code over GF(2) handling errors of weight up to 1
|
|
765
|
+
|
|
766
|
+
If there is no decoder for the code, we return an error::
|
|
767
|
+
|
|
768
|
+
sage: from sage.coding.abstract_code import AbstractCode
|
|
769
|
+
sage: class MyCodeFamily(AbstractCode):
|
|
770
|
+
....: def __init__(self, length, field):
|
|
771
|
+
....: sage.coding.abstract_code.AbstractCode.__init__(self, length)
|
|
772
|
+
....: Parent.__init__(self, base=field, facade=False, category=Sets())
|
|
773
|
+
....: self._field = field
|
|
774
|
+
....: def field(self):
|
|
775
|
+
....: return self._field
|
|
776
|
+
....: def _repr_(self):
|
|
777
|
+
....: return "%d dummy code over GF(%s)" % (self.length(), self.field().cardinality())
|
|
778
|
+
sage: D = MyCodeFamily(5, GF(2))
|
|
779
|
+
sage: D.decoder()
|
|
780
|
+
Traceback (most recent call last):
|
|
781
|
+
...
|
|
782
|
+
NotImplementedError: No decoder implemented for this code.
|
|
783
|
+
|
|
784
|
+
If the name of a decoder which is not known by ``self`` is passed,
|
|
785
|
+
an exception will be raised::
|
|
786
|
+
|
|
787
|
+
sage: sorted(C.decoders_available())
|
|
788
|
+
['InformationSet', 'NearestNeighbor', 'Syndrome']
|
|
789
|
+
sage: C.decoder('Try')
|
|
790
|
+
Traceback (most recent call last):
|
|
791
|
+
...
|
|
792
|
+
ValueError: There is no Decoder named 'Try'.
|
|
793
|
+
The known Decoders are: ['InformationSet', 'NearestNeighbor', 'Syndrome']
|
|
794
|
+
|
|
795
|
+
Some decoders take extra arguments. If the user forgets to supply these,
|
|
796
|
+
the error message attempts to be helpful::
|
|
797
|
+
|
|
798
|
+
sage: C.decoder('InformationSet')
|
|
799
|
+
Traceback (most recent call last):
|
|
800
|
+
...
|
|
801
|
+
ValueError: Constructing the InformationSet decoder failed,
|
|
802
|
+
possibly due to missing or incorrect parameters.
|
|
803
|
+
The constructor requires the arguments ['number_errors'].
|
|
804
|
+
It takes the optional arguments ['algorithm'].
|
|
805
|
+
It accepts unspecified arguments as well. See the documentation of
|
|
806
|
+
sage.coding.information_set_decoder.LinearCodeInformationSetDecoder
|
|
807
|
+
for more details.
|
|
808
|
+
"""
|
|
809
|
+
if not self._default_decoder_name:
|
|
810
|
+
raise NotImplementedError("No decoder implemented for this code.")
|
|
811
|
+
if decoder_name is None:
|
|
812
|
+
decoder_name = self._default_decoder_name
|
|
813
|
+
if decoder_name in self._registered_decoders:
|
|
814
|
+
decClass = self._registered_decoders[decoder_name]
|
|
815
|
+
try:
|
|
816
|
+
return decClass(self, *args, **kwargs)
|
|
817
|
+
except TypeError:
|
|
818
|
+
raise ValueError(
|
|
819
|
+
"Constructing the {0} decoder failed, possibly due "
|
|
820
|
+
"to missing or incorrect parameters.\n{1}".format(
|
|
821
|
+
decoder_name, _explain_constructor(decClass)))
|
|
822
|
+
else:
|
|
823
|
+
raise ValueError(
|
|
824
|
+
"There is no Decoder named '{0}'. The known Decoders are: "
|
|
825
|
+
"{1}".format(decoder_name, self.decoders_available()))
|
|
826
|
+
|
|
827
|
+
def decoders_available(self, classes=False):
|
|
828
|
+
r"""
|
|
829
|
+
Return a list of the available decoders' names for ``self``.
|
|
830
|
+
|
|
831
|
+
INPUT:
|
|
832
|
+
|
|
833
|
+
- ``classes`` -- boolean (default: ``False``); if ``classes`` is set to
|
|
834
|
+
``True``, return instead a :class:`dict` mapping available decoder
|
|
835
|
+
name to the associated decoder class
|
|
836
|
+
|
|
837
|
+
OUTPUT: list of strings, or a :class:`dict` mapping strings to classes
|
|
838
|
+
|
|
839
|
+
EXAMPLES::
|
|
840
|
+
|
|
841
|
+
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0], [1,0,0,1,1,0,0],
|
|
842
|
+
....: [0,1,0,1,0,1,0], [1,1,0,1,0,0,1]])
|
|
843
|
+
sage: C = LinearCode(G)
|
|
844
|
+
sage: C.decoders_available()
|
|
845
|
+
['InformationSet', 'NearestNeighbor', 'Syndrome']
|
|
846
|
+
|
|
847
|
+
sage: dictionary = C.decoders_available(True)
|
|
848
|
+
sage: sorted(dictionary.keys())
|
|
849
|
+
['InformationSet', 'NearestNeighbor', 'Syndrome']
|
|
850
|
+
sage: dictionary['NearestNeighbor']
|
|
851
|
+
<class 'sage.coding.linear_code.LinearCodeNearestNeighborDecoder'>
|
|
852
|
+
"""
|
|
853
|
+
if classes:
|
|
854
|
+
return copy(self._registered_decoders)
|
|
855
|
+
|
|
856
|
+
return sorted(self._registered_decoders)
|
|
857
|
+
|
|
858
|
+
def encode(self, word, encoder_name=None, *args, **kwargs):
|
|
859
|
+
r"""
|
|
860
|
+
Transform an element of a message space into a codeword.
|
|
861
|
+
|
|
862
|
+
INPUT:
|
|
863
|
+
|
|
864
|
+
- ``word`` -- an element of a message space of the code
|
|
865
|
+
|
|
866
|
+
- ``encoder_name`` -- (default: ``None``) name of the encoder which
|
|
867
|
+
will be used to encode ``word``. The default encoder of ``self`` will
|
|
868
|
+
be used if default value is kept.
|
|
869
|
+
|
|
870
|
+
- ``args``, ``kwargs`` -- all additional arguments are forwarded to the
|
|
871
|
+
construction of the encoder that is used
|
|
872
|
+
|
|
873
|
+
One can use the following shortcut to encode a word ::
|
|
874
|
+
|
|
875
|
+
C(word)
|
|
876
|
+
|
|
877
|
+
OUTPUT: a vector of ``self``
|
|
878
|
+
|
|
879
|
+
EXAMPLES::
|
|
880
|
+
|
|
881
|
+
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0], [1,0,0,1,1,0,0],
|
|
882
|
+
....: [0,1,0,1,0,1,0], [1,1,0,1,0,0,1]])
|
|
883
|
+
sage: C = LinearCode(G)
|
|
884
|
+
sage: word = vector((0, 1, 1, 0))
|
|
885
|
+
sage: C.encode(word)
|
|
886
|
+
(1, 1, 0, 0, 1, 1, 0)
|
|
887
|
+
sage: C(word)
|
|
888
|
+
(1, 1, 0, 0, 1, 1, 0)
|
|
889
|
+
|
|
890
|
+
It is possible to manually choose the encoder amongst the list of the available ones::
|
|
891
|
+
|
|
892
|
+
sage: sorted(C.encoders_available())
|
|
893
|
+
['GeneratorMatrix', 'Systematic']
|
|
894
|
+
sage: word = vector((0, 1, 1, 0))
|
|
895
|
+
sage: C.encode(word, 'GeneratorMatrix')
|
|
896
|
+
(1, 1, 0, 0, 1, 1, 0)
|
|
897
|
+
"""
|
|
898
|
+
E = self.encoder(encoder_name, *args, **kwargs)
|
|
899
|
+
return E.encode(word)
|
|
900
|
+
|
|
901
|
+
@cached_method
|
|
902
|
+
def encoder(self, encoder_name=None, *args, **kwargs):
|
|
903
|
+
r"""
|
|
904
|
+
Return an encoder of ``self``.
|
|
905
|
+
|
|
906
|
+
The returned encoder provided by this method is cached.
|
|
907
|
+
|
|
908
|
+
This methods creates a new instance of the encoder subclass designated by ``encoder_name``.
|
|
909
|
+
While it is also possible to do the same by directly calling the subclass' constructor,
|
|
910
|
+
it is strongly advised to use this method to take advantage of the caching mechanism.
|
|
911
|
+
|
|
912
|
+
INPUT:
|
|
913
|
+
|
|
914
|
+
- ``encoder_name`` -- (default: ``None``) name of the encoder which will be
|
|
915
|
+
returned. The default encoder of ``self`` will be used if
|
|
916
|
+
default value is kept.
|
|
917
|
+
|
|
918
|
+
- ``args``, ``kwargs`` -- all additional arguments are forwarded to the
|
|
919
|
+
constructor of the encoder this method will return
|
|
920
|
+
|
|
921
|
+
OUTPUT: an Encoder object
|
|
922
|
+
|
|
923
|
+
.. NOTE::
|
|
924
|
+
|
|
925
|
+
The default encoder always has `F^{k}` as message space, with `k` the dimension
|
|
926
|
+
of ``self`` and `F` the base ring of ``self``.
|
|
927
|
+
|
|
928
|
+
EXAMPLES::
|
|
929
|
+
|
|
930
|
+
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0], [1,0,0,1,1,0,0],
|
|
931
|
+
....: [0,1,0,1,0,1,0], [1,1,0,1,0,0,1]])
|
|
932
|
+
sage: C = LinearCode(G)
|
|
933
|
+
sage: C.encoder()
|
|
934
|
+
Generator matrix-based encoder for [7, 4] linear code over GF(2)
|
|
935
|
+
|
|
936
|
+
If there is no encoder for the code, we return an error::
|
|
937
|
+
|
|
938
|
+
sage: from sage.coding.abstract_code import AbstractCode
|
|
939
|
+
sage: class MyCodeFamily(AbstractCode):
|
|
940
|
+
....: def __init__(self, length, field):
|
|
941
|
+
....: sage.coding.abstract_code.AbstractCode.__init__(self, length)
|
|
942
|
+
....: Parent.__init__(self, base=field, facade=False, category=Sets())
|
|
943
|
+
....: self._field = field
|
|
944
|
+
....: def field(self):
|
|
945
|
+
....: return self._field
|
|
946
|
+
....: def _repr_(self):
|
|
947
|
+
....: return "%d dummy code over GF(%s)" % (self.length(),
|
|
948
|
+
....: self.field().cardinality())
|
|
949
|
+
sage: D = MyCodeFamily(5, GF(2))
|
|
950
|
+
sage: D.encoder()
|
|
951
|
+
Traceback (most recent call last):
|
|
952
|
+
...
|
|
953
|
+
NotImplementedError: No encoder implemented for this code.
|
|
954
|
+
|
|
955
|
+
We check that the returned encoder is cached::
|
|
956
|
+
|
|
957
|
+
sage: C.encoder.is_in_cache()
|
|
958
|
+
True
|
|
959
|
+
|
|
960
|
+
If the name of an encoder which is not known by ``self`` is passed,
|
|
961
|
+
an exception will be raised::
|
|
962
|
+
|
|
963
|
+
sage: sorted(C.encoders_available())
|
|
964
|
+
['GeneratorMatrix', 'Systematic']
|
|
965
|
+
sage: C.encoder('NonExistingEncoder')
|
|
966
|
+
Traceback (most recent call last):
|
|
967
|
+
...
|
|
968
|
+
ValueError: There is no Encoder named 'NonExistingEncoder'.
|
|
969
|
+
The known Encoders are: ['GeneratorMatrix', 'Systematic']
|
|
970
|
+
|
|
971
|
+
Some encoders take extra arguments. If the user incorrectly supplies
|
|
972
|
+
these, the error message attempts to be helpful::
|
|
973
|
+
|
|
974
|
+
sage: C.encoder('Systematic', strange_parameter=True)
|
|
975
|
+
Traceback (most recent call last):
|
|
976
|
+
...
|
|
977
|
+
ValueError: Constructing the Systematic encoder failed,
|
|
978
|
+
possibly due to missing or incorrect parameters.
|
|
979
|
+
The constructor requires no arguments. It takes the optional
|
|
980
|
+
arguments ['systematic_positions']. See the documentation of
|
|
981
|
+
sage.coding.linear_code_no_metric.LinearCodeSystematicEncoder
|
|
982
|
+
for more details.
|
|
983
|
+
"""
|
|
984
|
+
if not self._default_encoder_name:
|
|
985
|
+
raise NotImplementedError("No encoder implemented for this code.")
|
|
986
|
+
if encoder_name is None:
|
|
987
|
+
encoder_name = self._default_encoder_name
|
|
988
|
+
if encoder_name in self._registered_encoders:
|
|
989
|
+
encClass = self._registered_encoders[encoder_name]
|
|
990
|
+
try:
|
|
991
|
+
return encClass(self, *args, **kwargs)
|
|
992
|
+
except TypeError:
|
|
993
|
+
raise ValueError(
|
|
994
|
+
"Constructing the {0} encoder failed, possibly due "
|
|
995
|
+
"to missing or incorrect parameters.\n{1}".format(
|
|
996
|
+
encoder_name, _explain_constructor(encClass)))
|
|
997
|
+
else:
|
|
998
|
+
raise ValueError(
|
|
999
|
+
"There is no Encoder named '{0}'. The known Encoders are: "
|
|
1000
|
+
"{1}".format(encoder_name, self.encoders_available()))
|
|
1001
|
+
|
|
1002
|
+
def encoders_available(self, classes=False):
|
|
1003
|
+
r"""
|
|
1004
|
+
Return a list of the available encoders' names for ``self``.
|
|
1005
|
+
|
|
1006
|
+
INPUT:
|
|
1007
|
+
|
|
1008
|
+
- ``classes`` -- boolean (default: ``False``); if ``classes`` is set to
|
|
1009
|
+
``True``, return instead a :class:`dict` mapping available encoder
|
|
1010
|
+
name to the associated encoder class
|
|
1011
|
+
|
|
1012
|
+
OUTPUT: list of strings, or a :class:`dict` mapping strings to classes
|
|
1013
|
+
|
|
1014
|
+
EXAMPLES::
|
|
1015
|
+
|
|
1016
|
+
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0], [1,0,0,1,1,0,0],
|
|
1017
|
+
....: [0,1,0,1,0,1,0], [1,1,0,1,0,0,1]])
|
|
1018
|
+
sage: C = LinearCode(G)
|
|
1019
|
+
sage: C.encoders_available()
|
|
1020
|
+
['GeneratorMatrix', 'Systematic']
|
|
1021
|
+
sage: dictionary = C.encoders_available(True)
|
|
1022
|
+
sage: sorted(dictionary.items())
|
|
1023
|
+
[('GeneratorMatrix', <class 'sage.coding.linear_code.LinearCodeGeneratorMatrixEncoder'>),
|
|
1024
|
+
('Systematic', <class 'sage.coding.linear_code_no_metric.LinearCodeSystematicEncoder'>)]
|
|
1025
|
+
"""
|
|
1026
|
+
if classes:
|
|
1027
|
+
return copy(self._registered_encoders)
|
|
1028
|
+
|
|
1029
|
+
return sorted(self._registered_encoders)
|
|
1030
|
+
|
|
1031
|
+
def unencode(self, c, encoder_name=None, nocheck=False, **kwargs):
|
|
1032
|
+
r"""
|
|
1033
|
+
Return the message corresponding to ``c``.
|
|
1034
|
+
|
|
1035
|
+
This is the inverse of :meth:`encode`.
|
|
1036
|
+
|
|
1037
|
+
INPUT:
|
|
1038
|
+
|
|
1039
|
+
- ``c`` -- a codeword of ``self``
|
|
1040
|
+
|
|
1041
|
+
- ``encoder_name`` -- (default: ``None``) name of the decoder which will be used
|
|
1042
|
+
to decode ``word``. The default decoder of ``self`` will be used if
|
|
1043
|
+
default value is kept.
|
|
1044
|
+
|
|
1045
|
+
- ``nocheck`` -- boolean (default: ``False``); checks if ``c`` is in
|
|
1046
|
+
``self``. You might set this to ``True`` to disable the check for
|
|
1047
|
+
saving computation. Note that if ``c`` is not in ``self`` and
|
|
1048
|
+
``nocheck = True``, then the output of :meth:`unencode` is not
|
|
1049
|
+
defined (except that it will be in the message space of ``self``).
|
|
1050
|
+
|
|
1051
|
+
- ``kwargs`` -- all additional arguments are forwarded to the construction of the
|
|
1052
|
+
encoder that is used
|
|
1053
|
+
|
|
1054
|
+
OUTPUT: an element of the message space of ``encoder_name`` of ``self``
|
|
1055
|
+
|
|
1056
|
+
EXAMPLES::
|
|
1057
|
+
|
|
1058
|
+
sage: G = Matrix(GF(2), [[1,1,1,0,0,0,0], [1,0,0,1,1,0,0],
|
|
1059
|
+
....: [0,1,0,1,0,1,0], [1,1,0,1,0,0,1]])
|
|
1060
|
+
sage: C = LinearCode(G)
|
|
1061
|
+
sage: c = vector(GF(2), (1, 1, 0, 0, 1, 1, 0))
|
|
1062
|
+
sage: C.unencode(c)
|
|
1063
|
+
(0, 1, 1, 0)
|
|
1064
|
+
"""
|
|
1065
|
+
E = self.encoder(encoder_name, **kwargs)
|
|
1066
|
+
return E.unencode(c, nocheck)
|
|
1067
|
+
|
|
1068
|
+
def random_element(self, *args, **kwds):
|
|
1069
|
+
"""
|
|
1070
|
+
Return a random codeword; passes other positional and keyword
|
|
1071
|
+
arguments to ``random_element()`` method of vector space.
|
|
1072
|
+
|
|
1073
|
+
OUTPUT: random element of the vector space of this code
|
|
1074
|
+
|
|
1075
|
+
EXAMPLES::
|
|
1076
|
+
|
|
1077
|
+
sage: C = codes.HammingCode(GF(4,'a'), 3)
|
|
1078
|
+
sage: C.random_element() # random test
|
|
1079
|
+
(1, 0, 0, a + 1, 1, a, a, a + 1, a + 1, 1, 1, 0, a + 1, a, 0, a, a, 0, a, a, 1)
|
|
1080
|
+
|
|
1081
|
+
Passes extra positional or keyword arguments through::
|
|
1082
|
+
|
|
1083
|
+
sage: C.random_element(prob=.5, distribution='1/n') # random test
|
|
1084
|
+
(1, 0, a, 0, 0, 0, 0, a + 1, 0, 0, 0, 0, 0, 0, 0, 0, a + 1, a + 1, 1, 0, 0)
|
|
1085
|
+
|
|
1086
|
+
TESTS:
|
|
1087
|
+
|
|
1088
|
+
Test that the codeword returned is immutable (see :issue:`16469`)::
|
|
1089
|
+
|
|
1090
|
+
sage: c = C.random_element()
|
|
1091
|
+
sage: c.is_immutable()
|
|
1092
|
+
True
|
|
1093
|
+
|
|
1094
|
+
Test that codeword returned has the same parent as any non-random codeword
|
|
1095
|
+
(see :issue:`19653`)::
|
|
1096
|
+
|
|
1097
|
+
sage: C = codes.random_linear_code(GF(16, 'a'), 10, 4)
|
|
1098
|
+
sage: c1 = C.random_element()
|
|
1099
|
+
sage: c2 = C[1]
|
|
1100
|
+
sage: c1.parent() == c2.parent()
|
|
1101
|
+
True
|
|
1102
|
+
"""
|
|
1103
|
+
E = self.encoder()
|
|
1104
|
+
M = E.message_space()
|
|
1105
|
+
m = M.random_element(*args, **kwds)
|
|
1106
|
+
c = E.encode(m)
|
|
1107
|
+
c.set_immutable()
|
|
1108
|
+
return c
|