passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +808 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-0cd532bd.so.1 +0 -0
- passagemath_modules.libs/libgfortran-2c33b284.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-42cda06f.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-d8ebe4b5.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-aaecbfc0.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-905cb27d.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-bb76a5fc.so.0.0.0 +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-x86_64-linux-musl.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-x86_64-linux-musl.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-x86_64-linux-musl.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-musl.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-x86_64-linux-musl.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-x86_64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-x86_64-linux-musl.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-x86_64-linux-musl.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-x86_64-linux-musl.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-x86_64-linux-musl.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-x86_64-linux-musl.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-musl.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-x86_64-linux-musl.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,1271 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
`\ZZ`-filtered vector spaces
|
|
4
|
+
|
|
5
|
+
This module implements filtered vector spaces, that is, a descending
|
|
6
|
+
sequence of vector spaces
|
|
7
|
+
|
|
8
|
+
.. MATH::
|
|
9
|
+
|
|
10
|
+
\cdots \supset F_d \supset F_{d+1} \supset F_{d+2} \supset \cdots
|
|
11
|
+
|
|
12
|
+
with degrees `d\in \ZZ`. It is not required that `F_d` is the entire
|
|
13
|
+
ambient space for `d\ll 0` (see
|
|
14
|
+
:meth:`~FilteredVectorSpace_class.is_exhaustive`) nor that `F_d=0` for
|
|
15
|
+
`d\gg 0` (see :meth:`~FilteredVectorSpace_class.is_separating`). To
|
|
16
|
+
construct a filtered vector space, use the :func:`FilteredVectorSpace`
|
|
17
|
+
command. It supports easy creation of simple filtrations, for example
|
|
18
|
+
the trivial one::
|
|
19
|
+
|
|
20
|
+
sage: FilteredVectorSpace(2, base_ring=RDF)
|
|
21
|
+
RDF^2
|
|
22
|
+
|
|
23
|
+
The next-simplest filtration has a single non-trivial inclusion
|
|
24
|
+
between `V_d` and `V_{d+1}`::
|
|
25
|
+
|
|
26
|
+
sage: d = 1
|
|
27
|
+
sage: V = FilteredVectorSpace(2, d); V
|
|
28
|
+
QQ^2 >= 0
|
|
29
|
+
sage: [V.get_degree(i).dimension() for i in range(0,4)]
|
|
30
|
+
[2, 2, 0, 0]
|
|
31
|
+
|
|
32
|
+
To construct general filtrations, you need to tell Sage about generating
|
|
33
|
+
vectors for the nested subspaces. For example, a dictionary whose keys
|
|
34
|
+
are the degrees and values are a list of generators::
|
|
35
|
+
|
|
36
|
+
sage: r1 = (1, 0, 5)
|
|
37
|
+
sage: r2 = (0, 1, 2)
|
|
38
|
+
sage: r3 = (1, 2, 1)
|
|
39
|
+
sage: V = FilteredVectorSpace({0:[r1, r2, r3], 1:[r1, r2], 3:[r1]}); V
|
|
40
|
+
QQ^3 >= QQ^2 >= QQ^1 >= QQ^1 >= 0
|
|
41
|
+
|
|
42
|
+
For degrees `d` that are not specified, the associated vector subspace
|
|
43
|
+
is the same as the next-lower degree, that is, `V_d \simeq
|
|
44
|
+
V_{d-1}`. In the above example, this means that
|
|
45
|
+
|
|
46
|
+
* `V_d \simeq \QQ^3` for `d<0`
|
|
47
|
+
* `V_0 = \mathop{span}(r_1, r_2) \simeq \QQ^2`
|
|
48
|
+
* `V_1 = V_2 = \mathop{span}(r_3) \simeq \QQ`
|
|
49
|
+
* `V_d = 0` for `d \geq 3`
|
|
50
|
+
|
|
51
|
+
That is::
|
|
52
|
+
|
|
53
|
+
sage: V.get_degree(0) == V
|
|
54
|
+
True
|
|
55
|
+
sage: V.get_degree(1) == V.span([r1, r2])
|
|
56
|
+
True
|
|
57
|
+
sage: V.get_degree(2) == V.get_degree(3) == V.span([r1])
|
|
58
|
+
True
|
|
59
|
+
sage: V.get_degree(4) == V.get_degree(5) == V.span([])
|
|
60
|
+
True
|
|
61
|
+
|
|
62
|
+
If you have many generators you can just pass the generators once and
|
|
63
|
+
then refer to them by index::
|
|
64
|
+
|
|
65
|
+
sage: FilteredVectorSpace([r1, r2, r3], {0:[0,1,2], 1:[1,2], 3:[1]})
|
|
66
|
+
QQ^3 >= QQ^2 >= QQ^1 >= QQ^1 >= 0
|
|
67
|
+
|
|
68
|
+
Note that generators for the degree-`d` subspace of the filtration are
|
|
69
|
+
automatically generators for all lower degrees. For example, here we
|
|
70
|
+
do not have to specify the ray `r_2` separately in degree 1::
|
|
71
|
+
|
|
72
|
+
sage: FilteredVectorSpace([r1, r2, r3], {0:[0 ], 1:[1]})
|
|
73
|
+
QQ^2 >= QQ^1 >= 0 in QQ^3
|
|
74
|
+
sage: FilteredVectorSpace([r1, r2, r3], {0:[0, 1], 1:[1]})
|
|
75
|
+
QQ^2 >= QQ^1 >= 0 in QQ^3
|
|
76
|
+
|
|
77
|
+
The degree can be infinite (plus infinity), this allows construction
|
|
78
|
+
of filtered vector spaces that are not eventually zero in high
|
|
79
|
+
degree::
|
|
80
|
+
|
|
81
|
+
sage: FilteredVectorSpace([r1, r2, r3], {0:[0,1], oo:[1]})
|
|
82
|
+
QQ^2 >= QQ^1 in QQ^3
|
|
83
|
+
|
|
84
|
+
Any field can be used as the vector space base. For example a finite
|
|
85
|
+
field::
|
|
86
|
+
|
|
87
|
+
sage: F.<a> = GF(5^3) # needs sage.rings.finite_rings
|
|
88
|
+
sage: r1 = (a, 0, F(5)); r1 # needs sage.rings.finite_rings
|
|
89
|
+
(a, 0, 0)
|
|
90
|
+
sage: FilteredVectorSpace([r1, r2, r3], {0:[0,1], oo:[1]}, base_ring=F) # needs sage.rings.finite_rings
|
|
91
|
+
GF(125)^2 >= GF(125)^1 in GF(125)^3
|
|
92
|
+
|
|
93
|
+
Or the algebraic field::
|
|
94
|
+
|
|
95
|
+
sage: r1 = (1, 0, 1+QQbar(I)); r1 # needs sage.rings.number_field
|
|
96
|
+
(1, 0, I + 1)
|
|
97
|
+
sage: FilteredVectorSpace([r1, r2, r3], {0:[0,1], oo:[1]}, base_ring=QQbar) # needs sage.rings.number_field
|
|
98
|
+
Vector space of dimension 2 over Algebraic Field
|
|
99
|
+
>= Vector space of dimension 1 over Algebraic Field
|
|
100
|
+
in Vector space of dimension 3 over Algebraic Field
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
# ***************************************************************************
|
|
104
|
+
# Copyright (C) 2013 Volker Braun <vbraun.name@gmail.com>
|
|
105
|
+
#
|
|
106
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
107
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
108
|
+
# the License, or (at your option) any later version.
|
|
109
|
+
# https://www.gnu.org/licenses/
|
|
110
|
+
# ***************************************************************************
|
|
111
|
+
from itertools import product
|
|
112
|
+
|
|
113
|
+
from sage.rings.rational_field import QQ
|
|
114
|
+
from sage.rings.integer_ring import ZZ
|
|
115
|
+
from sage.rings.real_double import RDF
|
|
116
|
+
from sage.rings.integer import Integer
|
|
117
|
+
from sage.rings.infinity import InfinityRing, infinity, minus_infinity
|
|
118
|
+
from sage.categories.fields import Fields
|
|
119
|
+
from sage.modules.free_module import FreeModule_ambient_field, VectorSpace
|
|
120
|
+
from sage.matrix.constructor import matrix
|
|
121
|
+
from sage.misc.cachefunc import cached_method
|
|
122
|
+
|
|
123
|
+
try:
|
|
124
|
+
from sage.rings.real_mpfr import RR
|
|
125
|
+
except ImportError:
|
|
126
|
+
RR = None
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def is_FilteredVectorSpace(X):
|
|
130
|
+
"""
|
|
131
|
+
Test whether ``X`` is a filtered vector space.
|
|
132
|
+
|
|
133
|
+
This function is for library use only.
|
|
134
|
+
|
|
135
|
+
INPUT:
|
|
136
|
+
|
|
137
|
+
- ``X`` -- anything
|
|
138
|
+
|
|
139
|
+
OUTPUT: boolean
|
|
140
|
+
|
|
141
|
+
EXAMPLES::
|
|
142
|
+
|
|
143
|
+
sage: from sage.modules.filtered_vector_space import is_FilteredVectorSpace
|
|
144
|
+
sage: V = FilteredVectorSpace(2, 1)
|
|
145
|
+
sage: is_FilteredVectorSpace(V)
|
|
146
|
+
doctest:warning...:
|
|
147
|
+
DeprecationWarning: the function is_FilteredVectorSpace is deprecated;
|
|
148
|
+
use 'isinstance(..., FilteredVectorSpace_class)' instead
|
|
149
|
+
See https://github.com/sagemath/sage/issues/37924 for details.
|
|
150
|
+
True
|
|
151
|
+
sage: is_FilteredVectorSpace('ceci n\'est pas une pipe')
|
|
152
|
+
False
|
|
153
|
+
"""
|
|
154
|
+
from sage.misc.superseded import deprecation
|
|
155
|
+
deprecation(37924, "the function is_FilteredVectorSpace is deprecated; use 'isinstance(..., FilteredVectorSpace_class)' instead")
|
|
156
|
+
return isinstance(X, FilteredVectorSpace_class)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def FilteredVectorSpace(arg1, arg2=None, base_ring=QQ, check=True):
|
|
160
|
+
r"""
|
|
161
|
+
Construct a filtered vector space.
|
|
162
|
+
|
|
163
|
+
INPUT:
|
|
164
|
+
|
|
165
|
+
This function accepts various input that determines the vector space and filtration.
|
|
166
|
+
|
|
167
|
+
- Just the dimensionFilteredVectorSpace(dimension): Return the trivial filtration
|
|
168
|
+
(where all vector spaces are isomorphic).
|
|
169
|
+
|
|
170
|
+
- Dimension and maximal degree, see
|
|
171
|
+
:func:`constructor_from_dim_degree` for arguments. Construct a
|
|
172
|
+
filtration with only one non-trivial step `V\supset 0` at the
|
|
173
|
+
given cutoff degree.
|
|
174
|
+
|
|
175
|
+
- A dictionary containing the degrees as keys and a list of vector
|
|
176
|
+
space generators as values, see
|
|
177
|
+
:func:`FilteredVectorSpace_from_generators`
|
|
178
|
+
|
|
179
|
+
- Generators and a dictionary containing the degrees as keys and
|
|
180
|
+
the indices of vector space generators as values, see
|
|
181
|
+
:func:`FilteredVectorSpace_from_generators_indices`
|
|
182
|
+
|
|
183
|
+
In addition, the following keyword arguments are supported:
|
|
184
|
+
|
|
185
|
+
- ``base_ring`` -- a field (default: `\QQ`). The base
|
|
186
|
+
field of the vector space. Must be a field.
|
|
187
|
+
|
|
188
|
+
EXAMPLES:
|
|
189
|
+
|
|
190
|
+
Just the dimension for the trivial filtration::
|
|
191
|
+
|
|
192
|
+
sage: FilteredVectorSpace(2)
|
|
193
|
+
QQ^2
|
|
194
|
+
|
|
195
|
+
Dimension and degree::
|
|
196
|
+
|
|
197
|
+
sage: FilteredVectorSpace(2, 1)
|
|
198
|
+
QQ^2 >= 0
|
|
199
|
+
|
|
200
|
+
Dictionary of generators::
|
|
201
|
+
|
|
202
|
+
sage: FilteredVectorSpace({1:[(1,0), (0,1)], 3:[(1,0)]})
|
|
203
|
+
QQ^2 >= QQ^1 >= QQ^1 >= 0
|
|
204
|
+
|
|
205
|
+
Generators and a dictionary referring to them by index::
|
|
206
|
+
|
|
207
|
+
sage: FilteredVectorSpace([(1,0), (0,1)], {1:[0,1], 3:[0]})
|
|
208
|
+
QQ^2 >= QQ^1 >= QQ^1 >= 0
|
|
209
|
+
"""
|
|
210
|
+
if base_ring not in Fields():
|
|
211
|
+
raise ValueError('the base_ring argument must be a field')
|
|
212
|
+
if arg1 in ZZ:
|
|
213
|
+
return construct_from_dim_degree(arg1, arg2, base_ring, check)
|
|
214
|
+
elif arg2 is None:
|
|
215
|
+
return construct_from_generators(arg1, base_ring, check)
|
|
216
|
+
else:
|
|
217
|
+
return construct_from_generators_indices(arg1, arg2, base_ring, check)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def normalize_degree(deg):
|
|
221
|
+
"""
|
|
222
|
+
Normalize the degree.
|
|
223
|
+
|
|
224
|
+
- ``deg`` -- something that defines the degree (either integer or infinity)
|
|
225
|
+
|
|
226
|
+
OUTPUT: plus/minus infinity or a Sage integer
|
|
227
|
+
|
|
228
|
+
EXAMPLES::
|
|
229
|
+
|
|
230
|
+
sage: from sage.modules.filtered_vector_space import normalize_degree
|
|
231
|
+
sage: type(normalize_degree(int(1)))
|
|
232
|
+
<class 'sage.rings.integer.Integer'>
|
|
233
|
+
sage: normalize_degree(oo)
|
|
234
|
+
+Infinity
|
|
235
|
+
"""
|
|
236
|
+
try:
|
|
237
|
+
return ZZ(deg)
|
|
238
|
+
except TypeError:
|
|
239
|
+
pass
|
|
240
|
+
deg = InfinityRing(deg)
|
|
241
|
+
if deg == infinity:
|
|
242
|
+
return infinity
|
|
243
|
+
if deg == minus_infinity:
|
|
244
|
+
return minus_infinity
|
|
245
|
+
raise ValueError('not integer or infinity')
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def construct_from_dim_degree(dim, max_degree, base_ring, check):
|
|
249
|
+
"""
|
|
250
|
+
Construct a filtered vector space.
|
|
251
|
+
|
|
252
|
+
INPUT:
|
|
253
|
+
|
|
254
|
+
- ``dim`` -- integer; the dimension
|
|
255
|
+
|
|
256
|
+
- ``max_degree`` -- integer or infinity; the maximal degree where
|
|
257
|
+
the vector subspace of the filtration is still the entire space
|
|
258
|
+
|
|
259
|
+
EXAMPLES::
|
|
260
|
+
|
|
261
|
+
sage: V = FilteredVectorSpace(2, 5); V
|
|
262
|
+
QQ^2 >= 0
|
|
263
|
+
sage: V.get_degree(5)
|
|
264
|
+
Vector space of degree 2 and dimension 2 over Rational Field
|
|
265
|
+
Basis matrix:
|
|
266
|
+
[1 0]
|
|
267
|
+
[0 1]
|
|
268
|
+
sage: V.get_degree(6)
|
|
269
|
+
Vector space of degree 2 and dimension 0 over Rational Field
|
|
270
|
+
Basis matrix:
|
|
271
|
+
[]
|
|
272
|
+
|
|
273
|
+
sage: FilteredVectorSpace(2, oo)
|
|
274
|
+
QQ^2
|
|
275
|
+
sage: FilteredVectorSpace(2, -oo)
|
|
276
|
+
0 in QQ^2
|
|
277
|
+
|
|
278
|
+
TESTS::
|
|
279
|
+
|
|
280
|
+
sage: from sage.modules.filtered_vector_space import construct_from_dim_degree
|
|
281
|
+
sage: V = construct_from_dim_degree(2, 5, QQ, True); V
|
|
282
|
+
QQ^2 >= 0
|
|
283
|
+
"""
|
|
284
|
+
if dim not in ZZ:
|
|
285
|
+
raise ValueError('dimension must be an integer')
|
|
286
|
+
dim = ZZ(dim)
|
|
287
|
+
from sage.matrix.constructor import identity_matrix
|
|
288
|
+
generators = identity_matrix(base_ring, dim).columns()
|
|
289
|
+
filtration = {}
|
|
290
|
+
if max_degree is None:
|
|
291
|
+
max_degree = infinity
|
|
292
|
+
filtration[normalize_degree(max_degree)] = range(dim)
|
|
293
|
+
return construct_from_generators_indices(generators, filtration, base_ring, check)
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
def construct_from_generators(filtration, base_ring, check):
|
|
297
|
+
"""
|
|
298
|
+
Construct a filtered vector space.
|
|
299
|
+
|
|
300
|
+
INPUT:
|
|
301
|
+
|
|
302
|
+
- ``filtration`` -- dictionary of filtration steps. Each
|
|
303
|
+
filtration step is a pair consisting of an integer degree and a
|
|
304
|
+
list/tuple/iterable of vector space generators. The integer
|
|
305
|
+
``degree`` stipulates that all filtration steps of degree higher
|
|
306
|
+
or equal than ``degree`` (up to the next filtration step) are
|
|
307
|
+
said subspace.
|
|
308
|
+
|
|
309
|
+
EXAMPLES::
|
|
310
|
+
|
|
311
|
+
sage: from sage.modules.filtered_vector_space import construct_from_generators
|
|
312
|
+
sage: r = [1, 2]
|
|
313
|
+
sage: construct_from_generators({1:[r]}, QQ, True)
|
|
314
|
+
QQ^1 >= 0 in QQ^2
|
|
315
|
+
"""
|
|
316
|
+
def normalize_gen(v):
|
|
317
|
+
return tuple(map(base_ring, v))
|
|
318
|
+
|
|
319
|
+
# convert generator notation to generator+indices
|
|
320
|
+
if len(filtration) == 0:
|
|
321
|
+
raise ValueError('you need to specify at least one ray to deduce the dimension')
|
|
322
|
+
generators = set()
|
|
323
|
+
for gens in filtration.values():
|
|
324
|
+
generators.update(normalize_gen(g) for g in gens)
|
|
325
|
+
generators = tuple(sorted(generators))
|
|
326
|
+
|
|
327
|
+
# normalize filtration data
|
|
328
|
+
normalized = {}
|
|
329
|
+
for deg, gens_deg in filtration.items():
|
|
330
|
+
indices = [generators.index(normalize_gen(v)) for v in gens_deg]
|
|
331
|
+
normalized[deg] = tuple(indices)
|
|
332
|
+
return construct_from_generators_indices(generators, normalized, base_ring, check)
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
def construct_from_generators_indices(generators, filtration, base_ring, check):
|
|
336
|
+
"""
|
|
337
|
+
Construct a filtered vector space.
|
|
338
|
+
|
|
339
|
+
INPUT:
|
|
340
|
+
|
|
341
|
+
- ``generators`` -- list/tuple/iterable of vectors, or something
|
|
342
|
+
convertible to them. The generators spanning various
|
|
343
|
+
subspaces.
|
|
344
|
+
|
|
345
|
+
- ``filtration`` -- list or iterable of filtration steps. Each
|
|
346
|
+
filtration step is a pair ``(degree, ray_indices)``. The
|
|
347
|
+
``ray_indices`` are a list or iterable of ray indices, which
|
|
348
|
+
span a subspace of the vector space. The integer ``degree``
|
|
349
|
+
stipulates that all filtration steps of degree higher or equal
|
|
350
|
+
than ``degree`` (up to the next filtration step) are said
|
|
351
|
+
subspace.
|
|
352
|
+
|
|
353
|
+
EXAMPLES::
|
|
354
|
+
|
|
355
|
+
sage: from sage.modules.filtered_vector_space import construct_from_generators_indices
|
|
356
|
+
sage: gens = [(1,0), (0,1), (-1,-1)]
|
|
357
|
+
sage: V = construct_from_generators_indices(gens, {1:[0,1], 3:[1]}, QQ, True); V
|
|
358
|
+
QQ^2 >= QQ^1 >= QQ^1 >= 0
|
|
359
|
+
|
|
360
|
+
TESTS::
|
|
361
|
+
|
|
362
|
+
sage: gens = [(int(1),int(0)), (0,1), (-1,-1)]
|
|
363
|
+
sage: construct_from_generators_indices(iter(gens), {int(0):[0, int(1)], 2:[2]}, QQ, True)
|
|
364
|
+
QQ^2 >= QQ^1 >= QQ^1 >= 0
|
|
365
|
+
"""
|
|
366
|
+
# normalize generators
|
|
367
|
+
generators = [list(g) for g in generators]
|
|
368
|
+
|
|
369
|
+
# deduce dimension
|
|
370
|
+
if len(generators) == 0:
|
|
371
|
+
dim = ZZ(0)
|
|
372
|
+
else:
|
|
373
|
+
dim = ZZ(len(generators[0]))
|
|
374
|
+
ambient = VectorSpace(base_ring, dim)
|
|
375
|
+
|
|
376
|
+
# complete generators to a generating set
|
|
377
|
+
if matrix(base_ring, generators).rank() < dim:
|
|
378
|
+
complement = ambient.span(generators).complement()
|
|
379
|
+
generators = generators + list(complement.gens())
|
|
380
|
+
# normalize generators II
|
|
381
|
+
generators = tuple(ambient(v) for v in generators)
|
|
382
|
+
|
|
383
|
+
for v in generators:
|
|
384
|
+
v.set_immutable()
|
|
385
|
+
|
|
386
|
+
# normalize filtration data
|
|
387
|
+
normalized = {}
|
|
388
|
+
for deg, gens in filtration.items():
|
|
389
|
+
deg = normalize_degree(deg)
|
|
390
|
+
gens = tuple(sorted(ZZ(i) for i in gens))
|
|
391
|
+
if gens and (gens[0] < 0 or gens[-1] >= len(generators)):
|
|
392
|
+
raise ValueError('generator index out of bounds')
|
|
393
|
+
normalized[deg] = gens
|
|
394
|
+
try:
|
|
395
|
+
del normalized[minus_infinity]
|
|
396
|
+
except KeyError:
|
|
397
|
+
pass
|
|
398
|
+
filtration = normalized
|
|
399
|
+
|
|
400
|
+
return FilteredVectorSpace_class(base_ring, dim, generators, filtration, check=check)
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
class FilteredVectorSpace_class(FreeModule_ambient_field):
|
|
404
|
+
|
|
405
|
+
def __init__(self, base_ring, dim, generators, filtration, check=True):
|
|
406
|
+
r"""
|
|
407
|
+
A descending filtration of a vector space.
|
|
408
|
+
|
|
409
|
+
INPUT:
|
|
410
|
+
|
|
411
|
+
- ``base_ring`` -- a field; the base field of the ambient vector space
|
|
412
|
+
|
|
413
|
+
- ``dim`` -- integer; the dimension of the ambient vector space
|
|
414
|
+
|
|
415
|
+
- ``generators`` -- tuple of generators for the ambient vector
|
|
416
|
+
space. These will be used to span the subspaces of the
|
|
417
|
+
filtration.
|
|
418
|
+
|
|
419
|
+
- ``filtration`` -- dictionary of filtration steps in ray
|
|
420
|
+
index notation. See
|
|
421
|
+
:func:`construct_from_generators_indices` for details.
|
|
422
|
+
|
|
423
|
+
- ``check`` -- boolean (default: ``True``); whether
|
|
424
|
+
to perform consistency checks
|
|
425
|
+
|
|
426
|
+
TESTS::
|
|
427
|
+
|
|
428
|
+
sage: from sage.modules.filtered_vector_space import FilteredVectorSpace_class
|
|
429
|
+
sage: gens = [(1,0,0), (1,1,0), (1,2,0), (-1,-1, 0), (0,0,1)]
|
|
430
|
+
sage: FilteredVectorSpace_class(QQ, 3, gens, {2:(0,1), oo:(4,)})
|
|
431
|
+
QQ^3 >= QQ^1
|
|
432
|
+
sage: FilteredVectorSpace_class(QQ, 3, gens, {2:(0,1), 3:(4,)})
|
|
433
|
+
QQ^3 >= QQ^1 >= 0
|
|
434
|
+
|
|
435
|
+
The trivial filtration::
|
|
436
|
+
|
|
437
|
+
sage: FilteredVectorSpace_class(QQ, 3, gens, {}, QQ)
|
|
438
|
+
0 in QQ^3
|
|
439
|
+
|
|
440
|
+
The empty vector space::
|
|
441
|
+
|
|
442
|
+
sage: FilteredVectorSpace_class(QQ, 0, [], {})
|
|
443
|
+
0
|
|
444
|
+
|
|
445
|
+
Higher-degree generators are automatically generators in lower degrees::
|
|
446
|
+
|
|
447
|
+
sage: FilteredVectorSpace_class(QQ, 3, gens, {2:(4,), 3:(1,)})
|
|
448
|
+
QQ^2 >= QQ^1 >= 0 in QQ^3
|
|
449
|
+
"""
|
|
450
|
+
if check:
|
|
451
|
+
assert isinstance(dim, Integer)
|
|
452
|
+
assert base_ring in Fields()
|
|
453
|
+
super().__init__(base_ring, dim)
|
|
454
|
+
|
|
455
|
+
if check:
|
|
456
|
+
assert matrix(generators).rank() == self.dimension()
|
|
457
|
+
assert isinstance(filtration, dict)
|
|
458
|
+
for degree, indices in filtration.items():
|
|
459
|
+
assert isinstance(degree, Integer) or degree == infinity
|
|
460
|
+
assert isinstance(indices, tuple)
|
|
461
|
+
assert all(isinstance(r, Integer) for r in indices)
|
|
462
|
+
|
|
463
|
+
# Construct subspaces from the generators and store in self._filt
|
|
464
|
+
def make_subspace(indices):
|
|
465
|
+
return self.span([generators[i] for i in indices])
|
|
466
|
+
|
|
467
|
+
indices = set(filtration.pop(infinity, []))
|
|
468
|
+
V = make_subspace(indices)
|
|
469
|
+
filtered_subspaces = [(infinity, V)]
|
|
470
|
+
for deg in sorted(filtration.keys(), reverse=True):
|
|
471
|
+
next_V = V
|
|
472
|
+
indices.update(filtration[deg])
|
|
473
|
+
V = make_subspace(indices)
|
|
474
|
+
if V == next_V: # skip trivial filtrations
|
|
475
|
+
continue
|
|
476
|
+
filtered_subspaces.append((deg, V))
|
|
477
|
+
filtered_subspaces.append((minus_infinity, V))
|
|
478
|
+
filtered_subspaces.reverse()
|
|
479
|
+
self._filt = tuple(filtered_subspaces)
|
|
480
|
+
assert self._filt[0][0] is minus_infinity
|
|
481
|
+
|
|
482
|
+
def change_ring(self, base_ring):
|
|
483
|
+
"""
|
|
484
|
+
Return the same filtration over a different base ring.
|
|
485
|
+
|
|
486
|
+
INPUT:
|
|
487
|
+
|
|
488
|
+
- ``base_ring`` -- the new base ring
|
|
489
|
+
|
|
490
|
+
OUTPUT:
|
|
491
|
+
|
|
492
|
+
This method returns a new filtered vector space whose
|
|
493
|
+
subspaces are defined by the same generators but over a
|
|
494
|
+
different base ring.
|
|
495
|
+
|
|
496
|
+
EXAMPLES::
|
|
497
|
+
|
|
498
|
+
sage: V = FilteredVectorSpace(1, 0); V
|
|
499
|
+
QQ^1 >= 0
|
|
500
|
+
sage: V.change_ring(RDF)
|
|
501
|
+
RDF^1 >= 0
|
|
502
|
+
"""
|
|
503
|
+
generators, filtration = self.presentation()
|
|
504
|
+
return FilteredVectorSpace(generators, filtration, base_ring=base_ring)
|
|
505
|
+
|
|
506
|
+
def ambient_vector_space(self):
|
|
507
|
+
"""
|
|
508
|
+
Return the ambient (unfiltered) vector space.
|
|
509
|
+
|
|
510
|
+
OUTPUT: a vector space
|
|
511
|
+
|
|
512
|
+
EXAMPLES::
|
|
513
|
+
|
|
514
|
+
sage: V = FilteredVectorSpace(1, 0)
|
|
515
|
+
sage: V.ambient_vector_space()
|
|
516
|
+
Vector space of dimension 1 over Rational Field
|
|
517
|
+
"""
|
|
518
|
+
return VectorSpace(self.base_ring(), self.dimension())
|
|
519
|
+
|
|
520
|
+
@cached_method
|
|
521
|
+
def is_constant(self) -> bool:
|
|
522
|
+
"""
|
|
523
|
+
Return whether the filtration is constant.
|
|
524
|
+
|
|
525
|
+
OUTPUT: boolean; whether the filtered vector spaces are identical in
|
|
526
|
+
all degrees
|
|
527
|
+
|
|
528
|
+
EXAMPLES::
|
|
529
|
+
|
|
530
|
+
sage: V = FilteredVectorSpace(2); V
|
|
531
|
+
QQ^2
|
|
532
|
+
sage: V.is_constant()
|
|
533
|
+
True
|
|
534
|
+
|
|
535
|
+
sage: V = FilteredVectorSpace(1, 0); V
|
|
536
|
+
QQ^1 >= 0
|
|
537
|
+
sage: V.is_constant()
|
|
538
|
+
False
|
|
539
|
+
|
|
540
|
+
sage: V = FilteredVectorSpace({0:[(1,)]}); V
|
|
541
|
+
QQ^1 >= 0
|
|
542
|
+
sage: V.is_constant()
|
|
543
|
+
False
|
|
544
|
+
"""
|
|
545
|
+
f = self._filt
|
|
546
|
+
return (len(f) == 1) or (len(f) == 2 and f[1][0] == infinity)
|
|
547
|
+
|
|
548
|
+
def is_exhaustive(self) -> bool:
|
|
549
|
+
r"""
|
|
550
|
+
Return whether the filtration is exhaustive.
|
|
551
|
+
|
|
552
|
+
A filtration `\{F_d\}` in an ambient vector space `V` is
|
|
553
|
+
exhaustive if `\cup F_d = V`. See also :meth:`is_separating`.
|
|
554
|
+
|
|
555
|
+
OUTPUT: boolean
|
|
556
|
+
|
|
557
|
+
EXAMPLES::
|
|
558
|
+
|
|
559
|
+
sage: F = FilteredVectorSpace({0:[(1,1)]}); F
|
|
560
|
+
QQ^1 >= 0 in QQ^2
|
|
561
|
+
sage: F.is_exhaustive()
|
|
562
|
+
False
|
|
563
|
+
sage: G = FilteredVectorSpace(2, 0); G
|
|
564
|
+
QQ^2 >= 0
|
|
565
|
+
sage: G.is_exhaustive()
|
|
566
|
+
True
|
|
567
|
+
"""
|
|
568
|
+
return self.get_degree(minus_infinity).dimension() == \
|
|
569
|
+
self.ambient_vector_space().dimension()
|
|
570
|
+
|
|
571
|
+
def is_separating(self) -> bool:
|
|
572
|
+
r"""
|
|
573
|
+
Return whether the filtration is separating.
|
|
574
|
+
|
|
575
|
+
A filtration `\{F_d\}` in an ambient vector space `V` is
|
|
576
|
+
exhaustive if `\cap F_d = 0`. See also :meth:`is_exhaustive`.
|
|
577
|
+
|
|
578
|
+
OUTPUT: boolean
|
|
579
|
+
|
|
580
|
+
EXAMPLES::
|
|
581
|
+
|
|
582
|
+
sage: F = FilteredVectorSpace({0:[(1,1)]}); F
|
|
583
|
+
QQ^1 >= 0 in QQ^2
|
|
584
|
+
sage: F.is_separating()
|
|
585
|
+
True
|
|
586
|
+
sage: G = FilteredVectorSpace({0:[(1,1,0)], oo:[(0,0,1)]}); G
|
|
587
|
+
QQ^2 >= QQ^1 in QQ^3
|
|
588
|
+
sage: G.is_separating()
|
|
589
|
+
False
|
|
590
|
+
"""
|
|
591
|
+
return self.get_degree(infinity).dimension() == 0
|
|
592
|
+
|
|
593
|
+
@cached_method
|
|
594
|
+
def support(self):
|
|
595
|
+
"""
|
|
596
|
+
Return the degrees in which there are non-trivial generators.
|
|
597
|
+
|
|
598
|
+
OUTPUT:
|
|
599
|
+
|
|
600
|
+
A tuple of integers (and plus infinity) in ascending
|
|
601
|
+
order. The last entry is plus infinity if and only if the
|
|
602
|
+
filtration is not separating (see :meth:`is_separating`).
|
|
603
|
+
|
|
604
|
+
EXAMPLES::
|
|
605
|
+
|
|
606
|
+
sage: G = FilteredVectorSpace({0:[(1,1,0)], 3:[(0,1,0)]}); G
|
|
607
|
+
QQ^2 >= QQ^1 >= QQ^1 >= QQ^1 >= 0 in QQ^3
|
|
608
|
+
sage: G.support()
|
|
609
|
+
(0, 3)
|
|
610
|
+
|
|
611
|
+
sage: G = FilteredVectorSpace({0:[(1,1,0)], 3:[(0,1,0)], oo:[(0,0,1)]}); G
|
|
612
|
+
QQ^3 >= QQ^2 >= QQ^2 >= QQ^2 >= QQ^1
|
|
613
|
+
sage: G.support()
|
|
614
|
+
(0, 3, +Infinity)
|
|
615
|
+
"""
|
|
616
|
+
if self.is_separating():
|
|
617
|
+
filt = self._filt[1:-1]
|
|
618
|
+
else:
|
|
619
|
+
filt = self._filt[1:]
|
|
620
|
+
return tuple(f[0] for f in filt)
|
|
621
|
+
|
|
622
|
+
@cached_method
|
|
623
|
+
def min_degree(self):
|
|
624
|
+
r"""
|
|
625
|
+
Return the lowest degree of the filtration.
|
|
626
|
+
|
|
627
|
+
OUTPUT:
|
|
628
|
+
|
|
629
|
+
Integer or plus infinity. The largest degree `d` of the
|
|
630
|
+
(descending) filtration such that the filtered vector space
|
|
631
|
+
`F_d` is still equal to `F_{-\infty}`.
|
|
632
|
+
|
|
633
|
+
EXAMPLES::
|
|
634
|
+
|
|
635
|
+
sage: FilteredVectorSpace(1, 3).min_degree()
|
|
636
|
+
3
|
|
637
|
+
sage: FilteredVectorSpace(2).min_degree()
|
|
638
|
+
+Infinity
|
|
639
|
+
"""
|
|
640
|
+
if self.is_constant():
|
|
641
|
+
return infinity
|
|
642
|
+
return self._filt[1][0]
|
|
643
|
+
|
|
644
|
+
@cached_method
|
|
645
|
+
def max_degree(self):
|
|
646
|
+
r"""
|
|
647
|
+
Return the highest degree of the filtration.
|
|
648
|
+
|
|
649
|
+
OUTPUT:
|
|
650
|
+
|
|
651
|
+
Integer or minus infinity. The smallest degree of the
|
|
652
|
+
filtration such that the filtration is constant to the right.
|
|
653
|
+
|
|
654
|
+
EXAMPLES::
|
|
655
|
+
|
|
656
|
+
sage: FilteredVectorSpace(1, 3).max_degree()
|
|
657
|
+
4
|
|
658
|
+
sage: FilteredVectorSpace({0:[[1]]}).max_degree()
|
|
659
|
+
1
|
|
660
|
+
sage: FilteredVectorSpace(3).max_degree()
|
|
661
|
+
-Infinity
|
|
662
|
+
"""
|
|
663
|
+
f = self._filt
|
|
664
|
+
if len(f) == 1:
|
|
665
|
+
return minus_infinity
|
|
666
|
+
d = f[-1][0]
|
|
667
|
+
if d == infinity:
|
|
668
|
+
if len(f) == 1:
|
|
669
|
+
return minus_infinity
|
|
670
|
+
else:
|
|
671
|
+
return f[-2][0] + 1
|
|
672
|
+
else:
|
|
673
|
+
return d + 1
|
|
674
|
+
|
|
675
|
+
def get_degree(self, d):
|
|
676
|
+
r"""
|
|
677
|
+
Return the degree-``d`` entry of the filtration.
|
|
678
|
+
|
|
679
|
+
INPUT:
|
|
680
|
+
|
|
681
|
+
- ``d`` -- integer; the desired degree of the filtration
|
|
682
|
+
|
|
683
|
+
OUTPUT:
|
|
684
|
+
|
|
685
|
+
The degree-``d`` vector space in the filtration as subspace of
|
|
686
|
+
the ambient space.
|
|
687
|
+
|
|
688
|
+
EXAMPLES::
|
|
689
|
+
|
|
690
|
+
sage: rays = [(1,0), (1,1), (1,2), (-1,-1)]
|
|
691
|
+
sage: F = FilteredVectorSpace(rays, {3:[1], 1:[1,2]})
|
|
692
|
+
sage: F.get_degree(2)
|
|
693
|
+
Vector space of degree 2 and dimension 1 over Rational Field
|
|
694
|
+
Basis matrix:
|
|
695
|
+
[1 1]
|
|
696
|
+
sage: F.get_degree(oo)
|
|
697
|
+
Vector space of degree 2 and dimension 0 over Rational Field
|
|
698
|
+
Basis matrix:
|
|
699
|
+
[]
|
|
700
|
+
sage: F.get_degree(-oo)
|
|
701
|
+
Vector space of degree 2 and dimension 2 over Rational Field
|
|
702
|
+
Basis matrix:
|
|
703
|
+
[1 0]
|
|
704
|
+
[0 1]
|
|
705
|
+
"""
|
|
706
|
+
d = normalize_degree(d)
|
|
707
|
+
for deg, Vdeg in self._filt:
|
|
708
|
+
if d <= deg:
|
|
709
|
+
return Vdeg
|
|
710
|
+
assert False # unreachable
|
|
711
|
+
|
|
712
|
+
def graded(self, d):
|
|
713
|
+
r"""
|
|
714
|
+
Return the associated graded vectorspace.
|
|
715
|
+
|
|
716
|
+
INPUT:
|
|
717
|
+
|
|
718
|
+
- ``d`` -- integer; the degree
|
|
719
|
+
|
|
720
|
+
OUTPUT: the quotient `G_d = F_d / F_{d+1}`
|
|
721
|
+
|
|
722
|
+
EXAMPLES::
|
|
723
|
+
|
|
724
|
+
sage: rays = [(1,0), (1,1), (1,2)]
|
|
725
|
+
sage: F = FilteredVectorSpace(rays, {3:[1], 1:[1,2]})
|
|
726
|
+
sage: F.graded(1)
|
|
727
|
+
Vector space quotient V/W of dimension 1 over Rational Field where
|
|
728
|
+
V: Vector space of degree 2 and dimension 2 over Rational Field
|
|
729
|
+
Basis matrix:
|
|
730
|
+
[1 0]
|
|
731
|
+
[0 1]
|
|
732
|
+
W: Vector space of degree 2 and dimension 1 over Rational Field
|
|
733
|
+
Basis matrix:
|
|
734
|
+
[1 1]
|
|
735
|
+
"""
|
|
736
|
+
return self.get_degree(d).quotient(self.get_degree(d + 1))
|
|
737
|
+
|
|
738
|
+
def presentation(self):
|
|
739
|
+
"""
|
|
740
|
+
Return a presentation in term of generators of various degrees.
|
|
741
|
+
|
|
742
|
+
OUTPUT:
|
|
743
|
+
|
|
744
|
+
A pair consisting of generators and a filtration suitable as
|
|
745
|
+
input to :func:`~construct_from_generators_indices`.
|
|
746
|
+
|
|
747
|
+
EXAMPLES::
|
|
748
|
+
|
|
749
|
+
sage: rays = [(1,0), (1,1), (1,2), (-1,-1)]
|
|
750
|
+
sage: F = FilteredVectorSpace(rays, {0:[1, 2], 2:[3]}); F
|
|
751
|
+
QQ^2 >= QQ^1 >= QQ^1 >= 0
|
|
752
|
+
sage: F.presentation()
|
|
753
|
+
(((0, 1), (1, 0), (1, 1)), {0: (1, 0), 2: (2,), +Infinity: ()})
|
|
754
|
+
"""
|
|
755
|
+
# this could be done more efficiently with (potentially) less generators
|
|
756
|
+
generators = set()
|
|
757
|
+
filt = self._filt[1:]
|
|
758
|
+
for d, V in filt:
|
|
759
|
+
generators.update(V.echelonized_basis())
|
|
760
|
+
generators = tuple(sorted(generators))
|
|
761
|
+
|
|
762
|
+
filtration = {}
|
|
763
|
+
for d, V in filt:
|
|
764
|
+
indices = [ZZ(generators.index(v)) for v in V.echelonized_basis()]
|
|
765
|
+
filtration[d] = tuple(indices)
|
|
766
|
+
return generators, filtration
|
|
767
|
+
|
|
768
|
+
def _repr_field_name(self):
|
|
769
|
+
"""
|
|
770
|
+
Return an abbreviated field name as string.
|
|
771
|
+
|
|
772
|
+
.. NOTE: This should rather be a method of fields and rings.
|
|
773
|
+
|
|
774
|
+
RAISES:
|
|
775
|
+
|
|
776
|
+
:exc:`NotImplementedError`: The field does not have an
|
|
777
|
+
abbreviated name defined.
|
|
778
|
+
|
|
779
|
+
EXAMPLES::
|
|
780
|
+
|
|
781
|
+
sage: FilteredVectorSpace(2, base_ring=QQ)._repr_field_name()
|
|
782
|
+
'QQ'
|
|
783
|
+
|
|
784
|
+
sage: F.<a> = GF(9) # needs sage.rings.finite_rings
|
|
785
|
+
sage: FilteredVectorSpace(2, base_ring=F)._repr_field_name() # needs sage.rings.finite_rings
|
|
786
|
+
'GF(9)'
|
|
787
|
+
|
|
788
|
+
sage: FilteredVectorSpace(2, base_ring=AA)._repr_field_name() # needs sage.rings.number_field
|
|
789
|
+
Traceback (most recent call last):
|
|
790
|
+
...
|
|
791
|
+
NotImplementedError
|
|
792
|
+
"""
|
|
793
|
+
if self.base_ring() == QQ:
|
|
794
|
+
return 'QQ'
|
|
795
|
+
elif self.base_ring() == RDF:
|
|
796
|
+
return 'RDF'
|
|
797
|
+
elif self.base_ring() == RR:
|
|
798
|
+
return 'RR'
|
|
799
|
+
from sage.categories.finite_fields import FiniteFields
|
|
800
|
+
if self.base_ring() in FiniteFields():
|
|
801
|
+
return 'GF({})'.format(len(self.base_ring()))
|
|
802
|
+
else:
|
|
803
|
+
raise NotImplementedError()
|
|
804
|
+
|
|
805
|
+
def _repr_vector_space(self, dim):
|
|
806
|
+
"""
|
|
807
|
+
Return a string representation of the vector space of given dimension.
|
|
808
|
+
|
|
809
|
+
INPUT:
|
|
810
|
+
|
|
811
|
+
- ``dim`` -- integer
|
|
812
|
+
|
|
813
|
+
OUTPUT: string representation of the vector space of dimension ``dim``
|
|
814
|
+
|
|
815
|
+
EXAMPLES::
|
|
816
|
+
|
|
817
|
+
sage: F = FilteredVectorSpace(3, base_ring=RDF)
|
|
818
|
+
sage: F._repr_vector_space(1234)
|
|
819
|
+
'RDF^1234'
|
|
820
|
+
sage: F3 = FilteredVectorSpace(3, base_ring=GF(3))
|
|
821
|
+
sage: F3._repr_vector_space(1234)
|
|
822
|
+
'GF(3)^1234'
|
|
823
|
+
sage: F3 = FilteredVectorSpace(3, base_ring=AA) # needs sage.rings.number_field
|
|
824
|
+
sage: F3._repr_vector_space(1234) # needs sage.rings.number_field
|
|
825
|
+
'Vector space of dimension 1234 over Algebraic Real Field'
|
|
826
|
+
"""
|
|
827
|
+
if dim == 0:
|
|
828
|
+
return '0'
|
|
829
|
+
try:
|
|
830
|
+
return self._repr_field_name() + '^' + str(dim)
|
|
831
|
+
except NotImplementedError:
|
|
832
|
+
return repr(VectorSpace(self.base_ring(), dim))
|
|
833
|
+
|
|
834
|
+
def _repr_degrees(self, min_deg, max_deg):
|
|
835
|
+
"""
|
|
836
|
+
Return a string representation.
|
|
837
|
+
|
|
838
|
+
This method is like :meth:`_repr_` except that the user can
|
|
839
|
+
select the range of degrees to be shown in the output.
|
|
840
|
+
|
|
841
|
+
INPUT:
|
|
842
|
+
|
|
843
|
+
- ``min_deg``, ``max_deg`` -- two integers
|
|
844
|
+
|
|
845
|
+
EXAMPLES::
|
|
846
|
+
|
|
847
|
+
sage: rays = [(1,0), (1,1), (1,2), (-1,-1)]
|
|
848
|
+
sage: F = FilteredVectorSpace(rays, {0:[1, 2], 2:[3]})
|
|
849
|
+
sage: F._repr_degrees(-2, 4)
|
|
850
|
+
['QQ^2', 'QQ^2', 'QQ^2', 'QQ^1', 'QQ^1', '0', '0', '0']
|
|
851
|
+
"""
|
|
852
|
+
degrees = list(range(min_deg, max_deg + 1))
|
|
853
|
+
dims = []
|
|
854
|
+
for i in degrees + [infinity]:
|
|
855
|
+
d = self.get_degree(i).dimension()
|
|
856
|
+
dims.append(self._repr_vector_space(d))
|
|
857
|
+
return dims
|
|
858
|
+
|
|
859
|
+
def _repr_(self):
|
|
860
|
+
r"""
|
|
861
|
+
Return as string representation of ``self``.
|
|
862
|
+
|
|
863
|
+
OUTPUT: string
|
|
864
|
+
|
|
865
|
+
EXAMPLES::
|
|
866
|
+
|
|
867
|
+
sage: rays = [(1,0), (1,1), (1,2), (-1,-1)]
|
|
868
|
+
sage: FilteredVectorSpace(rays, {0:[1, 2], 2:[3]})._repr_()
|
|
869
|
+
'QQ^2 >= QQ^1 >= QQ^1 >= 0'
|
|
870
|
+
sage: FilteredVectorSpace(rays, {0:[1, 2], oo:[3]})
|
|
871
|
+
QQ^2 >= QQ^1
|
|
872
|
+
sage: FilteredVectorSpace(rays, {oo:[3]})
|
|
873
|
+
QQ^1 in QQ^2
|
|
874
|
+
sage: FilteredVectorSpace(rays, {0:[3]})
|
|
875
|
+
QQ^1 >= 0 in QQ^2
|
|
876
|
+
sage: FilteredVectorSpace({1:[(1,0), (-1,1)], 3:[(1,0)]}, base_ring=GF(3))
|
|
877
|
+
GF(3)^2 >= GF(3)^1 >= GF(3)^1 >= 0
|
|
878
|
+
sage: FilteredVectorSpace({1:[(1,0), (-1,1)], 3:[(1,0)]}, base_ring=AA) # needs sage.rings.number_field
|
|
879
|
+
Vector space of dimension 2 over Algebraic Real Field
|
|
880
|
+
>= Vector space of dimension 1 over Algebraic Real Field
|
|
881
|
+
>= Vector space of dimension 1 over Algebraic Real Field >= 0
|
|
882
|
+
"""
|
|
883
|
+
finite_support = [d for d in self.support() if d != infinity]
|
|
884
|
+
if len(finite_support) == 0:
|
|
885
|
+
dims = self._repr_degrees(0, -1)
|
|
886
|
+
else:
|
|
887
|
+
min_deg = finite_support[0]
|
|
888
|
+
max_deg = finite_support[-1]
|
|
889
|
+
dims = self._repr_degrees(min_deg, max_deg)
|
|
890
|
+
s = ' >= '.join(dims)
|
|
891
|
+
if not self.is_exhaustive():
|
|
892
|
+
s += ' in ' + self._repr_vector_space(self.degree())
|
|
893
|
+
return s
|
|
894
|
+
|
|
895
|
+
def __eq__(self, other):
|
|
896
|
+
"""
|
|
897
|
+
Return whether ``self`` is equal to ``other``.
|
|
898
|
+
|
|
899
|
+
EXAMPLES::
|
|
900
|
+
|
|
901
|
+
sage: V = FilteredVectorSpace(2, 0)
|
|
902
|
+
sage: W = FilteredVectorSpace([(1,0),(0,1)], {0:[0, 1]})
|
|
903
|
+
sage: V == W
|
|
904
|
+
True
|
|
905
|
+
sage: V is W
|
|
906
|
+
False
|
|
907
|
+
|
|
908
|
+
sage: W = FilteredVectorSpace([(1,0),(1,1)], {0:[1]})
|
|
909
|
+
sage: V == W
|
|
910
|
+
False
|
|
911
|
+
|
|
912
|
+
TESTS::
|
|
913
|
+
|
|
914
|
+
sage: # needs palp sage.geometry.polyhedron sage.graphs sage.schemes
|
|
915
|
+
sage: P = toric_varieties.P2()
|
|
916
|
+
sage: T_P = P.sheaves.tangent_bundle()
|
|
917
|
+
sage: O_P = P.sheaves.trivial_bundle(1)
|
|
918
|
+
sage: S1 = T_P + O_P
|
|
919
|
+
sage: S2 = O_P + T_P
|
|
920
|
+
sage: S1._filt[0].is_isomorphic(S2._filt[0]) # known bug
|
|
921
|
+
True
|
|
922
|
+
|
|
923
|
+
sage: FilteredVectorSpace(2, base_ring=QQ) == FilteredVectorSpace(2, base_ring=GF(5))
|
|
924
|
+
False
|
|
925
|
+
"""
|
|
926
|
+
if type(self) is not type(other):
|
|
927
|
+
return False
|
|
928
|
+
if self.base_ring() != other.base_ring():
|
|
929
|
+
return False
|
|
930
|
+
if self.dimension() != other.dimension():
|
|
931
|
+
return False
|
|
932
|
+
if len(self._filt) != len(other._filt):
|
|
933
|
+
return False
|
|
934
|
+
for self_filt, other_filt in zip(self._filt, other._filt):
|
|
935
|
+
if self_filt[0] != other_filt[0]:
|
|
936
|
+
# compare degree
|
|
937
|
+
return False
|
|
938
|
+
if (self_filt[1].echelonized_basis_matrix() !=
|
|
939
|
+
other_filt[1].echelonized_basis_matrix()):
|
|
940
|
+
# compare vector subspace
|
|
941
|
+
return False
|
|
942
|
+
return True
|
|
943
|
+
|
|
944
|
+
def __ne__(self, other):
|
|
945
|
+
"""
|
|
946
|
+
Return whether ``self`` is not equal to ``other``.
|
|
947
|
+
|
|
948
|
+
EXAMPLES::
|
|
949
|
+
|
|
950
|
+
sage: V = FilteredVectorSpace(2, 0)
|
|
951
|
+
sage: W = FilteredVectorSpace([(1,0),(0,1)], {0:[0, 1]})
|
|
952
|
+
sage: V != W
|
|
953
|
+
False
|
|
954
|
+
|
|
955
|
+
sage: W = FilteredVectorSpace([(1,0),(1,1)], {0:[1]})
|
|
956
|
+
sage: V != W
|
|
957
|
+
True
|
|
958
|
+
"""
|
|
959
|
+
return not (self == other)
|
|
960
|
+
|
|
961
|
+
def direct_sum(self, other):
|
|
962
|
+
"""
|
|
963
|
+
Return the direct sum.
|
|
964
|
+
|
|
965
|
+
INPUT:
|
|
966
|
+
|
|
967
|
+
- ``other`` -- a filtered vector space
|
|
968
|
+
|
|
969
|
+
OUTPUT: the direct sum as a filtered vector space
|
|
970
|
+
|
|
971
|
+
EXAMPLES::
|
|
972
|
+
|
|
973
|
+
sage: V = FilteredVectorSpace(2, 0)
|
|
974
|
+
sage: W = FilteredVectorSpace({0:[(1,-1),(2,1)], 1:[(1,1)]})
|
|
975
|
+
sage: V.direct_sum(W)
|
|
976
|
+
QQ^4 >= QQ^1 >= 0
|
|
977
|
+
sage: V + W # syntactic sugar
|
|
978
|
+
QQ^4 >= QQ^1 >= 0
|
|
979
|
+
sage: V + V == FilteredVectorSpace(4, 0)
|
|
980
|
+
True
|
|
981
|
+
|
|
982
|
+
sage: W = FilteredVectorSpace([(1,-1),(2,1)], {1:[0,1], 2:[1]})
|
|
983
|
+
sage: V + W
|
|
984
|
+
QQ^4 >= QQ^2 >= QQ^1 >= 0
|
|
985
|
+
|
|
986
|
+
A suitable base ring is chosen if they do not match::
|
|
987
|
+
|
|
988
|
+
sage: v = [(1,0), (0,1)]
|
|
989
|
+
sage: F1 = FilteredVectorSpace(v, {0:[0], 1:[1]}, base_ring=QQ)
|
|
990
|
+
sage: F2 = FilteredVectorSpace(v, {0:[0], 1:[1]}, base_ring=RDF)
|
|
991
|
+
sage: F1 + F2 # needs scipy
|
|
992
|
+
RDF^4 >= RDF^2 >= 0
|
|
993
|
+
"""
|
|
994
|
+
from sage.structure.element import get_coercion_model
|
|
995
|
+
base_ring = get_coercion_model().common_parent(self.base_ring(), other.base_ring())
|
|
996
|
+
# construct the generators
|
|
997
|
+
self_gens, self_filt = self.presentation()
|
|
998
|
+
other_gens, other_filt = other.presentation()
|
|
999
|
+
generators = \
|
|
1000
|
+
[list(v) + [base_ring.zero()] * other.dimension() for v in self_gens] + \
|
|
1001
|
+
[[base_ring.zero()] * self.dimension() + list(v) for v in other_gens]
|
|
1002
|
+
|
|
1003
|
+
# construct the filtration dictionary
|
|
1004
|
+
def join_indices(self_indices, other_indices):
|
|
1005
|
+
self_indices = tuple(self_indices)
|
|
1006
|
+
other_indices = tuple(i + len(self_gens) for i in other_indices)
|
|
1007
|
+
return self_indices + other_indices
|
|
1008
|
+
filtration = {}
|
|
1009
|
+
self_indices = set()
|
|
1010
|
+
other_indices = set()
|
|
1011
|
+
degrees = list(self_filt) + list(other_filt)
|
|
1012
|
+
for deg in sorted(set(degrees), reverse=True):
|
|
1013
|
+
self_indices.update(self_filt.get(deg, []))
|
|
1014
|
+
other_indices.update(other_filt.get(deg, []))
|
|
1015
|
+
gens = join_indices(self_indices, other_indices)
|
|
1016
|
+
filtration[deg] = gens
|
|
1017
|
+
return FilteredVectorSpace(generators, filtration, base_ring=base_ring)
|
|
1018
|
+
|
|
1019
|
+
__add__ = direct_sum
|
|
1020
|
+
|
|
1021
|
+
def tensor_product(self, other):
|
|
1022
|
+
r"""
|
|
1023
|
+
Return the graded tensor product.
|
|
1024
|
+
|
|
1025
|
+
INPUT:
|
|
1026
|
+
|
|
1027
|
+
- ``other`` -- a filtered vector space
|
|
1028
|
+
|
|
1029
|
+
OUTPUT:
|
|
1030
|
+
|
|
1031
|
+
The graded tensor product, that is, the tensor product of a
|
|
1032
|
+
generator of degree `d_1` with a generator in degree `d_2` has
|
|
1033
|
+
degree `d_1 + d_2`.
|
|
1034
|
+
|
|
1035
|
+
EXAMPLES::
|
|
1036
|
+
|
|
1037
|
+
sage: F1 = FilteredVectorSpace(1, 1)
|
|
1038
|
+
sage: F2 = FilteredVectorSpace(1, 2)
|
|
1039
|
+
sage: F1.tensor_product(F2)
|
|
1040
|
+
QQ^1 >= 0
|
|
1041
|
+
sage: F1 * F2
|
|
1042
|
+
QQ^1 >= 0
|
|
1043
|
+
|
|
1044
|
+
sage: F1.min_degree()
|
|
1045
|
+
1
|
|
1046
|
+
sage: F2.min_degree()
|
|
1047
|
+
2
|
|
1048
|
+
sage: (F1*F2).min_degree()
|
|
1049
|
+
3
|
|
1050
|
+
|
|
1051
|
+
A suitable base ring is chosen if they do not match::
|
|
1052
|
+
|
|
1053
|
+
sage: v = [(1,0), (0,1)]
|
|
1054
|
+
sage: F1 = FilteredVectorSpace(v, {0:[0], 1:[1]}, base_ring=QQ)
|
|
1055
|
+
sage: F2 = FilteredVectorSpace(v, {0:[0], 1:[1]}, base_ring=RDF)
|
|
1056
|
+
sage: F1 * F2 # needs scipy
|
|
1057
|
+
RDF^4 >= RDF^3 >= RDF^1 >= 0
|
|
1058
|
+
"""
|
|
1059
|
+
V = self
|
|
1060
|
+
W = other
|
|
1061
|
+
from sage.structure.element import get_coercion_model
|
|
1062
|
+
base_ring = get_coercion_model().common_parent(V.base_ring(), W.base_ring())
|
|
1063
|
+
from sage.modules.tensor_operations import VectorCollection, TensorOperation
|
|
1064
|
+
V_generators, V_indices = V.presentation()
|
|
1065
|
+
W_generators, W_indices = W.presentation()
|
|
1066
|
+
V_coll = VectorCollection(V_generators, base_ring, V.dimension())
|
|
1067
|
+
W_coll = VectorCollection(W_generators, base_ring, W.dimension())
|
|
1068
|
+
T = TensorOperation([V_coll, W_coll], 'product')
|
|
1069
|
+
|
|
1070
|
+
filtration = {}
|
|
1071
|
+
for V_deg in V.support():
|
|
1072
|
+
for W_deg in W.support():
|
|
1073
|
+
deg = V_deg + W_deg
|
|
1074
|
+
indices = filtration.get(deg, set())
|
|
1075
|
+
for i in V_indices[V_deg]:
|
|
1076
|
+
for j in W_indices[W_deg]:
|
|
1077
|
+
i_tensor_j = T.index_map(i, j)
|
|
1078
|
+
indices.add(i_tensor_j)
|
|
1079
|
+
filtration[deg] = indices
|
|
1080
|
+
return FilteredVectorSpace(T.vectors(), filtration, base_ring=base_ring)
|
|
1081
|
+
|
|
1082
|
+
__mul__ = tensor_product
|
|
1083
|
+
|
|
1084
|
+
def _power_operation(self, n, operation):
|
|
1085
|
+
"""
|
|
1086
|
+
Return tensor power operation.
|
|
1087
|
+
|
|
1088
|
+
INPUT:
|
|
1089
|
+
|
|
1090
|
+
- ``n`` -- integer; the number of factors of ``self``
|
|
1091
|
+
|
|
1092
|
+
- ``operation`` -- string. See
|
|
1093
|
+
:class:`~sage.modules.tensor_operations.TensorOperation` for
|
|
1094
|
+
details.
|
|
1095
|
+
|
|
1096
|
+
EXAMPLES::
|
|
1097
|
+
|
|
1098
|
+
sage: F = FilteredVectorSpace(1, 1) + FilteredVectorSpace(1, 2); F
|
|
1099
|
+
QQ^2 >= QQ^1 >= 0
|
|
1100
|
+
sage: F._power_operation(2, 'symmetric')
|
|
1101
|
+
QQ^3 >= QQ^2 >= QQ^1 >= 0
|
|
1102
|
+
sage: F._power_operation(2, 'antisymmetric') # needs sage.groups
|
|
1103
|
+
QQ^1 >= 0
|
|
1104
|
+
"""
|
|
1105
|
+
from sage.modules.tensor_operations import VectorCollection, TensorOperation
|
|
1106
|
+
generators, indices = self.presentation()
|
|
1107
|
+
V = VectorCollection(generators, self.base_ring(), self.dimension())
|
|
1108
|
+
T = TensorOperation([V] * n, operation)
|
|
1109
|
+
|
|
1110
|
+
iters = [self.support()] * n
|
|
1111
|
+
filtration = {}
|
|
1112
|
+
for degrees in product(*iters):
|
|
1113
|
+
deg = sum(degrees)
|
|
1114
|
+
filt_deg = filtration.get(deg, set())
|
|
1115
|
+
for i in product(*[indices.get(d) for d in degrees]):
|
|
1116
|
+
pow_i = T.index_map(*i)
|
|
1117
|
+
if pow_i is not None:
|
|
1118
|
+
filt_deg.add(pow_i)
|
|
1119
|
+
filtration[deg] = filt_deg
|
|
1120
|
+
return FilteredVectorSpace(T.vectors(), filtration, base_ring=self.base_ring())
|
|
1121
|
+
|
|
1122
|
+
def exterior_power(self, n):
|
|
1123
|
+
"""
|
|
1124
|
+
Return the `n`-th graded exterior power.
|
|
1125
|
+
|
|
1126
|
+
INPUT:
|
|
1127
|
+
|
|
1128
|
+
- ``n`` -- integer; exterior product of how many copies of ``self``
|
|
1129
|
+
|
|
1130
|
+
OUTPUT:
|
|
1131
|
+
|
|
1132
|
+
The graded exterior product, that is, the wedge product of a
|
|
1133
|
+
generator of degree `d_1` with a generator in degree `d_2` has
|
|
1134
|
+
degree `d_1 + d_2`.
|
|
1135
|
+
|
|
1136
|
+
EXAMPLES::
|
|
1137
|
+
|
|
1138
|
+
sage: # needs sage.groups
|
|
1139
|
+
sage: F = FilteredVectorSpace(1, 1) + FilteredVectorSpace(1, 2); F
|
|
1140
|
+
QQ^2 >= QQ^1 >= 0
|
|
1141
|
+
sage: F.exterior_power(1)
|
|
1142
|
+
QQ^2 >= QQ^1 >= 0
|
|
1143
|
+
sage: F.exterior_power(2)
|
|
1144
|
+
QQ^1 >= 0
|
|
1145
|
+
sage: F.exterior_power(3)
|
|
1146
|
+
0
|
|
1147
|
+
sage: F.wedge(2)
|
|
1148
|
+
QQ^1 >= 0
|
|
1149
|
+
"""
|
|
1150
|
+
return self._power_operation(n, 'antisymmetric')
|
|
1151
|
+
|
|
1152
|
+
wedge = exterior_power
|
|
1153
|
+
|
|
1154
|
+
def symmetric_power(self, n):
|
|
1155
|
+
"""
|
|
1156
|
+
Return the `n`-th graded symmetric power.
|
|
1157
|
+
|
|
1158
|
+
INPUT:
|
|
1159
|
+
|
|
1160
|
+
- ``n`` -- integer; symmetric product of how many copies of
|
|
1161
|
+
``self``
|
|
1162
|
+
|
|
1163
|
+
OUTPUT:
|
|
1164
|
+
|
|
1165
|
+
The graded symmetric product, that is, the symmetrization of a
|
|
1166
|
+
generator of degree `d_1` with a generator in degree `d_2` has
|
|
1167
|
+
degree `d_1 + d_2`.
|
|
1168
|
+
|
|
1169
|
+
EXAMPLES::
|
|
1170
|
+
|
|
1171
|
+
sage: F = FilteredVectorSpace(1, 1) + FilteredVectorSpace(1, 2); F
|
|
1172
|
+
QQ^2 >= QQ^1 >= 0
|
|
1173
|
+
sage: F.symmetric_power(2)
|
|
1174
|
+
QQ^3 >= QQ^2 >= QQ^1 >= 0
|
|
1175
|
+
"""
|
|
1176
|
+
return self._power_operation(n, 'symmetric')
|
|
1177
|
+
|
|
1178
|
+
def dual(self):
|
|
1179
|
+
"""
|
|
1180
|
+
Return the dual filtered vector space.
|
|
1181
|
+
|
|
1182
|
+
OUTPUT:
|
|
1183
|
+
|
|
1184
|
+
The graded dual, that is, the dual of a degree-`d` subspace is
|
|
1185
|
+
a set of linear constraints in degree `-d+1`. That is, the
|
|
1186
|
+
dual generators live in degree `-d`.
|
|
1187
|
+
|
|
1188
|
+
EXAMPLES::
|
|
1189
|
+
|
|
1190
|
+
sage: gens = identity_matrix(3).rows()
|
|
1191
|
+
sage: F = FilteredVectorSpace(gens, {0:[0,1,2], 2:[0]}); F
|
|
1192
|
+
QQ^3 >= QQ^1 >= QQ^1 >= 0
|
|
1193
|
+
sage: F.support()
|
|
1194
|
+
(0, 2)
|
|
1195
|
+
|
|
1196
|
+
sage: F.dual()
|
|
1197
|
+
QQ^3 >= QQ^2 >= QQ^2 >= 0
|
|
1198
|
+
sage: F.dual().support()
|
|
1199
|
+
(-2, 0)
|
|
1200
|
+
"""
|
|
1201
|
+
filtration = {}
|
|
1202
|
+
prev_deg = minus_infinity
|
|
1203
|
+
for deg, V in self._filt[1:]:
|
|
1204
|
+
filtration[-prev_deg] = V.complement().echelonized_basis()
|
|
1205
|
+
prev_deg = deg
|
|
1206
|
+
return FilteredVectorSpace(filtration, base_ring=self.base_ring())
|
|
1207
|
+
|
|
1208
|
+
def shift(self, deg):
|
|
1209
|
+
"""
|
|
1210
|
+
Return a filtered vector space with degrees shifted by a constant.
|
|
1211
|
+
|
|
1212
|
+
EXAMPLES::
|
|
1213
|
+
|
|
1214
|
+
sage: gens = identity_matrix(3).rows()
|
|
1215
|
+
sage: F = FilteredVectorSpace(gens, {0:[0,1,2], 2:[0]}); F
|
|
1216
|
+
QQ^3 >= QQ^1 >= QQ^1 >= 0
|
|
1217
|
+
sage: F.support()
|
|
1218
|
+
(0, 2)
|
|
1219
|
+
sage: F.shift(-5).support()
|
|
1220
|
+
(-5, -3)
|
|
1221
|
+
"""
|
|
1222
|
+
generators, filtration = self.presentation()
|
|
1223
|
+
shifted = {}
|
|
1224
|
+
for d, indices in filtration.items():
|
|
1225
|
+
shifted[d + deg] = indices
|
|
1226
|
+
return FilteredVectorSpace(generators, shifted, base_ring=self.base_ring())
|
|
1227
|
+
|
|
1228
|
+
def random_deformation(self, epsilon=None):
|
|
1229
|
+
"""
|
|
1230
|
+
Return a random deformation.
|
|
1231
|
+
|
|
1232
|
+
INPUT:
|
|
1233
|
+
|
|
1234
|
+
- ``epsilon`` -- a number in the base ring
|
|
1235
|
+
|
|
1236
|
+
OUTPUT:
|
|
1237
|
+
|
|
1238
|
+
A new filtered vector space where the generators of the
|
|
1239
|
+
subspaces are moved by ``epsilon`` times a random vector.
|
|
1240
|
+
|
|
1241
|
+
EXAMPLES::
|
|
1242
|
+
|
|
1243
|
+
sage: gens = identity_matrix(3).rows()
|
|
1244
|
+
sage: F = FilteredVectorSpace(gens, {0:[0,1,2], 2:[0]}); F
|
|
1245
|
+
QQ^3 >= QQ^1 >= QQ^1 >= 0
|
|
1246
|
+
sage: F.get_degree(2)
|
|
1247
|
+
Vector space of degree 3 and dimension 1 over Rational Field
|
|
1248
|
+
Basis matrix:
|
|
1249
|
+
[1 0 0]
|
|
1250
|
+
sage: G = F.random_deformation(1/50); G
|
|
1251
|
+
QQ^3 >= QQ^1 >= QQ^1 >= 0
|
|
1252
|
+
sage: D = G.get_degree(2)
|
|
1253
|
+
sage: D.degree()
|
|
1254
|
+
3
|
|
1255
|
+
sage: v = D.basis_matrix()[0]
|
|
1256
|
+
sage: v[0]
|
|
1257
|
+
1
|
|
1258
|
+
|
|
1259
|
+
sage: while F.random_deformation(1/50).get_degree(2).matrix() == matrix([1, 0, 0]):
|
|
1260
|
+
....: pass
|
|
1261
|
+
"""
|
|
1262
|
+
from sage.modules.free_module_element import random_vector
|
|
1263
|
+
R = self.base_ring()
|
|
1264
|
+
if epsilon is None:
|
|
1265
|
+
epsilon = R.one()
|
|
1266
|
+
filtration = {}
|
|
1267
|
+
for deg, filt in self._filt[1:]:
|
|
1268
|
+
generators = [v + epsilon * random_vector(R, self.rank())
|
|
1269
|
+
for v in filt.echelonized_basis()]
|
|
1270
|
+
filtration[deg] = generators
|
|
1271
|
+
return FilteredVectorSpace(filtration, base_ring=R, check=True)
|