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
sage/coding/channel.py
ADDED
|
@@ -0,0 +1,819 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
# sage.doctest: needs sage.modules sage.rings.finite_rings
|
|
3
|
+
r"""
|
|
4
|
+
Channels
|
|
5
|
+
|
|
6
|
+
Given an input space and an output space, a channel takes element from the
|
|
7
|
+
input space (the message) and transforms it into an element of the output space
|
|
8
|
+
(the transmitted message).
|
|
9
|
+
|
|
10
|
+
In Sage, Channels simulate error-prone transmission over communication
|
|
11
|
+
channels, and we borrow the nomenclature from communication theory, such as
|
|
12
|
+
"transmission" and "positions" as the elements of transmitted vectors.
|
|
13
|
+
Transmission can be achieved with two methods:
|
|
14
|
+
|
|
15
|
+
- :meth:`Channel.transmit`. Considering a channel ``Chan`` and a message
|
|
16
|
+
``msg``, transmitting ``msg`` with ``Chan`` can be done this way::
|
|
17
|
+
|
|
18
|
+
Chan.transmit(msg)
|
|
19
|
+
|
|
20
|
+
It can also be written in a more convenient way::
|
|
21
|
+
|
|
22
|
+
Chan(msg)
|
|
23
|
+
|
|
24
|
+
- :meth:`transmit_unsafe`. This does the exact same thing as
|
|
25
|
+
:meth:`transmit` except that it does not check if ``msg`` belongs to the
|
|
26
|
+
input space of ``Chan``::
|
|
27
|
+
|
|
28
|
+
Chan.transmit_unsafe(msg)
|
|
29
|
+
|
|
30
|
+
This is useful in e.g. an inner-loop of a long simulation as a
|
|
31
|
+
lighter-weight alternative to :meth:`Channel.transmit`.
|
|
32
|
+
|
|
33
|
+
This file contains the following elements:
|
|
34
|
+
|
|
35
|
+
- :class:`Channel`, the abstract class for Channels
|
|
36
|
+
- :class:`StaticErrorRateChannel`, which creates a specific number of errors in each
|
|
37
|
+
transmitted message
|
|
38
|
+
- :class:`ErrorErasureChannel`, which creates a specific number of errors and a
|
|
39
|
+
specific number of erasures in each transmitted message
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
# ****************************************************************************
|
|
43
|
+
# Copyright (C) 2015 David Lucas <david.lucas@inria.fr>
|
|
44
|
+
#
|
|
45
|
+
# This program is free software: you can redistribute it and/or modify
|
|
46
|
+
# it under the terms of the GNU General Public License as published by
|
|
47
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
48
|
+
# (at your option) any later version.
|
|
49
|
+
# https://www.gnu.org/licenses/
|
|
50
|
+
# ****************************************************************************
|
|
51
|
+
from copy import copy
|
|
52
|
+
|
|
53
|
+
from sage.structure.sage_object import SageObject
|
|
54
|
+
from sage.rings.integer import Integer
|
|
55
|
+
from sage.rings.finite_rings.finite_field_constructor import GF
|
|
56
|
+
from sage.misc.prandom import randint, random, sample
|
|
57
|
+
from sage.modules.free_module_element import vector
|
|
58
|
+
from sage.misc.abstract_method import abstract_method
|
|
59
|
+
from sage.categories.cartesian_product import cartesian_product
|
|
60
|
+
from sage.modules.free_module import VectorSpace
|
|
61
|
+
from sage.arith.misc import binomial
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def random_error_vector(n, F, error_positions):
|
|
65
|
+
r"""
|
|
66
|
+
Return a vector of length ``n`` over ``F`` filled with random nonzero coefficients
|
|
67
|
+
at the positions given by ``error_positions``.
|
|
68
|
+
|
|
69
|
+
.. NOTE::
|
|
70
|
+
|
|
71
|
+
This is a helper function, which should only be used when implementing new channels.
|
|
72
|
+
|
|
73
|
+
INPUT:
|
|
74
|
+
|
|
75
|
+
- ``n`` -- the length of the vector
|
|
76
|
+
|
|
77
|
+
- ``F`` -- the field over which the vector is defined
|
|
78
|
+
|
|
79
|
+
- ``error_positions`` -- the nonzero positions of the vector
|
|
80
|
+
|
|
81
|
+
OUTPUT: a vector of ``F``
|
|
82
|
+
|
|
83
|
+
AUTHORS:
|
|
84
|
+
|
|
85
|
+
This function is taken from codinglib (https://bitbucket.org/jsrn/codinglib/)
|
|
86
|
+
and was written by Johan Nielsen.
|
|
87
|
+
|
|
88
|
+
EXAMPLES::
|
|
89
|
+
|
|
90
|
+
sage: from sage.coding.channel import random_error_vector
|
|
91
|
+
sage: random_error_vector(5, GF(2), [1,3])
|
|
92
|
+
(0, 1, 0, 1, 0)
|
|
93
|
+
"""
|
|
94
|
+
vect = [F.zero()]*n
|
|
95
|
+
for i in error_positions:
|
|
96
|
+
vect[i] = F._random_nonzero_element()
|
|
97
|
+
return vector(F, vect)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def format_interval(t):
|
|
101
|
+
r"""
|
|
102
|
+
Return a formatted string representation of ``t``.
|
|
103
|
+
|
|
104
|
+
This method should be called by any representation function in Channel classes.
|
|
105
|
+
|
|
106
|
+
.. NOTE::
|
|
107
|
+
|
|
108
|
+
This is a helper function, which should only be used when implementing new channels.
|
|
109
|
+
|
|
110
|
+
INPUT:
|
|
111
|
+
|
|
112
|
+
- ``t`` -- list or a tuple
|
|
113
|
+
|
|
114
|
+
OUTPUT: string
|
|
115
|
+
|
|
116
|
+
TESTS::
|
|
117
|
+
|
|
118
|
+
sage: from sage.coding.channel import format_interval
|
|
119
|
+
sage: t = (5, 5)
|
|
120
|
+
sage: format_interval(t)
|
|
121
|
+
'5'
|
|
122
|
+
|
|
123
|
+
sage: t = (2, 10)
|
|
124
|
+
sage: format_interval(t)
|
|
125
|
+
'between 2 and 10'
|
|
126
|
+
"""
|
|
127
|
+
return str(t[0]) if t[0] == t[1] else 'between %s and %s' % (t[0], t[1])
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class Channel(SageObject):
|
|
131
|
+
r"""
|
|
132
|
+
Abstract top-class for Channel objects.
|
|
133
|
+
|
|
134
|
+
All channel objects must inherit from this class. To implement a channel subclass, one should
|
|
135
|
+
do the following:
|
|
136
|
+
|
|
137
|
+
- inherit from this class,
|
|
138
|
+
|
|
139
|
+
- call the super constructor,
|
|
140
|
+
|
|
141
|
+
- override :meth:`transmit_unsafe`.
|
|
142
|
+
|
|
143
|
+
While not being mandatory, it might be useful to reimplement representation methods (``_repr_`` and
|
|
144
|
+
``_latex_``).
|
|
145
|
+
|
|
146
|
+
This abstract class provides the following parameters:
|
|
147
|
+
|
|
148
|
+
- ``input_space`` -- the space of the words to transmit
|
|
149
|
+
|
|
150
|
+
- ``output_space`` -- the space of the transmitted words
|
|
151
|
+
"""
|
|
152
|
+
|
|
153
|
+
def __init__(self, input_space, output_space):
|
|
154
|
+
r"""
|
|
155
|
+
Initialize parameters for a Channel object.
|
|
156
|
+
|
|
157
|
+
This is a private method, which should be called by the constructor
|
|
158
|
+
of every encoder, as it automatically initializes the mandatory
|
|
159
|
+
parameters of a Channel object.
|
|
160
|
+
|
|
161
|
+
INPUT:
|
|
162
|
+
|
|
163
|
+
- ``input_space`` -- the space of the words to transmit
|
|
164
|
+
|
|
165
|
+
- ``output_space`` -- the space of the transmitted words
|
|
166
|
+
|
|
167
|
+
EXAMPLES:
|
|
168
|
+
|
|
169
|
+
We first create a new Channel subclass::
|
|
170
|
+
|
|
171
|
+
sage: from sage.coding.channel import Channel
|
|
172
|
+
sage: class ChannelExample(Channel):
|
|
173
|
+
....: def __init__(self, input_space, output_space):
|
|
174
|
+
....: super().__init__(input_space, output_space)
|
|
175
|
+
|
|
176
|
+
We now create a member of our newly made class::
|
|
177
|
+
|
|
178
|
+
sage: input = VectorSpace(GF(7), 6)
|
|
179
|
+
sage: output = VectorSpace(GF(7), 5)
|
|
180
|
+
sage: Chan = ChannelExample(input, output)
|
|
181
|
+
|
|
182
|
+
We can check its parameters::
|
|
183
|
+
|
|
184
|
+
sage: Chan.input_space()
|
|
185
|
+
Vector space of dimension 6 over Finite Field of size 7
|
|
186
|
+
sage: Chan.output_space()
|
|
187
|
+
Vector space of dimension 5 over Finite Field of size 7
|
|
188
|
+
"""
|
|
189
|
+
self._input_space = input_space
|
|
190
|
+
self._output_space = output_space
|
|
191
|
+
|
|
192
|
+
def transmit(self, message):
|
|
193
|
+
r"""
|
|
194
|
+
Return ``message``, modified accordingly with the algorithm of the channel it was
|
|
195
|
+
transmitted through.
|
|
196
|
+
|
|
197
|
+
Checks if ``message`` belongs to the input space, and returns an exception if not.
|
|
198
|
+
Note that ``message`` itself is never modified by the channel.
|
|
199
|
+
|
|
200
|
+
INPUT:
|
|
201
|
+
|
|
202
|
+
- ``message`` -- a vector
|
|
203
|
+
|
|
204
|
+
OUTPUT: a vector of the output space of ``self``
|
|
205
|
+
|
|
206
|
+
EXAMPLES::
|
|
207
|
+
|
|
208
|
+
sage: F = GF(59)^6
|
|
209
|
+
sage: n_err = 2
|
|
210
|
+
sage: Chan = channels.StaticErrorRateChannel(F, n_err)
|
|
211
|
+
sage: msg = F((4, 8, 15, 16, 23, 42))
|
|
212
|
+
sage: set_random_seed(10)
|
|
213
|
+
sage: Chan.transmit(msg)
|
|
214
|
+
(4, 8, 4, 16, 23, 53)
|
|
215
|
+
|
|
216
|
+
We can check that the input ``msg`` is not modified::
|
|
217
|
+
|
|
218
|
+
sage: msg
|
|
219
|
+
(4, 8, 15, 16, 23, 42)
|
|
220
|
+
|
|
221
|
+
If we transmit a vector which is not in the input space of ``self``::
|
|
222
|
+
|
|
223
|
+
sage: n_err = 2
|
|
224
|
+
sage: Chan = channels.StaticErrorRateChannel(GF(59)^6, n_err)
|
|
225
|
+
sage: msg = (4, 8, 15, 16, 23, 42)
|
|
226
|
+
sage: Chan.transmit(msg)
|
|
227
|
+
Traceback (most recent call last):
|
|
228
|
+
...
|
|
229
|
+
TypeError: Message must be an element of the input space for the given channel
|
|
230
|
+
|
|
231
|
+
.. NOTE::
|
|
232
|
+
|
|
233
|
+
One can also call directly ``Chan(message)``, which does the same as ``Chan.transmit(message)``
|
|
234
|
+
"""
|
|
235
|
+
if message in self.input_space():
|
|
236
|
+
return self.transmit_unsafe(message)
|
|
237
|
+
else:
|
|
238
|
+
raise TypeError("Message must be an element of the input space for the given channel")
|
|
239
|
+
|
|
240
|
+
#Alias for transmit method
|
|
241
|
+
__call__ = transmit
|
|
242
|
+
|
|
243
|
+
def input_space(self):
|
|
244
|
+
r"""
|
|
245
|
+
Return the input space of ``self``.
|
|
246
|
+
|
|
247
|
+
EXAMPLES::
|
|
248
|
+
|
|
249
|
+
sage: n_err = 2
|
|
250
|
+
sage: Chan = channels.StaticErrorRateChannel(GF(59)^6, n_err)
|
|
251
|
+
sage: Chan.input_space()
|
|
252
|
+
Vector space of dimension 6 over Finite Field of size 59
|
|
253
|
+
"""
|
|
254
|
+
return self._input_space
|
|
255
|
+
|
|
256
|
+
def output_space(self):
|
|
257
|
+
r"""
|
|
258
|
+
Return the output space of ``self``.
|
|
259
|
+
|
|
260
|
+
EXAMPLES::
|
|
261
|
+
|
|
262
|
+
sage: n_err = 2
|
|
263
|
+
sage: Chan = channels.StaticErrorRateChannel(GF(59)^6, n_err)
|
|
264
|
+
sage: Chan.output_space()
|
|
265
|
+
Vector space of dimension 6 over Finite Field of size 59
|
|
266
|
+
"""
|
|
267
|
+
return self._output_space
|
|
268
|
+
|
|
269
|
+
@abstract_method
|
|
270
|
+
def transmit_unsafe(self, message):
|
|
271
|
+
r"""
|
|
272
|
+
Return ``message``, modified accordingly with the algorithm of the channel it was
|
|
273
|
+
transmitted through.
|
|
274
|
+
|
|
275
|
+
This method does not check if ``message`` belongs to the input space of ``self``.
|
|
276
|
+
|
|
277
|
+
This is an abstract method which should be reimplemented in all the subclasses of
|
|
278
|
+
Channel.
|
|
279
|
+
|
|
280
|
+
EXAMPLES::
|
|
281
|
+
|
|
282
|
+
sage: n_err = 2
|
|
283
|
+
sage: Chan = channels.StaticErrorRateChannel(GF(59)^6, n_err)
|
|
284
|
+
sage: v = Chan.input_space().random_element()
|
|
285
|
+
sage: Chan.transmit_unsafe(v) # random
|
|
286
|
+
(1, 33, 46, 18, 20, 49)
|
|
287
|
+
"""
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
class StaticErrorRateChannel(Channel):
|
|
291
|
+
r"""
|
|
292
|
+
Channel which adds a static number of errors to each message it transmits.
|
|
293
|
+
|
|
294
|
+
The input space and the output space of this channel are the same.
|
|
295
|
+
|
|
296
|
+
INPUT:
|
|
297
|
+
|
|
298
|
+
- ``space`` -- the space of both input and output
|
|
299
|
+
|
|
300
|
+
- ``number_errors`` -- the number of errors added to each transmitted message
|
|
301
|
+
It can be either an integer of a tuple. If a tuple is passed as
|
|
302
|
+
argument, the number of errors will be a random integer between the
|
|
303
|
+
two bounds of the tuple.
|
|
304
|
+
|
|
305
|
+
EXAMPLES:
|
|
306
|
+
|
|
307
|
+
We construct a :class:`StaticErrorRateChannel` which adds 2 errors
|
|
308
|
+
to any transmitted message::
|
|
309
|
+
|
|
310
|
+
sage: n_err = 2
|
|
311
|
+
sage: Chan = channels.StaticErrorRateChannel(GF(59)^40, n_err)
|
|
312
|
+
sage: Chan
|
|
313
|
+
Static error rate channel creating 2 errors, of input and output space
|
|
314
|
+
Vector space of dimension 40 over Finite Field of size 59
|
|
315
|
+
|
|
316
|
+
We can also pass a tuple for the number of errors::
|
|
317
|
+
|
|
318
|
+
sage: n_err = (1, 10)
|
|
319
|
+
sage: Chan = channels.StaticErrorRateChannel(GF(59)^40, n_err)
|
|
320
|
+
sage: Chan
|
|
321
|
+
Static error rate channel creating between 1 and 10 errors,
|
|
322
|
+
of input and output space Vector space of dimension 40 over Finite Field of size 59
|
|
323
|
+
"""
|
|
324
|
+
|
|
325
|
+
def __init__(self, space, number_errors):
|
|
326
|
+
r"""
|
|
327
|
+
TESTS:
|
|
328
|
+
|
|
329
|
+
If the number of errors exceeds the dimension of the input space,
|
|
330
|
+
it will return an error::
|
|
331
|
+
|
|
332
|
+
sage: n_err = 42
|
|
333
|
+
sage: Chan = channels.StaticErrorRateChannel(GF(59)^40, n_err)
|
|
334
|
+
Traceback (most recent call last):
|
|
335
|
+
...
|
|
336
|
+
ValueError: There might be more errors than the dimension of the input space
|
|
337
|
+
"""
|
|
338
|
+
if isinstance(number_errors, (Integer, int)):
|
|
339
|
+
number_errors = (number_errors, number_errors)
|
|
340
|
+
if not isinstance(number_errors, (tuple, list)):
|
|
341
|
+
raise ValueError("number_errors must be a tuple, a list, an Integer or a Python int")
|
|
342
|
+
super().__init__(space, space)
|
|
343
|
+
if number_errors[1] > space.dimension():
|
|
344
|
+
raise ValueError("There might be more errors than the dimension of the input space")
|
|
345
|
+
self._number_errors = number_errors
|
|
346
|
+
|
|
347
|
+
def _repr_(self):
|
|
348
|
+
r"""
|
|
349
|
+
Return a string representation of ``self``.
|
|
350
|
+
|
|
351
|
+
EXAMPLES::
|
|
352
|
+
|
|
353
|
+
sage: n_err = 42
|
|
354
|
+
sage: Chan = channels.StaticErrorRateChannel(GF(59)^50, n_err)
|
|
355
|
+
sage: Chan
|
|
356
|
+
Static error rate channel creating 42 errors, of input and output space
|
|
357
|
+
Vector space of dimension 50 over Finite Field of size 59
|
|
358
|
+
"""
|
|
359
|
+
no_err = self.number_errors()
|
|
360
|
+
return "Static error rate channel creating %s errors, of input and output space %s"\
|
|
361
|
+
% (format_interval(no_err), self.input_space())
|
|
362
|
+
|
|
363
|
+
def _latex_(self):
|
|
364
|
+
r"""
|
|
365
|
+
Return a latex representation of ``self``.
|
|
366
|
+
|
|
367
|
+
EXAMPLES::
|
|
368
|
+
|
|
369
|
+
sage: n_err = 42
|
|
370
|
+
sage: Chan = channels.StaticErrorRateChannel(GF(59)^50, n_err)
|
|
371
|
+
sage: latex(Chan)
|
|
372
|
+
\textnormal{Static error rate channel creating 42 errors, of
|
|
373
|
+
input and output space Vector space of dimension 50 over Finite Field of size 59}
|
|
374
|
+
"""
|
|
375
|
+
no_err = self.number_errors()
|
|
376
|
+
return "\\textnormal{Static error rate channel creating %s errors, of input and output space %s}"\
|
|
377
|
+
% (format_interval(no_err), self.input_space())
|
|
378
|
+
|
|
379
|
+
def transmit_unsafe(self, message):
|
|
380
|
+
r"""
|
|
381
|
+
Return ``message`` with as many errors as ``self._number_errors`` in it.
|
|
382
|
+
|
|
383
|
+
If ``self._number_errors`` was passed as a tuple for the number of errors, it will
|
|
384
|
+
pick a random integer between the bounds of the tuple and use it as the number of errors.
|
|
385
|
+
|
|
386
|
+
This method does not check if ``message`` belongs to the input space of ``self``.
|
|
387
|
+
|
|
388
|
+
INPUT:
|
|
389
|
+
|
|
390
|
+
- ``message`` -- a vector
|
|
391
|
+
|
|
392
|
+
OUTPUT: a vector of the output space
|
|
393
|
+
|
|
394
|
+
EXAMPLES::
|
|
395
|
+
|
|
396
|
+
sage: F = GF(59)^6
|
|
397
|
+
sage: n_err = 2
|
|
398
|
+
sage: Chan = channels.StaticErrorRateChannel(F, n_err)
|
|
399
|
+
sage: msg = F((4, 8, 15, 16, 23, 42))
|
|
400
|
+
sage: set_random_seed(10)
|
|
401
|
+
sage: Chan.transmit_unsafe(msg)
|
|
402
|
+
(4, 8, 4, 16, 23, 53)
|
|
403
|
+
|
|
404
|
+
This checks that :issue:`19863` is fixed::
|
|
405
|
+
|
|
406
|
+
sage: V = VectorSpace(GF(2), 1000)
|
|
407
|
+
sage: Chan = channels.StaticErrorRateChannel(V, 367)
|
|
408
|
+
sage: c = V.random_element()
|
|
409
|
+
sage: (c - Chan(c)).hamming_weight()
|
|
410
|
+
367
|
|
411
|
+
"""
|
|
412
|
+
w = copy(message)
|
|
413
|
+
number_errors = randint(*self.number_errors())
|
|
414
|
+
V = self.input_space()
|
|
415
|
+
R = V.base_ring()
|
|
416
|
+
for i in sample(range(V.dimension()), number_errors):
|
|
417
|
+
err = R.random_element()
|
|
418
|
+
while (w[i] == err):
|
|
419
|
+
err = R.random_element()
|
|
420
|
+
w[i] = err
|
|
421
|
+
return w
|
|
422
|
+
|
|
423
|
+
def number_errors(self):
|
|
424
|
+
r"""
|
|
425
|
+
Return the number of errors created by ``self``.
|
|
426
|
+
|
|
427
|
+
EXAMPLES::
|
|
428
|
+
|
|
429
|
+
sage: n_err = 3
|
|
430
|
+
sage: Chan = channels.StaticErrorRateChannel(GF(59)^6, n_err)
|
|
431
|
+
sage: Chan.number_errors()
|
|
432
|
+
(3, 3)
|
|
433
|
+
"""
|
|
434
|
+
return self._number_errors
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
class ErrorErasureChannel(Channel):
|
|
438
|
+
r"""
|
|
439
|
+
Channel which adds errors and erases several positions in any message it transmits.
|
|
440
|
+
|
|
441
|
+
The output space of this channel is a Cartesian product between its input
|
|
442
|
+
space and a VectorSpace of the same dimension over `\GF{2}`.
|
|
443
|
+
|
|
444
|
+
INPUT:
|
|
445
|
+
|
|
446
|
+
- ``space`` -- the input and output space
|
|
447
|
+
|
|
448
|
+
- ``number_errors`` -- the number of errors created in each transmitted
|
|
449
|
+
message. It can be either an integer of a tuple. If a tuple is passed as
|
|
450
|
+
an argument, the number of errors will be a random integer between the
|
|
451
|
+
two bounds of this tuple.
|
|
452
|
+
|
|
453
|
+
- ``number_erasures`` -- the number of erasures created in each transmitted
|
|
454
|
+
message. It can be either an integer of a tuple. If a tuple is passed as an
|
|
455
|
+
argument, the number of erasures will be a random integer between the
|
|
456
|
+
two bounds of this tuple.
|
|
457
|
+
|
|
458
|
+
EXAMPLES:
|
|
459
|
+
|
|
460
|
+
We construct a ErrorErasureChannel which adds 2 errors
|
|
461
|
+
and 2 erasures to any transmitted message::
|
|
462
|
+
|
|
463
|
+
sage: n_err, n_era = 2, 2
|
|
464
|
+
sage: Chan = channels.ErrorErasureChannel(GF(59)^40, n_err, n_era)
|
|
465
|
+
sage: Chan
|
|
466
|
+
Error-and-erasure channel creating 2 errors and 2 erasures
|
|
467
|
+
of input space Vector space of dimension 40 over Finite Field of size 59
|
|
468
|
+
and output space The Cartesian product of (Vector space of dimension 40
|
|
469
|
+
over Finite Field of size 59, Vector space of dimension 40 over Finite Field of size 2)
|
|
470
|
+
|
|
471
|
+
We can also pass the number of errors and erasures as a couple of integers::
|
|
472
|
+
|
|
473
|
+
sage: n_err, n_era = (1, 10), (1, 10)
|
|
474
|
+
sage: Chan = channels.ErrorErasureChannel(GF(59)^40, n_err, n_era)
|
|
475
|
+
sage: Chan
|
|
476
|
+
Error-and-erasure channel creating between 1 and 10 errors and
|
|
477
|
+
between 1 and 10 erasures of input space Vector space of dimension 40
|
|
478
|
+
over Finite Field of size 59 and output space The Cartesian product of
|
|
479
|
+
(Vector space of dimension 40 over Finite Field of size 59,
|
|
480
|
+
Vector space of dimension 40 over Finite Field of size 2)
|
|
481
|
+
"""
|
|
482
|
+
|
|
483
|
+
def __init__(self, space, number_errors, number_erasures):
|
|
484
|
+
r"""
|
|
485
|
+
TESTS:
|
|
486
|
+
|
|
487
|
+
If the sum of number of errors and number of erasures
|
|
488
|
+
exceeds (or may exceed, in the case of tuples) the dimension of the input space,
|
|
489
|
+
it will return an error::
|
|
490
|
+
|
|
491
|
+
sage: n_err, n_era = 21, 21
|
|
492
|
+
sage: Chan = channels.ErrorErasureChannel(GF(59)^40, n_err, n_era)
|
|
493
|
+
Traceback (most recent call last):
|
|
494
|
+
...
|
|
495
|
+
ValueError: The total number of errors and erasures cannot exceed the dimension of the input space
|
|
496
|
+
"""
|
|
497
|
+
if isinstance(number_errors, (Integer, int)):
|
|
498
|
+
number_errors = (number_errors, number_errors)
|
|
499
|
+
if not isinstance(number_errors, (tuple, list)):
|
|
500
|
+
raise ValueError("number_errors must be a tuple, a list, an Integer or a Python int")
|
|
501
|
+
|
|
502
|
+
if isinstance(number_erasures, (Integer, int)):
|
|
503
|
+
number_erasures = (number_erasures, number_erasures)
|
|
504
|
+
if not isinstance(number_erasures, (tuple, list)):
|
|
505
|
+
raise ValueError("number_erasures must be a tuple, a list, an Integer or a Python int")
|
|
506
|
+
|
|
507
|
+
output_space = cartesian_product([space, VectorSpace(GF(2), space.dimension())])
|
|
508
|
+
super().__init__(space, output_space)
|
|
509
|
+
if number_errors[1] + number_erasures[1] > space.dimension():
|
|
510
|
+
raise ValueError("The total number of errors and erasures cannot exceed the dimension of the input space")
|
|
511
|
+
self._number_errors = number_errors
|
|
512
|
+
self._number_erasures = number_erasures
|
|
513
|
+
|
|
514
|
+
def _repr_(self):
|
|
515
|
+
r"""
|
|
516
|
+
Return a string representation of ``self``.
|
|
517
|
+
|
|
518
|
+
EXAMPLES::
|
|
519
|
+
|
|
520
|
+
sage: n_err, n_era = 21, 21
|
|
521
|
+
sage: Chan = channels.ErrorErasureChannel(GF(59)^50, n_err, n_era)
|
|
522
|
+
sage: Chan
|
|
523
|
+
Error-and-erasure channel creating 21 errors and 21 erasures
|
|
524
|
+
of input space Vector space of dimension 50 over Finite Field of size 59
|
|
525
|
+
and output space The Cartesian product of (Vector space of dimension 50
|
|
526
|
+
over Finite Field of size 59, Vector space of dimension 50 over Finite Field of size 2)
|
|
527
|
+
"""
|
|
528
|
+
no_err = self.number_errors()
|
|
529
|
+
no_era = self.number_erasures()
|
|
530
|
+
return "Error-and-erasure channel creating %s errors and %s erasures of input space %s and output space %s"\
|
|
531
|
+
% (format_interval(no_err), format_interval(no_era), self.input_space(), self.output_space())
|
|
532
|
+
|
|
533
|
+
def _latex_(self):
|
|
534
|
+
r"""
|
|
535
|
+
Return a latex representation of ``self``.
|
|
536
|
+
|
|
537
|
+
EXAMPLES::
|
|
538
|
+
|
|
539
|
+
sage: n_err, n_era = 21, 21
|
|
540
|
+
sage: Chan = channels.ErrorErasureChannel(GF(59)^50, n_err, n_era)
|
|
541
|
+
sage: latex(Chan)
|
|
542
|
+
\textnormal{Error-and-erasure channel creating 21 errors and 21 erasures
|
|
543
|
+
of input space Vector space of dimension 50 over Finite Field of size 59
|
|
544
|
+
and output space The Cartesian product of (Vector space of dimension 50
|
|
545
|
+
over Finite Field of size 59, Vector space of dimension 50 over Finite Field of size 2)}
|
|
546
|
+
"""
|
|
547
|
+
no_err = self.number_errors()
|
|
548
|
+
no_era = self.number_erasures()
|
|
549
|
+
return "\\textnormal{Error-and-erasure channel creating %s errors and %s erasures of input space %s and output space %s}"\
|
|
550
|
+
% (format_interval(no_err), format_interval(no_era), self.input_space(), self.output_space())
|
|
551
|
+
|
|
552
|
+
def transmit_unsafe(self, message):
|
|
553
|
+
r"""
|
|
554
|
+
Return ``message`` with as many errors as ``self._number_errors`` in it,
|
|
555
|
+
and as many erasures as ``self._number_erasures`` in it.
|
|
556
|
+
|
|
557
|
+
If ``self._number_errors`` was passed as a tuple for the number of errors, it will
|
|
558
|
+
pick a random integer between the bounds of the tuple and use it as the number of errors.
|
|
559
|
+
It does the same with ``self._number_erasures``.
|
|
560
|
+
|
|
561
|
+
All erased positions are set to 0 in the transmitted message.
|
|
562
|
+
It is guaranteed that the erasures and the errors will never overlap:
|
|
563
|
+
the received message will always contains exactly as many errors and erasures
|
|
564
|
+
as expected.
|
|
565
|
+
|
|
566
|
+
This method does not check if ``message`` belongs to the input space of ``self``.
|
|
567
|
+
|
|
568
|
+
INPUT:
|
|
569
|
+
|
|
570
|
+
- ``message`` -- a vector
|
|
571
|
+
|
|
572
|
+
OUTPUT: a couple of vectors, namely:
|
|
573
|
+
|
|
574
|
+
- the transmitted message, which is ``message`` with erroneous and
|
|
575
|
+
erased positions
|
|
576
|
+
- the erasure vector, which contains ``1`` at the erased positions of
|
|
577
|
+
the transmitted message and ``0`` elsewhere.
|
|
578
|
+
|
|
579
|
+
EXAMPLES::
|
|
580
|
+
|
|
581
|
+
sage: F = GF(59)^11
|
|
582
|
+
sage: n_err, n_era = 2, 2
|
|
583
|
+
sage: Chan = channels.ErrorErasureChannel(F, n_err, n_era)
|
|
584
|
+
sage: msg = F((3, 14, 15, 9, 26, 53, 58, 9, 7, 9, 3))
|
|
585
|
+
sage: set_random_seed(10)
|
|
586
|
+
sage: Chan.transmit_unsafe(msg)
|
|
587
|
+
((31, 0, 15, 9, 38, 53, 58, 9, 0, 9, 3), (0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0))
|
|
588
|
+
"""
|
|
589
|
+
number_errors = randint(*self.number_errors())
|
|
590
|
+
number_erasures = randint(*self.number_erasures())
|
|
591
|
+
V = self.input_space()
|
|
592
|
+
n = V.dimension()
|
|
593
|
+
zero = V.base_ring().zero()
|
|
594
|
+
|
|
595
|
+
errors = sample(range(n), number_errors + number_erasures)
|
|
596
|
+
error_positions = errors[:number_errors]
|
|
597
|
+
erasure_positions = errors[number_errors:]
|
|
598
|
+
|
|
599
|
+
error_vector = random_error_vector(n, V.base_ring(), error_positions)
|
|
600
|
+
erasure_vector = random_error_vector(n , GF(2), erasure_positions)
|
|
601
|
+
|
|
602
|
+
message = message + error_vector
|
|
603
|
+
|
|
604
|
+
for i in erasure_positions:
|
|
605
|
+
message[i] = zero
|
|
606
|
+
return message, erasure_vector
|
|
607
|
+
|
|
608
|
+
def number_errors(self):
|
|
609
|
+
r"""
|
|
610
|
+
Return the number of errors created by ``self``.
|
|
611
|
+
|
|
612
|
+
EXAMPLES::
|
|
613
|
+
|
|
614
|
+
sage: n_err, n_era = 3, 0
|
|
615
|
+
sage: Chan = channels.ErrorErasureChannel(GF(59)^6, n_err, n_era)
|
|
616
|
+
sage: Chan.number_errors()
|
|
617
|
+
(3, 3)
|
|
618
|
+
"""
|
|
619
|
+
return self._number_errors
|
|
620
|
+
|
|
621
|
+
def number_erasures(self):
|
|
622
|
+
r"""
|
|
623
|
+
Return the number of erasures created by ``self``.
|
|
624
|
+
|
|
625
|
+
EXAMPLES::
|
|
626
|
+
|
|
627
|
+
sage: n_err, n_era = 0, 3
|
|
628
|
+
sage: Chan = channels.ErrorErasureChannel(GF(59)^6, n_err, n_era)
|
|
629
|
+
sage: Chan.number_erasures()
|
|
630
|
+
(3, 3)
|
|
631
|
+
"""
|
|
632
|
+
return self._number_erasures
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
class QarySymmetricChannel(Channel):
|
|
636
|
+
r"""
|
|
637
|
+
The `q`-ary symmetric, memoryless communication channel.
|
|
638
|
+
|
|
639
|
+
Given an alphabet `\Sigma` with `|\Sigma| = q` and an error probability
|
|
640
|
+
`\epsilon`, a `q`-ary symmetric channel sends an element of `\Sigma` into the
|
|
641
|
+
same element with probability `1 - \epsilon`, and any one of the other `q -
|
|
642
|
+
1` elements with probability `\frac{\epsilon}{q - 1}`. This implementation
|
|
643
|
+
operates over vectors in `\Sigma^n`, and "transmits" each element of the
|
|
644
|
+
vector independently in the above manner.
|
|
645
|
+
|
|
646
|
+
Though `\Sigma` is usually taken to be a finite field, this implementation
|
|
647
|
+
allows any structure for which Sage can represent `\Sigma^n` and for which
|
|
648
|
+
`\Sigma` has a ``random_element()`` method. However, beware that if `\Sigma`
|
|
649
|
+
is infinite, errors will not be uniformly distributed (since
|
|
650
|
+
``random_element()`` does not draw uniformly at random).
|
|
651
|
+
|
|
652
|
+
The input space and the output space of this channel are the same:
|
|
653
|
+
`\Sigma^n`.
|
|
654
|
+
|
|
655
|
+
INPUT:
|
|
656
|
+
|
|
657
|
+
- ``space`` -- the input and output space of the channel; it has to be
|
|
658
|
+
`\GF{q}^n` for some finite field `\GF{q}`
|
|
659
|
+
|
|
660
|
+
- ``epsilon`` -- the transmission error probability of the individual elements
|
|
661
|
+
|
|
662
|
+
EXAMPLES:
|
|
663
|
+
|
|
664
|
+
We construct a :class:`QarySymmetricChannel` which corrupts 30% of all
|
|
665
|
+
transmitted symbols::
|
|
666
|
+
|
|
667
|
+
sage: epsilon = 0.3
|
|
668
|
+
sage: Chan = channels.QarySymmetricChannel(GF(59)^50, epsilon)
|
|
669
|
+
sage: Chan
|
|
670
|
+
q-ary symmetric channel with error probability 0.300000000000000,
|
|
671
|
+
of input and output space
|
|
672
|
+
Vector space of dimension 50 over Finite Field of size 59
|
|
673
|
+
"""
|
|
674
|
+
|
|
675
|
+
def __init__(self, space, epsilon):
|
|
676
|
+
r"""
|
|
677
|
+
TESTS:
|
|
678
|
+
|
|
679
|
+
If ``space`` is not a vector space, an error is raised::
|
|
680
|
+
|
|
681
|
+
sage: epsilon = 0.42
|
|
682
|
+
sage: Chan = channels.QarySymmetricChannel(GF(59), epsilon)
|
|
683
|
+
Traceback (most recent call last):
|
|
684
|
+
...
|
|
685
|
+
ValueError: space has to be of the form Sigma^n, where Sigma has a random_element() method
|
|
686
|
+
|
|
687
|
+
If ``epsilon`` is not between 0 and 1, an error is raised::
|
|
688
|
+
|
|
689
|
+
sage: epsilon = 42
|
|
690
|
+
sage: Chan = channels.QarySymmetricChannel(GF(59)^50, epsilon)
|
|
691
|
+
Traceback (most recent call last):
|
|
692
|
+
...
|
|
693
|
+
ValueError: Error probability must be between 0 and 1
|
|
694
|
+
"""
|
|
695
|
+
if epsilon >= 1 or epsilon <= 0:
|
|
696
|
+
raise ValueError("Error probability must be between 0 and 1")
|
|
697
|
+
|
|
698
|
+
super().__init__(space, space)
|
|
699
|
+
self._epsilon = epsilon
|
|
700
|
+
try:
|
|
701
|
+
self.transmit_unsafe(space.random_element())
|
|
702
|
+
except Exception:
|
|
703
|
+
raise ValueError("space has to be of the form Sigma^n, where Sigma has a random_element() method")
|
|
704
|
+
|
|
705
|
+
def __repr__(self):
|
|
706
|
+
r"""
|
|
707
|
+
Return a string representation of ``self``.
|
|
708
|
+
|
|
709
|
+
EXAMPLES::
|
|
710
|
+
|
|
711
|
+
sage: epsilon = 0.3
|
|
712
|
+
sage: Chan = channels.QarySymmetricChannel(GF(59)^50, epsilon)
|
|
713
|
+
sage: Chan
|
|
714
|
+
q-ary symmetric channel with error probability 0.300000000000000,
|
|
715
|
+
of input and output space Vector space of dimension 50 over Finite Field of size 59
|
|
716
|
+
"""
|
|
717
|
+
return "q-ary symmetric channel with error probability %s, of input and output space %s"\
|
|
718
|
+
% (self.error_probability(), self.input_space())
|
|
719
|
+
|
|
720
|
+
def _latex_(self):
|
|
721
|
+
r"""
|
|
722
|
+
Return a latex representation of ``self``.
|
|
723
|
+
|
|
724
|
+
EXAMPLES::
|
|
725
|
+
|
|
726
|
+
sage: epsilon = 0.3
|
|
727
|
+
sage: Chan = channels.QarySymmetricChannel(GF(59)^50, epsilon)
|
|
728
|
+
sage: latex(Chan)
|
|
729
|
+
\textnormal{q-ary symmetric channel with error probability 0.300000000000000,
|
|
730
|
+
of input and output space Vector space of dimension 50 over Finite Field of size 59}
|
|
731
|
+
"""
|
|
732
|
+
return "\\textnormal{q-ary symmetric channel with error probability %s, of input and output space %s}"\
|
|
733
|
+
% (self.error_probability(), self.input_space())
|
|
734
|
+
|
|
735
|
+
def transmit_unsafe(self, message):
|
|
736
|
+
r"""
|
|
737
|
+
Return ``message`` where each of the symbols has been changed to another from the alphabet with
|
|
738
|
+
probability :meth:`error_probability`.
|
|
739
|
+
|
|
740
|
+
This method does not check if ``message`` belongs to the input space of ``self``.
|
|
741
|
+
|
|
742
|
+
INPUT:
|
|
743
|
+
|
|
744
|
+
- ``message`` -- a vector
|
|
745
|
+
|
|
746
|
+
EXAMPLES::
|
|
747
|
+
|
|
748
|
+
sage: F = GF(59)^11
|
|
749
|
+
sage: epsilon = 0.3
|
|
750
|
+
sage: Chan = channels.QarySymmetricChannel(F, epsilon)
|
|
751
|
+
sage: msg = F((3, 14, 15, 9, 26, 53, 58, 9, 7, 9, 3))
|
|
752
|
+
sage: set_random_seed(10)
|
|
753
|
+
sage: Chan.transmit_unsafe(msg)
|
|
754
|
+
(3, 14, 15, 53, 12, 53, 58, 9, 55, 9, 3)
|
|
755
|
+
"""
|
|
756
|
+
epsilon = self.error_probability()
|
|
757
|
+
V = self.input_space()
|
|
758
|
+
F = V.base_ring()
|
|
759
|
+
msg = copy(message.list())
|
|
760
|
+
for i in range(len(msg)):
|
|
761
|
+
if random() <= epsilon:
|
|
762
|
+
a = F.random_element()
|
|
763
|
+
while a == msg[i]:
|
|
764
|
+
a = F.random_element()
|
|
765
|
+
msg[i] = a
|
|
766
|
+
return V(msg)
|
|
767
|
+
|
|
768
|
+
def error_probability(self):
|
|
769
|
+
r"""
|
|
770
|
+
Return the error probability of a single symbol transmission of
|
|
771
|
+
``self``.
|
|
772
|
+
|
|
773
|
+
EXAMPLES::
|
|
774
|
+
|
|
775
|
+
sage: epsilon = 0.3
|
|
776
|
+
sage: Chan = channels.QarySymmetricChannel(GF(59)^50, epsilon)
|
|
777
|
+
sage: Chan.error_probability()
|
|
778
|
+
0.300000000000000
|
|
779
|
+
"""
|
|
780
|
+
return self._epsilon
|
|
781
|
+
|
|
782
|
+
def probability_of_exactly_t_errors(self, t):
|
|
783
|
+
r"""
|
|
784
|
+
Return the probability ``self`` has to return
|
|
785
|
+
exactly ``t`` errors.
|
|
786
|
+
|
|
787
|
+
INPUT:
|
|
788
|
+
|
|
789
|
+
- ``t`` -- integer
|
|
790
|
+
|
|
791
|
+
EXAMPLES::
|
|
792
|
+
|
|
793
|
+
sage: epsilon = 0.3
|
|
794
|
+
sage: Chan = channels.QarySymmetricChannel(GF(59)^50, epsilon)
|
|
795
|
+
sage: Chan.probability_of_exactly_t_errors(15)
|
|
796
|
+
0.122346861835401
|
|
797
|
+
"""
|
|
798
|
+
n = self.input_space().dimension()
|
|
799
|
+
epsilon = self.error_probability()
|
|
800
|
+
return binomial(n, t) * epsilon**t * (1-epsilon)**(n-t)
|
|
801
|
+
|
|
802
|
+
def probability_of_at_most_t_errors(self, t):
|
|
803
|
+
r"""
|
|
804
|
+
Return the probability ``self`` has to return
|
|
805
|
+
at most ``t`` errors.
|
|
806
|
+
|
|
807
|
+
INPUT:
|
|
808
|
+
|
|
809
|
+
- ``t`` -- integer
|
|
810
|
+
|
|
811
|
+
EXAMPLES::
|
|
812
|
+
|
|
813
|
+
sage: epsilon = 0.3
|
|
814
|
+
sage: Chan = channels.QarySymmetricChannel(GF(59)^50, epsilon)
|
|
815
|
+
sage: Chan.probability_of_at_most_t_errors(20)
|
|
816
|
+
0.952236164579467
|
|
817
|
+
"""
|
|
818
|
+
return sum(self.probability_of_exactly_t_errors(i)
|
|
819
|
+
for i in range(t+1))
|