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,1032 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.modules sage.rings.finite_rings
|
|
3
|
+
r"""
|
|
4
|
+
Information-set decoding for linear codes
|
|
5
|
+
|
|
6
|
+
Information-set decoding is a probabilistic decoding strategy that
|
|
7
|
+
essentially tries to guess `k` correct positions in the received word,
|
|
8
|
+
where `k` is the dimension of the code. A codeword agreeing with the
|
|
9
|
+
received word on the guessed position can easily be computed, and their
|
|
10
|
+
difference is one possible error vector. A "correct" guess is assumed when
|
|
11
|
+
this error vector has low Hamming weight.
|
|
12
|
+
|
|
13
|
+
This simple algorithm is not very efficient in itself, but there are numerous
|
|
14
|
+
refinements to the strategy that make it very capable over rather large codes.
|
|
15
|
+
Still, the decoding algorithm is exponential in dimension of the code and the
|
|
16
|
+
log of the field size.
|
|
17
|
+
|
|
18
|
+
The ISD strategy requires choosing how many errors is deemed acceptable. One
|
|
19
|
+
choice could be `d/2`, where `d` is the minimum distance of the code, but
|
|
20
|
+
sometimes `d` is not known, or sometimes more errors are expected. If one
|
|
21
|
+
chooses anything above `d/2`, the algorithm does not guarantee to return a
|
|
22
|
+
nearest codeword.
|
|
23
|
+
|
|
24
|
+
AUTHORS:
|
|
25
|
+
|
|
26
|
+
- David Lucas, Johan Rosenkilde, Yann Laigle-Chapuy (2016-02, 2017-06): initial
|
|
27
|
+
version
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
#******************************************************************************
|
|
31
|
+
# Copyright (C) 2017 David Lucas <david.lucas@inria.fr>
|
|
32
|
+
# Johan Rosenkilde <jsrn@jsrn.dk>
|
|
33
|
+
# Yann Laigle-Chapuy
|
|
34
|
+
#
|
|
35
|
+
# This program is free software: you can redistribute it and/or modify
|
|
36
|
+
# it under the terms of the GNU General Public License as published by
|
|
37
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
38
|
+
# (at your option) any later version.
|
|
39
|
+
#
|
|
40
|
+
# http://www.gnu.org/licenses/
|
|
41
|
+
#******************************************************************************
|
|
42
|
+
|
|
43
|
+
from sage.arith.misc import binomial
|
|
44
|
+
from sage.rings.integer_ring import ZZ
|
|
45
|
+
from sage.rings.integer import Integer
|
|
46
|
+
from sage.modules.free_module_element import free_module_element as vector
|
|
47
|
+
from sage.structure.sage_object import SageObject
|
|
48
|
+
from .decoder import Decoder
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _format_decoding_interval(decoding_interval):
|
|
52
|
+
r"""
|
|
53
|
+
Format the decoding interval of an ISD decoder when calling ``_repr_`` or
|
|
54
|
+
``_latex_``.
|
|
55
|
+
|
|
56
|
+
EXAMPLES::
|
|
57
|
+
|
|
58
|
+
sage: from sage.coding.information_set_decoder import _format_decoding_interval
|
|
59
|
+
sage: _format_decoding_interval((0,3))
|
|
60
|
+
'up to 3'
|
|
61
|
+
sage: _format_decoding_interval((2,3))
|
|
62
|
+
'between 2 and 3'
|
|
63
|
+
sage: _format_decoding_interval((3,3))
|
|
64
|
+
'exactly 3'
|
|
65
|
+
"""
|
|
66
|
+
if decoding_interval[0] == 0:
|
|
67
|
+
return "up to {0}".format(decoding_interval[1])
|
|
68
|
+
if decoding_interval[0] == decoding_interval[1]:
|
|
69
|
+
return "exactly {0}".format(decoding_interval[0])
|
|
70
|
+
return "between {0} and {1}".format(decoding_interval[0], decoding_interval[1])
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class InformationSetAlgorithm(SageObject):
|
|
74
|
+
r"""
|
|
75
|
+
Abstract class for algorithms for
|
|
76
|
+
:class:`sage.coding.information_set_decoder.LinearCodeInformationSetDecoder`.
|
|
77
|
+
|
|
78
|
+
To sub-class this class, override ``decode`` and ``calibrate``, and call the
|
|
79
|
+
super constructor from ``__init__``.
|
|
80
|
+
|
|
81
|
+
INPUT:
|
|
82
|
+
|
|
83
|
+
- ``code`` -- a linear code for which to decode
|
|
84
|
+
|
|
85
|
+
- ``number_errors`` -- integer; the maximal number of errors to accept as
|
|
86
|
+
correct decoding. An interval can also be specified by giving a pair of
|
|
87
|
+
integers, where both end values are taken to be in the interval.
|
|
88
|
+
|
|
89
|
+
- ``algorithm_name`` -- a name for the specific ISD algorithm used (used for
|
|
90
|
+
printing)
|
|
91
|
+
|
|
92
|
+
- ``parameters`` -- (optional) A dictionary for setting the parameters of
|
|
93
|
+
this ISD algorithm. Note that sanity checking this dictionary for the
|
|
94
|
+
individual sub-classes should be done in the sub-class constructor.
|
|
95
|
+
|
|
96
|
+
EXAMPLES::
|
|
97
|
+
|
|
98
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
99
|
+
sage: LeeBrickellISDAlgorithm(codes.GolayCode(GF(2)), (0,4))
|
|
100
|
+
ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2)
|
|
101
|
+
decoding up to 4 errors
|
|
102
|
+
|
|
103
|
+
A minimal working example of how to sub-class::
|
|
104
|
+
|
|
105
|
+
sage: from sage.coding.information_set_decoder import InformationSetAlgorithm
|
|
106
|
+
sage: from sage.coding.decoder import DecodingError
|
|
107
|
+
sage: class MinimalISD(InformationSetAlgorithm):
|
|
108
|
+
....: def __init__(self, code, decoding_interval):
|
|
109
|
+
....: super().__init__(code, decoding_interval, "MinimalISD")
|
|
110
|
+
....: def calibrate(self):
|
|
111
|
+
....: self._parameters = { } # calibrate parameters here
|
|
112
|
+
....: self._time_estimate = 10.0 # calibrated time estimate
|
|
113
|
+
....: def decode(self, r):
|
|
114
|
+
....: # decoding algorithm here
|
|
115
|
+
....: raise DecodingError("I failed")
|
|
116
|
+
sage: MinimalISD(codes.GolayCode(GF(2)), (0,4))
|
|
117
|
+
ISD Algorithm (MinimalISD) for [24, 12, 8] Extended Golay code over GF(2)
|
|
118
|
+
decoding up to 4 errors
|
|
119
|
+
"""
|
|
120
|
+
|
|
121
|
+
def __init__(self, code, decoding_interval, algorithm_name, parameters=None):
|
|
122
|
+
r"""
|
|
123
|
+
TESTS::
|
|
124
|
+
|
|
125
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
126
|
+
sage: LeeBrickellISDAlgorithm(codes.GolayCode(GF(2)), (0,4))
|
|
127
|
+
ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2) decoding up to 4 errors
|
|
128
|
+
"""
|
|
129
|
+
self._code = code
|
|
130
|
+
self._decoding_interval = decoding_interval
|
|
131
|
+
self._algorithm_name = algorithm_name
|
|
132
|
+
if parameters:
|
|
133
|
+
self._parameters = parameters
|
|
134
|
+
self._parameters_specified = True
|
|
135
|
+
else:
|
|
136
|
+
self._parameters_specified = False
|
|
137
|
+
|
|
138
|
+
def name(self):
|
|
139
|
+
r"""
|
|
140
|
+
Return the name of this ISD algorithm.
|
|
141
|
+
|
|
142
|
+
EXAMPLES::
|
|
143
|
+
|
|
144
|
+
sage: C = codes.GolayCode(GF(2))
|
|
145
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
146
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0,2))
|
|
147
|
+
sage: A.name()
|
|
148
|
+
'Lee-Brickell'
|
|
149
|
+
"""
|
|
150
|
+
return self._algorithm_name
|
|
151
|
+
|
|
152
|
+
def decode(self, r):
|
|
153
|
+
r"""
|
|
154
|
+
Decode a received word using this ISD decoding algorithm.
|
|
155
|
+
|
|
156
|
+
Must be overridden by sub-classes.
|
|
157
|
+
|
|
158
|
+
EXAMPLES::
|
|
159
|
+
|
|
160
|
+
sage: M = matrix(GF(2), [[1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0],\
|
|
161
|
+
....: [0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1],\
|
|
162
|
+
....: [0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0],\
|
|
163
|
+
....: [0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1],\
|
|
164
|
+
....: [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1]])
|
|
165
|
+
sage: C = codes.LinearCode(M)
|
|
166
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
167
|
+
sage: A = LeeBrickellISDAlgorithm(C, (2,2))
|
|
168
|
+
sage: r = vector(GF(2), [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
169
|
+
sage: A.decode(r)
|
|
170
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
|
171
|
+
"""
|
|
172
|
+
raise NotImplementedError
|
|
173
|
+
|
|
174
|
+
def time_estimate(self):
|
|
175
|
+
"""
|
|
176
|
+
Estimate for how long this ISD algorithm takes to perform a single decoding.
|
|
177
|
+
|
|
178
|
+
The estimate is for a received word whose number of errors is within the
|
|
179
|
+
decoding interval of this ISD algorithm.
|
|
180
|
+
|
|
181
|
+
EXAMPLES::
|
|
182
|
+
|
|
183
|
+
sage: C = codes.GolayCode(GF(2))
|
|
184
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
185
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0,2))
|
|
186
|
+
sage: A.time_estimate() #random
|
|
187
|
+
0.0008162108571427874
|
|
188
|
+
"""
|
|
189
|
+
if not hasattr(self, "_time_estimate"):
|
|
190
|
+
self.calibrate()
|
|
191
|
+
return self._time_estimate
|
|
192
|
+
|
|
193
|
+
def calibrate(self):
|
|
194
|
+
"""
|
|
195
|
+
Uses test computations to estimate optimal values for any parameters
|
|
196
|
+
this ISD algorithm may take.
|
|
197
|
+
|
|
198
|
+
Must be overridden by sub-classes.
|
|
199
|
+
|
|
200
|
+
If ``self._parameters_specified`` is ``False``, this method shall set
|
|
201
|
+
``self._parameters`` to the best parameters estimated. It shall always
|
|
202
|
+
set ``self._time_estimate`` to the time estimate of using
|
|
203
|
+
``self._parameters``.
|
|
204
|
+
|
|
205
|
+
EXAMPLES::
|
|
206
|
+
|
|
207
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
208
|
+
sage: C = codes.GolayCode(GF(2))
|
|
209
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0,3))
|
|
210
|
+
sage: A.calibrate()
|
|
211
|
+
sage: A.parameters() #random
|
|
212
|
+
{'search_size': 1}
|
|
213
|
+
"""
|
|
214
|
+
raise NotImplementedError
|
|
215
|
+
|
|
216
|
+
def code(self):
|
|
217
|
+
r"""
|
|
218
|
+
Return the code associated to this ISD algorithm.
|
|
219
|
+
|
|
220
|
+
EXAMPLES::
|
|
221
|
+
|
|
222
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
223
|
+
sage: C = codes.GolayCode(GF(2))
|
|
224
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0,3))
|
|
225
|
+
sage: A.code()
|
|
226
|
+
[24, 12, 8] Extended Golay code over GF(2)
|
|
227
|
+
"""
|
|
228
|
+
return self._code
|
|
229
|
+
|
|
230
|
+
def decoding_interval(self):
|
|
231
|
+
r"""
|
|
232
|
+
A pair of integers specifying the interval of number of errors this
|
|
233
|
+
ISD algorithm will attempt to correct.
|
|
234
|
+
|
|
235
|
+
The interval includes both end values.
|
|
236
|
+
|
|
237
|
+
EXAMPLES::
|
|
238
|
+
|
|
239
|
+
sage: C = codes.GolayCode(GF(2))
|
|
240
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
241
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0,2))
|
|
242
|
+
sage: A.decoding_interval()
|
|
243
|
+
(0, 2)
|
|
244
|
+
"""
|
|
245
|
+
return self._decoding_interval
|
|
246
|
+
|
|
247
|
+
def parameters(self):
|
|
248
|
+
"""
|
|
249
|
+
Return any parameters this ISD algorithm uses.
|
|
250
|
+
|
|
251
|
+
If the parameters have not already been set, efficient values will first
|
|
252
|
+
be calibrated and returned.
|
|
253
|
+
|
|
254
|
+
EXAMPLES::
|
|
255
|
+
|
|
256
|
+
sage: C = codes.GolayCode(GF(2))
|
|
257
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
258
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0,4), search_size=3)
|
|
259
|
+
sage: A.parameters()
|
|
260
|
+
{'search_size': 3}
|
|
261
|
+
|
|
262
|
+
If not set, calibration will determine a sensible value::
|
|
263
|
+
|
|
264
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0,4))
|
|
265
|
+
sage: A.parameters() #random
|
|
266
|
+
{'search_size': 1}
|
|
267
|
+
"""
|
|
268
|
+
if not hasattr(self, "_parameters"):
|
|
269
|
+
self.calibrate()
|
|
270
|
+
return self._parameters
|
|
271
|
+
|
|
272
|
+
def __eq__(self, other):
|
|
273
|
+
r"""
|
|
274
|
+
Test equality between ISD algorithm objects.
|
|
275
|
+
|
|
276
|
+
EXAMPLES::
|
|
277
|
+
|
|
278
|
+
sage: C = codes.GolayCode(GF(2))
|
|
279
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
280
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0,4))
|
|
281
|
+
sage: A == LeeBrickellISDAlgorithm(C, (0,4))
|
|
282
|
+
True
|
|
283
|
+
sage: A == LeeBrickellISDAlgorithm(C, (0,5))
|
|
284
|
+
False
|
|
285
|
+
sage: other_search = 1 if A.parameters()['search_size'] != 1 else 2
|
|
286
|
+
sage: A == LeeBrickellISDAlgorithm(C, (0,4), search_size=other_search)
|
|
287
|
+
False
|
|
288
|
+
|
|
289
|
+
ISD Algorithm objects can be equal only if they have both calibrated
|
|
290
|
+
the parameters, or if they both had it set and to the same value::
|
|
291
|
+
|
|
292
|
+
sage: A2 = LeeBrickellISDAlgorithm(C, (0,4), search_size=A.parameters()['search_size'])
|
|
293
|
+
sage: A == A2
|
|
294
|
+
False
|
|
295
|
+
sage: A2 == LeeBrickellISDAlgorithm(C, (0,4), search_size=A.parameters()['search_size'])
|
|
296
|
+
True
|
|
297
|
+
"""
|
|
298
|
+
return isinstance(other, self.__class__)\
|
|
299
|
+
and self.code() == other.code()\
|
|
300
|
+
and self.decoding_interval() == other.decoding_interval()\
|
|
301
|
+
and self._parameters_specified == other._parameters_specified\
|
|
302
|
+
and (not self._parameters_specified or self.parameters() == other.parameters())
|
|
303
|
+
|
|
304
|
+
def __hash__(self):
|
|
305
|
+
r"""
|
|
306
|
+
Return the hash value of ``self``.
|
|
307
|
+
|
|
308
|
+
EXAMPLES::
|
|
309
|
+
|
|
310
|
+
sage: C = codes.GolayCode(GF(2))
|
|
311
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
312
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0,4))
|
|
313
|
+
sage: hash(A) #random
|
|
314
|
+
5884357732955478461
|
|
315
|
+
sage: C2 = codes.GolayCode(GF(3))
|
|
316
|
+
sage: A2 = LeeBrickellISDAlgorithm(C2, (0,4))
|
|
317
|
+
sage: hash(A) != hash(A2)
|
|
318
|
+
True
|
|
319
|
+
"""
|
|
320
|
+
return hash(str(self))
|
|
321
|
+
|
|
322
|
+
def _repr_(self):
|
|
323
|
+
r"""
|
|
324
|
+
Return a string representation of this ISD algorithm.
|
|
325
|
+
|
|
326
|
+
EXAMPLES::
|
|
327
|
+
|
|
328
|
+
sage: C = codes.GolayCode(GF(2))
|
|
329
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
330
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0,4))
|
|
331
|
+
sage: A
|
|
332
|
+
ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2) decoding up to 4 errors
|
|
333
|
+
"""
|
|
334
|
+
return "ISD Algorithm ({}) for {} decoding {} errors ".format(self._algorithm_name, self.code(), _format_decoding_interval(self.decoding_interval()))
|
|
335
|
+
|
|
336
|
+
def _latex_(self):
|
|
337
|
+
r"""
|
|
338
|
+
Return a latex representation of this ISD algorithm.
|
|
339
|
+
|
|
340
|
+
EXAMPLES::
|
|
341
|
+
|
|
342
|
+
sage: C = codes.GolayCode(GF(2))
|
|
343
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
344
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0,4))
|
|
345
|
+
sage: latex(A)
|
|
346
|
+
\textnormal{ISD Algorithm (Lee-Brickell) for }[24, 12, 8] \textnormal{ Extended Golay Code over } \Bold{F}_{2} \textnormal{decoding up to 4 errors}
|
|
347
|
+
"""
|
|
348
|
+
return "\\textnormal{{ISD Algorithm ({}) for }}{} \\textnormal{{decoding {} errors}}".format(self._algorithm_name, self.code()._latex_(), _format_decoding_interval(self.decoding_interval()))
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
class LeeBrickellISDAlgorithm(InformationSetAlgorithm):
|
|
352
|
+
r"""
|
|
353
|
+
The Lee-Brickell algorithm for information-set decoding.
|
|
354
|
+
|
|
355
|
+
For a description of the information-set decoding paradigm (ISD), see
|
|
356
|
+
:class:`sage.coding.information_set_decoder.LinearCodeInformationSetDecoder`.
|
|
357
|
+
|
|
358
|
+
This implements the Lee-Brickell variant of ISD, see [LB1988]_ for the
|
|
359
|
+
original binary case, and [Pet2010]_ for the `q`-ary extension.
|
|
360
|
+
|
|
361
|
+
Let `C` be a `[n, k]`-linear code over `\GF{q}`, and let `r \in \GF{q}^{n}` be
|
|
362
|
+
a received word in a transmission. We seek the codeword whose Hamming
|
|
363
|
+
distance from `r` is minimal. Let `p` and `w` be integers, such that `0\leq
|
|
364
|
+
p\leq w`, Let `G` be a generator matrix of `C`, and for any set of indices
|
|
365
|
+
`I`, we write `G_{I}` for the matrix formed by the columns of `G` indexed by
|
|
366
|
+
`I`. The Lee-Brickell ISD loops the following until it is successful:
|
|
367
|
+
|
|
368
|
+
1. Choose an information set `I` of `C`.
|
|
369
|
+
2. Compute `r' = r - r_{I} G_I^{-1} G`
|
|
370
|
+
3. Consider every size-`p` subset of `I`, `\{a_1, \dots, a_p\}`.
|
|
371
|
+
For each `m = (m_1, \dots, m_p) \in \GF{q}^{p}`, compute
|
|
372
|
+
the error vector `e = r' - \sum_{i=1}^{p} m_i g_{a_i}`,
|
|
373
|
+
4. If `e` has a Hamming weight at most `w`, return `r-e`.
|
|
374
|
+
|
|
375
|
+
INPUT:
|
|
376
|
+
|
|
377
|
+
- ``code`` -- a linear code for which to decode
|
|
378
|
+
|
|
379
|
+
- ``decoding_interval`` -- a pair of integers specifying an interval of
|
|
380
|
+
number of errors to correct; includes both end values
|
|
381
|
+
|
|
382
|
+
- ``search_size`` -- (optional) the size of subsets to use on step 3 of the
|
|
383
|
+
algorithm as described above. Usually a small number. It has to be at most
|
|
384
|
+
the largest allowed number of errors. A good choice will be approximated
|
|
385
|
+
if this option is not set; see
|
|
386
|
+
:meth:`sage.coding.LeeBrickellISDAlgorithm.calibrate`
|
|
387
|
+
for details.
|
|
388
|
+
|
|
389
|
+
EXAMPLES::
|
|
390
|
+
|
|
391
|
+
sage: C = codes.GolayCode(GF(2))
|
|
392
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
393
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0,4)); A
|
|
394
|
+
ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2)
|
|
395
|
+
decoding up to 4 errors
|
|
396
|
+
|
|
397
|
+
sage: C = codes.GolayCode(GF(2))
|
|
398
|
+
sage: A = LeeBrickellISDAlgorithm(C, (2,3)); A
|
|
399
|
+
ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2)
|
|
400
|
+
decoding between 2 and 3 errors
|
|
401
|
+
"""
|
|
402
|
+
def __init__(self, code, decoding_interval, search_size=None):
|
|
403
|
+
r"""
|
|
404
|
+
TESTS:
|
|
405
|
+
|
|
406
|
+
If ``search_size`` is not a positive integer, or is bigger than the
|
|
407
|
+
decoding radius, an error will be raised::
|
|
408
|
+
|
|
409
|
+
sage: C = codes.GolayCode(GF(2))
|
|
410
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
411
|
+
sage: LeeBrickellISDAlgorithm(C, (1, 3), search_size=-1)
|
|
412
|
+
Traceback (most recent call last):
|
|
413
|
+
...
|
|
414
|
+
ValueError: The search size parameter has to be a positive integer
|
|
415
|
+
|
|
416
|
+
sage: LeeBrickellISDAlgorithm(C, (1, 3), search_size=4)
|
|
417
|
+
Traceback (most recent call last):
|
|
418
|
+
...
|
|
419
|
+
ValueError: The search size parameter has to be at most the maximal number of allowed errors
|
|
420
|
+
"""
|
|
421
|
+
if search_size is not None:
|
|
422
|
+
if not isinstance(search_size, (Integer, int)) or search_size < 0:
|
|
423
|
+
raise ValueError("The search size parameter has to be a positive integer")
|
|
424
|
+
if search_size > decoding_interval[1]:
|
|
425
|
+
raise ValueError("The search size parameter has to be at most"
|
|
426
|
+
" the maximal number of allowed errors")
|
|
427
|
+
super().__init__(code, decoding_interval, "Lee-Brickell",
|
|
428
|
+
parameters={'search_size': search_size})
|
|
429
|
+
self._parameters_specified = True
|
|
430
|
+
else:
|
|
431
|
+
self._parameters_specified = False
|
|
432
|
+
super().__init__(code, decoding_interval, "Lee-Brickell")
|
|
433
|
+
|
|
434
|
+
def decode(self, r):
|
|
435
|
+
r"""
|
|
436
|
+
The Lee-Brickell algorithm as described in the class doc.
|
|
437
|
+
|
|
438
|
+
Note that either parameters must be given at construction time or
|
|
439
|
+
:meth:`sage.coding.information_set_decoder.InformationSetAlgorithm.calibrate()`
|
|
440
|
+
should be called before calling this method.
|
|
441
|
+
|
|
442
|
+
INPUT:
|
|
443
|
+
|
|
444
|
+
- ``r`` -- a received word, i.e. a vector in the ambient space of
|
|
445
|
+
:meth:`decoder.Decoder.code`
|
|
446
|
+
|
|
447
|
+
OUTPUT: a codeword whose distance to `r` satisfies ``self.decoding_interval()``.
|
|
448
|
+
|
|
449
|
+
EXAMPLES::
|
|
450
|
+
|
|
451
|
+
sage: M = matrix(GF(2), [[1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0],\
|
|
452
|
+
....: [0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1],\
|
|
453
|
+
....: [0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0],\
|
|
454
|
+
....: [0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1],\
|
|
455
|
+
....: [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1]])
|
|
456
|
+
sage: C = codes.LinearCode(M)
|
|
457
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
458
|
+
sage: A = LeeBrickellISDAlgorithm(C, (2,2))
|
|
459
|
+
sage: c = C.random_element()
|
|
460
|
+
sage: Chan = channels.StaticErrorRateChannel(C.ambient_space(), 2)
|
|
461
|
+
sage: r = Chan(c)
|
|
462
|
+
sage: c_out = A.decode(r)
|
|
463
|
+
sage: (r - c).hamming_weight() == 2
|
|
464
|
+
True
|
|
465
|
+
"""
|
|
466
|
+
import itertools
|
|
467
|
+
from sage.misc.prandom import sample
|
|
468
|
+
C = self.code()
|
|
469
|
+
n, k = C.length(), C.dimension()
|
|
470
|
+
tau = self.decoding_interval()
|
|
471
|
+
p = self.parameters()['search_size']
|
|
472
|
+
F = C.base_ring()
|
|
473
|
+
G = C.generator_matrix()
|
|
474
|
+
Fstar = F.list()[1:]
|
|
475
|
+
while True:
|
|
476
|
+
# step 1.
|
|
477
|
+
I = sample(range(n), k)
|
|
478
|
+
Gi = G.matrix_from_columns(I)
|
|
479
|
+
try:
|
|
480
|
+
Gi_inv = Gi.inverse()
|
|
481
|
+
except ZeroDivisionError:
|
|
482
|
+
# I was not an information set
|
|
483
|
+
continue
|
|
484
|
+
Gt = Gi_inv * G
|
|
485
|
+
# step 2.
|
|
486
|
+
y = r - vector([r[i] for i in I]) * Gt
|
|
487
|
+
g = Gt.rows()
|
|
488
|
+
# step 3.
|
|
489
|
+
for pi in range(p + 1):
|
|
490
|
+
for A in itertools.combinations(range(k), pi):
|
|
491
|
+
for m in itertools.product(Fstar, repeat=pi):
|
|
492
|
+
e = y - sum(m[i] * g[A[i]] for i in range(pi))
|
|
493
|
+
errs = e.hamming_weight()
|
|
494
|
+
if tau[0] <= errs <= tau[1]:
|
|
495
|
+
return r - e
|
|
496
|
+
|
|
497
|
+
def calibrate(self):
|
|
498
|
+
r"""
|
|
499
|
+
Run some test computations to estimate the optimal search size.
|
|
500
|
+
|
|
501
|
+
Let `p` be the search size. We should simply choose `p` such that the
|
|
502
|
+
average expected time is minimal. The algorithm succeeds when it chooses
|
|
503
|
+
an information set with at least `k - p` correct positions, where `k` is
|
|
504
|
+
the dimension of the code and `p` the search size. The expected number
|
|
505
|
+
of trials we need before this occurs is:
|
|
506
|
+
|
|
507
|
+
.. MATH::
|
|
508
|
+
|
|
509
|
+
\binom{n}{k}/(\rho \sum_{i=0}^p \binom{n-\tau}{k-i} \binom{\tau}{i})
|
|
510
|
+
|
|
511
|
+
Here `\rho` is the fraction of `k` subsets of indices which are
|
|
512
|
+
information sets. If `T` is the average time for steps 1 and 2
|
|
513
|
+
(including selecting `I` until an information set is found), while `P(i)`
|
|
514
|
+
is the time for the body of the ``for``-loop in step 3 for `m` of weight
|
|
515
|
+
`i`, then each information set trial takes roughly time `T +
|
|
516
|
+
\sum_{i=0}^{p} P(i) \binom{k}{i} (q-1)^i`, where `\GF{q}` is the base
|
|
517
|
+
field.
|
|
518
|
+
|
|
519
|
+
The values `T` and `P` are here estimated by running a few test
|
|
520
|
+
computations similar to those done by the decoding algorithm.
|
|
521
|
+
We don't explicitly estimate `\rho`.
|
|
522
|
+
|
|
523
|
+
OUTPUT: does not output anything but sets private fields used by
|
|
524
|
+
:meth:`sage.coding.information_set_decoder.InformationSetAlgorithm.parameters()`
|
|
525
|
+
and
|
|
526
|
+
:meth:`sage.coding.information_set_decoder.InformationSetAlgorithm.time_estimate()`.
|
|
527
|
+
|
|
528
|
+
EXAMPLES::
|
|
529
|
+
|
|
530
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
531
|
+
sage: C = codes.GolayCode(GF(2))
|
|
532
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0,3)); A
|
|
533
|
+
ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2)
|
|
534
|
+
decoding up to 3 errors
|
|
535
|
+
sage: A.calibrate()
|
|
536
|
+
sage: A.parameters() #random
|
|
537
|
+
{'search_size': 1}
|
|
538
|
+
sage: A.time_estimate() #random
|
|
539
|
+
0.0008162108571427874
|
|
540
|
+
|
|
541
|
+
If we specify the parameter at construction time, calibrate does not override this choice::
|
|
542
|
+
|
|
543
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0,3), search_size=2); A
|
|
544
|
+
ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2)
|
|
545
|
+
decoding up to 3 errors
|
|
546
|
+
sage: A.parameters()
|
|
547
|
+
{'search_size': 2}
|
|
548
|
+
sage: A.calibrate()
|
|
549
|
+
sage: A.parameters()
|
|
550
|
+
{'search_size': 2}
|
|
551
|
+
sage: A.time_estimate() #random
|
|
552
|
+
0.0008162108571427874
|
|
553
|
+
"""
|
|
554
|
+
from sage.matrix.special import random_matrix
|
|
555
|
+
from sage.misc.prandom import sample, randint
|
|
556
|
+
from sage.modules.free_module_element import random_vector
|
|
557
|
+
from time import process_time
|
|
558
|
+
|
|
559
|
+
C = self.code()
|
|
560
|
+
G = C.generator_matrix()
|
|
561
|
+
n, k = C.length(), C.dimension()
|
|
562
|
+
tau = self.decoding_interval()[1]
|
|
563
|
+
F = C.base_ring()
|
|
564
|
+
q = F.cardinality()
|
|
565
|
+
Fstar = F.list()[1:]
|
|
566
|
+
|
|
567
|
+
def time_information_set_steps():
|
|
568
|
+
before = process_time()
|
|
569
|
+
while True:
|
|
570
|
+
I = sample(range(n), k)
|
|
571
|
+
Gi = G.matrix_from_columns(I)
|
|
572
|
+
try:
|
|
573
|
+
Gi_inv = Gi.inverse()
|
|
574
|
+
except ZeroDivisionError:
|
|
575
|
+
continue
|
|
576
|
+
return process_time() - before
|
|
577
|
+
|
|
578
|
+
def time_search_loop(p):
|
|
579
|
+
y = random_vector(F, n)
|
|
580
|
+
g = random_matrix(F, p, n).rows()
|
|
581
|
+
scalars = [ [ Fstar[randint(0,q-2)] for i in range(p) ]
|
|
582
|
+
for s in range(100) ]
|
|
583
|
+
before = process_time()
|
|
584
|
+
for m in scalars:
|
|
585
|
+
e = y - sum(m[i]*g[i] for i in range(p))
|
|
586
|
+
return (process_time() - before) / 100.
|
|
587
|
+
T = sum([ time_information_set_steps() for s in range(5) ]) / 5.
|
|
588
|
+
P = [ time_search_loop(p) for p in range(tau+1) ]
|
|
589
|
+
|
|
590
|
+
def compute_estimate(p):
|
|
591
|
+
iters = 1. * binomial(n, k) / \
|
|
592
|
+
sum( binomial(n-tau, k-i)*binomial(tau,i) for i in range(p+1) )
|
|
593
|
+
estimate = iters*(T +
|
|
594
|
+
sum(P[pi] * (q-1)**pi * binomial(k, pi) for pi in range(p+1) ))
|
|
595
|
+
return estimate
|
|
596
|
+
|
|
597
|
+
if self._parameters_specified:
|
|
598
|
+
self._time_estimate = compute_estimate(self._parameters['search_size'])
|
|
599
|
+
else:
|
|
600
|
+
self._calibrate_select([ compute_estimate(p) for p in range(tau+1) ])
|
|
601
|
+
|
|
602
|
+
def _calibrate_select(self, estimates):
|
|
603
|
+
r"""
|
|
604
|
+
Internal method used by ``self.calibrate()``.
|
|
605
|
+
|
|
606
|
+
Given the timing estimates, select the best parameter and set the
|
|
607
|
+
appropriate private fields.
|
|
608
|
+
|
|
609
|
+
INPUT:
|
|
610
|
+
|
|
611
|
+
- ``estimates`` -- list of time estimates, for the search size set to the
|
|
612
|
+
index of the list entry
|
|
613
|
+
|
|
614
|
+
OUTPUT: none, but sets the private fields `self._parameters` and
|
|
615
|
+
`self._time_estimate`.
|
|
616
|
+
|
|
617
|
+
TESTS::
|
|
618
|
+
|
|
619
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
620
|
+
sage: C = codes.GolayCode(GF(2))
|
|
621
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0,3)); A
|
|
622
|
+
ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2) decoding up to 3 errors
|
|
623
|
+
sage: A._calibrate_select([ 1.0, 2.0, 3.0, 0.5, 0.6, 1.0 ])
|
|
624
|
+
sage: A._time_estimate
|
|
625
|
+
0.500000000000000
|
|
626
|
+
sage: A._parameters
|
|
627
|
+
{'search_size': 3}
|
|
628
|
+
"""
|
|
629
|
+
search_size = 0
|
|
630
|
+
for p in range(1, len(estimates)):
|
|
631
|
+
if estimates[p] < estimates[search_size]:
|
|
632
|
+
search_size = p
|
|
633
|
+
self._parameters = { 'search_size': search_size }
|
|
634
|
+
self._time_estimate = estimates[search_size]
|
|
635
|
+
|
|
636
|
+
|
|
637
|
+
class LinearCodeInformationSetDecoder(Decoder):
|
|
638
|
+
r"""
|
|
639
|
+
Information-set decoder for any linear code.
|
|
640
|
+
|
|
641
|
+
Information-set decoding is a probabilistic decoding strategy that
|
|
642
|
+
essentially tries to guess `k` correct positions in the received word,
|
|
643
|
+
where `k` is the dimension of the code. A codeword agreeing with the
|
|
644
|
+
received word on the guessed position can easily be computed, and their
|
|
645
|
+
difference is one possible error vector. A "correct" guess is assumed when
|
|
646
|
+
this error vector has low Hamming weight.
|
|
647
|
+
|
|
648
|
+
The ISD strategy requires choosing how many errors is deemed acceptable. One
|
|
649
|
+
choice could be `d/2`, where `d` is the minimum distance of the code, but
|
|
650
|
+
sometimes `d` is not known, or sometimes more errors are expected. If one
|
|
651
|
+
chooses anything above `d/2`, the algorithm does not guarantee to return a
|
|
652
|
+
nearest codeword.
|
|
653
|
+
|
|
654
|
+
This simple algorithm is not very efficient in itself, but there are numerous
|
|
655
|
+
refinements to the strategy. Specifying which strategy to use among those
|
|
656
|
+
that Sage knows is done using the ``algorithm`` keyword. If this is not set,
|
|
657
|
+
an efficient choice will be made for you.
|
|
658
|
+
|
|
659
|
+
The various ISD algorithms all need to select a number of parameters. If you
|
|
660
|
+
choose a specific algorithm to use, you can pass these parameters as named
|
|
661
|
+
parameters directly to this class' constructor. If you don't, efficient
|
|
662
|
+
choices will be calibrated for you.
|
|
663
|
+
|
|
664
|
+
.. WARNING::
|
|
665
|
+
|
|
666
|
+
If there is no codeword within the specified decoding distance, then the
|
|
667
|
+
decoder may never terminate, or it may raise a
|
|
668
|
+
:exc:`sage.coding.decoder.DecodingError` exception, depending on the ISD
|
|
669
|
+
algorithm used.
|
|
670
|
+
|
|
671
|
+
INPUT:
|
|
672
|
+
|
|
673
|
+
- ``code`` -- a linear code for which to decode
|
|
674
|
+
|
|
675
|
+
- ``number_errors`` -- integer; the maximal number of errors to accept as
|
|
676
|
+
correct decoding. An interval can also be specified by giving a pair of
|
|
677
|
+
integers, where both end values are taken to be in the interval.
|
|
678
|
+
|
|
679
|
+
- ``algorithm`` -- (optional) the string name of the ISD algorithm to
|
|
680
|
+
employ. If this is not set, an appropriate one will be chosen.
|
|
681
|
+
A constructed
|
|
682
|
+
:class:`sage.coding.information_set_decoder.InformationSetAlgorithm`
|
|
683
|
+
object may also be given. In this case ``number_errors`` must match that
|
|
684
|
+
of the passed algorithm.
|
|
685
|
+
|
|
686
|
+
- ``**kwargs`` -- (optional) any number of named arguments passed on to the
|
|
687
|
+
ISD algorithm. Such are usually not required, and they can only be set if
|
|
688
|
+
``algorithm`` is set to a specific algorithm. See the documentation for
|
|
689
|
+
each individual ISD algorithm class for information on any named arguments
|
|
690
|
+
they may accept. The easiest way to access this documentation is to first
|
|
691
|
+
construct the decoder without passing any named arguments, then accessing
|
|
692
|
+
the ISD algorithm using
|
|
693
|
+
:meth:`sage.coding.information_set_decoder.LinearCodeInformationSetDecoder.algorithm`,
|
|
694
|
+
and then reading the `?` help on the constructed object.
|
|
695
|
+
|
|
696
|
+
EXAMPLES:
|
|
697
|
+
|
|
698
|
+
The principal way to access this class is through the
|
|
699
|
+
:meth:`sage.code.linear_code.AbstractLinearCode.decoder` method::
|
|
700
|
+
|
|
701
|
+
sage: C = codes.GolayCode(GF(3))
|
|
702
|
+
sage: D = C.decoder('InformationSet', 2); D
|
|
703
|
+
Information-set decoder (Lee-Brickell) for [12, 6, 6] Extended Golay code over GF(3)
|
|
704
|
+
decoding up to 2 errors
|
|
705
|
+
|
|
706
|
+
You can specify which algorithm you wish to use, and you should do so in
|
|
707
|
+
order to pass special parameters to it::
|
|
708
|
+
|
|
709
|
+
sage: C = codes.GolayCode(GF(3))
|
|
710
|
+
sage: D2 = C.decoder('InformationSet', 2, algorithm='Lee-Brickell', search_size=2); D2
|
|
711
|
+
Information-set decoder (Lee-Brickell) for [12, 6, 6] Extended Golay code over GF(3)
|
|
712
|
+
decoding up to 2 errors
|
|
713
|
+
sage: D2.algorithm()
|
|
714
|
+
ISD Algorithm (Lee-Brickell) for [12, 6, 6] Extended Golay code over GF(3)
|
|
715
|
+
decoding up to 2 errors
|
|
716
|
+
sage: D2.algorithm().parameters()
|
|
717
|
+
{'search_size': 2}
|
|
718
|
+
|
|
719
|
+
If you specify an algorithm which is not known, you get a friendly error message::
|
|
720
|
+
|
|
721
|
+
sage: C.decoder('InformationSet', 2, algorithm="NoSuchThing")
|
|
722
|
+
Traceback (most recent call last):
|
|
723
|
+
...
|
|
724
|
+
ValueError: Unknown ISD algorithm 'NoSuchThing'.
|
|
725
|
+
The known algorithms are ['Lee-Brickell'].
|
|
726
|
+
|
|
727
|
+
You can also construct an ISD algorithm separately and pass that. This is
|
|
728
|
+
mostly useful if you write your own ISD algorithms::
|
|
729
|
+
|
|
730
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
731
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0, 2))
|
|
732
|
+
sage: D = C.decoder('InformationSet', 2, algorithm=A); D
|
|
733
|
+
Information-set decoder (Lee-Brickell) for [12, 6, 6] Extended Golay code over GF(3)
|
|
734
|
+
decoding up to 2 errors
|
|
735
|
+
|
|
736
|
+
When passing an already constructed ISD algorithm, you can't also pass
|
|
737
|
+
parameters to the ISD algorithm when constructing the decoder::
|
|
738
|
+
|
|
739
|
+
sage: C.decoder('InformationSet', 2, algorithm=A, search_size=2)
|
|
740
|
+
Traceback (most recent call last):
|
|
741
|
+
...
|
|
742
|
+
ValueError: ISD algorithm arguments are not allowed
|
|
743
|
+
when supplying a constructed ISD algorithm
|
|
744
|
+
|
|
745
|
+
We can also information-set decode non-binary codes::
|
|
746
|
+
|
|
747
|
+
sage: C = codes.GolayCode(GF(3))
|
|
748
|
+
sage: D = C.decoder('InformationSet', 2); D
|
|
749
|
+
Information-set decoder (Lee-Brickell) for [12, 6, 6] Extended Golay code over GF(3)
|
|
750
|
+
decoding up to 2 errors
|
|
751
|
+
|
|
752
|
+
There are two other ways to access this class::
|
|
753
|
+
|
|
754
|
+
sage: D = codes.decoders.LinearCodeInformationSetDecoder(C, 2); D
|
|
755
|
+
Information-set decoder (Lee-Brickell) for [12, 6, 6] Extended Golay code over GF(3)
|
|
756
|
+
decoding up to 2 errors
|
|
757
|
+
|
|
758
|
+
sage: from sage.coding.information_set_decoder import LinearCodeInformationSetDecoder
|
|
759
|
+
sage: D = LinearCodeInformationSetDecoder(C, 2); D
|
|
760
|
+
Information-set decoder (Lee-Brickell) for [12, 6, 6] Extended Golay code over GF(3)
|
|
761
|
+
decoding up to 2 errors
|
|
762
|
+
"""
|
|
763
|
+
def __init__(self, code, number_errors, algorithm=None, **kwargs):
|
|
764
|
+
r"""
|
|
765
|
+
TESTS:
|
|
766
|
+
|
|
767
|
+
``number_errors`` has to be either a list of Integers/ints, a tuple of Integers/ints,
|
|
768
|
+
or an Integer/int::
|
|
769
|
+
|
|
770
|
+
sage: C = codes.GolayCode(GF(2))
|
|
771
|
+
sage: D = C.decoder('InformationSet', "aa")
|
|
772
|
+
Traceback (most recent call last):
|
|
773
|
+
...
|
|
774
|
+
ValueError: number_errors should be an integer or a pair of integers
|
|
775
|
+
|
|
776
|
+
If ``number_errors`` is passed as a list/tuple, it has to contain only
|
|
777
|
+
two values, the first one being at most the second one::
|
|
778
|
+
|
|
779
|
+
sage: C = codes.GolayCode(GF(2))
|
|
780
|
+
sage: D = C.decoder('InformationSet', (4, 2))
|
|
781
|
+
Traceback (most recent call last):
|
|
782
|
+
...
|
|
783
|
+
ValueError: number_errors should be a positive integer or a valid interval within the positive integers
|
|
784
|
+
|
|
785
|
+
You cannot ask the decoder to correct more errors than the code length::
|
|
786
|
+
|
|
787
|
+
sage: D = C.decoder('InformationSet', 25)
|
|
788
|
+
Traceback (most recent call last):
|
|
789
|
+
...
|
|
790
|
+
ValueError: The provided number of errors should be at most the code's length
|
|
791
|
+
|
|
792
|
+
If ``algorithm`` is not set, additional parameters cannot be passed to
|
|
793
|
+
the ISD algorithm::
|
|
794
|
+
|
|
795
|
+
sage: D = C.decoder('InformationSet', 2, search_size=2)
|
|
796
|
+
Traceback (most recent call last):
|
|
797
|
+
...
|
|
798
|
+
ValueError: Additional arguments to an information-set decoder algorithm are only allowed if a specific algorithm is selected by setting the algorithm keyword
|
|
799
|
+
|
|
800
|
+
If ``algorithm`` is set to a constructed ISD algorithm, additional
|
|
801
|
+
parameters cannot be passed to the ISD algorithm::
|
|
802
|
+
|
|
803
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
804
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0, 2))
|
|
805
|
+
sage: D = C.decoder('InformationSet', 2, A, search_size=3)
|
|
806
|
+
Traceback (most recent call last):
|
|
807
|
+
...
|
|
808
|
+
ValueError: ISD algorithm arguments are not allowed when supplying a constructed ISD algorithm
|
|
809
|
+
|
|
810
|
+
If ``algorithm`` is set to a constructed
|
|
811
|
+
:class:`sage.coding.information_set_decoder.InformationSetAlgorithm`,
|
|
812
|
+
then ``number_errors`` must match that of the algorithm::
|
|
813
|
+
|
|
814
|
+
sage: C = codes.GolayCode(GF(2))
|
|
815
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
816
|
+
sage: A = LeeBrickellISDAlgorithm(C, (0, 2))
|
|
817
|
+
sage: D = C.decoder('InformationSet', 2, A); D
|
|
818
|
+
Information-set decoder (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2) decoding up to 2 errors
|
|
819
|
+
sage: D = C.decoder('InformationSet', (0,2), A); D
|
|
820
|
+
Information-set decoder (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2) decoding up to 2 errors
|
|
821
|
+
sage: D = C.decoder('InformationSet', 3, A); D
|
|
822
|
+
Traceback (most recent call last):
|
|
823
|
+
...
|
|
824
|
+
ValueError: number_errors must match that of the passed ISD algorithm
|
|
825
|
+
"""
|
|
826
|
+
if isinstance(number_errors, (Integer, int)):
|
|
827
|
+
number_errors = (0, number_errors)
|
|
828
|
+
if isinstance(number_errors, (tuple, list)) and len(number_errors) == 2 \
|
|
829
|
+
and number_errors[0] in ZZ and number_errors[1] in ZZ:
|
|
830
|
+
if 0 > number_errors[0] or number_errors[0] > number_errors[1]:
|
|
831
|
+
raise ValueError(
|
|
832
|
+
"number_errors should be a positive integer or"
|
|
833
|
+
" a valid interval within the positive integers")
|
|
834
|
+
if number_errors[1] > code.length():
|
|
835
|
+
raise ValueError("The provided number of errors should be at"
|
|
836
|
+
" most the code's length")
|
|
837
|
+
else:
|
|
838
|
+
raise ValueError("number_errors should be an integer or a pair of integers")
|
|
839
|
+
|
|
840
|
+
self._number_errors = number_errors
|
|
841
|
+
|
|
842
|
+
super().__init__(code, code.ambient_space(), code._default_encoder_name)
|
|
843
|
+
|
|
844
|
+
if algorithm is None:
|
|
845
|
+
if kwargs:
|
|
846
|
+
raise ValueError("Additional arguments to an information-set decoder"
|
|
847
|
+
" algorithm are only allowed if a specific"
|
|
848
|
+
" algorithm is selected by setting the algorithm"
|
|
849
|
+
" keyword")
|
|
850
|
+
algorithm = "Lee-Brickell"
|
|
851
|
+
algorithm_names = LinearCodeInformationSetDecoder.known_algorithms(dictionary=True)
|
|
852
|
+
|
|
853
|
+
if isinstance(algorithm, InformationSetAlgorithm):
|
|
854
|
+
if kwargs:
|
|
855
|
+
raise ValueError("ISD algorithm arguments are not allowed when"
|
|
856
|
+
" supplying a constructed ISD algorithm")
|
|
857
|
+
if number_errors != algorithm.decoding_interval():
|
|
858
|
+
raise ValueError("number_errors must match that of the passed"
|
|
859
|
+
" ISD algorithm")
|
|
860
|
+
self._algorithm = algorithm
|
|
861
|
+
elif algorithm in algorithm_names:
|
|
862
|
+
self._algorithm = algorithm_names[algorithm](code, number_errors, **kwargs)
|
|
863
|
+
else:
|
|
864
|
+
raise ValueError("Unknown ISD algorithm '{}'."
|
|
865
|
+
" The known algorithms are {}."
|
|
866
|
+
.format(algorithm, sorted(algorithm_names)))
|
|
867
|
+
|
|
868
|
+
_known_algorithms = {
|
|
869
|
+
"Lee-Brickell": LeeBrickellISDAlgorithm
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
@staticmethod
|
|
873
|
+
def known_algorithms(dictionary=False):
|
|
874
|
+
r"""
|
|
875
|
+
Return the list of ISD algorithms that Sage knows.
|
|
876
|
+
|
|
877
|
+
Passing any of these to the constructor of
|
|
878
|
+
:class:`sage.coding.information_set_decoder.LinearCodeInformationSetDecoder`
|
|
879
|
+
will make the ISD decoder use that algorithm.
|
|
880
|
+
|
|
881
|
+
INPUT:
|
|
882
|
+
|
|
883
|
+
- ``dictionary`` -- boolean (default: ``False``); if set to ``True``,
|
|
884
|
+
return a ``dict`` mapping decoding algorithm name to its class
|
|
885
|
+
|
|
886
|
+
OUTPUT: list of strings or a ``dict`` from string to ISD algorithm class
|
|
887
|
+
|
|
888
|
+
EXAMPLES::
|
|
889
|
+
|
|
890
|
+
sage: from sage.coding.information_set_decoder import LinearCodeInformationSetDecoder
|
|
891
|
+
sage: sorted(LinearCodeInformationSetDecoder.known_algorithms())
|
|
892
|
+
['Lee-Brickell']
|
|
893
|
+
"""
|
|
894
|
+
if dictionary:
|
|
895
|
+
return LinearCodeInformationSetDecoder._known_algorithms
|
|
896
|
+
else:
|
|
897
|
+
return LinearCodeInformationSetDecoder._known_algorithms.keys()
|
|
898
|
+
|
|
899
|
+
def algorithm(self):
|
|
900
|
+
r"""
|
|
901
|
+
Return the ISD algorithm used by this ISD decoder.
|
|
902
|
+
|
|
903
|
+
EXAMPLES::
|
|
904
|
+
|
|
905
|
+
sage: C = codes.GolayCode(GF(2))
|
|
906
|
+
sage: D = C.decoder('InformationSet', (2,4), "Lee-Brickell")
|
|
907
|
+
sage: D.algorithm()
|
|
908
|
+
ISD Algorithm (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2)
|
|
909
|
+
decoding between 2 and 4 errors
|
|
910
|
+
"""
|
|
911
|
+
return self._algorithm
|
|
912
|
+
|
|
913
|
+
def decode_to_code(self, r):
|
|
914
|
+
r"""
|
|
915
|
+
Decodes a received word with respect to the associated code of this decoder.
|
|
916
|
+
|
|
917
|
+
.. WARNING::
|
|
918
|
+
|
|
919
|
+
If there is no codeword within the decoding radius of this decoder, this
|
|
920
|
+
method may never terminate, or it may raise a
|
|
921
|
+
:exc:`sage.coding.decoder.DecodingError` exception, depending on the ISD
|
|
922
|
+
algorithm used.
|
|
923
|
+
|
|
924
|
+
INPUT:
|
|
925
|
+
|
|
926
|
+
- ``r`` -- a vector in the ambient space of :meth:`decoder.Decoder.code`
|
|
927
|
+
|
|
928
|
+
OUTPUT: a codeword of :meth:`decoder.Decoder.code`
|
|
929
|
+
|
|
930
|
+
EXAMPLES::
|
|
931
|
+
|
|
932
|
+
sage: M = matrix(GF(2), [[1,0,0,0,0,0,1,0,1,0,1,1,0,0,1],\
|
|
933
|
+
....: [0,1,0,0,0,1,1,1,1,0,0,0,0,1,1],\
|
|
934
|
+
....: [0,0,1,0,0,0,0,1,0,1,1,1,1,1,0],\
|
|
935
|
+
....: [0,0,0,1,0,0,1,0,1,0,0,0,1,1,0],\
|
|
936
|
+
....: [0,0,0,0,1,0,0,0,1,0,1,1,0,1,0]])
|
|
937
|
+
sage: C = LinearCode(M)
|
|
938
|
+
sage: c = C.random_element()
|
|
939
|
+
sage: Chan = channels.StaticErrorRateChannel(C.ambient_space(), 2)
|
|
940
|
+
sage: r = Chan(c)
|
|
941
|
+
sage: D = C.decoder('InformationSet', 2)
|
|
942
|
+
sage: c == D.decode_to_code(r)
|
|
943
|
+
True
|
|
944
|
+
|
|
945
|
+
Information-set decoding a non-binary code::
|
|
946
|
+
|
|
947
|
+
sage: C = codes.GolayCode(GF(3)); C
|
|
948
|
+
[12, 6, 6] Extended Golay code over GF(3)
|
|
949
|
+
sage: c = C.random_element()
|
|
950
|
+
sage: Chan = channels.StaticErrorRateChannel(C.ambient_space(), 2)
|
|
951
|
+
sage: r = Chan(c)
|
|
952
|
+
sage: D = C.decoder('InformationSet', 2)
|
|
953
|
+
sage: c == D.decode_to_code(r)
|
|
954
|
+
True
|
|
955
|
+
|
|
956
|
+
Let's take a bigger example, for which syndrome decoding or
|
|
957
|
+
nearest-neighbor decoding would be infeasible: the `[59, 30]` Quadratic
|
|
958
|
+
Residue code over `\GF{3}` has true minimum distance 17, so we can
|
|
959
|
+
correct 8 errors::
|
|
960
|
+
|
|
961
|
+
sage: C = codes.QuadraticResidueCode(59, GF(3))
|
|
962
|
+
sage: c = C.random_element()
|
|
963
|
+
sage: Chan = channels.StaticErrorRateChannel(C.ambient_space(), 2)
|
|
964
|
+
sage: r = Chan(c)
|
|
965
|
+
sage: D = C.decoder('InformationSet', 8)
|
|
966
|
+
sage: c == D.decode_to_code(r) # long time
|
|
967
|
+
True
|
|
968
|
+
"""
|
|
969
|
+
C = self.code()
|
|
970
|
+
if r in C:
|
|
971
|
+
return r
|
|
972
|
+
return self.algorithm().decode(r)
|
|
973
|
+
|
|
974
|
+
def decoding_radius(self):
|
|
975
|
+
r"""
|
|
976
|
+
Return the maximal number of errors this decoder can decode.
|
|
977
|
+
|
|
978
|
+
EXAMPLES::
|
|
979
|
+
|
|
980
|
+
sage: C = codes.GolayCode(GF(2))
|
|
981
|
+
sage: D = C.decoder('InformationSet', 2)
|
|
982
|
+
sage: D.decoding_radius()
|
|
983
|
+
2
|
|
984
|
+
"""
|
|
985
|
+
return self._number_errors[1]
|
|
986
|
+
|
|
987
|
+
def decoding_interval(self):
|
|
988
|
+
r"""
|
|
989
|
+
A pair of integers specifying the interval of number of errors this
|
|
990
|
+
decoder will attempt to correct.
|
|
991
|
+
|
|
992
|
+
The interval includes both end values.
|
|
993
|
+
|
|
994
|
+
EXAMPLES::
|
|
995
|
+
|
|
996
|
+
sage: C = codes.GolayCode(GF(2))
|
|
997
|
+
sage: D = C.decoder('InformationSet', 2)
|
|
998
|
+
sage: D.decoding_interval()
|
|
999
|
+
(0, 2)
|
|
1000
|
+
"""
|
|
1001
|
+
return self._number_errors
|
|
1002
|
+
|
|
1003
|
+
def _repr_(self):
|
|
1004
|
+
r"""
|
|
1005
|
+
Return a string representation of this decoding algorithm.
|
|
1006
|
+
|
|
1007
|
+
EXAMPLES::
|
|
1008
|
+
|
|
1009
|
+
sage: C = codes.GolayCode(GF(2))
|
|
1010
|
+
sage: D = C.decoder('InformationSet', 2)
|
|
1011
|
+
sage: D
|
|
1012
|
+
Information-set decoder (Lee-Brickell) for [24, 12, 8] Extended Golay code over GF(2) decoding up to 2 errors
|
|
1013
|
+
"""
|
|
1014
|
+
return "Information-set decoder ({}) for {} decoding {} errors ".format(self.algorithm().name(), self.code(), _format_decoding_interval(self.decoding_interval()))
|
|
1015
|
+
|
|
1016
|
+
def _latex_(self):
|
|
1017
|
+
r"""
|
|
1018
|
+
Return a latex representation of this decoding algorithm.
|
|
1019
|
+
|
|
1020
|
+
EXAMPLES::
|
|
1021
|
+
|
|
1022
|
+
sage: C = codes.GolayCode(GF(2))
|
|
1023
|
+
sage: from sage.coding.information_set_decoder import LeeBrickellISDAlgorithm
|
|
1024
|
+
sage: D = C.decoder('InformationSet', 2)
|
|
1025
|
+
sage: latex(D)
|
|
1026
|
+
\textnormal{Information-set decoder (Lee-Brickell) for }[24, 12, 8] \textnormal{ Extended Golay Code over } \Bold{F}_{2} \textnormal{decoding up to 2 errors}
|
|
1027
|
+
"""
|
|
1028
|
+
return "\\textnormal{{Information-set decoder ({}) for }}{} \\textnormal{{decoding {} errors}}".format(self.algorithm().name(), self.code()._latex_(), _format_decoding_interval(self.decoding_interval()))
|
|
1029
|
+
|
|
1030
|
+
|
|
1031
|
+
LinearCodeInformationSetDecoder._decoder_type = {"hard-decision",
|
|
1032
|
+
"probabilistic", "not-always-closest", "bounded-distance", "might-fail"}
|