passagemath-modules 10.6.31rc3__cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_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 +807 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +6 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgfortran-83c28eba.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-6e109695.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-cda90e79.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7f678fcf.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-82690d50.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-6dcb67f9.3.29.so +0 -0
- passagemath_modules.libs/libquadmath-2284e583.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-gnu.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-x86_64-linux-gnu.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-gnu.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-x86_64-linux-gnu.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-gnu.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-x86_64-linux-gnu.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-gnu.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-x86_64-linux-gnu.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-gnu.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-x86_64-linux-gnu.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,809 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
Some useful functions for the matroid class.
|
|
4
|
+
|
|
5
|
+
For direct access to the methods :meth:`newlabel`, :meth:`setprint` and
|
|
6
|
+
:meth:`get_nonisomorphic_matroids`, type::
|
|
7
|
+
|
|
8
|
+
sage: from sage.matroids.advanced import *
|
|
9
|
+
|
|
10
|
+
See also :mod:`sage.matroids.advanced`.
|
|
11
|
+
|
|
12
|
+
AUTHORS:
|
|
13
|
+
|
|
14
|
+
- Stefan van Zwam (2011-06-24): initial version
|
|
15
|
+
"""
|
|
16
|
+
# ****************************************************************************
|
|
17
|
+
# Copyright (C) 2013 Rudi Pendavingh <rudi.pendavingh@gmail.com>
|
|
18
|
+
# Copyright (C) 2013 Stefan van Zwam <stefanvanzwam@gmail.com>
|
|
19
|
+
#
|
|
20
|
+
#
|
|
21
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
22
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
23
|
+
# the License, or (at your option) any later version.
|
|
24
|
+
# https://www.gnu.org/licenses/
|
|
25
|
+
# ****************************************************************************
|
|
26
|
+
|
|
27
|
+
from collections.abc import Iterable
|
|
28
|
+
from sage.matrix.constructor import Matrix
|
|
29
|
+
from sage.rings.integer_ring import ZZ
|
|
30
|
+
from sage.rings.rational_field import QQ
|
|
31
|
+
from sage.structure.all import SageObject
|
|
32
|
+
from operator import itemgetter
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def setprint(X):
|
|
36
|
+
"""
|
|
37
|
+
Print nested data structures nicely.
|
|
38
|
+
|
|
39
|
+
Python's data structures ``set`` and ``frozenset`` do not print nicely.
|
|
40
|
+
This function can be used as replacement for ``print`` to overcome this.
|
|
41
|
+
For direct access to ``setprint``, run::
|
|
42
|
+
|
|
43
|
+
sage: from sage.matroids.advanced import *
|
|
44
|
+
|
|
45
|
+
.. NOTE::
|
|
46
|
+
|
|
47
|
+
This function will be redundant when Sage moves to Python 3, since the
|
|
48
|
+
default ``print`` will suffice then.
|
|
49
|
+
|
|
50
|
+
INPUT:
|
|
51
|
+
|
|
52
|
+
- ``X`` -- any Python object
|
|
53
|
+
|
|
54
|
+
OUTPUT: none; however, the function prints a nice representation of ``X``
|
|
55
|
+
|
|
56
|
+
EXAMPLES:
|
|
57
|
+
|
|
58
|
+
Output looks much better::
|
|
59
|
+
|
|
60
|
+
sage: from sage.matroids.advanced import setprint
|
|
61
|
+
sage: L = [{1, 2, 3}, {1, 2, 4}, {2, 3, 4}, {4, 1, 3}]
|
|
62
|
+
sage: print(L)
|
|
63
|
+
[{1, 2, 3}, {1, 2, 4}, {2, 3, 4}, {1, 3, 4}]
|
|
64
|
+
sage: setprint(L)
|
|
65
|
+
[{1, 2, 3}, {1, 2, 4}, {1, 3, 4}, {2, 3, 4}]
|
|
66
|
+
|
|
67
|
+
Note that for iterables, the effect can be undesirable::
|
|
68
|
+
|
|
69
|
+
sage: from sage.matroids.advanced import setprint
|
|
70
|
+
sage: M = matroids.catalog.Fano().delete('efg')
|
|
71
|
+
sage: M.bases()
|
|
72
|
+
SetSystem of 3 sets over 4 elements
|
|
73
|
+
sage: setprint(M.bases())
|
|
74
|
+
[{'a', 'b', 'c'}, {'a', 'b', 'd'}, {'a', 'c', 'd'}]
|
|
75
|
+
|
|
76
|
+
An exception was made for subclasses of SageObject::
|
|
77
|
+
|
|
78
|
+
sage: from sage.matroids.advanced import setprint
|
|
79
|
+
sage: G = graphs.PetersenGraph() # needs sage.graphs
|
|
80
|
+
sage: list(G) # needs sage.graphs
|
|
81
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
82
|
+
sage: setprint(G) # needs sage.graphs
|
|
83
|
+
Petersen graph: Graph on 10 vertices
|
|
84
|
+
"""
|
|
85
|
+
print(setprint_s(X, toplevel=True))
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def setprint_s(X, toplevel=False):
|
|
89
|
+
"""
|
|
90
|
+
Create the string for use by ``setprint()``.
|
|
91
|
+
|
|
92
|
+
INPUT:
|
|
93
|
+
|
|
94
|
+
- ``X`` -- any Python object
|
|
95
|
+
- ``toplevel`` -- boolean (default: ``False``); indicates whether this is a
|
|
96
|
+
recursion or not
|
|
97
|
+
|
|
98
|
+
OUTPUT:
|
|
99
|
+
|
|
100
|
+
A string representation of the object, with nice notation for sets and
|
|
101
|
+
frozensets.
|
|
102
|
+
|
|
103
|
+
EXAMPLES::
|
|
104
|
+
|
|
105
|
+
sage: from sage.matroids.utilities import setprint_s
|
|
106
|
+
sage: L = [{1, 2, 3}, {1, 2, 4}, {2, 3, 4}, {4, 1, 3}]
|
|
107
|
+
sage: setprint_s(L)
|
|
108
|
+
'[{1, 2, 3}, {1, 2, 4}, {1, 3, 4}, {2, 3, 4}]'
|
|
109
|
+
|
|
110
|
+
The ``toplevel`` argument only affects strings, to mimic ``print``'s
|
|
111
|
+
behavior::
|
|
112
|
+
|
|
113
|
+
sage: X = 'abcd'
|
|
114
|
+
sage: setprint_s(X)
|
|
115
|
+
"'abcd'"
|
|
116
|
+
sage: setprint_s(X, toplevel=True)
|
|
117
|
+
'abcd'
|
|
118
|
+
"""
|
|
119
|
+
if isinstance(X, (frozenset, set)):
|
|
120
|
+
return '{' + ', '.join(sorted(setprint_s(x) for x in X)) + '}'
|
|
121
|
+
elif isinstance(X, dict):
|
|
122
|
+
return '{' + ', '.join(sorted(setprint_s(key) + ': ' + setprint_s(val)
|
|
123
|
+
for key, val in X.items())) + '}'
|
|
124
|
+
elif isinstance(X, str):
|
|
125
|
+
if toplevel:
|
|
126
|
+
return X
|
|
127
|
+
else:
|
|
128
|
+
return "'" + X + "'"
|
|
129
|
+
elif isinstance(X, Iterable) and not isinstance(X, SageObject):
|
|
130
|
+
return '[' + ', '.join(sorted(setprint_s(x) for x in X)) + ']'
|
|
131
|
+
else:
|
|
132
|
+
return repr(X)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def newlabel(groundset):
|
|
136
|
+
r"""
|
|
137
|
+
Create a new element label different from the labels in ``groundset``.
|
|
138
|
+
|
|
139
|
+
INPUT:
|
|
140
|
+
|
|
141
|
+
- ``groundset`` -- set of objects
|
|
142
|
+
|
|
143
|
+
OUTPUT: string not in the set ``groundset``
|
|
144
|
+
|
|
145
|
+
For direct access to ``newlabel``, run::
|
|
146
|
+
|
|
147
|
+
sage: from sage.matroids.advanced import *
|
|
148
|
+
|
|
149
|
+
ALGORITHM:
|
|
150
|
+
|
|
151
|
+
#. Create a set of all one-character alphanumeric strings.
|
|
152
|
+
#. Remove the string representation of each existing element from this
|
|
153
|
+
list.
|
|
154
|
+
#. If the list is nonempty, return any element.
|
|
155
|
+
#. Otherwise, return the concatenation of the strings of each existing
|
|
156
|
+
element, preceded by 'e'.
|
|
157
|
+
|
|
158
|
+
EXAMPLES::
|
|
159
|
+
|
|
160
|
+
sage: from sage.matroids.advanced import newlabel
|
|
161
|
+
sage: S = set(['a', 42, 'b'])
|
|
162
|
+
sage: newlabel(S) in S
|
|
163
|
+
False
|
|
164
|
+
|
|
165
|
+
sage: S = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
|
|
166
|
+
sage: t = newlabel(S)
|
|
167
|
+
sage: len(t)
|
|
168
|
+
63
|
|
169
|
+
sage: t[0]
|
|
170
|
+
'e'
|
|
171
|
+
"""
|
|
172
|
+
char_list = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
|
|
173
|
+
char_list.difference_update([str(e) for e in groundset])
|
|
174
|
+
try:
|
|
175
|
+
s = char_list.pop()
|
|
176
|
+
except KeyError:
|
|
177
|
+
s = 'e' + ''.join([str(e) for e in groundset])
|
|
178
|
+
return s
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def sanitize_contractions_deletions(matroid, contractions, deletions):
|
|
182
|
+
r"""
|
|
183
|
+
Return a fixed version of sets ``contractions`` and ``deletions``.
|
|
184
|
+
|
|
185
|
+
INPUT:
|
|
186
|
+
|
|
187
|
+
- ``matroid`` -- a :class:`Matroid <sage.matroids.matroid.Matroid>`
|
|
188
|
+
instance
|
|
189
|
+
- ``contractions`` -- a subset of the groundset
|
|
190
|
+
- ``deletions`` -- a subset of the groundset
|
|
191
|
+
|
|
192
|
+
OUTPUT: an independent set ``C`` and a coindependent set ``D`` such that
|
|
193
|
+
|
|
194
|
+
``matroid / contractions \ deletions == matroid / C \ D``
|
|
195
|
+
|
|
196
|
+
Raise an error if either is not a subset of the groundset of ``matroid``
|
|
197
|
+
or if they are not disjoint.
|
|
198
|
+
|
|
199
|
+
This function is used by the
|
|
200
|
+
:meth:`Matroid.minor() <sage.matroids.matroid.Matroid.minor>` method.
|
|
201
|
+
|
|
202
|
+
EXAMPLES::
|
|
203
|
+
|
|
204
|
+
sage: from sage.matroids.utilities import setprint
|
|
205
|
+
sage: from sage.matroids.utilities import sanitize_contractions_deletions
|
|
206
|
+
sage: M = matroids.catalog.Fano()
|
|
207
|
+
sage: setprint(sanitize_contractions_deletions(M, 'abc', 'defg'))
|
|
208
|
+
[{'a', 'b', 'c'}, {'d', 'e', 'f', 'g'}]
|
|
209
|
+
sage: setprint(sanitize_contractions_deletions(M, 'defg', 'abc'))
|
|
210
|
+
[{'a', 'b', 'c', 'f'}, {'d', 'e', 'g'}]
|
|
211
|
+
sage: setprint(sanitize_contractions_deletions(M, [1, 2, 3], 'efg'))
|
|
212
|
+
Traceback (most recent call last):
|
|
213
|
+
...
|
|
214
|
+
ValueError: [1, 2, 3] is not a subset of the groundset
|
|
215
|
+
sage: setprint(sanitize_contractions_deletions(M, 'efg', [1, 2, 3]))
|
|
216
|
+
Traceback (most recent call last):
|
|
217
|
+
...
|
|
218
|
+
ValueError: [1, 2, 3] is not a subset of the groundset
|
|
219
|
+
sage: setprint(sanitize_contractions_deletions(M, 'ade', 'efg'))
|
|
220
|
+
Traceback (most recent call last):
|
|
221
|
+
...
|
|
222
|
+
ValueError: contraction and deletion sets are not disjoint.
|
|
223
|
+
"""
|
|
224
|
+
if not contractions:
|
|
225
|
+
contractions = frozenset()
|
|
226
|
+
else:
|
|
227
|
+
contractions = matroid._subset(contractions)
|
|
228
|
+
|
|
229
|
+
if not deletions:
|
|
230
|
+
deletions = frozenset()
|
|
231
|
+
else:
|
|
232
|
+
deletions = matroid._subset(deletions)
|
|
233
|
+
|
|
234
|
+
if not contractions.isdisjoint(deletions):
|
|
235
|
+
raise ValueError("contraction and deletion sets are not disjoint.")
|
|
236
|
+
|
|
237
|
+
conset = matroid._max_independent(contractions)
|
|
238
|
+
delset = matroid._max_coindependent(deletions)
|
|
239
|
+
|
|
240
|
+
return conset.union(deletions.difference(delset)), delset.union(contractions.difference(conset))
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def make_regular_matroid_from_matroid(matroid):
|
|
244
|
+
r"""
|
|
245
|
+
Attempt to construct a regular representation of a matroid.
|
|
246
|
+
|
|
247
|
+
INPUT:
|
|
248
|
+
|
|
249
|
+
- ``matroid`` -- matroid
|
|
250
|
+
|
|
251
|
+
OUTPUT:
|
|
252
|
+
|
|
253
|
+
Return a `(0, 1, -1)`-matrix over the integers such that, if the input is
|
|
254
|
+
a regular matroid, then the output is a totally unimodular matrix
|
|
255
|
+
representing that matroid.
|
|
256
|
+
|
|
257
|
+
EXAMPLES::
|
|
258
|
+
|
|
259
|
+
sage: from sage.matroids.utilities import make_regular_matroid_from_matroid
|
|
260
|
+
sage: make_regular_matroid_from_matroid( # needs sage.graphs
|
|
261
|
+
....: matroids.CompleteGraphic(6)).is_isomorphic(
|
|
262
|
+
....: matroids.CompleteGraphic(6))
|
|
263
|
+
True
|
|
264
|
+
"""
|
|
265
|
+
import sage.matroids.linear_matroid
|
|
266
|
+
M = matroid
|
|
267
|
+
if isinstance(M, sage.matroids.linear_matroid.RegularMatroid):
|
|
268
|
+
return M
|
|
269
|
+
|
|
270
|
+
from sage.graphs.bipartite_graph import BipartiteGraph
|
|
271
|
+
|
|
272
|
+
rk = M.full_rank()
|
|
273
|
+
# First create a reduced 0-1 matrix
|
|
274
|
+
B = list(M.basis())
|
|
275
|
+
NB = list(M.groundset().difference(B))
|
|
276
|
+
dB = {}
|
|
277
|
+
i = 0
|
|
278
|
+
for e in B:
|
|
279
|
+
dB[e] = i
|
|
280
|
+
i += 1
|
|
281
|
+
dNB = {}
|
|
282
|
+
i = 0
|
|
283
|
+
for e in NB:
|
|
284
|
+
dNB[e] = i
|
|
285
|
+
i += 1
|
|
286
|
+
A = Matrix(ZZ, len(B), len(NB), 0)
|
|
287
|
+
G = BipartiteGraph(A.transpose()) # Sage's BipartiteGraph uses the column set as first color class. This is an edgeless graph.
|
|
288
|
+
for e in NB:
|
|
289
|
+
C = M.circuit(B + [e])
|
|
290
|
+
for f in C.difference([e]):
|
|
291
|
+
A[dB[f], dNB[e]] = 1
|
|
292
|
+
# Change some entries from -1 to 1
|
|
293
|
+
entries = list(BipartiteGraph(A.transpose()).edges(labels=False, sort=False))
|
|
294
|
+
while entries:
|
|
295
|
+
L = [G.shortest_path(u, v) for u, v in entries]
|
|
296
|
+
mindex, minval = min(enumerate(L), key=lambda x: len(x[1]))
|
|
297
|
+
|
|
298
|
+
# if minval = 0, there is an edge not spanned by the current subgraph. Its entry is free to be scaled any way.
|
|
299
|
+
if len(minval) > 0: # DUBIOUS !!
|
|
300
|
+
# Check the subdeterminant
|
|
301
|
+
S = frozenset(L[mindex])
|
|
302
|
+
rows = []
|
|
303
|
+
cols = []
|
|
304
|
+
for i in S:
|
|
305
|
+
if i < rk:
|
|
306
|
+
rows.append(i)
|
|
307
|
+
else:
|
|
308
|
+
cols.append(i - rk)
|
|
309
|
+
if A[rows, cols].det() != 0:
|
|
310
|
+
A[entries[mindex][0], entries[mindex][1] - rk] = -1
|
|
311
|
+
G.add_edge(entries[mindex][0], entries[mindex][1])
|
|
312
|
+
entries.pop(mindex)
|
|
313
|
+
return sage.matroids.linear_matroid.RegularMatroid(groundset=B + NB, reduced_matrix=A)
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def get_nonisomorphic_matroids(MSet):
|
|
317
|
+
"""
|
|
318
|
+
Return non-isomorphic members of the matroids in set ``MSet``.
|
|
319
|
+
|
|
320
|
+
For direct access to ``get_nonisomorphic_matroids``, run::
|
|
321
|
+
|
|
322
|
+
sage: from sage.matroids.advanced import *
|
|
323
|
+
|
|
324
|
+
INPUT:
|
|
325
|
+
|
|
326
|
+
- ``MSet`` -- an iterable whose members are matroids
|
|
327
|
+
|
|
328
|
+
OUTPUT:
|
|
329
|
+
|
|
330
|
+
A list containing one representative of each isomorphism class of
|
|
331
|
+
members of ``MSet``.
|
|
332
|
+
|
|
333
|
+
EXAMPLES::
|
|
334
|
+
|
|
335
|
+
sage: from sage.matroids.advanced import *
|
|
336
|
+
sage: L = matroids.Uniform(3, 5).extensions()
|
|
337
|
+
sage: len(list(L))
|
|
338
|
+
32
|
|
339
|
+
sage: len(get_nonisomorphic_matroids(L))
|
|
340
|
+
5
|
|
341
|
+
"""
|
|
342
|
+
OutSet = []
|
|
343
|
+
for M in MSet:
|
|
344
|
+
seen = False
|
|
345
|
+
for N in OutSet:
|
|
346
|
+
if N.is_isomorphic(M):
|
|
347
|
+
seen = True
|
|
348
|
+
break
|
|
349
|
+
if not seen:
|
|
350
|
+
OutSet.append(M)
|
|
351
|
+
return OutSet
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def spanning_forest(M):
|
|
355
|
+
r"""
|
|
356
|
+
Return a list of edges of a spanning forest of the bipartite
|
|
357
|
+
graph defined by `M`
|
|
358
|
+
|
|
359
|
+
INPUT:
|
|
360
|
+
|
|
361
|
+
- ``M`` -- a matrix defining a bipartite graph G. The vertices are the
|
|
362
|
+
rows and columns, if `M[i,j]` is nonzero, then there is an edge
|
|
363
|
+
between row `i` and column `j`.
|
|
364
|
+
|
|
365
|
+
OUTPUT:
|
|
366
|
+
|
|
367
|
+
A list of tuples `(r_i,c_i)` representing edges between row `r_i` and
|
|
368
|
+
column `c_i`.
|
|
369
|
+
|
|
370
|
+
EXAMPLES::
|
|
371
|
+
|
|
372
|
+
sage: from sage.matroids.utilities import spanning_forest
|
|
373
|
+
sage: len(spanning_forest(matrix([[1,1,1],[1,1,1],[1,1,1]]))) # needs sage.graphs
|
|
374
|
+
5
|
|
375
|
+
sage: len(spanning_forest(matrix([[0,0,1],[0,1,0],[0,1,0]]))) # needs sage.graphs
|
|
376
|
+
3
|
|
377
|
+
"""
|
|
378
|
+
from sage.graphs.graph import Graph
|
|
379
|
+
from sage.graphs.spanning_tree import kruskal
|
|
380
|
+
|
|
381
|
+
# Given a matrix, produce a spanning tree
|
|
382
|
+
G = Graph()
|
|
383
|
+
m = M.ncols()
|
|
384
|
+
for (x, y) in M.dict():
|
|
385
|
+
G.add_edge(x + m, y)
|
|
386
|
+
T = []
|
|
387
|
+
# find spanning tree in each component
|
|
388
|
+
for component in G.connected_components_subgraphs():
|
|
389
|
+
spanning_tree = kruskal(component)
|
|
390
|
+
for (x, y, z) in spanning_tree:
|
|
391
|
+
if x < m:
|
|
392
|
+
t = x
|
|
393
|
+
x = y
|
|
394
|
+
y = t
|
|
395
|
+
T.append((x - m, y))
|
|
396
|
+
return T
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
def spanning_stars(M):
|
|
400
|
+
r"""
|
|
401
|
+
Return the edges of a connected subgraph that is a union of
|
|
402
|
+
all edges incident some subset of vertices.
|
|
403
|
+
|
|
404
|
+
INPUT:
|
|
405
|
+
|
|
406
|
+
- ``M`` -- a matrix defining a bipartite graph G. The vertices are the
|
|
407
|
+
rows and columns, if `M[i,j]` is nonzero, then there is an edge
|
|
408
|
+
between row i and column 0.
|
|
409
|
+
|
|
410
|
+
OUTPUT:
|
|
411
|
+
|
|
412
|
+
A list of tuples `(row,column)` in a spanning forest of the bipartite graph
|
|
413
|
+
defined by ``M``.
|
|
414
|
+
|
|
415
|
+
EXAMPLES::
|
|
416
|
+
|
|
417
|
+
sage: from sage.matroids.utilities import spanning_stars
|
|
418
|
+
sage: edges = spanning_stars(matrix([[1,1,1],[1,1,1],[1,1,1]])) # needs sage.graphs
|
|
419
|
+
sage: Graph([(x+3, y) for x,y in edges]).is_connected() # needs sage.graphs
|
|
420
|
+
True
|
|
421
|
+
"""
|
|
422
|
+
from sage.graphs.graph import Graph
|
|
423
|
+
|
|
424
|
+
G = Graph()
|
|
425
|
+
m = M.ncols()
|
|
426
|
+
for x, y in M.dict():
|
|
427
|
+
G.add_edge(x + m, y)
|
|
428
|
+
|
|
429
|
+
delta = (M.nrows() + m)**0.5
|
|
430
|
+
# remove low degree vertices
|
|
431
|
+
H = []
|
|
432
|
+
# candidate vertices
|
|
433
|
+
V_0 = set()
|
|
434
|
+
d = 0
|
|
435
|
+
while G.order():
|
|
436
|
+
x, d = min(G.degree_iterator(labels=True), key=itemgetter(1))
|
|
437
|
+
if d < delta:
|
|
438
|
+
V_0.add(x)
|
|
439
|
+
H.extend(G.edges_incident(x, False))
|
|
440
|
+
G.delete_vertex(x)
|
|
441
|
+
else:
|
|
442
|
+
break
|
|
443
|
+
|
|
444
|
+
# min degree is at least sqrt(n)
|
|
445
|
+
# greedily remove vertices
|
|
446
|
+
G2 = G.copy()
|
|
447
|
+
# set of picked vertices
|
|
448
|
+
V_1 = set()
|
|
449
|
+
while G2.order():
|
|
450
|
+
# choose vertex with maximum degree in G2
|
|
451
|
+
x, d = max(G2.degree_iterator(labels=True), key=itemgetter(1))
|
|
452
|
+
V_1.add(x)
|
|
453
|
+
G2.delete_vertices(G2.neighbors(x))
|
|
454
|
+
G2.delete_vertex(x)
|
|
455
|
+
|
|
456
|
+
# G2 is a graph of all edges incident to V_1
|
|
457
|
+
G2 = Graph()
|
|
458
|
+
for v in V_1:
|
|
459
|
+
for u in G.neighbors(v):
|
|
460
|
+
G2.add_edge(u, v)
|
|
461
|
+
|
|
462
|
+
V = V_0 | V_1
|
|
463
|
+
# compute a spanning tree
|
|
464
|
+
T = spanning_forest(M)
|
|
465
|
+
for x, y in T:
|
|
466
|
+
if x not in V and y not in V:
|
|
467
|
+
V.add(v)
|
|
468
|
+
|
|
469
|
+
for v in V:
|
|
470
|
+
if G.has_vertex(v): # some vertices are not in G
|
|
471
|
+
H.extend(G.edges_incident(v, False))
|
|
472
|
+
|
|
473
|
+
# T contain all edges in some spanning tree
|
|
474
|
+
T = []
|
|
475
|
+
for x, y in H:
|
|
476
|
+
if x < m:
|
|
477
|
+
t = x
|
|
478
|
+
x = y
|
|
479
|
+
y = t
|
|
480
|
+
T.append((x - m, y))
|
|
481
|
+
return T
|
|
482
|
+
|
|
483
|
+
# Partial fields and lifting
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
def lift_cross_ratios(A, lift_map=None):
|
|
487
|
+
r"""
|
|
488
|
+
Return a matrix which arises from the given matrix by lifting cross ratios.
|
|
489
|
+
|
|
490
|
+
INPUT:
|
|
491
|
+
|
|
492
|
+
- ``A`` -- a matrix over a ring ``source_ring``
|
|
493
|
+
- ``lift_map`` -- a Python dictionary, mapping each cross ratio of ``A`` to
|
|
494
|
+
some element of a target ring, and such that
|
|
495
|
+
``lift_map[source_ring(1)] = target_ring(1)``
|
|
496
|
+
|
|
497
|
+
OUTPUT: ``Z`` -- a matrix over the ring ``target_ring``
|
|
498
|
+
|
|
499
|
+
The intended use of this method is to create a (reduced) matrix representation of a
|
|
500
|
+
matroid ``M`` over a ring ``target_ring``, given a (reduced) matrix representation of
|
|
501
|
+
``A`` of ``M`` over a ring ``source_ring`` and a map ``lift_map`` from ``source_ring``
|
|
502
|
+
to ``target_ring``.
|
|
503
|
+
|
|
504
|
+
This method will create a unique candidate representation ``Z``, but will not verify
|
|
505
|
+
if ``Z`` is indeed a representation of ``M``. However, this is guaranteed if the
|
|
506
|
+
conditions of the lift theorem (see [PvZ2010]_) hold for the lift map in combination with
|
|
507
|
+
the matrix ``A``.
|
|
508
|
+
|
|
509
|
+
For a lift map `f` and a matrix `A` these conditions are as follows. First of all
|
|
510
|
+
`f: S \rightarrow T`, where `S` is a set of invertible elements of the source ring and
|
|
511
|
+
`T` is a set of invertible elements of the target ring. The matrix `A` has entries
|
|
512
|
+
from the source ring, and each cross ratio of `A` is contained in `S`. Moreover:
|
|
513
|
+
|
|
514
|
+
- `1 \in S`, `1 \in T`;
|
|
515
|
+
- for all `x \in S`: `f(x) = 1` if and only if `x = 1`;
|
|
516
|
+
- for all `x, y \in S`: if `x + y = 0` then `f(x) + f(y) = 0`;
|
|
517
|
+
- for all `x, y \in S`: if `x + y = 1` then `f(x) + f(y) = 1`;
|
|
518
|
+
- for all `x, y, z \in S`: if `xy = z` then `f(x)f(y) = f(z)`.
|
|
519
|
+
|
|
520
|
+
Any ring homomorphism `h: P \rightarrow R` induces a lift map from the set of units `S` of
|
|
521
|
+
`P` to the set of units `T` of `R`. There exist lift maps which do not arise in
|
|
522
|
+
this manner. Several such maps can be created by the function
|
|
523
|
+
:meth:`lift_map() <sage.matroids.utilities.lift_map>`.
|
|
524
|
+
|
|
525
|
+
.. SEEALSO::
|
|
526
|
+
|
|
527
|
+
:meth:`lift_map() <sage.matroids.utilities.lift_map>`
|
|
528
|
+
|
|
529
|
+
EXAMPLES::
|
|
530
|
+
|
|
531
|
+
sage: # needs sage.graphs
|
|
532
|
+
sage: from sage.matroids.advanced import lift_cross_ratios, lift_map, LinearMatroid
|
|
533
|
+
sage: R = GF(7)
|
|
534
|
+
sage: to_sixth_root_of_unity = lift_map('sru') # needs sage.rings.number_field
|
|
535
|
+
sage: A = Matrix(R, [[1, 0, 6, 1, 2],[6, 1, 0, 0, 1],[0, 6, 3, 6, 0]])
|
|
536
|
+
sage: A
|
|
537
|
+
[1 0 6 1 2]
|
|
538
|
+
[6 1 0 0 1]
|
|
539
|
+
[0 6 3 6 0]
|
|
540
|
+
sage: Z = lift_cross_ratios(A, to_sixth_root_of_unity) # needs sage.rings.finite_rings sage.rings.number_field
|
|
541
|
+
sage: Z # needs sage.rings.finite_rings sage.rings.number_field
|
|
542
|
+
[ 1 0 1 1 1]
|
|
543
|
+
[-z + 1 1 0 0 1]
|
|
544
|
+
[ 0 -1 1 -z + 1 0]
|
|
545
|
+
sage: M = LinearMatroid(reduced_matrix=A)
|
|
546
|
+
sage: sorted(M.cross_ratios())
|
|
547
|
+
[3, 5]
|
|
548
|
+
sage: N = LinearMatroid(reduced_matrix=Z) # needs sage.rings.finite_rings sage.rings.number_field
|
|
549
|
+
sage: sorted(N.cross_ratios()) # needs sage.rings.finite_rings sage.rings.number_field
|
|
550
|
+
[-z + 1, z]
|
|
551
|
+
sage: M.is_isomorphism(N, {e:e for e in M.groundset()}) # needs sage.rings.finite_rings sage.rings.number_field
|
|
552
|
+
True
|
|
553
|
+
"""
|
|
554
|
+
from sage.graphs.graph import Graph
|
|
555
|
+
|
|
556
|
+
for s, t in lift_map.items():
|
|
557
|
+
source_ring = s.parent()
|
|
558
|
+
target_ring = t.parent()
|
|
559
|
+
break
|
|
560
|
+
plus_one1 = source_ring(1)
|
|
561
|
+
minus_one1 = source_ring(-1)
|
|
562
|
+
plus_one2 = target_ring(1)
|
|
563
|
+
minus_one2 = target_ring(-1)
|
|
564
|
+
|
|
565
|
+
G = Graph([((r, 0), (c, 1), (r, c)) for r, c in A.nonzero_positions()])
|
|
566
|
+
# write the entries of (a scaled version of) A as products of cross ratios of A
|
|
567
|
+
T = Graph()
|
|
568
|
+
for C in G.connected_components_subgraphs():
|
|
569
|
+
T.add_edges(C.min_spanning_tree())
|
|
570
|
+
# - fix a tree of the support graph G to units (= empty dict, product of 0 terms)
|
|
571
|
+
F = {entry: dict() for entry in T.edge_labels()}
|
|
572
|
+
W = set(G.edge_iterator()) - set(T.edge_iterator())
|
|
573
|
+
H = G.subgraph(edges=T.edge_iterator())
|
|
574
|
+
while W:
|
|
575
|
+
# - find an edge in W to process, closing a circuit in H which is induced in G
|
|
576
|
+
edge = W.pop()
|
|
577
|
+
path = H.shortest_path(edge[0], edge[1])
|
|
578
|
+
path_s = set(path)
|
|
579
|
+
retry = True
|
|
580
|
+
while retry:
|
|
581
|
+
retry = False
|
|
582
|
+
for edge2 in W:
|
|
583
|
+
if edge2[0] in path_s and edge2[1] in path_s:
|
|
584
|
+
W.add(edge)
|
|
585
|
+
edge = edge2
|
|
586
|
+
W.remove(edge)
|
|
587
|
+
path = H.shortest_path(edge[0], edge[1])
|
|
588
|
+
path_s = set(path)
|
|
589
|
+
retry = True
|
|
590
|
+
break
|
|
591
|
+
entry = edge[2]
|
|
592
|
+
entries = []
|
|
593
|
+
for i in range(len(path) - 1):
|
|
594
|
+
v = path[i]
|
|
595
|
+
w = path[i + 1]
|
|
596
|
+
if v[1] == 0:
|
|
597
|
+
entries.append((v[0], w[0]))
|
|
598
|
+
else:
|
|
599
|
+
entries.append((w[0], v[0]))
|
|
600
|
+
# - compute the cross ratio `cr` of this whirl
|
|
601
|
+
cr = source_ring(A[entry])
|
|
602
|
+
div = True
|
|
603
|
+
for entry2 in entries:
|
|
604
|
+
if div:
|
|
605
|
+
cr /= A[entry2]
|
|
606
|
+
else:
|
|
607
|
+
cr *= A[entry2]
|
|
608
|
+
div = not div
|
|
609
|
+
|
|
610
|
+
monomial = {}
|
|
611
|
+
if len(path) % 4 == 0:
|
|
612
|
+
if not cr == plus_one1:
|
|
613
|
+
monomial[cr] = 1
|
|
614
|
+
else:
|
|
615
|
+
cr = -cr
|
|
616
|
+
if cr != plus_one1:
|
|
617
|
+
monomial[cr] = 1
|
|
618
|
+
if minus_one1 in monomial:
|
|
619
|
+
monomial[minus_one1] = monomial[minus_one1] + 1
|
|
620
|
+
else:
|
|
621
|
+
monomial[minus_one1] = 1
|
|
622
|
+
|
|
623
|
+
if cr != plus_one1 and cr not in lift_map:
|
|
624
|
+
raise ValueError("Input matrix has a cross ratio " + str(cr) + ", which is not in the lift_map")
|
|
625
|
+
# - write the entry as a product of cross ratios of A
|
|
626
|
+
div = True
|
|
627
|
+
for entry2 in entries:
|
|
628
|
+
if div:
|
|
629
|
+
for cr, degree in F[entry2].items():
|
|
630
|
+
if cr in monomial:
|
|
631
|
+
monomial[cr] = monomial[cr] + degree
|
|
632
|
+
else:
|
|
633
|
+
monomial[cr] = degree
|
|
634
|
+
else:
|
|
635
|
+
for cr, degree in F[entry2].items():
|
|
636
|
+
if cr in monomial:
|
|
637
|
+
monomial[cr] = monomial[cr] - degree
|
|
638
|
+
else:
|
|
639
|
+
monomial[cr] = -degree
|
|
640
|
+
div = not div
|
|
641
|
+
F[entry] = monomial
|
|
642
|
+
# - current edge is done, can be used in next iteration
|
|
643
|
+
H.add_edge(edge)
|
|
644
|
+
|
|
645
|
+
# compute each entry of Z as the product of lifted cross ratios
|
|
646
|
+
Z = Matrix(target_ring, A.nrows(), A.ncols())
|
|
647
|
+
for entry, monomial in F.items():
|
|
648
|
+
Z[entry] = plus_one2
|
|
649
|
+
for cr, degree in monomial.items():
|
|
650
|
+
if cr == minus_one1:
|
|
651
|
+
Z[entry] = Z[entry] * (minus_one2**degree)
|
|
652
|
+
else:
|
|
653
|
+
Z[entry] = Z[entry] * (lift_map[cr]**degree)
|
|
654
|
+
|
|
655
|
+
return Z
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
def lift_map(target):
|
|
659
|
+
r"""
|
|
660
|
+
Create a lift map, to be used for lifting the cross ratios of a matroid
|
|
661
|
+
representation.
|
|
662
|
+
|
|
663
|
+
.. SEEALSO::
|
|
664
|
+
|
|
665
|
+
:meth:`lift_cross_ratios() <sage.matroids.utilities.lift_cross_ratios>`
|
|
666
|
+
|
|
667
|
+
INPUT:
|
|
668
|
+
|
|
669
|
+
- ``target`` -- string describing the target (partial) field
|
|
670
|
+
|
|
671
|
+
OUTPUT: dictionary
|
|
672
|
+
|
|
673
|
+
Depending on the value of ``target``, the following lift maps will be created:
|
|
674
|
+
|
|
675
|
+
- "reg": a lift map from `\GF3` to the regular partial field `(\ZZ, <-1>)`.
|
|
676
|
+
|
|
677
|
+
- "sru": a lift map from `\GF7` to the
|
|
678
|
+
sixth-root-of-unity partial field `(\QQ(z), <z>)`, where `z` is a sixth root
|
|
679
|
+
of unity. The map sends 3 to `z`.
|
|
680
|
+
|
|
681
|
+
- "dyadic": a lift map from `\GF{11}` to the dyadic partial field `(\QQ, <-1, 2>)`.
|
|
682
|
+
|
|
683
|
+
- "gm": a lift map from `\GF{19}` to the golden mean partial field
|
|
684
|
+
`(\QQ(t), <-1,t>)`, where `t` is a root of `t^2-t-1`. The map sends `5` to `t`.
|
|
685
|
+
|
|
686
|
+
The example below shows that the latter map satisfies three necessary conditions stated in
|
|
687
|
+
:meth:`lift_cross_ratios() <sage.matroids.utilities.lift_cross_ratios>`
|
|
688
|
+
|
|
689
|
+
EXAMPLES::
|
|
690
|
+
|
|
691
|
+
sage: from sage.matroids.utilities import lift_map
|
|
692
|
+
sage: lm = lift_map('gm') # needs sage.rings.finite_rings sage.rings.number_field
|
|
693
|
+
sage: for x in lm: # needs sage.rings.finite_rings sage.rings.number_field
|
|
694
|
+
....: if (x == 1) is not (lm[x] == 1):
|
|
695
|
+
....: print('not a proper lift map')
|
|
696
|
+
....: for y in lm:
|
|
697
|
+
....: if (x+y == 0) and not (lm[x]+lm[y] == 0):
|
|
698
|
+
....: print('not a proper lift map')
|
|
699
|
+
....: if (x+y == 1) and not (lm[x]+lm[y] == 1):
|
|
700
|
+
....: print('not a proper lift map')
|
|
701
|
+
....: for z in lm:
|
|
702
|
+
....: if (x*y==z) and not (lm[x]*lm[y]==lm[z]):
|
|
703
|
+
....: print('not a proper lift map')
|
|
704
|
+
"""
|
|
705
|
+
from sage.rings.finite_rings.finite_field_constructor import GF
|
|
706
|
+
|
|
707
|
+
if target == "reg":
|
|
708
|
+
R = GF(3)
|
|
709
|
+
return {R(1): ZZ(1)}
|
|
710
|
+
|
|
711
|
+
if target == "sru":
|
|
712
|
+
from sage.rings.number_field.number_field import NumberField
|
|
713
|
+
|
|
714
|
+
R = GF(7)
|
|
715
|
+
z = ZZ['z'].gen()
|
|
716
|
+
S = NumberField(z * z - z + 1, 'z')
|
|
717
|
+
z = S(z)
|
|
718
|
+
return {R.one(): S.one(), R(3): z, R(3)**(-1): z**5}
|
|
719
|
+
|
|
720
|
+
if target == "dyadic":
|
|
721
|
+
R = GF(11)
|
|
722
|
+
return {R(1): QQ(1), R(-1): QQ(-1), R(2): QQ(2), R(6): QQ((1, 2))}
|
|
723
|
+
|
|
724
|
+
if target == "gm":
|
|
725
|
+
from sage.rings.number_field.number_field import NumberField
|
|
726
|
+
|
|
727
|
+
R = GF(19)
|
|
728
|
+
t = QQ['t'].gen()
|
|
729
|
+
G = NumberField(t * t - t - 1, 't')
|
|
730
|
+
return {R(1): G(1), R(5): G(t),
|
|
731
|
+
R(1) / R(5): G(1) / G(t), R(-5): G(-t),
|
|
732
|
+
R(-5)**(-1): G(-t)**(-1), R(5)**2: G(t)**2,
|
|
733
|
+
R(5)**(-2): G(t)**(-2)}
|
|
734
|
+
|
|
735
|
+
raise NotImplementedError(target)
|
|
736
|
+
|
|
737
|
+
|
|
738
|
+
def split_vertex(G, u, v=None, edges=None):
|
|
739
|
+
"""
|
|
740
|
+
Split a vertex in a graph.
|
|
741
|
+
|
|
742
|
+
If an edge is inserted between the vertices after splitting, this
|
|
743
|
+
corresponds to a graphic coextension of a matroid.
|
|
744
|
+
|
|
745
|
+
INPUT:
|
|
746
|
+
|
|
747
|
+
- ``G`` -- a SageMath :class:`Graph`
|
|
748
|
+
- ``u`` -- a vertex in ``G``
|
|
749
|
+
- ``v`` -- (optional) the name of the new vertex after the splitting. If
|
|
750
|
+
``v`` is specified and already in the graph, it must be an isolated vertex.
|
|
751
|
+
- ``edges`` -- (optional) iterable container of edges on ``u`` that
|
|
752
|
+
move to ``v`` after the splitting. If ``None``, ``v`` will be an isolated
|
|
753
|
+
vertex. The edge labels must be specified.
|
|
754
|
+
|
|
755
|
+
EXAMPLES::
|
|
756
|
+
|
|
757
|
+
sage: # needs sage.graphs
|
|
758
|
+
sage: from sage.matroids.utilities import split_vertex
|
|
759
|
+
sage: G = graphs.BullGraph()
|
|
760
|
+
sage: split_vertex(G, u=1, v=55, edges=[(1, 3)])
|
|
761
|
+
Traceback (most recent call last):
|
|
762
|
+
...
|
|
763
|
+
ValueError: the edges are not all incident with u
|
|
764
|
+
sage: split_vertex(G, u=1, v=55, edges=[(1, 3, None)])
|
|
765
|
+
sage: list(G.edges(sort=True))
|
|
766
|
+
[(0, 1, None), (0, 2, None), (1, 2, None), (2, 4, None), (3, 55, None)]
|
|
767
|
+
"""
|
|
768
|
+
if v is None:
|
|
769
|
+
v = G.add_vertex()
|
|
770
|
+
elif v not in G:
|
|
771
|
+
G.add_vertex(v)
|
|
772
|
+
elif G.degree(v):
|
|
773
|
+
raise ValueError("v must be a new vertex or an isolated vertex")
|
|
774
|
+
if edges is None:
|
|
775
|
+
edges = []
|
|
776
|
+
|
|
777
|
+
edges_on_u = G.edges_incident(u)
|
|
778
|
+
|
|
779
|
+
for e in edges:
|
|
780
|
+
if e not in edges_on_u:
|
|
781
|
+
# if e is a loop, put it on u and v
|
|
782
|
+
# otherwise raise an error
|
|
783
|
+
if e[0] == e[1]:
|
|
784
|
+
G.add_edge(u, v, e[2])
|
|
785
|
+
G.delete_edge(e)
|
|
786
|
+
else:
|
|
787
|
+
raise ValueError("the edges are not all incident with u")
|
|
788
|
+
|
|
789
|
+
elif e[0] == u:
|
|
790
|
+
G.add_edge(v, e[1], e[2])
|
|
791
|
+
elif e[1] == u:
|
|
792
|
+
G.add_edge(e[0], v, e[2])
|
|
793
|
+
G.delete_edge(e)
|
|
794
|
+
|
|
795
|
+
# This modifies the graph without needing to return anything
|
|
796
|
+
|
|
797
|
+
|
|
798
|
+
def cmp_elements_key(x):
|
|
799
|
+
"""
|
|
800
|
+
A helper function to compare elements which may be integers or strings.
|
|
801
|
+
|
|
802
|
+
EXAMPLES::
|
|
803
|
+
|
|
804
|
+
sage: from sage.matroids.utilities import cmp_elements_key
|
|
805
|
+
sage: l = ['a', 'b', 1, 3, 2, 10, 111, 100, 'c', 'aa']
|
|
806
|
+
sage: sorted(l, key=cmp_elements_key)
|
|
807
|
+
[1, 2, 3, 10, 100, 111, 'a', 'aa', 'b', 'c']
|
|
808
|
+
"""
|
|
809
|
+
return (isinstance(x, str), x)
|