passagemath-modules 10.6.31rc3__cp314-cp314-musllinux_1_2_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of passagemath-modules might be problematic. Click here for more details.
- passagemath_modules-10.6.31rc3.dist-info/METADATA +281 -0
- passagemath_modules-10.6.31rc3.dist-info/RECORD +807 -0
- passagemath_modules-10.6.31rc3.dist-info/WHEEL +5 -0
- passagemath_modules-10.6.31rc3.dist-info/top_level.txt +2 -0
- passagemath_modules.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_modules.libs/libgfortran-67378ab2.so.5.0.0 +0 -0
- passagemath_modules.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_modules.libs/libgsl-23768756.so.28.0.0 +0 -0
- passagemath_modules.libs/libmpc-7897025b.so.3.3.1 +0 -0
- passagemath_modules.libs/libmpfr-e34bb864.so.6.2.1 +0 -0
- passagemath_modules.libs/libopenblasp-r0-503f0c35.3.29.so +0 -0
- sage/algebras/all__sagemath_modules.py +20 -0
- sage/algebras/catalog.py +148 -0
- sage/algebras/clifford_algebra.py +3107 -0
- sage/algebras/clifford_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/clifford_algebra_element.pxd +16 -0
- sage/algebras/clifford_algebra_element.pyx +997 -0
- sage/algebras/commutative_dga.py +4252 -0
- sage/algebras/exterior_algebra_groebner.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/exterior_algebra_groebner.pxd +55 -0
- sage/algebras/exterior_algebra_groebner.pyx +727 -0
- sage/algebras/finite_dimensional_algebras/all.py +2 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra.py +1029 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pxd +12 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_element.pyx +706 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_ideal.py +196 -0
- sage/algebras/finite_dimensional_algebras/finite_dimensional_algebra_morphism.py +255 -0
- sage/algebras/finite_gca.py +528 -0
- sage/algebras/group_algebra.py +232 -0
- sage/algebras/lie_algebras/abelian.py +197 -0
- sage/algebras/lie_algebras/affine_lie_algebra.py +1213 -0
- sage/algebras/lie_algebras/all.py +25 -0
- sage/algebras/lie_algebras/all__sagemath_modules.py +1 -0
- sage/algebras/lie_algebras/bch.py +177 -0
- sage/algebras/lie_algebras/bgg_dual_module.py +1184 -0
- sage/algebras/lie_algebras/bgg_resolution.py +232 -0
- sage/algebras/lie_algebras/center_uea.py +767 -0
- sage/algebras/lie_algebras/classical_lie_algebra.py +2516 -0
- sage/algebras/lie_algebras/examples.py +683 -0
- sage/algebras/lie_algebras/free_lie_algebra.py +973 -0
- sage/algebras/lie_algebras/heisenberg.py +820 -0
- sage/algebras/lie_algebras/lie_algebra.py +1562 -0
- sage/algebras/lie_algebras/lie_algebra_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/lie_algebras/lie_algebra_element.pxd +68 -0
- sage/algebras/lie_algebras/lie_algebra_element.pyx +2122 -0
- sage/algebras/lie_algebras/morphism.py +661 -0
- sage/algebras/lie_algebras/nilpotent_lie_algebra.py +457 -0
- sage/algebras/lie_algebras/onsager.py +1324 -0
- sage/algebras/lie_algebras/poincare_birkhoff_witt.py +816 -0
- sage/algebras/lie_algebras/quotient.py +462 -0
- sage/algebras/lie_algebras/rank_two_heisenberg_virasoro.py +355 -0
- sage/algebras/lie_algebras/representation.py +1040 -0
- sage/algebras/lie_algebras/structure_coefficients.py +459 -0
- sage/algebras/lie_algebras/subalgebra.py +967 -0
- sage/algebras/lie_algebras/symplectic_derivation.py +289 -0
- sage/algebras/lie_algebras/verma_module.py +1630 -0
- sage/algebras/lie_algebras/virasoro.py +1186 -0
- sage/algebras/octonion_algebra.cpython-314-aarch64-linux-musl.so +0 -0
- sage/algebras/octonion_algebra.pxd +20 -0
- sage/algebras/octonion_algebra.pyx +987 -0
- sage/algebras/orlik_solomon.py +907 -0
- sage/algebras/orlik_terao.py +779 -0
- sage/algebras/steenrod/all.py +7 -0
- sage/algebras/steenrod/steenrod_algebra.py +4258 -0
- sage/algebras/steenrod/steenrod_algebra_bases.py +1179 -0
- sage/algebras/steenrod/steenrod_algebra_misc.py +1167 -0
- sage/algebras/steenrod/steenrod_algebra_mult.py +954 -0
- sage/algebras/weyl_algebra.py +1126 -0
- sage/all__sagemath_modules.py +62 -0
- sage/calculus/all__sagemath_modules.py +19 -0
- sage/calculus/expr.py +205 -0
- sage/calculus/integration.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/integration.pyx +698 -0
- sage/calculus/interpolation.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolation.pxd +13 -0
- sage/calculus/interpolation.pyx +387 -0
- sage/calculus/interpolators.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/interpolators.pyx +326 -0
- sage/calculus/ode.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/ode.pxd +5 -0
- sage/calculus/ode.pyx +610 -0
- sage/calculus/riemann.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/riemann.pyx +1521 -0
- sage/calculus/test_sympy.py +201 -0
- sage/calculus/transforms/all.py +7 -0
- sage/calculus/transforms/dft.py +844 -0
- sage/calculus/transforms/dwt.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/transforms/dwt.pxd +7 -0
- sage/calculus/transforms/dwt.pyx +160 -0
- sage/calculus/transforms/fft.cpython-314-aarch64-linux-musl.so +0 -0
- sage/calculus/transforms/fft.pxd +12 -0
- sage/calculus/transforms/fft.pyx +487 -0
- sage/calculus/wester.py +662 -0
- sage/coding/abstract_code.py +1108 -0
- sage/coding/ag_code.py +868 -0
- sage/coding/ag_code_decoders.cpython-314-aarch64-linux-musl.so +0 -0
- sage/coding/ag_code_decoders.pyx +2639 -0
- sage/coding/all.py +15 -0
- sage/coding/bch_code.py +494 -0
- sage/coding/binary_code.cpython-314-aarch64-linux-musl.so +0 -0
- sage/coding/binary_code.pxd +124 -0
- sage/coding/binary_code.pyx +4139 -0
- sage/coding/bounds_catalog.py +43 -0
- sage/coding/channel.py +819 -0
- sage/coding/channels_catalog.py +29 -0
- sage/coding/code_bounds.py +755 -0
- sage/coding/code_constructions.py +804 -0
- sage/coding/codes_catalog.py +111 -0
- sage/coding/cyclic_code.py +1329 -0
- sage/coding/databases.py +316 -0
- sage/coding/decoder.py +373 -0
- sage/coding/decoders_catalog.py +88 -0
- sage/coding/delsarte_bounds.py +709 -0
- sage/coding/encoder.py +390 -0
- sage/coding/encoders_catalog.py +64 -0
- sage/coding/extended_code.py +468 -0
- sage/coding/gabidulin_code.py +1058 -0
- sage/coding/golay_code.py +404 -0
- sage/coding/goppa_code.py +441 -0
- sage/coding/grs_code.py +2371 -0
- sage/coding/guava.py +107 -0
- sage/coding/guruswami_sudan/all.py +1 -0
- sage/coding/guruswami_sudan/gs_decoder.py +897 -0
- sage/coding/guruswami_sudan/interpolation.py +409 -0
- sage/coding/guruswami_sudan/utils.py +176 -0
- sage/coding/hamming_code.py +176 -0
- sage/coding/information_set_decoder.py +1032 -0
- sage/coding/kasami_codes.cpython-314-aarch64-linux-musl.so +0 -0
- sage/coding/kasami_codes.pyx +351 -0
- sage/coding/linear_code.py +3067 -0
- sage/coding/linear_code_no_metric.py +1354 -0
- sage/coding/linear_rank_metric.py +961 -0
- sage/coding/parity_check_code.py +353 -0
- sage/coding/punctured_code.py +719 -0
- sage/coding/reed_muller_code.py +999 -0
- sage/coding/self_dual_codes.py +942 -0
- sage/coding/source_coding/all.py +2 -0
- sage/coding/source_coding/huffman.py +553 -0
- sage/coding/subfield_subcode.py +423 -0
- sage/coding/two_weight_db.py +399 -0
- sage/combinat/all__sagemath_modules.py +7 -0
- sage/combinat/cartesian_product.py +347 -0
- sage/combinat/family.py +11 -0
- sage/combinat/free_module.py +1977 -0
- sage/combinat/root_system/all.py +147 -0
- sage/combinat/root_system/ambient_space.py +527 -0
- sage/combinat/root_system/associahedron.py +471 -0
- sage/combinat/root_system/braid_move_calculator.py +143 -0
- sage/combinat/root_system/braid_orbit.cpython-314-aarch64-linux-musl.so +0 -0
- sage/combinat/root_system/braid_orbit.pyx +144 -0
- sage/combinat/root_system/branching_rules.py +2301 -0
- sage/combinat/root_system/cartan_matrix.py +1245 -0
- sage/combinat/root_system/cartan_type.py +3069 -0
- sage/combinat/root_system/coxeter_group.py +162 -0
- sage/combinat/root_system/coxeter_matrix.py +1261 -0
- sage/combinat/root_system/coxeter_type.py +681 -0
- sage/combinat/root_system/dynkin_diagram.py +900 -0
- sage/combinat/root_system/extended_affine_weyl_group.py +2993 -0
- sage/combinat/root_system/fundamental_group.py +795 -0
- sage/combinat/root_system/hecke_algebra_representation.py +1203 -0
- sage/combinat/root_system/integrable_representations.py +1227 -0
- sage/combinat/root_system/non_symmetric_macdonald_polynomials.py +1965 -0
- sage/combinat/root_system/pieri_factors.py +1147 -0
- sage/combinat/root_system/plot.py +1615 -0
- sage/combinat/root_system/root_lattice_realization_algebras.py +1214 -0
- sage/combinat/root_system/root_lattice_realizations.py +4628 -0
- sage/combinat/root_system/root_space.py +487 -0
- sage/combinat/root_system/root_system.py +882 -0
- sage/combinat/root_system/type_A.py +348 -0
- sage/combinat/root_system/type_A_affine.py +227 -0
- sage/combinat/root_system/type_A_infinity.py +241 -0
- sage/combinat/root_system/type_B.py +347 -0
- sage/combinat/root_system/type_BC_affine.py +287 -0
- sage/combinat/root_system/type_B_affine.py +216 -0
- sage/combinat/root_system/type_C.py +317 -0
- sage/combinat/root_system/type_C_affine.py +188 -0
- sage/combinat/root_system/type_D.py +357 -0
- sage/combinat/root_system/type_D_affine.py +208 -0
- sage/combinat/root_system/type_E.py +641 -0
- sage/combinat/root_system/type_E_affine.py +231 -0
- sage/combinat/root_system/type_F.py +387 -0
- sage/combinat/root_system/type_F_affine.py +137 -0
- sage/combinat/root_system/type_G.py +293 -0
- sage/combinat/root_system/type_G_affine.py +132 -0
- sage/combinat/root_system/type_H.py +105 -0
- sage/combinat/root_system/type_I.py +110 -0
- sage/combinat/root_system/type_Q.py +150 -0
- sage/combinat/root_system/type_affine.py +509 -0
- sage/combinat/root_system/type_dual.py +704 -0
- sage/combinat/root_system/type_folded.py +301 -0
- sage/combinat/root_system/type_marked.py +748 -0
- sage/combinat/root_system/type_reducible.py +601 -0
- sage/combinat/root_system/type_relabel.py +730 -0
- sage/combinat/root_system/type_super_A.py +837 -0
- sage/combinat/root_system/weight_lattice_realizations.py +1188 -0
- sage/combinat/root_system/weight_space.py +639 -0
- sage/combinat/root_system/weyl_characters.py +2238 -0
- sage/crypto/__init__.py +4 -0
- sage/crypto/all.py +28 -0
- sage/crypto/block_cipher/all.py +7 -0
- sage/crypto/block_cipher/des.py +1065 -0
- sage/crypto/block_cipher/miniaes.py +2171 -0
- sage/crypto/block_cipher/present.py +909 -0
- sage/crypto/block_cipher/sdes.py +1527 -0
- sage/crypto/boolean_function.cpython-314-aarch64-linux-musl.so +0 -0
- sage/crypto/boolean_function.pxd +10 -0
- sage/crypto/boolean_function.pyx +1487 -0
- sage/crypto/cipher.py +78 -0
- sage/crypto/classical.py +3668 -0
- sage/crypto/classical_cipher.py +569 -0
- sage/crypto/cryptosystem.py +387 -0
- sage/crypto/key_exchange/all.py +7 -0
- sage/crypto/key_exchange/catalog.py +24 -0
- sage/crypto/key_exchange/diffie_hellman.py +323 -0
- sage/crypto/key_exchange/key_exchange_scheme.py +107 -0
- sage/crypto/lattice.py +312 -0
- sage/crypto/lfsr.py +295 -0
- sage/crypto/lwe.py +840 -0
- sage/crypto/mq/__init__.py +4 -0
- sage/crypto/mq/mpolynomialsystemgenerator.py +204 -0
- sage/crypto/mq/rijndael_gf.py +2345 -0
- sage/crypto/mq/sbox.py +7 -0
- sage/crypto/mq/sr.py +3344 -0
- sage/crypto/public_key/all.py +5 -0
- sage/crypto/public_key/blum_goldwasser.py +776 -0
- sage/crypto/sbox.cpython-314-aarch64-linux-musl.so +0 -0
- sage/crypto/sbox.pyx +2090 -0
- sage/crypto/sboxes.py +2090 -0
- sage/crypto/stream.py +390 -0
- sage/crypto/stream_cipher.py +297 -0
- sage/crypto/util.py +519 -0
- sage/ext/all__sagemath_modules.py +1 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_modules.py +2 -0
- sage/ext/interpreters/wrapper_cc.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cc.pxd +30 -0
- sage/ext/interpreters/wrapper_cc.pyx +252 -0
- sage/ext/interpreters/wrapper_cdf.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_cdf.pxd +26 -0
- sage/ext/interpreters/wrapper_cdf.pyx +245 -0
- sage/ext/interpreters/wrapper_rdf.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rdf.pxd +23 -0
- sage/ext/interpreters/wrapper_rdf.pyx +221 -0
- sage/ext/interpreters/wrapper_rr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_rr.pxd +28 -0
- sage/ext/interpreters/wrapper_rr.pyx +335 -0
- sage/geometry/all__sagemath_modules.py +5 -0
- sage/geometry/toric_lattice.py +1745 -0
- sage/geometry/toric_lattice_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/geometry/toric_lattice_element.pyx +432 -0
- sage/groups/abelian_gps/abelian_group.py +1925 -0
- sage/groups/abelian_gps/abelian_group_element.py +164 -0
- sage/groups/abelian_gps/all__sagemath_modules.py +5 -0
- sage/groups/abelian_gps/dual_abelian_group.py +421 -0
- sage/groups/abelian_gps/dual_abelian_group_element.py +179 -0
- sage/groups/abelian_gps/element_base.py +341 -0
- sage/groups/abelian_gps/values.py +488 -0
- sage/groups/additive_abelian/additive_abelian_group.py +476 -0
- sage/groups/additive_abelian/additive_abelian_wrapper.py +857 -0
- sage/groups/additive_abelian/all.py +4 -0
- sage/groups/additive_abelian/qmodnz.py +231 -0
- sage/groups/additive_abelian/qmodnz_element.py +349 -0
- sage/groups/affine_gps/affine_group.py +535 -0
- sage/groups/affine_gps/all.py +1 -0
- sage/groups/affine_gps/catalog.py +17 -0
- sage/groups/affine_gps/euclidean_group.py +246 -0
- sage/groups/affine_gps/group_element.py +562 -0
- sage/groups/all__sagemath_modules.py +12 -0
- sage/groups/galois_group.py +479 -0
- sage/groups/matrix_gps/all.py +4 -0
- sage/groups/matrix_gps/all__sagemath_modules.py +13 -0
- sage/groups/matrix_gps/catalog.py +26 -0
- sage/groups/matrix_gps/coxeter_group.py +927 -0
- sage/groups/matrix_gps/finitely_generated.py +487 -0
- sage/groups/matrix_gps/group_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/groups/matrix_gps/group_element.pxd +11 -0
- sage/groups/matrix_gps/group_element.pyx +431 -0
- sage/groups/matrix_gps/linear.py +440 -0
- sage/groups/matrix_gps/matrix_group.py +617 -0
- sage/groups/matrix_gps/named_group.py +296 -0
- sage/groups/matrix_gps/orthogonal.py +544 -0
- sage/groups/matrix_gps/symplectic.py +251 -0
- sage/groups/matrix_gps/unitary.py +436 -0
- sage/groups/misc_gps/all__sagemath_modules.py +1 -0
- sage/groups/misc_gps/argument_groups.py +1905 -0
- sage/groups/misc_gps/imaginary_groups.py +479 -0
- sage/groups/perm_gps/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_modules.py +1 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.cpython-314-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pxd +41 -0
- sage/groups/perm_gps/partn_ref/refinement_binary.pyx +1167 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.cpython-314-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pxd +31 -0
- sage/groups/perm_gps/partn_ref/refinement_matrices.pyx +385 -0
- sage/homology/algebraic_topological_model.py +595 -0
- sage/homology/all.py +2 -0
- sage/homology/all__sagemath_modules.py +8 -0
- sage/homology/chain_complex.py +2148 -0
- sage/homology/chain_complex_homspace.py +165 -0
- sage/homology/chain_complex_morphism.py +629 -0
- sage/homology/chain_homotopy.py +604 -0
- sage/homology/chains.py +653 -0
- sage/homology/free_resolution.py +923 -0
- sage/homology/graded_resolution.py +567 -0
- sage/homology/hochschild_complex.py +756 -0
- sage/homology/homology_group.py +188 -0
- sage/homology/homology_morphism.py +422 -0
- sage/homology/homology_vector_space_with_basis.py +1454 -0
- sage/homology/koszul_complex.py +169 -0
- sage/homology/matrix_utils.py +205 -0
- sage/libs/all__sagemath_modules.py +1 -0
- sage/libs/gsl/__init__.py +1 -0
- sage/libs/gsl/airy.pxd +56 -0
- sage/libs/gsl/all.pxd +66 -0
- sage/libs/gsl/array.cpython-314-aarch64-linux-musl.so +0 -0
- sage/libs/gsl/array.pxd +5 -0
- sage/libs/gsl/array.pyx +102 -0
- sage/libs/gsl/bessel.pxd +208 -0
- sage/libs/gsl/blas.pxd +116 -0
- sage/libs/gsl/blas_types.pxd +34 -0
- sage/libs/gsl/block.pxd +52 -0
- sage/libs/gsl/chebyshev.pxd +37 -0
- sage/libs/gsl/clausen.pxd +12 -0
- sage/libs/gsl/combination.pxd +47 -0
- sage/libs/gsl/complex.pxd +151 -0
- sage/libs/gsl/coulomb.pxd +30 -0
- sage/libs/gsl/coupling.pxd +21 -0
- sage/libs/gsl/dawson.pxd +12 -0
- sage/libs/gsl/debye.pxd +24 -0
- sage/libs/gsl/dilog.pxd +14 -0
- sage/libs/gsl/eigen.pxd +46 -0
- sage/libs/gsl/elementary.pxd +12 -0
- sage/libs/gsl/ellint.pxd +48 -0
- sage/libs/gsl/elljac.pxd +8 -0
- sage/libs/gsl/erf.pxd +32 -0
- sage/libs/gsl/errno.pxd +26 -0
- sage/libs/gsl/exp.pxd +44 -0
- sage/libs/gsl/expint.pxd +44 -0
- sage/libs/gsl/fermi_dirac.pxd +44 -0
- sage/libs/gsl/fft.pxd +121 -0
- sage/libs/gsl/fit.pxd +50 -0
- sage/libs/gsl/gamma.pxd +94 -0
- sage/libs/gsl/gegenbauer.pxd +26 -0
- sage/libs/gsl/histogram.pxd +176 -0
- sage/libs/gsl/hyperg.pxd +52 -0
- sage/libs/gsl/integration.pxd +69 -0
- sage/libs/gsl/interp.pxd +109 -0
- sage/libs/gsl/laguerre.pxd +24 -0
- sage/libs/gsl/lambert.pxd +16 -0
- sage/libs/gsl/legendre.pxd +90 -0
- sage/libs/gsl/linalg.pxd +185 -0
- sage/libs/gsl/log.pxd +26 -0
- sage/libs/gsl/math.pxd +43 -0
- sage/libs/gsl/matrix.pxd +143 -0
- sage/libs/gsl/matrix_complex.pxd +130 -0
- sage/libs/gsl/min.pxd +67 -0
- sage/libs/gsl/monte.pxd +56 -0
- sage/libs/gsl/ntuple.pxd +32 -0
- sage/libs/gsl/odeiv.pxd +70 -0
- sage/libs/gsl/permutation.pxd +78 -0
- sage/libs/gsl/poly.pxd +40 -0
- sage/libs/gsl/pow_int.pxd +12 -0
- sage/libs/gsl/psi.pxd +28 -0
- sage/libs/gsl/qrng.pxd +29 -0
- sage/libs/gsl/random.pxd +257 -0
- sage/libs/gsl/rng.pxd +100 -0
- sage/libs/gsl/roots.pxd +72 -0
- sage/libs/gsl/sort.pxd +36 -0
- sage/libs/gsl/statistics.pxd +59 -0
- sage/libs/gsl/sum.pxd +55 -0
- sage/libs/gsl/synchrotron.pxd +16 -0
- sage/libs/gsl/transport.pxd +24 -0
- sage/libs/gsl/trig.pxd +58 -0
- sage/libs/gsl/types.pxd +137 -0
- sage/libs/gsl/vector.pxd +101 -0
- sage/libs/gsl/vector_complex.pxd +83 -0
- sage/libs/gsl/wavelet.pxd +49 -0
- sage/libs/gsl/zeta.pxd +28 -0
- sage/libs/mpc/__init__.pxd +114 -0
- sage/libs/mpc/types.pxd +28 -0
- sage/libs/mpfr/__init__.pxd +299 -0
- sage/libs/mpfr/types.pxd +26 -0
- sage/libs/mpmath/__init__.py +1 -0
- sage/libs/mpmath/all.py +27 -0
- sage/libs/mpmath/all__sagemath_modules.py +1 -0
- sage/libs/mpmath/utils.cpython-314-aarch64-linux-musl.so +0 -0
- sage/libs/mpmath/utils.pxd +4 -0
- sage/libs/mpmath/utils.pyx +319 -0
- sage/matrix/action.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/action.pxd +26 -0
- sage/matrix/action.pyx +596 -0
- sage/matrix/all.py +9 -0
- sage/matrix/args.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/args.pxd +144 -0
- sage/matrix/args.pyx +1668 -0
- sage/matrix/benchmark.py +1258 -0
- sage/matrix/berlekamp_massey.py +95 -0
- sage/matrix/compute_J_ideal.py +926 -0
- sage/matrix/constructor.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/constructor.pyx +750 -0
- sage/matrix/docs.py +430 -0
- sage/matrix/echelon_matrix.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/echelon_matrix.pyx +155 -0
- sage/matrix/matrix.pxd +2 -0
- sage/matrix/matrix0.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix0.pxd +68 -0
- sage/matrix/matrix0.pyx +6324 -0
- sage/matrix/matrix1.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix1.pxd +8 -0
- sage/matrix/matrix1.pyx +2851 -0
- sage/matrix/matrix2.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix2.pxd +25 -0
- sage/matrix/matrix2.pyx +20181 -0
- sage/matrix/matrix_cdv.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_cdv.pxd +4 -0
- sage/matrix/matrix_cdv.pyx +93 -0
- sage/matrix/matrix_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_complex_double_dense.pxd +5 -0
- sage/matrix/matrix_complex_double_dense.pyx +98 -0
- sage/matrix/matrix_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_dense.pxd +5 -0
- sage/matrix/matrix_dense.pyx +343 -0
- sage/matrix/matrix_domain_dense.pxd +5 -0
- sage/matrix/matrix_domain_sparse.pxd +5 -0
- sage/matrix/matrix_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_double_dense.pxd +7 -0
- sage/matrix/matrix_double_dense.pyx +3906 -0
- sage/matrix/matrix_double_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_double_sparse.pxd +6 -0
- sage/matrix/matrix_double_sparse.pyx +248 -0
- sage/matrix/matrix_generic_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_dense.pxd +7 -0
- sage/matrix/matrix_generic_dense.pyx +354 -0
- sage/matrix/matrix_generic_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_generic_sparse.pxd +7 -0
- sage/matrix/matrix_generic_sparse.pyx +461 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pxd +5 -0
- sage/matrix/matrix_laurent_mpolynomial_dense.pyx +115 -0
- sage/matrix/matrix_misc.py +313 -0
- sage/matrix/matrix_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_dense.pxd +14 -0
- sage/matrix/matrix_numpy_dense.pyx +450 -0
- sage/matrix/matrix_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_numpy_integer_dense.pxd +7 -0
- sage/matrix/matrix_numpy_integer_dense.pyx +59 -0
- sage/matrix/matrix_polynomial_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_polynomial_dense.pxd +5 -0
- sage/matrix/matrix_polynomial_dense.pyx +5341 -0
- sage/matrix/matrix_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_real_double_dense.pxd +7 -0
- sage/matrix/matrix_real_double_dense.pyx +122 -0
- sage/matrix/matrix_space.py +2848 -0
- sage/matrix/matrix_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_sparse.pxd +5 -0
- sage/matrix/matrix_sparse.pyx +1222 -0
- sage/matrix/matrix_window.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/matrix_window.pxd +37 -0
- sage/matrix/matrix_window.pyx +242 -0
- sage/matrix/misc_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/misc_mpfr.pyx +80 -0
- sage/matrix/operation_table.py +1182 -0
- sage/matrix/special.py +3666 -0
- sage/matrix/strassen.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matrix/strassen.pyx +851 -0
- sage/matrix/symplectic_basis.py +541 -0
- sage/matrix/template.pxd +6 -0
- sage/matrix/tests.py +71 -0
- sage/matroids/advanced.py +77 -0
- sage/matroids/all.py +13 -0
- sage/matroids/basis_exchange_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/basis_exchange_matroid.pxd +96 -0
- sage/matroids/basis_exchange_matroid.pyx +2344 -0
- sage/matroids/basis_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/basis_matroid.pxd +45 -0
- sage/matroids/basis_matroid.pyx +1217 -0
- sage/matroids/catalog.py +44 -0
- sage/matroids/chow_ring.py +473 -0
- sage/matroids/chow_ring_ideal.py +849 -0
- sage/matroids/circuit_closures_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/circuit_closures_matroid.pxd +16 -0
- sage/matroids/circuit_closures_matroid.pyx +559 -0
- sage/matroids/circuits_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/circuits_matroid.pxd +38 -0
- sage/matroids/circuits_matroid.pyx +947 -0
- sage/matroids/constructor.py +1086 -0
- sage/matroids/database_collections.py +365 -0
- sage/matroids/database_matroids.py +5338 -0
- sage/matroids/dual_matroid.py +583 -0
- sage/matroids/extension.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/extension.pxd +34 -0
- sage/matroids/extension.pyx +519 -0
- sage/matroids/flats_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/flats_matroid.pxd +28 -0
- sage/matroids/flats_matroid.pyx +715 -0
- sage/matroids/gammoid.py +600 -0
- sage/matroids/graphic_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/graphic_matroid.pxd +39 -0
- sage/matroids/graphic_matroid.pyx +2024 -0
- sage/matroids/lean_matrix.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/lean_matrix.pxd +126 -0
- sage/matroids/lean_matrix.pyx +3667 -0
- sage/matroids/linear_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/linear_matroid.pxd +180 -0
- sage/matroids/linear_matroid.pyx +6649 -0
- sage/matroids/matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/matroid.pxd +243 -0
- sage/matroids/matroid.pyx +8759 -0
- sage/matroids/matroids_catalog.py +190 -0
- sage/matroids/matroids_plot_helpers.py +890 -0
- sage/matroids/minor_matroid.py +480 -0
- sage/matroids/minorfix.h +9 -0
- sage/matroids/named_matroids.py +5 -0
- sage/matroids/rank_matroid.py +268 -0
- sage/matroids/set_system.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/set_system.pxd +38 -0
- sage/matroids/set_system.pyx +800 -0
- sage/matroids/transversal_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/transversal_matroid.pxd +14 -0
- sage/matroids/transversal_matroid.pyx +893 -0
- sage/matroids/union_matroid.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/union_matroid.pxd +20 -0
- sage/matroids/union_matroid.pyx +331 -0
- sage/matroids/unpickling.cpython-314-aarch64-linux-musl.so +0 -0
- sage/matroids/unpickling.pyx +843 -0
- sage/matroids/utilities.py +809 -0
- sage/misc/all__sagemath_modules.py +20 -0
- sage/misc/c3.cpython-314-aarch64-linux-musl.so +0 -0
- sage/misc/c3.pyx +238 -0
- sage/misc/compat.py +87 -0
- sage/misc/element_with_label.py +173 -0
- sage/misc/func_persist.py +79 -0
- sage/misc/pickle_old.cpython-314-aarch64-linux-musl.so +0 -0
- sage/misc/pickle_old.pyx +19 -0
- sage/misc/proof.py +7 -0
- sage/misc/replace_dot_all.py +472 -0
- sage/misc/sagedoc_conf.py +168 -0
- sage/misc/sphinxify.py +167 -0
- sage/misc/test_class_pickling.py +85 -0
- sage/modules/all.py +42 -0
- sage/modules/complex_double_vector.py +25 -0
- sage/modules/diamond_cutting.py +380 -0
- sage/modules/fg_pid/all.py +1 -0
- sage/modules/fg_pid/fgp_element.py +456 -0
- sage/modules/fg_pid/fgp_module.py +2091 -0
- sage/modules/fg_pid/fgp_morphism.py +550 -0
- sage/modules/filtered_vector_space.py +1271 -0
- sage/modules/finite_submodule_iter.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/finite_submodule_iter.pxd +27 -0
- sage/modules/finite_submodule_iter.pyx +452 -0
- sage/modules/fp_graded/all.py +1 -0
- sage/modules/fp_graded/element.py +346 -0
- sage/modules/fp_graded/free_element.py +298 -0
- sage/modules/fp_graded/free_homspace.py +53 -0
- sage/modules/fp_graded/free_module.py +1060 -0
- sage/modules/fp_graded/free_morphism.py +217 -0
- sage/modules/fp_graded/homspace.py +563 -0
- sage/modules/fp_graded/module.py +1340 -0
- sage/modules/fp_graded/morphism.py +1990 -0
- sage/modules/fp_graded/steenrod/all.py +1 -0
- sage/modules/fp_graded/steenrod/homspace.py +65 -0
- sage/modules/fp_graded/steenrod/module.py +477 -0
- sage/modules/fp_graded/steenrod/morphism.py +404 -0
- sage/modules/fp_graded/steenrod/profile.py +241 -0
- sage/modules/free_module.py +8447 -0
- sage/modules/free_module_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/free_module_element.pxd +22 -0
- sage/modules/free_module_element.pyx +5445 -0
- sage/modules/free_module_homspace.py +369 -0
- sage/modules/free_module_integer.py +896 -0
- sage/modules/free_module_morphism.py +823 -0
- sage/modules/free_module_pseudohomspace.py +352 -0
- sage/modules/free_module_pseudomorphism.py +578 -0
- sage/modules/free_quadratic_module.py +1706 -0
- sage/modules/free_quadratic_module_integer_symmetric.py +1790 -0
- sage/modules/matrix_morphism.py +1745 -0
- sage/modules/misc.py +103 -0
- sage/modules/module_functors.py +192 -0
- sage/modules/multi_filtered_vector_space.py +719 -0
- sage/modules/ore_module.py +2208 -0
- sage/modules/ore_module_element.py +178 -0
- sage/modules/ore_module_homspace.py +147 -0
- sage/modules/ore_module_morphism.py +968 -0
- sage/modules/quotient_module.py +699 -0
- sage/modules/real_double_vector.py +22 -0
- sage/modules/submodule.py +255 -0
- sage/modules/tensor_operations.py +567 -0
- sage/modules/torsion_quadratic_module.py +1352 -0
- sage/modules/tutorial_free_modules.py +248 -0
- sage/modules/vector_complex_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_complex_double_dense.pxd +6 -0
- sage/modules/vector_complex_double_dense.pyx +117 -0
- sage/modules/vector_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_double_dense.pxd +6 -0
- sage/modules/vector_double_dense.pyx +604 -0
- sage/modules/vector_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_integer_dense.pxd +15 -0
- sage/modules/vector_integer_dense.pyx +361 -0
- sage/modules/vector_integer_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_integer_sparse.pxd +29 -0
- sage/modules/vector_integer_sparse.pyx +406 -0
- sage/modules/vector_modn_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_modn_dense.pxd +12 -0
- sage/modules/vector_modn_dense.pyx +394 -0
- sage/modules/vector_modn_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_modn_sparse.pxd +21 -0
- sage/modules/vector_modn_sparse.pyx +298 -0
- sage/modules/vector_numpy_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_numpy_dense.pxd +15 -0
- sage/modules/vector_numpy_dense.pyx +304 -0
- sage/modules/vector_numpy_integer_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_numpy_integer_dense.pxd +7 -0
- sage/modules/vector_numpy_integer_dense.pyx +54 -0
- sage/modules/vector_rational_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_rational_dense.pxd +15 -0
- sage/modules/vector_rational_dense.pyx +387 -0
- sage/modules/vector_rational_sparse.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_rational_sparse.pxd +30 -0
- sage/modules/vector_rational_sparse.pyx +413 -0
- sage/modules/vector_real_double_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/vector_real_double_dense.pxd +6 -0
- sage/modules/vector_real_double_dense.pyx +126 -0
- sage/modules/vector_space_homspace.py +430 -0
- sage/modules/vector_space_morphism.py +989 -0
- sage/modules/with_basis/all.py +15 -0
- sage/modules/with_basis/cell_module.py +494 -0
- sage/modules/with_basis/indexed_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/modules/with_basis/indexed_element.pxd +13 -0
- sage/modules/with_basis/indexed_element.pyx +1058 -0
- sage/modules/with_basis/invariant.py +1075 -0
- sage/modules/with_basis/morphism.py +1636 -0
- sage/modules/with_basis/representation.py +2939 -0
- sage/modules/with_basis/subquotient.py +685 -0
- sage/numerical/all__sagemath_modules.py +6 -0
- sage/numerical/gauss_legendre.cpython-314-aarch64-linux-musl.so +0 -0
- sage/numerical/gauss_legendre.pyx +381 -0
- sage/numerical/optimize.py +910 -0
- sage/probability/all.py +10 -0
- sage/probability/probability_distribution.cpython-314-aarch64-linux-musl.so +0 -0
- sage/probability/probability_distribution.pyx +1242 -0
- sage/probability/random_variable.py +411 -0
- sage/quadratic_forms/all.py +4 -0
- sage/quadratic_forms/all__sagemath_modules.py +15 -0
- sage/quadratic_forms/binary_qf.py +2042 -0
- sage/quadratic_forms/bqf_class_group.py +748 -0
- sage/quadratic_forms/constructions.py +93 -0
- sage/quadratic_forms/count_local_2.cpython-314-aarch64-linux-musl.so +0 -0
- sage/quadratic_forms/count_local_2.pyx +365 -0
- sage/quadratic_forms/extras.py +195 -0
- sage/quadratic_forms/quadratic_form.py +1753 -0
- sage/quadratic_forms/quadratic_form__count_local_2.py +221 -0
- sage/quadratic_forms/quadratic_form__equivalence_testing.py +708 -0
- sage/quadratic_forms/quadratic_form__evaluate.cpython-314-aarch64-linux-musl.so +0 -0
- sage/quadratic_forms/quadratic_form__evaluate.pyx +139 -0
- sage/quadratic_forms/quadratic_form__local_density_congruence.py +977 -0
- sage/quadratic_forms/quadratic_form__local_field_invariants.py +1072 -0
- sage/quadratic_forms/quadratic_form__neighbors.py +424 -0
- sage/quadratic_forms/quadratic_form__reduction_theory.py +488 -0
- sage/quadratic_forms/quadratic_form__split_local_covering.py +416 -0
- sage/quadratic_forms/quadratic_form__ternary_Tornaria.py +657 -0
- sage/quadratic_forms/quadratic_form__theta.py +352 -0
- sage/quadratic_forms/quadratic_form__variable_substitutions.py +370 -0
- sage/quadratic_forms/random_quadraticform.py +209 -0
- sage/quadratic_forms/ternary.cpython-314-aarch64-linux-musl.so +0 -0
- sage/quadratic_forms/ternary.pyx +1154 -0
- sage/quadratic_forms/ternary_qf.py +2027 -0
- sage/rings/all__sagemath_modules.py +28 -0
- sage/rings/asymptotic/all__sagemath_modules.py +1 -0
- sage/rings/asymptotic/misc.py +1252 -0
- sage/rings/cc.py +4 -0
- sage/rings/cfinite_sequence.py +1306 -0
- sage/rings/complex_conversion.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_conversion.pxd +8 -0
- sage/rings/complex_conversion.pyx +23 -0
- sage/rings/complex_double.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_double.pxd +21 -0
- sage/rings/complex_double.pyx +2654 -0
- sage/rings/complex_mpc.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_mpc.pxd +21 -0
- sage/rings/complex_mpc.pyx +2576 -0
- sage/rings/complex_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/complex_mpfr.pxd +18 -0
- sage/rings/complex_mpfr.pyx +3602 -0
- sage/rings/derivation.py +2334 -0
- sage/rings/finite_rings/all__sagemath_modules.py +1 -0
- sage/rings/finite_rings/maps_finite_field.py +191 -0
- sage/rings/function_field/all__sagemath_modules.py +8 -0
- sage/rings/function_field/derivations.py +102 -0
- sage/rings/function_field/derivations_rational.py +132 -0
- sage/rings/function_field/differential.py +853 -0
- sage/rings/function_field/divisor.py +1107 -0
- sage/rings/function_field/drinfeld_modules/action.py +199 -0
- sage/rings/function_field/drinfeld_modules/all.py +1 -0
- sage/rings/function_field/drinfeld_modules/charzero_drinfeld_module.py +673 -0
- sage/rings/function_field/drinfeld_modules/drinfeld_module.py +2087 -0
- sage/rings/function_field/drinfeld_modules/finite_drinfeld_module.py +1131 -0
- sage/rings/function_field/drinfeld_modules/homset.py +420 -0
- sage/rings/function_field/drinfeld_modules/morphism.py +820 -0
- sage/rings/function_field/hermite_form_polynomial.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/hermite_form_polynomial.pyx +188 -0
- sage/rings/function_field/khuri_makdisi.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/khuri_makdisi.pyx +935 -0
- sage/rings/invariants/all.py +4 -0
- sage/rings/invariants/invariant_theory.py +4597 -0
- sage/rings/invariants/reconstruction.py +395 -0
- sage/rings/polynomial/all__sagemath_modules.py +17 -0
- sage/rings/polynomial/integer_valued_polynomials.py +1230 -0
- sage/rings/polynomial/laurent_polynomial_mpair.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pxd +15 -0
- sage/rings/polynomial/laurent_polynomial_mpair.pyx +2023 -0
- sage/rings/polynomial/ore_function_element.py +952 -0
- sage/rings/polynomial/ore_function_field.py +1028 -0
- sage/rings/polynomial/ore_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/ore_polynomial_element.pxd +48 -0
- sage/rings/polynomial/ore_polynomial_element.pyx +3145 -0
- sage/rings/polynomial/ore_polynomial_ring.py +1334 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_real_mpfr_dense.pyx +788 -0
- sage/rings/polynomial/q_integer_valued_polynomials.py +1264 -0
- sage/rings/polynomial/skew_polynomial_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_element.pxd +9 -0
- sage/rings/polynomial/skew_polynomial_element.pyx +684 -0
- sage/rings/polynomial/skew_polynomial_finite_field.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pxd +19 -0
- sage/rings/polynomial/skew_polynomial_finite_field.pyx +1093 -0
- sage/rings/polynomial/skew_polynomial_finite_order.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pxd +10 -0
- sage/rings/polynomial/skew_polynomial_finite_order.pyx +567 -0
- sage/rings/polynomial/skew_polynomial_ring.py +908 -0
- sage/rings/real_double_element_gsl.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/real_double_element_gsl.pxd +8 -0
- sage/rings/real_double_element_gsl.pyx +794 -0
- sage/rings/real_field.py +58 -0
- sage/rings/real_mpfr.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/real_mpfr.pxd +29 -0
- sage/rings/real_mpfr.pyx +6122 -0
- sage/rings/ring_extension.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension.pxd +42 -0
- sage/rings/ring_extension.pyx +2779 -0
- sage/rings/ring_extension_conversion.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension_conversion.pxd +16 -0
- sage/rings/ring_extension_conversion.pyx +462 -0
- sage/rings/ring_extension_element.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension_element.pxd +21 -0
- sage/rings/ring_extension_element.pyx +1635 -0
- sage/rings/ring_extension_homset.py +64 -0
- sage/rings/ring_extension_morphism.cpython-314-aarch64-linux-musl.so +0 -0
- sage/rings/ring_extension_morphism.pxd +35 -0
- sage/rings/ring_extension_morphism.pyx +920 -0
- sage/schemes/all__sagemath_modules.py +1 -0
- sage/schemes/projective/all__sagemath_modules.py +1 -0
- sage/schemes/projective/coherent_sheaf.py +300 -0
- sage/schemes/projective/cohomology.py +510 -0
- sage/stats/all.py +15 -0
- sage/stats/basic_stats.py +489 -0
- sage/stats/distributions/all.py +7 -0
- sage/stats/distributions/catalog.py +34 -0
- sage/stats/distributions/dgs.h +50 -0
- sage/stats/distributions/dgs.pxd +111 -0
- sage/stats/distributions/dgs_bern.h +400 -0
- sage/stats/distributions/dgs_gauss.h +614 -0
- sage/stats/distributions/dgs_misc.h +104 -0
- sage/stats/distributions/discrete_gaussian_integer.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/distributions/discrete_gaussian_integer.pxd +14 -0
- sage/stats/distributions/discrete_gaussian_integer.pyx +498 -0
- sage/stats/distributions/discrete_gaussian_lattice.py +908 -0
- sage/stats/distributions/discrete_gaussian_polynomial.py +141 -0
- sage/stats/hmm/all.py +15 -0
- sage/stats/hmm/chmm.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/chmm.pyx +1595 -0
- sage/stats/hmm/distributions.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/distributions.pxd +29 -0
- sage/stats/hmm/distributions.pyx +531 -0
- sage/stats/hmm/hmm.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/hmm.pxd +17 -0
- sage/stats/hmm/hmm.pyx +1388 -0
- sage/stats/hmm/util.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/hmm/util.pxd +7 -0
- sage/stats/hmm/util.pyx +165 -0
- sage/stats/intlist.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/intlist.pxd +14 -0
- sage/stats/intlist.pyx +588 -0
- sage/stats/r.py +49 -0
- sage/stats/time_series.cpython-314-aarch64-linux-musl.so +0 -0
- sage/stats/time_series.pxd +6 -0
- sage/stats/time_series.pyx +2546 -0
- sage/tensor/all.py +2 -0
- sage/tensor/modules/all.py +8 -0
- sage/tensor/modules/alternating_contr_tensor.py +761 -0
- sage/tensor/modules/comp.py +5598 -0
- sage/tensor/modules/ext_pow_free_module.py +824 -0
- sage/tensor/modules/finite_rank_free_module.py +3589 -0
- sage/tensor/modules/format_utilities.py +333 -0
- sage/tensor/modules/free_module_alt_form.py +858 -0
- sage/tensor/modules/free_module_automorphism.py +1207 -0
- sage/tensor/modules/free_module_basis.py +1074 -0
- sage/tensor/modules/free_module_element.py +284 -0
- sage/tensor/modules/free_module_homset.py +652 -0
- sage/tensor/modules/free_module_linear_group.py +564 -0
- sage/tensor/modules/free_module_morphism.py +1581 -0
- sage/tensor/modules/free_module_tensor.py +3289 -0
- sage/tensor/modules/reflexive_module.py +386 -0
- sage/tensor/modules/tensor_free_module.py +780 -0
- sage/tensor/modules/tensor_free_submodule.py +538 -0
- sage/tensor/modules/tensor_free_submodule_basis.py +140 -0
- sage/tensor/modules/tensor_with_indices.py +1043 -0
|
@@ -0,0 +1,1086 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-modules
|
|
2
|
+
r"""
|
|
3
|
+
Matroid construction
|
|
4
|
+
|
|
5
|
+
Theory
|
|
6
|
+
======
|
|
7
|
+
|
|
8
|
+
Matroids are combinatorial structures that capture the abstract properties
|
|
9
|
+
of (linear/algebraic/...) dependence. Formally, a matroid is a pair
|
|
10
|
+
`M = (E, I)` of a finite set `E`, the *groundset*, and a collection of
|
|
11
|
+
subsets `I`, the independent sets, subject to the following axioms:
|
|
12
|
+
|
|
13
|
+
* `I` contains the empty set
|
|
14
|
+
* If `X` is a set in `I`, then each subset of `X` is in `I`
|
|
15
|
+
* If two subsets `X`, `Y` are in `I`, and `|X| > |Y|`, then there exists
|
|
16
|
+
`x \in X - Y` such that `Y + \{x\}` is in `I`.
|
|
17
|
+
|
|
18
|
+
See the :wikipedia:`Wikipedia article on matroids <Matroid>` for more theory
|
|
19
|
+
and examples. Matroids can be obtained from many types of mathematical
|
|
20
|
+
structures, and Sage supports a number of them.
|
|
21
|
+
|
|
22
|
+
There are two main entry points to Sage's matroid functionality. The object
|
|
23
|
+
:class:`matroids. <sage.matroids.matroids_catalog>` contains a number of
|
|
24
|
+
constructors for well-known matroids. The function
|
|
25
|
+
:func:`Matroid() <sage.matroids.constructor.Matroid>` allows you to define
|
|
26
|
+
your own matroids from a variety of sources. We briefly introduce both below;
|
|
27
|
+
follow the links for more comprehensive documentation.
|
|
28
|
+
|
|
29
|
+
Each matroid object in Sage comes with a number of built-in operations. An
|
|
30
|
+
overview can be found in the documentation of
|
|
31
|
+
:mod:`the abstract matroid class <sage.matroids.matroid>`.
|
|
32
|
+
|
|
33
|
+
Built-in matroids
|
|
34
|
+
=================
|
|
35
|
+
|
|
36
|
+
For built-in matroids, do the following:
|
|
37
|
+
|
|
38
|
+
* Within a Sage session, type ``matroids.`` (Do not press :kbd:`Enter`,
|
|
39
|
+
and do not forget the final period ".")
|
|
40
|
+
* Hit :kbd:`Tab`.
|
|
41
|
+
|
|
42
|
+
You will see a list of methods which will construct matroids. For example::
|
|
43
|
+
|
|
44
|
+
sage: M = matroids.Wheel(4)
|
|
45
|
+
sage: M.is_connected()
|
|
46
|
+
True
|
|
47
|
+
|
|
48
|
+
or::
|
|
49
|
+
|
|
50
|
+
sage: U36 = matroids.Uniform(3, 6)
|
|
51
|
+
sage: U36.equals(U36.dual())
|
|
52
|
+
True
|
|
53
|
+
|
|
54
|
+
A number of special matroids are collected under a ``catalog`` submenu.
|
|
55
|
+
To see which, type ``matroids.catalog.<tab>`` as above::
|
|
56
|
+
|
|
57
|
+
sage: F7 = matroids.catalog.Fano()
|
|
58
|
+
sage: len(F7.nonspanning_circuits())
|
|
59
|
+
7
|
|
60
|
+
|
|
61
|
+
Constructing matroids
|
|
62
|
+
=====================
|
|
63
|
+
|
|
64
|
+
To define your own matroid, use the function
|
|
65
|
+
:func:`Matroid() <sage.matroids.constructor.Matroid>`. This function attempts
|
|
66
|
+
to interpret its arguments to create an appropriate matroid. The input
|
|
67
|
+
arguments are documented in detail
|
|
68
|
+
:func:`below <sage.matroids.constructor.Matroid>`.
|
|
69
|
+
|
|
70
|
+
EXAMPLES::
|
|
71
|
+
|
|
72
|
+
sage: A = Matrix(GF(2), [[1, 0, 0, 0, 1, 1, 1],
|
|
73
|
+
....: [0, 1, 0, 1, 0, 1, 1],
|
|
74
|
+
....: [0, 0, 1, 1, 1, 0, 1]])
|
|
75
|
+
sage: M = Matroid(A)
|
|
76
|
+
sage: M.is_isomorphic(matroids.catalog.Fano())
|
|
77
|
+
True
|
|
78
|
+
|
|
79
|
+
sage: M = Matroid(graphs.PetersenGraph()) # needs sage.graphs
|
|
80
|
+
sage: M.rank() # needs sage.graphs
|
|
81
|
+
9
|
|
82
|
+
|
|
83
|
+
AUTHORS:
|
|
84
|
+
|
|
85
|
+
- Rudi Pendavingh, Michael Welsh, Stefan van Zwam (2013-04-01): initial
|
|
86
|
+
version
|
|
87
|
+
|
|
88
|
+
Functions
|
|
89
|
+
=========
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
# ****************************************************************************
|
|
93
|
+
# Copyright (C) 2013 Rudi Pendavingh <rudi.pendavingh@gmail.com>
|
|
94
|
+
# Copyright (C) 2013 Michael Welsh <michael@welsh.co.nz>
|
|
95
|
+
# Copyright (C) 2013 Stefan van Zwam <stefanvanzwam@gmail.com>
|
|
96
|
+
#
|
|
97
|
+
#
|
|
98
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
99
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
100
|
+
# the License, or (at your option) any later version.
|
|
101
|
+
# https://www.gnu.org/licenses/
|
|
102
|
+
# ****************************************************************************
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
from itertools import combinations
|
|
106
|
+
from sage.matrix.constructor import matrix
|
|
107
|
+
from sage.misc.lazy_import import lazy_import
|
|
108
|
+
from sage.structure.element import Matrix
|
|
109
|
+
from sage.rings.integer_ring import ZZ
|
|
110
|
+
from sage.rings.rational_field import QQ
|
|
111
|
+
from sage.categories.fields import Fields
|
|
112
|
+
from sage.categories.rings import Rings
|
|
113
|
+
from sage.rings.finite_rings.finite_field_base import FiniteField
|
|
114
|
+
import sage.matroids.matroid
|
|
115
|
+
import sage.matroids.utilities
|
|
116
|
+
|
|
117
|
+
lazy_import('sage.combinat.posets.lattices', 'FiniteLatticePoset')
|
|
118
|
+
lazy_import('sage.matroids.basis_matroid', 'BasisMatroid')
|
|
119
|
+
lazy_import('sage.matroids.circuit_closures_matroid', 'CircuitClosuresMatroid')
|
|
120
|
+
lazy_import('sage.matroids.circuits_matroid', 'CircuitsMatroid')
|
|
121
|
+
lazy_import('sage.matroids.flats_matroid', 'FlatsMatroid')
|
|
122
|
+
lazy_import('sage.matroids.graphic_matroid', 'GraphicMatroid')
|
|
123
|
+
lazy_import('sage.matroids.linear_matroid',
|
|
124
|
+
['LinearMatroid', 'RegularMatroid', 'BinaryMatroid',
|
|
125
|
+
'TernaryMatroid', 'QuaternaryMatroid'])
|
|
126
|
+
lazy_import('sage.matroids.rank_matroid', 'RankMatroid')
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def Matroid(groundset=None, data=None, **kwds):
|
|
130
|
+
r"""
|
|
131
|
+
Construct a matroid.
|
|
132
|
+
|
|
133
|
+
Matroids are combinatorial structures that capture the abstract properties
|
|
134
|
+
of (linear/algebraic/...) dependence. Formally, a matroid is a pair
|
|
135
|
+
`M = (E, I)` of a finite set `E`, the *groundset*, and a collection of
|
|
136
|
+
subsets `I`, the independent sets, subject to the following axioms:
|
|
137
|
+
|
|
138
|
+
* `I` contains the empty set
|
|
139
|
+
* If `X` is a set in `I`, then each subset of `X` is in `I`
|
|
140
|
+
* If two subsets `X`, `Y` are in `I`, and `|X| > |Y|`, then there exists
|
|
141
|
+
`x \in X - Y` such that `Y + \{x\}` is in `I`.
|
|
142
|
+
|
|
143
|
+
See the :wikipedia:`Wikipedia article on matroids <Matroid>` for more
|
|
144
|
+
theory and examples. Matroids can be obtained from many types of
|
|
145
|
+
mathematical structures, and Sage supports a number of them.
|
|
146
|
+
|
|
147
|
+
There are two main entry points to Sage's matroid functionality. For
|
|
148
|
+
built-in matroids, do the following:
|
|
149
|
+
|
|
150
|
+
* Within a Sage session, type "matroids." (Do not press :kbd:`Enter`, and do
|
|
151
|
+
not forget the final period ".")
|
|
152
|
+
* Hit :kbd:`Tab`.
|
|
153
|
+
|
|
154
|
+
You will see a list of methods which will construct matroids. For
|
|
155
|
+
example::
|
|
156
|
+
|
|
157
|
+
sage: F7 = matroids.catalog.Fano()
|
|
158
|
+
sage: len(F7.nonspanning_circuits())
|
|
159
|
+
7
|
|
160
|
+
|
|
161
|
+
or::
|
|
162
|
+
|
|
163
|
+
sage: U36 = matroids.Uniform(3, 6)
|
|
164
|
+
sage: U36.equals(U36.dual())
|
|
165
|
+
True
|
|
166
|
+
|
|
167
|
+
To define your own matroid, use the function ``Matroid()``.
|
|
168
|
+
This function attempts to interpret its arguments to create an appropriate
|
|
169
|
+
matroid. The following named arguments are supported:
|
|
170
|
+
|
|
171
|
+
INPUT:
|
|
172
|
+
|
|
173
|
+
- ``groundset`` -- (optional) the groundset of the matroid; if not
|
|
174
|
+
provided, the function attempts to determine a groundset from the data
|
|
175
|
+
|
|
176
|
+
Exactly one of the following inputs must be given (where ``data``
|
|
177
|
+
must be a positional argument and anything else must be a keyword
|
|
178
|
+
argument):
|
|
179
|
+
|
|
180
|
+
- ``data`` -- a graph or a matrix or a RevLex-Index string or a list
|
|
181
|
+
of independent sets containing all bases or a matroid
|
|
182
|
+
- ``bases`` -- the list of bases (maximal independent sets) of the
|
|
183
|
+
matroid
|
|
184
|
+
- ``independent_sets`` -- the list of independent sets of the matroid
|
|
185
|
+
- ``circuits`` -- the list of circuits of the matroid
|
|
186
|
+
- ``nonspanning_circuits`` -- the list of nonspanning circuits of the
|
|
187
|
+
matroid
|
|
188
|
+
- ``flats`` -- the dictionary, list, or lattice of flats of the matroid
|
|
189
|
+
- ``graph`` -- a graph, whose edges form the elements of the matroid
|
|
190
|
+
- ``matrix`` -- a matrix representation of the matroid
|
|
191
|
+
- ``reduced_matrix`` -- a reduced representation of the matroid: if
|
|
192
|
+
``reduced_matrix = A``
|
|
193
|
+
then the matroid is represented by `[I\ \ A]` where `I` is an
|
|
194
|
+
appropriately sized identity matrix
|
|
195
|
+
- ``morphism`` -- a morphism representation of the matroid
|
|
196
|
+
- ``reduced_morphism`` -- a reduced morphism representation of the matroid
|
|
197
|
+
- ``rank_function`` -- a function that computes the rank of each subset;
|
|
198
|
+
can only be provided together with a groundset
|
|
199
|
+
- ``circuit_closures`` -- either a list of tuples ``(k, C)`` with ``C``
|
|
200
|
+
the closure of a circuit, and ``k`` the rank of ``C``, or a dictionary
|
|
201
|
+
``D`` with ``D[k]`` the set of closures of rank-``k`` circuits
|
|
202
|
+
- ``revlex`` -- the encoding as a string of ``0`` and ``*`` symbols;
|
|
203
|
+
used by [Mat2012]_ and explained in [MMIB2012]_
|
|
204
|
+
- ``matroid`` -- an object that is already a matroid; useful only with the
|
|
205
|
+
``regular`` option
|
|
206
|
+
|
|
207
|
+
Further options:
|
|
208
|
+
|
|
209
|
+
- ``regular`` -- boolean (default: ``False``); if ``True``,
|
|
210
|
+
output a
|
|
211
|
+
:class:`RegularMatroid <sage.matroids.linear_matroid.RegularMatroid>`
|
|
212
|
+
instance such that, *if* the input defines a valid regular matroid, then
|
|
213
|
+
the output represents this matroid. Note that this option can be
|
|
214
|
+
combined with any type of input.
|
|
215
|
+
- ``ring`` -- any ring. If provided, and the input is a ``matrix`` or
|
|
216
|
+
``reduced_matrix``, output will be a linear matroid over the ring or
|
|
217
|
+
field ``ring``.
|
|
218
|
+
- ``field`` -- any field. Same as ``ring``, but only fields are allowed
|
|
219
|
+
- ``check`` -- boolean (default: ``True``); if ``True`` and
|
|
220
|
+
``regular`` is ``True``, the output is checked to make sure it is a valid
|
|
221
|
+
regular matroid
|
|
222
|
+
|
|
223
|
+
.. WARNING::
|
|
224
|
+
|
|
225
|
+
Except for regular matroids, the input is not checked for validity. If
|
|
226
|
+
your data does not correspond to an actual matroid, the behavior of
|
|
227
|
+
the methods is undefined and may cause strange errors. To ensure you
|
|
228
|
+
have a matroid, run
|
|
229
|
+
:meth:`M.is_valid() <sage.matroids.matroid.Matroid.is_valid>`.
|
|
230
|
+
|
|
231
|
+
.. NOTE::
|
|
232
|
+
|
|
233
|
+
The ``Matroid()`` method will return instances of type
|
|
234
|
+
:class:`BasisMatroid <sage.matroids.basis_matroid.BasisMatroid>`,
|
|
235
|
+
:class:`CircuitsMatroid <sage.matroids.circuits_matroid.CircuitsMatroid>`,
|
|
236
|
+
:class:`FlatsMatroid <sage.matroids.flats_matroid.FlatsMatroid>`,
|
|
237
|
+
:class:`CircuitClosuresMatroid <sage.matroids.circuit_closures_matroid.CircuitClosuresMatroid>`,
|
|
238
|
+
:class:`LinearMatroid <sage.matroids.linear_matroid.LinearMatroid>`,
|
|
239
|
+
:class:`BinaryMatroid <sage.matroids.linear_matroid.LinearMatroid>`,
|
|
240
|
+
:class:`TernaryMatroid <sage.matroids.linear_matroid.LinearMatroid>`,
|
|
241
|
+
:class:`QuaternaryMatroid <sage.matroids.linear_matroid.LinearMatroid>`,
|
|
242
|
+
:class:`RegularMatroid <sage.matroids.linear_matroid.LinearMatroid>`, or
|
|
243
|
+
:class:`RankMatroid <sage.matroids.rank_matroid.RankMatroid>`. To
|
|
244
|
+
import these classes (and other useful functions) directly into Sage's
|
|
245
|
+
main namespace, type::
|
|
246
|
+
|
|
247
|
+
sage: from sage.matroids.advanced import *
|
|
248
|
+
|
|
249
|
+
See :mod:`sage.matroids.advanced <sage.matroids.advanced>`.
|
|
250
|
+
|
|
251
|
+
EXAMPLES:
|
|
252
|
+
|
|
253
|
+
Note that in these examples we will often use the fact that strings are
|
|
254
|
+
iterable in these examples. So we type ``'abcd'`` to denote the list
|
|
255
|
+
``['a', 'b', 'c', 'd']``.
|
|
256
|
+
|
|
257
|
+
#. List of bases:
|
|
258
|
+
|
|
259
|
+
All of the following inputs are allowed, and equivalent::
|
|
260
|
+
|
|
261
|
+
sage: M1 = Matroid(groundset='abcd', bases=['ab', 'ac', 'ad',
|
|
262
|
+
....: 'bc', 'bd', 'cd'])
|
|
263
|
+
sage: M2 = Matroid(bases=['ab', 'ac', 'ad', 'bc', 'bd', 'cd'])
|
|
264
|
+
sage: M3 = Matroid(['ab', 'ac', 'ad', 'bc', 'bd', 'cd'])
|
|
265
|
+
sage: M4 = Matroid('abcd', ['ab', 'ac', 'ad', 'bc', 'bd', 'cd'])
|
|
266
|
+
sage: M5 = Matroid('abcd', bases=[['a', 'b'], ['a', 'c'],
|
|
267
|
+
....: ['a', 'd'], ['b', 'c'],
|
|
268
|
+
....: ['b', 'd'], ['c', 'd']])
|
|
269
|
+
sage: M1 == M2
|
|
270
|
+
True
|
|
271
|
+
sage: M1 == M3
|
|
272
|
+
True
|
|
273
|
+
sage: M1 == M4
|
|
274
|
+
True
|
|
275
|
+
sage: M1 == M5
|
|
276
|
+
True
|
|
277
|
+
|
|
278
|
+
We do not check if the provided input forms an actual matroid::
|
|
279
|
+
|
|
280
|
+
sage: M1 = Matroid(groundset='abcd', bases=['ab', 'cd'])
|
|
281
|
+
sage: M1.full_rank()
|
|
282
|
+
2
|
|
283
|
+
sage: M1.is_valid()
|
|
284
|
+
False
|
|
285
|
+
|
|
286
|
+
Bases may be repeated::
|
|
287
|
+
|
|
288
|
+
sage: M1 = Matroid(['ab', 'ac'])
|
|
289
|
+
sage: M2 = Matroid(['ab', 'ac', 'ab'])
|
|
290
|
+
sage: M1 == M2
|
|
291
|
+
True
|
|
292
|
+
|
|
293
|
+
#. List of independent sets:
|
|
294
|
+
|
|
295
|
+
::
|
|
296
|
+
|
|
297
|
+
sage: M1 = Matroid(groundset='abcd',
|
|
298
|
+
....: independent_sets=['', 'a', 'b', 'c', 'd', 'ab',
|
|
299
|
+
....: 'ac', 'ad', 'bc', 'bd', 'cd'])
|
|
300
|
+
|
|
301
|
+
We only require that the list of independent sets contains each basis
|
|
302
|
+
of the matroid; omissions of smaller independent sets and
|
|
303
|
+
repetitions are allowed::
|
|
304
|
+
|
|
305
|
+
sage: M1 = Matroid(bases=['ab', 'ac'])
|
|
306
|
+
sage: M2 = Matroid(independent_sets=['a', 'ab', 'b', 'ab', 'a',
|
|
307
|
+
....: 'b', 'ac'])
|
|
308
|
+
sage: M1 == M2
|
|
309
|
+
True
|
|
310
|
+
|
|
311
|
+
#. List of circuits:
|
|
312
|
+
|
|
313
|
+
::
|
|
314
|
+
|
|
315
|
+
sage: M1 = Matroid(groundset='abc', circuits=['bc'])
|
|
316
|
+
|
|
317
|
+
A matroid specified by a list of circuits gets converted to a
|
|
318
|
+
:class:`CircuitsMatroid <sage.matroids.circuits_matroid.CircuitsMatroid>`
|
|
319
|
+
internally::
|
|
320
|
+
|
|
321
|
+
sage: from sage.matroids.circuits_matroid import CircuitsMatroid
|
|
322
|
+
sage: M2 = CircuitsMatroid(Matroid(bases=['ab', 'ac']))
|
|
323
|
+
sage: M1 == M2
|
|
324
|
+
True
|
|
325
|
+
|
|
326
|
+
sage: M = Matroid(groundset='abcd', circuits=['abc', 'abd', 'acd',
|
|
327
|
+
....: 'bcd'])
|
|
328
|
+
sage: type(M)
|
|
329
|
+
<class 'sage.matroids.circuits_matroid.CircuitsMatroid'>
|
|
330
|
+
|
|
331
|
+
Strange things can happen if the input does not satisfy the circuit
|
|
332
|
+
axioms, and these can be caught by the
|
|
333
|
+
:meth:`is_valid() <sage.matroids.circuits_matroid.CircuitsMatroid.is_valid>`
|
|
334
|
+
method. So please check that your input makes sense!
|
|
335
|
+
|
|
336
|
+
::
|
|
337
|
+
|
|
338
|
+
sage: M = Matroid('abcd', circuits=['ab', 'acd'])
|
|
339
|
+
sage: M.is_valid()
|
|
340
|
+
False
|
|
341
|
+
|
|
342
|
+
#. Flats:
|
|
343
|
+
|
|
344
|
+
Given a dictionary of flats indexed by their rank, we get a
|
|
345
|
+
:class:`FlatsMatroid <sage.matroids.flats_matroid.FlatsMatroid>`::
|
|
346
|
+
|
|
347
|
+
sage: # needs sage.graphs
|
|
348
|
+
sage: M = Matroid(flats={0: [''], 1: ['a', 'b'], 2: ['ab']})
|
|
349
|
+
sage: M.is_isomorphic(matroids.Uniform(2, 2)) and M.is_valid()
|
|
350
|
+
True
|
|
351
|
+
sage: type(M)
|
|
352
|
+
<class 'sage.matroids.flats_matroid.FlatsMatroid'>
|
|
353
|
+
|
|
354
|
+
If instead we simply provide a list of flats, then the class computes
|
|
355
|
+
and stores the lattice of flats upon definition. This can be
|
|
356
|
+
time-consuming, but after it's done we benefit from some faster methods
|
|
357
|
+
(e.g., :meth:`is_valid() <sage.matroids.flats_matroid.FlatsMatroid.is_valid>`)::
|
|
358
|
+
|
|
359
|
+
sage: # needs sage.graphs
|
|
360
|
+
sage: M = Matroid(flats=['', 'a', 'b', 'ab'])
|
|
361
|
+
sage: for i in range(M.rank() + 1): # print flats by rank
|
|
362
|
+
....: print(f'{i}: {sorted([sorted(F) for F in M.flats(i)], key=str)}')
|
|
363
|
+
0: [[]]
|
|
364
|
+
1: [['a'], ['b']]
|
|
365
|
+
2: [['a', 'b']]
|
|
366
|
+
sage: M.is_valid()
|
|
367
|
+
True
|
|
368
|
+
sage: type(M)
|
|
369
|
+
<class 'sage.matroids.flats_matroid.FlatsMatroid'>
|
|
370
|
+
|
|
371
|
+
Finally, we can also directly provide a lattice of flats::
|
|
372
|
+
|
|
373
|
+
sage: # needs sage.graphs
|
|
374
|
+
sage: from sage.combinat.posets.lattices import LatticePoset
|
|
375
|
+
sage: flats = [frozenset(F) for F in powerset('ab')]
|
|
376
|
+
sage: L_M = LatticePoset((flats, lambda x, y: x < y))
|
|
377
|
+
sage: M = Matroid(L_M)
|
|
378
|
+
sage: M.is_isomorphic(matroids.Uniform(2, 2)) and M.is_valid()
|
|
379
|
+
True
|
|
380
|
+
sage: type(M)
|
|
381
|
+
<class 'sage.matroids.flats_matroid.FlatsMatroid'>
|
|
382
|
+
|
|
383
|
+
#. Graph:
|
|
384
|
+
|
|
385
|
+
Sage has great support for graphs, see :mod:`sage.graphs.graph`.
|
|
386
|
+
|
|
387
|
+
::
|
|
388
|
+
|
|
389
|
+
sage: G = graphs.PetersenGraph() # needs sage.graphs
|
|
390
|
+
sage: Matroid(G) # needs sage.graphs
|
|
391
|
+
Graphic matroid of rank 9 on 15 elements
|
|
392
|
+
|
|
393
|
+
If each edge has a unique label, then those are used as the ground set
|
|
394
|
+
labels::
|
|
395
|
+
|
|
396
|
+
sage: G = Graph([(0, 1, 'a'), (0, 2, 'b'), (1, 2, 'c')]) # needs sage.graphs
|
|
397
|
+
sage: M = Matroid(G) # needs sage.graphs
|
|
398
|
+
sage: sorted(M.groundset()) # needs sage.graphs
|
|
399
|
+
['a', 'b', 'c']
|
|
400
|
+
|
|
401
|
+
If there are parallel edges, then integers are used for the ground set.
|
|
402
|
+
If there are no edges in parallel, and is not a complete list of labels,
|
|
403
|
+
or the labels are not unique, then vertex tuples are used::
|
|
404
|
+
|
|
405
|
+
sage: # needs sage.graphs
|
|
406
|
+
sage: G = Graph([(0, 1, 'a'), (0, 2, 'b'), (1, 2, 'b')])
|
|
407
|
+
sage: M = Matroid(G)
|
|
408
|
+
sage: sorted(M.groundset())
|
|
409
|
+
[(0, 1), (0, 2), (1, 2)]
|
|
410
|
+
sage: H = Graph([(0, 1, 'a'), (0, 2, 'b'), (1, 2, 'b'), (1, 2, 'c')],
|
|
411
|
+
....: multiedges=True)
|
|
412
|
+
sage: N = Matroid(H)
|
|
413
|
+
sage: sorted(N.groundset())
|
|
414
|
+
[0, 1, 2, 3]
|
|
415
|
+
|
|
416
|
+
The GraphicMatroid object forces its graph to be connected. If a
|
|
417
|
+
disconnected graph is used as input, it will connect the components::
|
|
418
|
+
|
|
419
|
+
sage: # needs sage.graphs
|
|
420
|
+
sage: G1 = graphs.CycleGraph(3); G2 = graphs.DiamondGraph()
|
|
421
|
+
sage: G = G1.disjoint_union(G2)
|
|
422
|
+
sage: M = Matroid(G); M
|
|
423
|
+
Graphic matroid of rank 5 on 8 elements
|
|
424
|
+
sage: M.graph()
|
|
425
|
+
Looped multi-graph on 6 vertices
|
|
426
|
+
sage: M.graph().is_connected()
|
|
427
|
+
True
|
|
428
|
+
sage: M.is_connected()
|
|
429
|
+
False
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
If the keyword ``regular`` is set to ``True``, the output will instead
|
|
433
|
+
be an instance of :class:`RegularMatroid`.
|
|
434
|
+
|
|
435
|
+
::
|
|
436
|
+
|
|
437
|
+
sage: G = Graph([(0, 1), (0, 2), (1, 2)]) # needs sage.graphs
|
|
438
|
+
sage: M = Matroid(G, regular=True); M # needs sage.graphs
|
|
439
|
+
Regular matroid of rank 2 on 3 elements with 3 bases
|
|
440
|
+
|
|
441
|
+
Note: if a groundset is specified, we assume it is in the same order
|
|
442
|
+
as
|
|
443
|
+
:meth:`G.edge_iterator() <sage.graphs.generic_graph.GenericGraph.edge_iterator>`
|
|
444
|
+
provides::
|
|
445
|
+
|
|
446
|
+
sage: G = Graph([(0, 1), (0, 2), (0, 2), (1, 2)], multiedges=True) # needs sage.graphs
|
|
447
|
+
sage: M = Matroid('abcd', G) # needs sage.graphs
|
|
448
|
+
sage: M.rank(['b', 'c']) # needs sage.graphs
|
|
449
|
+
1
|
|
450
|
+
|
|
451
|
+
As before,
|
|
452
|
+
if no edge labels are present and the graph is simple, we use the
|
|
453
|
+
tuples ``(i, j)`` of endpoints. If that fails, we simply use a list
|
|
454
|
+
``[0..m-1]`` ::
|
|
455
|
+
|
|
456
|
+
sage: G = Graph([(0, 1), (0, 2), (1, 2)]) # needs sage.graphs
|
|
457
|
+
sage: M = Matroid(G, regular=True) # needs sage.graphs
|
|
458
|
+
sage: sorted(M.groundset()) # needs sage.graphs
|
|
459
|
+
[(0, 1), (0, 2), (1, 2)]
|
|
460
|
+
|
|
461
|
+
sage: G = Graph([(0, 1), (0, 2), (0, 2), (1, 2)], multiedges=True) # needs sage.graphs
|
|
462
|
+
sage: M = Matroid(G, regular=True) # needs sage.graphs
|
|
463
|
+
sage: sorted(M.groundset()) # needs sage.graphs
|
|
464
|
+
[0, 1, 2, 3]
|
|
465
|
+
|
|
466
|
+
When the ``graph`` keyword is used, a variety of inputs can be
|
|
467
|
+
converted to a graph automatically. The following uses a graph6 string
|
|
468
|
+
(see the :class:`Graph <sage.graphs.graph.Graph>` method's
|
|
469
|
+
documentation)::
|
|
470
|
+
|
|
471
|
+
sage: Matroid(graph=':I`AKGsaOs`cI]Gb~') # needs sage.graphs
|
|
472
|
+
Graphic matroid of rank 9 on 17 elements
|
|
473
|
+
|
|
474
|
+
However, this method is no more clever than ``Graph()``::
|
|
475
|
+
|
|
476
|
+
sage: Matroid(graph=41/2) # needs sage.graphs
|
|
477
|
+
Traceback (most recent call last):
|
|
478
|
+
...
|
|
479
|
+
ValueError: This input cannot be turned into a graph
|
|
480
|
+
|
|
481
|
+
#. Matrix:
|
|
482
|
+
|
|
483
|
+
The basic input is a
|
|
484
|
+
:mod:`Sage matrix <sage.matrix.constructor>`::
|
|
485
|
+
|
|
486
|
+
sage: A = Matrix(GF(2), [[1, 0, 0, 1, 1, 0],
|
|
487
|
+
....: [0, 1, 0, 1, 0, 1],
|
|
488
|
+
....: [0, 0, 1, 0, 1, 1]])
|
|
489
|
+
sage: M = Matroid(matrix=A)
|
|
490
|
+
sage: M.is_isomorphic(matroids.CompleteGraphic(4)) # needs sage.graphs
|
|
491
|
+
True
|
|
492
|
+
|
|
493
|
+
Various shortcuts are possible::
|
|
494
|
+
|
|
495
|
+
sage: M1 = Matroid(matrix=[[1, 0, 0, 1, 1, 0],
|
|
496
|
+
....: [0, 1, 0, 1, 0, 1],
|
|
497
|
+
....: [0, 0, 1, 0, 1, 1]], ring=GF(2))
|
|
498
|
+
sage: M2 = Matroid(reduced_matrix=[[1, 1, 0],
|
|
499
|
+
....: [1, 0, 1],
|
|
500
|
+
....: [0, 1, 1]], ring=GF(2))
|
|
501
|
+
sage: M3 = Matroid(groundset=[0, 1, 2, 3, 4, 5],
|
|
502
|
+
....: matrix=[[1, 1, 0], [1, 0, 1], [0, 1, 1]],
|
|
503
|
+
....: ring=GF(2))
|
|
504
|
+
sage: A = Matrix(GF(2), [[1, 1, 0], [1, 0, 1], [0, 1, 1]])
|
|
505
|
+
sage: M4 = Matroid([0, 1, 2, 3, 4, 5], A)
|
|
506
|
+
sage: M1 == M2
|
|
507
|
+
True
|
|
508
|
+
sage: M1 == M3
|
|
509
|
+
True
|
|
510
|
+
sage: M1 == M4
|
|
511
|
+
True
|
|
512
|
+
|
|
513
|
+
However, with unnamed arguments the input has to be a ``Matrix``
|
|
514
|
+
instance, or the function will try to interpret it as a set of bases::
|
|
515
|
+
|
|
516
|
+
sage: Matroid([0, 1, 2], [[1, 0, 1], [0, 1, 1]])
|
|
517
|
+
Traceback (most recent call last):
|
|
518
|
+
...
|
|
519
|
+
ValueError: basis has wrong cardinality
|
|
520
|
+
|
|
521
|
+
If the groundset size equals number of rows plus number of columns, an
|
|
522
|
+
identity matrix is prepended. Otherwise the groundset size must equal
|
|
523
|
+
the number of columns::
|
|
524
|
+
|
|
525
|
+
sage: A = Matrix(GF(2), [[1, 1, 0], [1, 0, 1], [0, 1, 1]])
|
|
526
|
+
sage: M = Matroid([0, 1, 2], A)
|
|
527
|
+
sage: N = Matroid([0, 1, 2, 3, 4, 5], A)
|
|
528
|
+
sage: M.rank()
|
|
529
|
+
2
|
|
530
|
+
sage: N.rank()
|
|
531
|
+
3
|
|
532
|
+
|
|
533
|
+
We automatically create an optimized subclass, if available::
|
|
534
|
+
|
|
535
|
+
sage: Matroid([0, 1, 2, 3, 4, 5],
|
|
536
|
+
....: matrix=[[1, 1, 0], [1, 0, 1], [0, 1, 1]],
|
|
537
|
+
....: field=GF(2))
|
|
538
|
+
Binary matroid of rank 3 on 6 elements, type (2, 7)
|
|
539
|
+
sage: Matroid([0, 1, 2, 3, 4, 5],
|
|
540
|
+
....: matrix=[[1, 1, 0], [1, 0, 1], [0, 1, 1]],
|
|
541
|
+
....: field=GF(3))
|
|
542
|
+
Ternary matroid of rank 3 on 6 elements, type 0-
|
|
543
|
+
sage: Matroid([0, 1, 2, 3, 4, 5], # needs sage.rings.finite_rings
|
|
544
|
+
....: matrix=[[1, 1, 0], [1, 0, 1], [0, 1, 1]],
|
|
545
|
+
....: field=GF(4, 'x'))
|
|
546
|
+
Quaternary matroid of rank 3 on 6 elements
|
|
547
|
+
sage: Matroid([0, 1, 2, 3, 4, 5], # needs sage.graphs
|
|
548
|
+
....: matrix=[[1, 1, 0], [1, 0, 1], [0, 1, 1]],
|
|
549
|
+
....: field=GF(2), regular=True)
|
|
550
|
+
Regular matroid of rank 3 on 6 elements with 16 bases
|
|
551
|
+
|
|
552
|
+
Otherwise the generic LinearMatroid class is used::
|
|
553
|
+
|
|
554
|
+
sage: Matroid([0, 1, 2, 3, 4, 5],
|
|
555
|
+
....: matrix=[[1, 1, 0], [1, 0, 1], [0, 1, 1]],
|
|
556
|
+
....: field=GF(83))
|
|
557
|
+
Linear matroid of rank 3 on 6 elements represented over the Finite
|
|
558
|
+
Field of size 83
|
|
559
|
+
|
|
560
|
+
An integer matrix is automatically converted to a matrix over `\QQ`.
|
|
561
|
+
If you really want integers, you can specify the ring explicitly::
|
|
562
|
+
|
|
563
|
+
sage: A = Matrix([[1, 1, 0], [1, 0, 1], [0, 1, -1]])
|
|
564
|
+
sage: A.base_ring()
|
|
565
|
+
Integer Ring
|
|
566
|
+
sage: M = Matroid([0, 1, 2, 3, 4, 5], A)
|
|
567
|
+
sage: M.base_ring()
|
|
568
|
+
Rational Field
|
|
569
|
+
sage: M = Matroid([0, 1, 2, 3, 4, 5], A, ring=ZZ)
|
|
570
|
+
sage: M.base_ring()
|
|
571
|
+
Integer Ring
|
|
572
|
+
|
|
573
|
+
A morphism representation of a :class:`LinearMatroid` can also be used as
|
|
574
|
+
input::
|
|
575
|
+
|
|
576
|
+
sage: M = matroids.catalog.Fano()
|
|
577
|
+
sage: A = M.representation(order=True); A
|
|
578
|
+
Generic morphism:
|
|
579
|
+
From: Free module generated by {'a', 'b', 'c', 'd', 'e', 'f', 'g'} over
|
|
580
|
+
Finite Field of size 2
|
|
581
|
+
To: Free module generated by {0, 1, 2} over Finite Field of size 2
|
|
582
|
+
sage: A._unicode_art_matrix()
|
|
583
|
+
a b c d e f g
|
|
584
|
+
0⎛1 0 0 0 1 1 1⎞
|
|
585
|
+
1⎜0 1 0 1 0 1 1⎟
|
|
586
|
+
2⎝0 0 1 1 1 0 1⎠
|
|
587
|
+
sage: N = Matroid(A); N
|
|
588
|
+
Binary matroid of rank 3 on 7 elements, type (3, 0)
|
|
589
|
+
sage: N.groundset()
|
|
590
|
+
frozenset({'a', 'b', 'c', 'd', 'e', 'f', 'g'})
|
|
591
|
+
sage: M == N
|
|
592
|
+
True
|
|
593
|
+
|
|
594
|
+
The keywords ``morphism`` and ``reduced_morphism`` are also available::
|
|
595
|
+
|
|
596
|
+
sage: # needs sage.rings.finite_rings
|
|
597
|
+
sage: M = matroids.catalog.RelaxedNonFano("abcdefg")
|
|
598
|
+
sage: A = M.representation(order=True, reduced=True); A
|
|
599
|
+
Generic morphism:
|
|
600
|
+
From: Free module generated by {'d', 'e', 'f', 'g'} over
|
|
601
|
+
Finite Field in w of size 2^2
|
|
602
|
+
To: Free module generated by {'a', 'b', 'c'} over
|
|
603
|
+
Finite Field in w of size 2^2
|
|
604
|
+
sage: A._unicode_art_matrix()
|
|
605
|
+
d e f g
|
|
606
|
+
a⎛1 1 0 1⎞
|
|
607
|
+
b⎜1 0 1 1⎟
|
|
608
|
+
c⎝0 1 w 1⎠
|
|
609
|
+
sage: N = Matroid(reduced_morphism=A); N
|
|
610
|
+
Quaternary matroid of rank 3 on 7 elements
|
|
611
|
+
sage: N.groundset()
|
|
612
|
+
frozenset({'a', 'b', 'c', 'd', 'e', 'f', 'g'})
|
|
613
|
+
sage: M == N
|
|
614
|
+
True
|
|
615
|
+
|
|
616
|
+
#. Rank function:
|
|
617
|
+
|
|
618
|
+
Any function mapping subsets to integers can be used as input::
|
|
619
|
+
|
|
620
|
+
sage: def f(X):
|
|
621
|
+
....: return min(len(X), 2)
|
|
622
|
+
sage: M = Matroid('abcd', rank_function=f)
|
|
623
|
+
sage: M
|
|
624
|
+
Matroid of rank 2 on 4 elements
|
|
625
|
+
sage: M.is_isomorphic(matroids.Uniform(2, 4))
|
|
626
|
+
True
|
|
627
|
+
|
|
628
|
+
#. Circuit closures:
|
|
629
|
+
|
|
630
|
+
This is often a really concise way to specify a matroid. The usual way
|
|
631
|
+
is a dictionary of lists::
|
|
632
|
+
|
|
633
|
+
sage: M = Matroid(circuit_closures={3: ['edfg', 'acdg', 'bcfg',
|
|
634
|
+
....: 'cefh', 'afgh', 'abce', 'abdf', 'begh', 'bcdh', 'adeh'],
|
|
635
|
+
....: 4: ['abcdefgh']})
|
|
636
|
+
sage: M.equals(matroids.catalog.P8())
|
|
637
|
+
True
|
|
638
|
+
|
|
639
|
+
You can also input tuples `(k, X)` where `X` is the closure of a
|
|
640
|
+
circuit, and `k` the rank of `X`::
|
|
641
|
+
|
|
642
|
+
sage: M = Matroid(circuit_closures=[(2, 'abd'), (3, 'abcdef'),
|
|
643
|
+
....: (2, 'bce')])
|
|
644
|
+
sage: M.equals(matroids.catalog.Q6()) # needs sage.rings.finite_rings
|
|
645
|
+
True
|
|
646
|
+
|
|
647
|
+
#. RevLex-Index:
|
|
648
|
+
|
|
649
|
+
This requires the ``groundset`` to be given and also needs a
|
|
650
|
+
additional keyword argument ``rank`` to specify the rank of the
|
|
651
|
+
matroid::
|
|
652
|
+
|
|
653
|
+
sage: M = Matroid("abcdef", "000000******0**", rank=4); M
|
|
654
|
+
Matroid of rank 4 on 6 elements with 8 bases
|
|
655
|
+
sage: list(M.bases())
|
|
656
|
+
[frozenset({'a', 'b', 'd', 'f'}),
|
|
657
|
+
frozenset({'a', 'c', 'd', 'f'}),
|
|
658
|
+
frozenset({'b', 'c', 'd', 'f'}),
|
|
659
|
+
frozenset({'a', 'b', 'e', 'f'}),
|
|
660
|
+
frozenset({'a', 'c', 'e', 'f'}),
|
|
661
|
+
frozenset({'b', 'c', 'e', 'f'}),
|
|
662
|
+
frozenset({'b', 'd', 'e', 'f'}),
|
|
663
|
+
frozenset({'c', 'd', 'e', 'f'})]
|
|
664
|
+
|
|
665
|
+
Only the ``0`` symbols really matter, any symbol can be used
|
|
666
|
+
instead of ``*``:
|
|
667
|
+
|
|
668
|
+
sage: Matroid("abcdefg", revlex='0++++++++0++++0+++++0+--++----+--++', rank=4)
|
|
669
|
+
Matroid of rank 4 on 7 elements with 31 bases
|
|
670
|
+
|
|
671
|
+
It is checked that the input makes sense (but not that it
|
|
672
|
+
defines a matroid)::
|
|
673
|
+
|
|
674
|
+
sage: Matroid("abcdef", "000000******0**")
|
|
675
|
+
Traceback (most recent call last):
|
|
676
|
+
...
|
|
677
|
+
TypeError: for RevLex-Index, the rank needs to be specified
|
|
678
|
+
sage: Matroid("abcdef", "000000******0**", rank=3)
|
|
679
|
+
Traceback (most recent call last):
|
|
680
|
+
...
|
|
681
|
+
ValueError: expected string of length 20 (6 choose 3), got 15
|
|
682
|
+
sage: M = Matroid("abcdef", "*0000000000000*", rank=4); M
|
|
683
|
+
Matroid of rank 4 on 6 elements with 2 bases
|
|
684
|
+
sage: M.is_valid()
|
|
685
|
+
False
|
|
686
|
+
|
|
687
|
+
#. Matroid:
|
|
688
|
+
|
|
689
|
+
Most of the time, the matroid itself is returned::
|
|
690
|
+
|
|
691
|
+
sage: M = matroids.catalog.Fano()
|
|
692
|
+
sage: N = Matroid(M)
|
|
693
|
+
sage: N is M
|
|
694
|
+
True
|
|
695
|
+
|
|
696
|
+
But it can be useful with the ``regular`` option::
|
|
697
|
+
|
|
698
|
+
sage: M = Matroid(circuit_closures={2:['adb', 'bec', 'cfa',
|
|
699
|
+
....: 'def'], 3:['abcdef']})
|
|
700
|
+
sage: N = Matroid(M, regular=True); N # needs sage.graphs
|
|
701
|
+
Regular matroid of rank 3 on 6 elements with 16 bases
|
|
702
|
+
sage: M == N # needs sage.graphs
|
|
703
|
+
False
|
|
704
|
+
sage: M.is_isomorphic(N) # needs sage.graphs
|
|
705
|
+
True
|
|
706
|
+
sage: Matrix(N) # random # needs sage.graphs
|
|
707
|
+
[1 0 0 1 1 0]
|
|
708
|
+
[0 1 0 1 1 1]
|
|
709
|
+
[0 0 1 0 1 1]
|
|
710
|
+
|
|
711
|
+
The ``regular`` option::
|
|
712
|
+
|
|
713
|
+
sage: M = Matroid(reduced_matrix=[[1, 1, 0], # needs sage.graphs
|
|
714
|
+
....: [1, 0, 1],
|
|
715
|
+
....: [0, 1, 1]], regular=True); M
|
|
716
|
+
Regular matroid of rank 3 on 6 elements with 16 bases
|
|
717
|
+
|
|
718
|
+
sage: M.is_isomorphic(matroids.CompleteGraphic(4)) # needs sage.graphs
|
|
719
|
+
True
|
|
720
|
+
|
|
721
|
+
By default we check if the resulting matroid is actually regular. To
|
|
722
|
+
increase speed, this check can be skipped::
|
|
723
|
+
|
|
724
|
+
sage: M = matroids.catalog.Fano()
|
|
725
|
+
sage: N = Matroid(M, regular=True) # needs sage.graphs
|
|
726
|
+
Traceback (most recent call last):
|
|
727
|
+
...
|
|
728
|
+
ValueError: input is not a valid regular matroid
|
|
729
|
+
sage: N = Matroid(M, regular=True, check=False); N # needs sage.graphs
|
|
730
|
+
Regular matroid of rank 3 on 7 elements with 32 bases
|
|
731
|
+
|
|
732
|
+
sage: N.is_valid() # needs sage.graphs
|
|
733
|
+
False
|
|
734
|
+
|
|
735
|
+
Sometimes the output is regular, but represents a different matroid
|
|
736
|
+
from the one you intended::
|
|
737
|
+
|
|
738
|
+
sage: M = Matroid(Matrix(GF(3), [[1, 0, 1, 1], [0, 1, 1, 2]]))
|
|
739
|
+
sage: N = Matroid(Matrix(GF(3), [[1, 0, 1, 1], [0, 1, 1, 2]]), # needs sage.graphs
|
|
740
|
+
....: regular=True)
|
|
741
|
+
sage: N.is_valid() # needs sage.graphs
|
|
742
|
+
True
|
|
743
|
+
sage: N.is_isomorphic(M) # needs sage.graphs
|
|
744
|
+
False
|
|
745
|
+
|
|
746
|
+
TESTS::
|
|
747
|
+
|
|
748
|
+
sage: Matroid()
|
|
749
|
+
Traceback (most recent call last):
|
|
750
|
+
...
|
|
751
|
+
TypeError: no input data given for Matroid()
|
|
752
|
+
sage: Matroid("abc", bases=["abc"], foo='bar')
|
|
753
|
+
Traceback (most recent call last):
|
|
754
|
+
...
|
|
755
|
+
TypeError: ...Matroid() got an unexpected keyword argument 'foo'
|
|
756
|
+
sage: Matroid(data=["x"], matrix=Matrix(1,1))
|
|
757
|
+
Traceback (most recent call last):
|
|
758
|
+
...
|
|
759
|
+
TypeError: ...Matroid() got an unexpected keyword argument 'matrix'
|
|
760
|
+
sage: Matroid(bases=["x"], matrix=Matrix(1,1))
|
|
761
|
+
Traceback (most recent call last):
|
|
762
|
+
...
|
|
763
|
+
TypeError: ...Matroid() got an unexpected keyword argument 'matrix'
|
|
764
|
+
sage: Matroid(Matrix(1,1), ring=ZZ, field=QQ)
|
|
765
|
+
Traceback (most recent call last):
|
|
766
|
+
...
|
|
767
|
+
TypeError: ...Matroid() got an unexpected keyword argument 'ring'
|
|
768
|
+
sage: Matroid(rank_function=lambda X: len(X))
|
|
769
|
+
Traceback (most recent call last):
|
|
770
|
+
...
|
|
771
|
+
TypeError: for rank functions, the groundset needs to be specified
|
|
772
|
+
sage: Matroid(matroid='rubbish')
|
|
773
|
+
Traceback (most recent call last):
|
|
774
|
+
...
|
|
775
|
+
TypeError: input 'rubbish' is not a matroid
|
|
776
|
+
"""
|
|
777
|
+
# process options
|
|
778
|
+
want_regular = kwds.pop('regular', False)
|
|
779
|
+
check = kwds.pop('check', True)
|
|
780
|
+
|
|
781
|
+
base_ring = None
|
|
782
|
+
if 'field' in kwds:
|
|
783
|
+
base_ring = kwds.pop('field')
|
|
784
|
+
if check and base_ring not in Fields():
|
|
785
|
+
raise TypeError("{} is not a field".format(base_ring))
|
|
786
|
+
elif 'ring' in kwds:
|
|
787
|
+
base_ring = kwds.pop('ring')
|
|
788
|
+
if check and base_ring not in Rings():
|
|
789
|
+
raise TypeError("{} is not a ring".format(base_ring))
|
|
790
|
+
|
|
791
|
+
# "key" is the kind of data we got
|
|
792
|
+
key = None
|
|
793
|
+
if data is None:
|
|
794
|
+
for k in ['bases', 'independent_sets', 'circuits',
|
|
795
|
+
'nonspanning_circuits', 'flats', 'graph', 'matrix',
|
|
796
|
+
'reduced_matrix', 'morphism', 'reduced_morphism',
|
|
797
|
+
'rank_function', 'revlex', 'circuit_closures', 'matroid']:
|
|
798
|
+
if k in kwds:
|
|
799
|
+
data = kwds.pop(k)
|
|
800
|
+
key = k
|
|
801
|
+
break
|
|
802
|
+
else:
|
|
803
|
+
# Assume that the single positional argument was actually
|
|
804
|
+
# the data (instead of the groundset)
|
|
805
|
+
data = groundset
|
|
806
|
+
groundset = None
|
|
807
|
+
|
|
808
|
+
if key is None:
|
|
809
|
+
try:
|
|
810
|
+
from sage.graphs.graph import Graph
|
|
811
|
+
except ImportError:
|
|
812
|
+
Graph = ()
|
|
813
|
+
if isinstance(data, Graph):
|
|
814
|
+
key = 'graph'
|
|
815
|
+
elif isinstance(data, Matrix) or (
|
|
816
|
+
isinstance(data, tuple) and isinstance(data[0], Matrix)):
|
|
817
|
+
key = 'matrix'
|
|
818
|
+
elif isinstance(data, sage.modules.with_basis.morphism.ModuleMorphism) or (
|
|
819
|
+
isinstance(data, tuple) and
|
|
820
|
+
isinstance(data[0], sage.modules.with_basis.morphism.ModuleMorphism)):
|
|
821
|
+
key = 'morphism'
|
|
822
|
+
elif isinstance(data, sage.matroids.matroid.Matroid):
|
|
823
|
+
key = 'matroid'
|
|
824
|
+
elif isinstance(data, str):
|
|
825
|
+
key = 'revlex'
|
|
826
|
+
elif isinstance(data, (dict, FiniteLatticePoset)):
|
|
827
|
+
key = 'flats'
|
|
828
|
+
elif data is None:
|
|
829
|
+
raise TypeError("no input data given for Matroid()")
|
|
830
|
+
else:
|
|
831
|
+
key = 'independent_sets'
|
|
832
|
+
|
|
833
|
+
# Bases:
|
|
834
|
+
if key == 'bases':
|
|
835
|
+
if groundset is None:
|
|
836
|
+
groundset = set()
|
|
837
|
+
for B in data:
|
|
838
|
+
groundset.update(B)
|
|
839
|
+
M = BasisMatroid(groundset=groundset, bases=data)
|
|
840
|
+
|
|
841
|
+
# Independent sets:
|
|
842
|
+
elif key == 'independent_sets':
|
|
843
|
+
# Convert to list of bases first
|
|
844
|
+
rk = -1
|
|
845
|
+
bases = []
|
|
846
|
+
for I in data:
|
|
847
|
+
if len(I) == rk:
|
|
848
|
+
bases.append(I)
|
|
849
|
+
elif len(I) > rk:
|
|
850
|
+
bases = [I]
|
|
851
|
+
rk = len(I)
|
|
852
|
+
if groundset is None:
|
|
853
|
+
groundset = set()
|
|
854
|
+
for B in bases:
|
|
855
|
+
groundset.update(B)
|
|
856
|
+
M = BasisMatroid(groundset=groundset, bases=bases)
|
|
857
|
+
|
|
858
|
+
# Circuits:
|
|
859
|
+
elif key == 'circuits':
|
|
860
|
+
# Convert to list of bases first
|
|
861
|
+
# Determine groundset (note that this cannot detect coloops)
|
|
862
|
+
if groundset is None:
|
|
863
|
+
groundset = set()
|
|
864
|
+
for C in data:
|
|
865
|
+
groundset.update(C)
|
|
866
|
+
M = CircuitsMatroid(groundset=groundset, circuits=data)
|
|
867
|
+
|
|
868
|
+
# Nonspanning circuits:
|
|
869
|
+
elif key == 'nonspanning_circuits':
|
|
870
|
+
try:
|
|
871
|
+
rk = kwds.pop("rank")
|
|
872
|
+
except TypeError:
|
|
873
|
+
raise TypeError("the rank needs to be specified alongside the " +
|
|
874
|
+
"nonspanning circuits")
|
|
875
|
+
# Determine groundset (note that this cannot detect coloops)
|
|
876
|
+
if groundset is None:
|
|
877
|
+
groundset = set()
|
|
878
|
+
for C in data:
|
|
879
|
+
groundset.update(C)
|
|
880
|
+
# Construct the basis matroid of appropriate rank. Note: slow!
|
|
881
|
+
B = [] # bases
|
|
882
|
+
for b in combinations(groundset, rk):
|
|
883
|
+
flag = True
|
|
884
|
+
for C in data:
|
|
885
|
+
if set(b) >= set(C):
|
|
886
|
+
flag = False
|
|
887
|
+
break
|
|
888
|
+
if flag:
|
|
889
|
+
B += [list(b)]
|
|
890
|
+
# convert to circuits matroid defined by non-spanning circuits
|
|
891
|
+
M = CircuitsMatroid(
|
|
892
|
+
BasisMatroid(groundset=groundset, bases=B),
|
|
893
|
+
nsc_defined=True
|
|
894
|
+
)
|
|
895
|
+
|
|
896
|
+
# Flats
|
|
897
|
+
elif key == 'flats':
|
|
898
|
+
# Determine groundset
|
|
899
|
+
if groundset is None:
|
|
900
|
+
groundset = set()
|
|
901
|
+
if isinstance(data, dict):
|
|
902
|
+
for i in data:
|
|
903
|
+
for F in data[i]:
|
|
904
|
+
groundset.update(F)
|
|
905
|
+
else: # iterable of flats (including lattice)
|
|
906
|
+
for F in data:
|
|
907
|
+
groundset.update(F)
|
|
908
|
+
M = FlatsMatroid(groundset=groundset, flats=data)
|
|
909
|
+
|
|
910
|
+
# Graphs:
|
|
911
|
+
elif key == 'graph':
|
|
912
|
+
from sage.graphs.graph import Graph
|
|
913
|
+
|
|
914
|
+
if isinstance(data, sage.graphs.generic_graph.GenericGraph):
|
|
915
|
+
G = data
|
|
916
|
+
else:
|
|
917
|
+
G = Graph(data)
|
|
918
|
+
# Decide on the groundset
|
|
919
|
+
m = G.num_edges()
|
|
920
|
+
if groundset is None:
|
|
921
|
+
# 1. Attempt to use edge labels.
|
|
922
|
+
sl = G.edge_labels()
|
|
923
|
+
if len(sl) == len(set(sl)):
|
|
924
|
+
groundset = sl
|
|
925
|
+
# 2. If simple, use vertex tuples
|
|
926
|
+
elif not G.has_multiple_edges():
|
|
927
|
+
groundset = [(i, j) for i, j, k in G.edge_iterator()]
|
|
928
|
+
else:
|
|
929
|
+
# 3. Use numbers
|
|
930
|
+
groundset = list(range(m))
|
|
931
|
+
if want_regular:
|
|
932
|
+
# Construct the incidence matrix
|
|
933
|
+
# NOTE: we are not using Sage's built-in method because
|
|
934
|
+
# 1) we would need to fix the loops anyway
|
|
935
|
+
# 2) Sage will sort the columns, making it impossible to keep labels!
|
|
936
|
+
V = G.vertices(sort=True)
|
|
937
|
+
n = G.num_verts()
|
|
938
|
+
A = matrix(ZZ, n, m, 0)
|
|
939
|
+
mm = 0
|
|
940
|
+
for i, j, k in G.edge_iterator():
|
|
941
|
+
A[V.index(i), mm] = -1
|
|
942
|
+
A[V.index(j), mm] += 1 # So loops get 0
|
|
943
|
+
mm += 1
|
|
944
|
+
M = RegularMatroid(matrix=A, groundset=groundset)
|
|
945
|
+
want_regular = False # Save some time, since result is already regular
|
|
946
|
+
else:
|
|
947
|
+
M = GraphicMatroid(G, groundset=groundset)
|
|
948
|
+
|
|
949
|
+
# Matrices:
|
|
950
|
+
elif key in ['matrix', 'reduced_matrix', 'morphism', 'reduced_morphism']:
|
|
951
|
+
A = data
|
|
952
|
+
is_reduced = (key == 'reduced_matrix' or key == 'reduced_morphism')
|
|
953
|
+
if isinstance(data, tuple):
|
|
954
|
+
A = data[0]
|
|
955
|
+
if key == 'matrix' or key == 'reduced_matrix':
|
|
956
|
+
if groundset is None:
|
|
957
|
+
groundset = data[1]
|
|
958
|
+
if is_reduced:
|
|
959
|
+
groundset += data[2]
|
|
960
|
+
if key == 'morphism' or key == 'reduced_morphism':
|
|
961
|
+
if groundset is None:
|
|
962
|
+
groundset = list(A.domain().basis().keys())
|
|
963
|
+
if is_reduced:
|
|
964
|
+
groundset = list(A.codomain().basis().keys()) + groundset
|
|
965
|
+
A = A.matrix()
|
|
966
|
+
|
|
967
|
+
# Fix the representation
|
|
968
|
+
if not isinstance(A, Matrix):
|
|
969
|
+
if base_ring is not None:
|
|
970
|
+
A = matrix(base_ring, A)
|
|
971
|
+
else:
|
|
972
|
+
A = matrix(A)
|
|
973
|
+
|
|
974
|
+
# Fix the ring
|
|
975
|
+
if base_ring is not None:
|
|
976
|
+
if A.base_ring() is not base_ring:
|
|
977
|
+
A = A.change_ring(base_ring)
|
|
978
|
+
elif A.base_ring() is ZZ and not want_regular: # Usually a rational matrix is intended, we presume.
|
|
979
|
+
A = A.change_ring(QQ)
|
|
980
|
+
base_ring = QQ
|
|
981
|
+
else:
|
|
982
|
+
base_ring = A.base_ring()
|
|
983
|
+
|
|
984
|
+
# Check groundset
|
|
985
|
+
if groundset is not None:
|
|
986
|
+
if not is_reduced:
|
|
987
|
+
if len(groundset) == A.ncols():
|
|
988
|
+
pass
|
|
989
|
+
elif len(groundset) == A.nrows() + A.ncols():
|
|
990
|
+
is_reduced = True
|
|
991
|
+
else:
|
|
992
|
+
raise ValueError("groundset size does not correspond to matrix size")
|
|
993
|
+
elif is_reduced:
|
|
994
|
+
if len(groundset) == A.nrows() + A.ncols():
|
|
995
|
+
pass
|
|
996
|
+
else:
|
|
997
|
+
raise ValueError("groundset size does not correspond to matrix size")
|
|
998
|
+
|
|
999
|
+
if is_reduced:
|
|
1000
|
+
kw = dict(groundset=groundset, reduced_matrix=A)
|
|
1001
|
+
else:
|
|
1002
|
+
kw = dict(groundset=groundset, matrix=A)
|
|
1003
|
+
|
|
1004
|
+
if isinstance(base_ring, FiniteField):
|
|
1005
|
+
q = base_ring.order()
|
|
1006
|
+
else:
|
|
1007
|
+
q = 0
|
|
1008
|
+
|
|
1009
|
+
if q == 2:
|
|
1010
|
+
M = BinaryMatroid(**kw)
|
|
1011
|
+
elif q == 3:
|
|
1012
|
+
M = TernaryMatroid(**kw)
|
|
1013
|
+
elif q == 4:
|
|
1014
|
+
M = QuaternaryMatroid(**kw)
|
|
1015
|
+
else:
|
|
1016
|
+
M = LinearMatroid(ring=base_ring, **kw)
|
|
1017
|
+
|
|
1018
|
+
# Rank functions:
|
|
1019
|
+
elif key == 'rank_function':
|
|
1020
|
+
if groundset is None:
|
|
1021
|
+
raise TypeError('for rank functions, the groundset needs to be specified')
|
|
1022
|
+
M = RankMatroid(groundset=groundset, rank_function=data)
|
|
1023
|
+
|
|
1024
|
+
# RevLex-Index:
|
|
1025
|
+
elif key == "revlex":
|
|
1026
|
+
if groundset is None:
|
|
1027
|
+
raise TypeError('for RevLex-Index, the groundset needs to be specified')
|
|
1028
|
+
try:
|
|
1029
|
+
rk = kwds.pop("rank")
|
|
1030
|
+
except KeyError:
|
|
1031
|
+
raise TypeError('for RevLex-Index, the rank needs to be specified')
|
|
1032
|
+
|
|
1033
|
+
groundset = tuple(groundset)
|
|
1034
|
+
data = tuple(data)
|
|
1035
|
+
rk = int(rk)
|
|
1036
|
+
N = len(groundset)
|
|
1037
|
+
|
|
1038
|
+
def revlex_sort_key(s):
|
|
1039
|
+
return tuple(reversed(s))
|
|
1040
|
+
subsets = sorted(combinations(range(N), rk), key=revlex_sort_key)
|
|
1041
|
+
if len(data) != len(subsets):
|
|
1042
|
+
raise ValueError("expected string of length %s (%s choose %s), got %s" %
|
|
1043
|
+
(len(subsets), N, rk, len(data)))
|
|
1044
|
+
bases = [[groundset[c] for c in subsets[i]]
|
|
1045
|
+
for i, x in enumerate(data) if x != '0']
|
|
1046
|
+
M = BasisMatroid(groundset=groundset, bases=bases)
|
|
1047
|
+
|
|
1048
|
+
# Circuit closures:
|
|
1049
|
+
elif key == 'circuit_closures':
|
|
1050
|
+
if isinstance(data, dict):
|
|
1051
|
+
CC = data
|
|
1052
|
+
else:
|
|
1053
|
+
# Convert to dictionary
|
|
1054
|
+
CC = {}
|
|
1055
|
+
for X in data:
|
|
1056
|
+
if X[0] not in CC:
|
|
1057
|
+
CC[X[0]] = []
|
|
1058
|
+
CC[X[0]].append(X[1])
|
|
1059
|
+
|
|
1060
|
+
if groundset is None:
|
|
1061
|
+
groundset = set()
|
|
1062
|
+
for X in CC.values():
|
|
1063
|
+
for Y in X:
|
|
1064
|
+
groundset.update(Y)
|
|
1065
|
+
|
|
1066
|
+
M = CircuitClosuresMatroid(groundset=groundset, circuit_closures=CC)
|
|
1067
|
+
|
|
1068
|
+
# Matroids:
|
|
1069
|
+
elif key == 'matroid':
|
|
1070
|
+
if not isinstance(data, sage.matroids.matroid.Matroid):
|
|
1071
|
+
raise TypeError("input {!r} is not a matroid".format(data))
|
|
1072
|
+
M = data
|
|
1073
|
+
|
|
1074
|
+
else:
|
|
1075
|
+
raise AssertionError("unknown key %r" % key)
|
|
1076
|
+
|
|
1077
|
+
# All keywords should be used
|
|
1078
|
+
for k in kwds:
|
|
1079
|
+
raise TypeError("Matroid() got an unexpected keyword argument '{}'".format(k))
|
|
1080
|
+
|
|
1081
|
+
if want_regular:
|
|
1082
|
+
M = sage.matroids.utilities.make_regular_matroid_from_matroid(M)
|
|
1083
|
+
if check and not M.is_valid():
|
|
1084
|
+
raise ValueError('input is not a valid regular matroid')
|
|
1085
|
+
|
|
1086
|
+
return M
|