passagemath-categories 10.6.32__cp314-cp314t-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.
- passagemath_categories-10.6.32.dist-info/METADATA +156 -0
- passagemath_categories-10.6.32.dist-info/RECORD +719 -0
- passagemath_categories-10.6.32.dist-info/WHEEL +5 -0
- passagemath_categories-10.6.32.dist-info/top_level.txt +2 -0
- passagemath_categories.libs/libgcc_s-2d945d6c.so.1 +0 -0
- passagemath_categories.libs/libgmp-28992bcb.so.10.5.0 +0 -0
- passagemath_categories.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
- sage/all__sagemath_categories.py +28 -0
- sage/arith/all.py +38 -0
- sage/arith/constants.pxd +27 -0
- sage/arith/functions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/functions.pxd +4 -0
- sage/arith/functions.pyx +221 -0
- sage/arith/misc.py +6552 -0
- sage/arith/multi_modular.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/multi_modular.pxd +39 -0
- sage/arith/multi_modular.pyx +994 -0
- sage/arith/rational_reconstruction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/rational_reconstruction.pxd +4 -0
- sage/arith/rational_reconstruction.pyx +115 -0
- sage/arith/srange.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/arith/srange.pyx +571 -0
- sage/calculus/all__sagemath_categories.py +2 -0
- sage/calculus/functional.py +481 -0
- sage/calculus/functions.py +151 -0
- sage/categories/additive_groups.py +73 -0
- sage/categories/additive_magmas.py +1044 -0
- sage/categories/additive_monoids.py +114 -0
- sage/categories/additive_semigroups.py +184 -0
- sage/categories/affine_weyl_groups.py +238 -0
- sage/categories/algebra_ideals.py +95 -0
- sage/categories/algebra_modules.py +96 -0
- sage/categories/algebras.py +349 -0
- sage/categories/algebras_with_basis.py +377 -0
- sage/categories/all.py +160 -0
- sage/categories/aperiodic_semigroups.py +29 -0
- sage/categories/associative_algebras.py +47 -0
- sage/categories/bialgebras.py +101 -0
- sage/categories/bialgebras_with_basis.py +414 -0
- sage/categories/bimodules.py +206 -0
- sage/categories/chain_complexes.py +268 -0
- sage/categories/classical_crystals.py +480 -0
- sage/categories/coalgebras.py +405 -0
- sage/categories/coalgebras_with_basis.py +232 -0
- sage/categories/coercion_methods.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/coercion_methods.pyx +52 -0
- sage/categories/commutative_additive_groups.py +104 -0
- sage/categories/commutative_additive_monoids.py +45 -0
- sage/categories/commutative_additive_semigroups.py +48 -0
- sage/categories/commutative_algebra_ideals.py +87 -0
- sage/categories/commutative_algebras.py +94 -0
- sage/categories/commutative_ring_ideals.py +58 -0
- sage/categories/commutative_rings.py +736 -0
- sage/categories/complete_discrete_valuation.py +293 -0
- sage/categories/complex_reflection_groups.py +145 -0
- sage/categories/complex_reflection_or_generalized_coxeter_groups.py +1249 -0
- sage/categories/coxeter_group_algebras.py +186 -0
- sage/categories/coxeter_groups.py +3402 -0
- sage/categories/crystals.py +2628 -0
- sage/categories/cw_complexes.py +216 -0
- sage/categories/dedekind_domains.py +137 -0
- sage/categories/discrete_valuation.py +325 -0
- sage/categories/distributive_magmas_and_additive_magmas.py +100 -0
- sage/categories/division_rings.py +114 -0
- sage/categories/domains.py +95 -0
- sage/categories/drinfeld_modules.py +789 -0
- sage/categories/dual.py +42 -0
- sage/categories/enumerated_sets.py +1146 -0
- sage/categories/euclidean_domains.py +271 -0
- sage/categories/examples/algebras_with_basis.py +102 -0
- sage/categories/examples/all.py +1 -0
- sage/categories/examples/commutative_additive_monoids.py +130 -0
- sage/categories/examples/commutative_additive_semigroups.py +199 -0
- sage/categories/examples/coxeter_groups.py +8 -0
- sage/categories/examples/crystals.py +236 -0
- sage/categories/examples/cw_complexes.py +163 -0
- sage/categories/examples/facade_sets.py +187 -0
- sage/categories/examples/filtered_algebras_with_basis.py +204 -0
- sage/categories/examples/filtered_modules_with_basis.py +154 -0
- sage/categories/examples/finite_coxeter_groups.py +252 -0
- sage/categories/examples/finite_dimensional_algebras_with_basis.py +148 -0
- sage/categories/examples/finite_dimensional_lie_algebras_with_basis.py +495 -0
- sage/categories/examples/finite_enumerated_sets.py +208 -0
- sage/categories/examples/finite_monoids.py +150 -0
- sage/categories/examples/finite_semigroups.py +190 -0
- sage/categories/examples/finite_weyl_groups.py +191 -0
- sage/categories/examples/graded_connected_hopf_algebras_with_basis.py +152 -0
- sage/categories/examples/graded_modules_with_basis.py +168 -0
- sage/categories/examples/graphs.py +122 -0
- sage/categories/examples/hopf_algebras_with_basis.py +145 -0
- sage/categories/examples/infinite_enumerated_sets.py +190 -0
- sage/categories/examples/lie_algebras.py +352 -0
- sage/categories/examples/lie_algebras_with_basis.py +196 -0
- sage/categories/examples/magmas.py +162 -0
- sage/categories/examples/manifolds.py +94 -0
- sage/categories/examples/monoids.py +144 -0
- sage/categories/examples/posets.py +178 -0
- sage/categories/examples/semigroups.py +580 -0
- sage/categories/examples/semigroups_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/categories/examples/semigroups_cython.pyx +221 -0
- sage/categories/examples/semirings.py +249 -0
- sage/categories/examples/sets_cat.py +706 -0
- sage/categories/examples/sets_with_grading.py +101 -0
- sage/categories/examples/with_realizations.py +542 -0
- sage/categories/fields.py +991 -0
- sage/categories/filtered_algebras.py +63 -0
- sage/categories/filtered_algebras_with_basis.py +548 -0
- sage/categories/filtered_hopf_algebras_with_basis.py +138 -0
- sage/categories/filtered_modules.py +210 -0
- sage/categories/filtered_modules_with_basis.py +1209 -0
- sage/categories/finite_complex_reflection_groups.py +1506 -0
- sage/categories/finite_coxeter_groups.py +1138 -0
- sage/categories/finite_crystals.py +103 -0
- sage/categories/finite_dimensional_algebras_with_basis.py +1860 -0
- sage/categories/finite_dimensional_bialgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_coalgebras_with_basis.py +33 -0
- sage/categories/finite_dimensional_graded_lie_algebras_with_basis.py +231 -0
- sage/categories/finite_dimensional_hopf_algebras_with_basis.py +38 -0
- sage/categories/finite_dimensional_lie_algebras_with_basis.py +2774 -0
- sage/categories/finite_dimensional_modules_with_basis.py +1407 -0
- sage/categories/finite_dimensional_nilpotent_lie_algebras_with_basis.py +167 -0
- sage/categories/finite_dimensional_semisimple_algebras_with_basis.py +270 -0
- sage/categories/finite_enumerated_sets.py +769 -0
- sage/categories/finite_fields.py +252 -0
- sage/categories/finite_groups.py +256 -0
- sage/categories/finite_lattice_posets.py +242 -0
- sage/categories/finite_monoids.py +316 -0
- sage/categories/finite_permutation_groups.py +339 -0
- sage/categories/finite_posets.py +1994 -0
- sage/categories/finite_semigroups.py +136 -0
- sage/categories/finite_sets.py +93 -0
- sage/categories/finite_weyl_groups.py +39 -0
- sage/categories/finitely_generated_lambda_bracket_algebras.py +112 -0
- sage/categories/finitely_generated_lie_conformal_algebras.py +114 -0
- sage/categories/finitely_generated_magmas.py +57 -0
- sage/categories/finitely_generated_semigroups.py +214 -0
- sage/categories/function_fields.py +76 -0
- sage/categories/g_sets.py +77 -0
- sage/categories/gcd_domains.py +65 -0
- sage/categories/generalized_coxeter_groups.py +94 -0
- sage/categories/graded_algebras.py +85 -0
- sage/categories/graded_algebras_with_basis.py +258 -0
- sage/categories/graded_bialgebras.py +32 -0
- sage/categories/graded_bialgebras_with_basis.py +32 -0
- sage/categories/graded_coalgebras.py +65 -0
- sage/categories/graded_coalgebras_with_basis.py +51 -0
- sage/categories/graded_hopf_algebras.py +41 -0
- sage/categories/graded_hopf_algebras_with_basis.py +169 -0
- sage/categories/graded_lie_algebras.py +91 -0
- sage/categories/graded_lie_algebras_with_basis.py +44 -0
- sage/categories/graded_lie_conformal_algebras.py +74 -0
- sage/categories/graded_modules.py +133 -0
- sage/categories/graded_modules_with_basis.py +329 -0
- sage/categories/graphs.py +138 -0
- sage/categories/group_algebras.py +430 -0
- sage/categories/groupoid.py +94 -0
- sage/categories/groups.py +667 -0
- sage/categories/h_trivial_semigroups.py +64 -0
- sage/categories/hecke_modules.py +185 -0
- sage/categories/highest_weight_crystals.py +980 -0
- sage/categories/hopf_algebras.py +219 -0
- sage/categories/hopf_algebras_with_basis.py +309 -0
- sage/categories/infinite_enumerated_sets.py +115 -0
- sage/categories/integral_domains.py +203 -0
- sage/categories/j_trivial_semigroups.py +29 -0
- sage/categories/kac_moody_algebras.py +82 -0
- sage/categories/kahler_algebras.py +203 -0
- sage/categories/l_trivial_semigroups.py +63 -0
- sage/categories/lambda_bracket_algebras.py +280 -0
- sage/categories/lambda_bracket_algebras_with_basis.py +107 -0
- sage/categories/lattice_posets.py +89 -0
- sage/categories/left_modules.py +49 -0
- sage/categories/lie_algebras.py +1070 -0
- sage/categories/lie_algebras_with_basis.py +261 -0
- sage/categories/lie_conformal_algebras.py +350 -0
- sage/categories/lie_conformal_algebras_with_basis.py +147 -0
- sage/categories/lie_groups.py +73 -0
- sage/categories/loop_crystals.py +1290 -0
- sage/categories/magmas.py +1189 -0
- sage/categories/magmas_and_additive_magmas.py +149 -0
- sage/categories/magmatic_algebras.py +365 -0
- sage/categories/manifolds.py +352 -0
- sage/categories/matrix_algebras.py +40 -0
- sage/categories/metric_spaces.py +387 -0
- sage/categories/modular_abelian_varieties.py +78 -0
- sage/categories/modules.py +989 -0
- sage/categories/modules_with_basis.py +2794 -0
- sage/categories/monoid_algebras.py +38 -0
- sage/categories/monoids.py +739 -0
- sage/categories/noetherian_rings.py +87 -0
- sage/categories/number_fields.py +242 -0
- sage/categories/ore_modules.py +189 -0
- sage/categories/partially_ordered_monoids.py +49 -0
- sage/categories/permutation_groups.py +63 -0
- sage/categories/pointed_sets.py +42 -0
- sage/categories/polyhedra.py +74 -0
- sage/categories/poor_man_map.py +270 -0
- sage/categories/posets.py +722 -0
- sage/categories/principal_ideal_domains.py +270 -0
- sage/categories/quantum_group_representations.py +543 -0
- sage/categories/quotient_fields.py +728 -0
- sage/categories/r_trivial_semigroups.py +45 -0
- sage/categories/regular_crystals.py +898 -0
- sage/categories/regular_supercrystals.py +170 -0
- sage/categories/right_modules.py +49 -0
- sage/categories/ring_ideals.py +74 -0
- sage/categories/rings.py +1904 -0
- sage/categories/rngs.py +175 -0
- sage/categories/schemes.py +393 -0
- sage/categories/semigroups.py +1060 -0
- sage/categories/semirings.py +71 -0
- sage/categories/semisimple_algebras.py +114 -0
- sage/categories/sets_with_grading.py +235 -0
- sage/categories/shephard_groups.py +43 -0
- sage/categories/signed_tensor.py +120 -0
- sage/categories/simplicial_complexes.py +134 -0
- sage/categories/simplicial_sets.py +1206 -0
- sage/categories/super_algebras.py +149 -0
- sage/categories/super_algebras_with_basis.py +144 -0
- sage/categories/super_hopf_algebras_with_basis.py +126 -0
- sage/categories/super_lie_conformal_algebras.py +193 -0
- sage/categories/super_modules.py +229 -0
- sage/categories/super_modules_with_basis.py +193 -0
- sage/categories/supercommutative_algebras.py +99 -0
- sage/categories/supercrystals.py +406 -0
- sage/categories/tensor.py +110 -0
- sage/categories/topological_spaces.py +170 -0
- sage/categories/triangular_kac_moody_algebras.py +439 -0
- sage/categories/tutorial.py +58 -0
- sage/categories/unique_factorization_domains.py +318 -0
- sage/categories/unital_algebras.py +426 -0
- sage/categories/vector_bundles.py +159 -0
- sage/categories/vector_spaces.py +357 -0
- sage/categories/weyl_groups.py +853 -0
- sage/combinat/all__sagemath_categories.py +34 -0
- sage/combinat/backtrack.py +180 -0
- sage/combinat/combinat.py +2269 -0
- sage/combinat/combinat_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/combinat_cython.pxd +6 -0
- sage/combinat/combinat_cython.pyx +390 -0
- sage/combinat/combination.py +796 -0
- sage/combinat/combinatorial_map.py +416 -0
- sage/combinat/composition.py +2192 -0
- sage/combinat/dlx.py +510 -0
- sage/combinat/integer_lists/__init__.py +7 -0
- sage/combinat/integer_lists/base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/base.pxd +16 -0
- sage/combinat/integer_lists/base.pyx +713 -0
- sage/combinat/integer_lists/invlex.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/integer_lists/invlex.pxd +4 -0
- sage/combinat/integer_lists/invlex.pyx +1650 -0
- sage/combinat/integer_lists/lists.py +328 -0
- sage/combinat/integer_lists/nn.py +48 -0
- sage/combinat/integer_vector.py +1818 -0
- sage/combinat/integer_vector_weighted.py +413 -0
- sage/combinat/matrices/all__sagemath_categories.py +5 -0
- sage/combinat/matrices/dancing_links.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/matrices/dancing_links.pyx +1159 -0
- sage/combinat/matrices/dancing_links_c.h +380 -0
- sage/combinat/matrices/dlxcpp.py +136 -0
- sage/combinat/partition.py +10070 -0
- sage/combinat/partitions.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/partitions.pyx +743 -0
- sage/combinat/permutation.py +10168 -0
- sage/combinat/permutation_cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/combinat/permutation_cython.pxd +11 -0
- sage/combinat/permutation_cython.pyx +407 -0
- sage/combinat/q_analogues.py +1090 -0
- sage/combinat/ranker.py +268 -0
- sage/combinat/subset.py +1561 -0
- sage/combinat/subsets_hereditary.py +202 -0
- sage/combinat/subsets_pairwise.py +184 -0
- sage/combinat/tools.py +63 -0
- sage/combinat/tuple.py +348 -0
- sage/data_structures/all.py +2 -0
- sage/data_structures/all__sagemath_categories.py +2 -0
- sage/data_structures/binary_matrix.pxd +138 -0
- sage/data_structures/binary_search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/binary_search.pxd +3 -0
- sage/data_structures/binary_search.pyx +66 -0
- sage/data_structures/bitset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset.pxd +40 -0
- sage/data_structures/bitset.pyx +2385 -0
- sage/data_structures/bitset_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/bitset_base.pxd +926 -0
- sage/data_structures/bitset_base.pyx +117 -0
- sage/data_structures/bitset_intrinsics.h +487 -0
- sage/data_structures/blas_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/blas_dict.pxd +12 -0
- sage/data_structures/blas_dict.pyx +469 -0
- sage/data_structures/list_of_pairs.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/list_of_pairs.pxd +16 -0
- sage/data_structures/list_of_pairs.pyx +122 -0
- sage/data_structures/mutable_poset.py +3312 -0
- sage/data_structures/pairing_heap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/data_structures/pairing_heap.h +346 -0
- sage/data_structures/pairing_heap.pxd +88 -0
- sage/data_structures/pairing_heap.pyx +1464 -0
- sage/data_structures/sparse_bitset.pxd +62 -0
- sage/data_structures/stream.py +5070 -0
- sage/databases/all__sagemath_categories.py +7 -0
- sage/databases/sql_db.py +2236 -0
- sage/ext/all__sagemath_categories.py +3 -0
- sage/ext/fast_callable.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_callable.pxd +4 -0
- sage/ext/fast_callable.pyx +2746 -0
- sage/ext/fast_eval.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/fast_eval.pxd +1 -0
- sage/ext/fast_eval.pyx +102 -0
- sage/ext/interpreters/__init__.py +1 -0
- sage/ext/interpreters/all__sagemath_categories.py +2 -0
- sage/ext/interpreters/wrapper_el.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_el.pxd +18 -0
- sage/ext/interpreters/wrapper_el.pyx +148 -0
- sage/ext/interpreters/wrapper_py.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/ext/interpreters/wrapper_py.pxd +17 -0
- sage/ext/interpreters/wrapper_py.pyx +133 -0
- sage/functions/airy.py +937 -0
- sage/functions/all.py +97 -0
- sage/functions/bessel.py +2102 -0
- sage/functions/error.py +784 -0
- sage/functions/exp_integral.py +1529 -0
- sage/functions/gamma.py +1087 -0
- sage/functions/generalized.py +672 -0
- sage/functions/hyperbolic.py +747 -0
- sage/functions/hypergeometric.py +1156 -0
- sage/functions/jacobi.py +1705 -0
- sage/functions/log.py +1402 -0
- sage/functions/min_max.py +338 -0
- sage/functions/orthogonal_polys.py +3106 -0
- sage/functions/other.py +2303 -0
- sage/functions/piecewise.py +1505 -0
- sage/functions/prime_pi.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/functions/prime_pi.pyx +262 -0
- sage/functions/special.py +1212 -0
- sage/functions/spike_function.py +278 -0
- sage/functions/transcendental.py +690 -0
- sage/functions/trig.py +1062 -0
- sage/functions/wigner.py +726 -0
- sage/geometry/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/geometry/abc.pyx +82 -0
- sage/geometry/all__sagemath_categories.py +1 -0
- sage/groups/all__sagemath_categories.py +11 -0
- sage/groups/generic.py +1733 -0
- sage/groups/groups_catalog.py +113 -0
- sage/groups/perm_gps/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/all.py +1 -0
- sage/groups/perm_gps/partn_ref/all__sagemath_categories.py +1 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pxd +52 -0
- sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx +906 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pxd +85 -0
- sage/groups/perm_gps/partn_ref/canonical_augmentation.pyx +534 -0
- sage/groups/perm_gps/partn_ref/data_structures.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/data_structures.pxd +576 -0
- sage/groups/perm_gps/partn_ref/data_structures.pyx +1792 -0
- sage/groups/perm_gps/partn_ref/double_coset.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/double_coset.pxd +45 -0
- sage/groups/perm_gps/partn_ref/double_coset.pyx +739 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pxd +18 -0
- sage/groups/perm_gps/partn_ref/refinement_lists.pyx +82 -0
- sage/groups/perm_gps/partn_ref/refinement_python.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pxd +16 -0
- sage/groups/perm_gps/partn_ref/refinement_python.pyx +564 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pxd +60 -0
- sage/groups/perm_gps/partn_ref/refinement_sets.pyx +858 -0
- sage/interfaces/abc.py +140 -0
- sage/interfaces/all.py +58 -0
- sage/interfaces/all__sagemath_categories.py +1 -0
- sage/interfaces/expect.py +1643 -0
- sage/interfaces/interface.py +1682 -0
- sage/interfaces/process.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/process.pxd +5 -0
- sage/interfaces/process.pyx +288 -0
- sage/interfaces/quit.py +167 -0
- sage/interfaces/sage0.py +604 -0
- sage/interfaces/sagespawn.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/interfaces/sagespawn.pyx +308 -0
- sage/interfaces/tab_completion.py +101 -0
- sage/misc/all__sagemath_categories.py +78 -0
- sage/misc/allocator.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/allocator.pxd +6 -0
- sage/misc/allocator.pyx +47 -0
- sage/misc/binary_tree.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/binary_tree.pxd +29 -0
- sage/misc/binary_tree.pyx +537 -0
- sage/misc/callable_dict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/callable_dict.pyx +89 -0
- sage/misc/citation.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/citation.pyx +159 -0
- sage/misc/converting_dict.py +293 -0
- sage/misc/defaults.py +129 -0
- sage/misc/derivative.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/derivative.pyx +223 -0
- sage/misc/functional.py +2005 -0
- sage/misc/html.py +589 -0
- sage/misc/latex.py +2673 -0
- sage/misc/latex_macros.py +236 -0
- sage/misc/latex_standalone.py +1833 -0
- sage/misc/map_threaded.py +38 -0
- sage/misc/mathml.py +76 -0
- sage/misc/method_decorator.py +88 -0
- sage/misc/mrange.py +755 -0
- sage/misc/multireplace.py +41 -0
- sage/misc/object_multiplexer.py +92 -0
- sage/misc/parser.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/parser.pyx +1107 -0
- sage/misc/random_testing.py +264 -0
- sage/misc/rest_index_of_methods.py +377 -0
- sage/misc/search.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/search.pxd +2 -0
- sage/misc/search.pyx +68 -0
- sage/misc/stopgap.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/misc/stopgap.pyx +95 -0
- sage/misc/table.py +853 -0
- sage/monoids/all__sagemath_categories.py +1 -0
- sage/monoids/indexed_free_monoid.py +1071 -0
- sage/monoids/monoid.py +82 -0
- sage/numerical/all__sagemath_categories.py +1 -0
- sage/numerical/backends/all__sagemath_categories.py +1 -0
- sage/numerical/backends/generic_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_backend.pxd +61 -0
- sage/numerical/backends/generic_backend.pyx +1893 -0
- sage/numerical/backends/generic_sdp_backend.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/numerical/backends/generic_sdp_backend.pxd +38 -0
- sage/numerical/backends/generic_sdp_backend.pyx +755 -0
- sage/parallel/all.py +6 -0
- sage/parallel/decorate.py +575 -0
- sage/parallel/map_reduce.py +1997 -0
- sage/parallel/multiprocessing_sage.py +76 -0
- sage/parallel/ncpus.py +35 -0
- sage/parallel/parallelism.py +364 -0
- sage/parallel/reference.py +47 -0
- sage/parallel/use_fork.py +333 -0
- sage/rings/abc.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/abc.pxd +31 -0
- sage/rings/abc.pyx +526 -0
- sage/rings/algebraic_closure_finite_field.py +1154 -0
- sage/rings/all__sagemath_categories.py +91 -0
- sage/rings/big_oh.py +227 -0
- sage/rings/continued_fraction.py +2754 -0
- sage/rings/continued_fraction_gosper.py +220 -0
- sage/rings/factorint.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/factorint.pyx +295 -0
- sage/rings/fast_arith.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fast_arith.pxd +21 -0
- sage/rings/fast_arith.pyx +535 -0
- sage/rings/finite_rings/all__sagemath_categories.py +9 -0
- sage/rings/finite_rings/conway_polynomials.py +542 -0
- sage/rings/finite_rings/element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/element_base.pxd +12 -0
- sage/rings/finite_rings/element_base.pyx +1176 -0
- sage/rings/finite_rings/finite_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/finite_field_base.pxd +7 -0
- sage/rings/finite_rings/finite_field_base.pyx +2171 -0
- sage/rings/finite_rings/finite_field_constructor.py +827 -0
- sage/rings/finite_rings/finite_field_prime_modn.py +372 -0
- sage/rings/finite_rings/galois_group.py +154 -0
- sage/rings/finite_rings/hom_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_finite_field.pxd +23 -0
- sage/rings/finite_rings/hom_finite_field.pyx +856 -0
- sage/rings/finite_rings/hom_prime_finite_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/hom_prime_finite_field.pxd +15 -0
- sage/rings/finite_rings/hom_prime_finite_field.pyx +164 -0
- sage/rings/finite_rings/homset.py +357 -0
- sage/rings/finite_rings/integer_mod.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/integer_mod.pxd +56 -0
- sage/rings/finite_rings/integer_mod.pyx +4586 -0
- sage/rings/finite_rings/integer_mod_limits.h +11 -0
- sage/rings/finite_rings/integer_mod_ring.py +2044 -0
- sage/rings/finite_rings/residue_field.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/finite_rings/residue_field.pxd +30 -0
- sage/rings/finite_rings/residue_field.pyx +1811 -0
- sage/rings/finite_rings/stdint.pxd +19 -0
- sage/rings/fraction_field.py +1452 -0
- sage/rings/fraction_field_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/fraction_field_element.pyx +1357 -0
- sage/rings/function_field/all.py +7 -0
- sage/rings/function_field/all__sagemath_categories.py +2 -0
- sage/rings/function_field/constructor.py +218 -0
- sage/rings/function_field/element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element.pxd +11 -0
- sage/rings/function_field/element.pyx +1008 -0
- sage/rings/function_field/element_rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/function_field/element_rational.pyx +513 -0
- sage/rings/function_field/extensions.py +230 -0
- sage/rings/function_field/function_field.py +1468 -0
- sage/rings/function_field/function_field_rational.py +1005 -0
- sage/rings/function_field/ideal.py +1155 -0
- sage/rings/function_field/ideal_rational.py +629 -0
- sage/rings/function_field/jacobian_base.py +826 -0
- sage/rings/function_field/jacobian_hess.py +1053 -0
- sage/rings/function_field/jacobian_khuri_makdisi.py +1027 -0
- sage/rings/function_field/maps.py +1039 -0
- sage/rings/function_field/order.py +281 -0
- sage/rings/function_field/order_basis.py +586 -0
- sage/rings/function_field/order_rational.py +576 -0
- sage/rings/function_field/place.py +426 -0
- sage/rings/function_field/place_rational.py +181 -0
- sage/rings/generic.py +320 -0
- sage/rings/homset.py +332 -0
- sage/rings/ideal.py +1885 -0
- sage/rings/ideal_monoid.py +215 -0
- sage/rings/infinity.py +1890 -0
- sage/rings/integer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer.pxd +45 -0
- sage/rings/integer.pyx +7874 -0
- sage/rings/integer_ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/integer_ring.pxd +8 -0
- sage/rings/integer_ring.pyx +1693 -0
- sage/rings/laurent_series_ring.py +931 -0
- sage/rings/laurent_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/laurent_series_ring_element.pxd +11 -0
- sage/rings/laurent_series_ring_element.pyx +1927 -0
- sage/rings/lazy_series.py +7815 -0
- sage/rings/lazy_series_ring.py +4356 -0
- sage/rings/localization.py +1043 -0
- sage/rings/morphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/morphism.pxd +39 -0
- sage/rings/morphism.pyx +3299 -0
- sage/rings/multi_power_series_ring.py +1145 -0
- sage/rings/multi_power_series_ring_element.py +2184 -0
- sage/rings/noncommutative_ideals.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/noncommutative_ideals.pyx +423 -0
- sage/rings/number_field/all__sagemath_categories.py +1 -0
- sage/rings/number_field/number_field_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_base.pxd +8 -0
- sage/rings/number_field/number_field_base.pyx +507 -0
- sage/rings/number_field/number_field_element_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/number_field/number_field_element_base.pxd +6 -0
- sage/rings/number_field/number_field_element_base.pyx +36 -0
- sage/rings/number_field/number_field_ideal.py +3550 -0
- sage/rings/padics/all__sagemath_categories.py +4 -0
- sage/rings/padics/local_generic.py +1670 -0
- sage/rings/padics/local_generic_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/local_generic_element.pxd +5 -0
- sage/rings/padics/local_generic_element.pyx +1017 -0
- sage/rings/padics/misc.py +256 -0
- sage/rings/padics/padic_generic.py +1911 -0
- sage/rings/padics/pow_computer.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/padics/pow_computer.pxd +38 -0
- sage/rings/padics/pow_computer.pyx +671 -0
- sage/rings/padics/precision_error.py +24 -0
- sage/rings/polynomial/all__sagemath_categories.py +25 -0
- sage/rings/polynomial/commutative_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/commutative_polynomial.pxd +6 -0
- sage/rings/polynomial/commutative_polynomial.pyx +24 -0
- sage/rings/polynomial/cyclotomic.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/cyclotomic.pyx +404 -0
- sage/rings/polynomial/flatten.py +711 -0
- sage/rings/polynomial/ideal.py +102 -0
- sage/rings/polynomial/infinite_polynomial_element.py +1768 -0
- sage/rings/polynomial/infinite_polynomial_ring.py +1653 -0
- sage/rings/polynomial/laurent_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/laurent_polynomial.pxd +18 -0
- sage/rings/polynomial/laurent_polynomial.pyx +2190 -0
- sage/rings/polynomial/laurent_polynomial_ideal.py +590 -0
- sage/rings/polynomial/laurent_polynomial_ring.py +832 -0
- sage/rings/polynomial/laurent_polynomial_ring_base.py +708 -0
- sage/rings/polynomial/multi_polynomial.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial.pxd +12 -0
- sage/rings/polynomial/multi_polynomial.pyx +3082 -0
- sage/rings/polynomial/multi_polynomial_element.py +2570 -0
- sage/rings/polynomial/multi_polynomial_ideal.py +5771 -0
- sage/rings/polynomial/multi_polynomial_ring.py +947 -0
- sage/rings/polynomial/multi_polynomial_ring_base.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pxd +15 -0
- sage/rings/polynomial/multi_polynomial_ring_base.pyx +1855 -0
- sage/rings/polynomial/multi_polynomial_sequence.py +2204 -0
- sage/rings/polynomial/polydict.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polydict.pxd +45 -0
- sage/rings/polynomial/polydict.pyx +2701 -0
- sage/rings/polynomial/polynomial_compiled.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_compiled.pxd +59 -0
- sage/rings/polynomial/polynomial_compiled.pyx +509 -0
- sage/rings/polynomial/polynomial_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_element.pxd +64 -0
- sage/rings/polynomial/polynomial_element.pyx +13255 -0
- sage/rings/polynomial/polynomial_element_generic.py +1637 -0
- sage/rings/polynomial/polynomial_fateman.py +97 -0
- sage/rings/polynomial/polynomial_quotient_ring.py +2465 -0
- sage/rings/polynomial/polynomial_quotient_ring_element.py +779 -0
- sage/rings/polynomial/polynomial_ring.py +3784 -0
- sage/rings/polynomial/polynomial_ring_constructor.py +1051 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pxd +5 -0
- sage/rings/polynomial/polynomial_ring_homomorphism.pyx +121 -0
- sage/rings/polynomial/polynomial_singular_interface.py +549 -0
- sage/rings/polynomial/symmetric_ideal.py +989 -0
- sage/rings/polynomial/symmetric_reduction.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/polynomial/symmetric_reduction.pxd +8 -0
- sage/rings/polynomial/symmetric_reduction.pyx +669 -0
- sage/rings/polynomial/term_order.py +2279 -0
- sage/rings/polynomial/toy_buchberger.py +449 -0
- sage/rings/polynomial/toy_d_basis.py +387 -0
- sage/rings/polynomial/toy_variety.py +362 -0
- sage/rings/power_series_mpoly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_mpoly.pxd +9 -0
- sage/rings/power_series_mpoly.pyx +161 -0
- sage/rings/power_series_poly.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_poly.pxd +10 -0
- sage/rings/power_series_poly.pyx +1317 -0
- sage/rings/power_series_ring.py +1441 -0
- sage/rings/power_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/power_series_ring_element.pxd +12 -0
- sage/rings/power_series_ring_element.pyx +3028 -0
- sage/rings/puiseux_series_ring.py +487 -0
- sage/rings/puiseux_series_ring_element.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/puiseux_series_ring_element.pxd +7 -0
- sage/rings/puiseux_series_ring_element.pyx +1055 -0
- sage/rings/qqbar_decorators.py +167 -0
- sage/rings/quotient_ring.py +1598 -0
- sage/rings/quotient_ring_element.py +979 -0
- sage/rings/rational.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/rational.pxd +20 -0
- sage/rings/rational.pyx +4284 -0
- sage/rings/rational_field.py +1730 -0
- sage/rings/real_double.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_double.pxd +16 -0
- sage/rings/real_double.pyx +2218 -0
- sage/rings/real_lazy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/real_lazy.pxd +30 -0
- sage/rings/real_lazy.pyx +1773 -0
- sage/rings/ring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/ring.pxd +30 -0
- sage/rings/ring.pyx +850 -0
- sage/rings/semirings/all.py +3 -0
- sage/rings/semirings/non_negative_integer_semiring.py +107 -0
- sage/rings/semirings/tropical_mpolynomial.py +972 -0
- sage/rings/semirings/tropical_polynomial.py +997 -0
- sage/rings/semirings/tropical_semiring.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/semirings/tropical_semiring.pyx +676 -0
- sage/rings/semirings/tropical_variety.py +1701 -0
- sage/rings/sum_of_squares.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/rings/sum_of_squares.pxd +3 -0
- sage/rings/sum_of_squares.pyx +336 -0
- sage/rings/tests.py +504 -0
- sage/schemes/affine/affine_homset.py +508 -0
- sage/schemes/affine/affine_morphism.py +1574 -0
- sage/schemes/affine/affine_point.py +460 -0
- sage/schemes/affine/affine_rational_point.py +308 -0
- sage/schemes/affine/affine_space.py +1264 -0
- sage/schemes/affine/affine_subscheme.py +592 -0
- sage/schemes/affine/all.py +25 -0
- sage/schemes/all__sagemath_categories.py +5 -0
- sage/schemes/generic/algebraic_scheme.py +2092 -0
- sage/schemes/generic/all.py +5 -0
- sage/schemes/generic/ambient_space.py +400 -0
- sage/schemes/generic/divisor.py +465 -0
- sage/schemes/generic/divisor_group.py +313 -0
- sage/schemes/generic/glue.py +84 -0
- sage/schemes/generic/homset.py +820 -0
- sage/schemes/generic/hypersurface.py +234 -0
- sage/schemes/generic/morphism.py +2107 -0
- sage/schemes/generic/point.py +237 -0
- sage/schemes/generic/scheme.py +1190 -0
- sage/schemes/generic/spec.py +199 -0
- sage/schemes/product_projective/all.py +6 -0
- sage/schemes/product_projective/homset.py +236 -0
- sage/schemes/product_projective/morphism.py +517 -0
- sage/schemes/product_projective/point.py +568 -0
- sage/schemes/product_projective/rational_point.py +550 -0
- sage/schemes/product_projective/space.py +1301 -0
- sage/schemes/product_projective/subscheme.py +466 -0
- sage/schemes/projective/all.py +24 -0
- sage/schemes/projective/proj_bdd_height.py +453 -0
- sage/schemes/projective/projective_homset.py +718 -0
- sage/schemes/projective/projective_morphism.py +2792 -0
- sage/schemes/projective/projective_point.py +1484 -0
- sage/schemes/projective/projective_rational_point.py +569 -0
- sage/schemes/projective/projective_space.py +2571 -0
- sage/schemes/projective/projective_subscheme.py +1574 -0
- sage/sets/all.py +17 -0
- sage/sets/cartesian_product.py +376 -0
- sage/sets/condition_set.py +525 -0
- sage/sets/disjoint_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/disjoint_set.pxd +36 -0
- sage/sets/disjoint_set.pyx +998 -0
- sage/sets/disjoint_union_enumerated_sets.py +625 -0
- sage/sets/family.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/family.pxd +12 -0
- sage/sets/family.pyx +1556 -0
- sage/sets/finite_enumerated_set.py +406 -0
- sage/sets/finite_set_map_cy.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/finite_set_map_cy.pxd +34 -0
- sage/sets/finite_set_map_cy.pyx +708 -0
- sage/sets/finite_set_maps.py +591 -0
- sage/sets/image_set.py +448 -0
- sage/sets/integer_range.py +829 -0
- sage/sets/non_negative_integers.py +241 -0
- sage/sets/positive_integers.py +93 -0
- sage/sets/primes.py +188 -0
- sage/sets/real_set.py +2760 -0
- sage/sets/recursively_enumerated_set.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/sets/recursively_enumerated_set.pxd +31 -0
- sage/sets/recursively_enumerated_set.pyx +2082 -0
- sage/sets/set.py +2083 -0
- sage/sets/set_from_iterator.py +1021 -0
- sage/sets/totally_ordered_finite_set.py +329 -0
- sage/symbolic/all__sagemath_categories.py +1 -0
- sage/symbolic/function.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/symbolic/function.pxd +29 -0
- sage/symbolic/function.pyx +1488 -0
- sage/symbolic/symbols.py +56 -0
- sage/tests/all__sagemath_categories.py +1 -0
- sage/tests/cython.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/cython.pyx +37 -0
- sage/tests/stl_vector.cpython-314t-aarch64-linux-musl.so +0 -0
- sage/tests/stl_vector.pyx +171 -0
- sage/typeset/all.py +6 -0
- sage/typeset/ascii_art.py +295 -0
- sage/typeset/character_art.py +789 -0
- sage/typeset/character_art_factory.py +572 -0
- sage/typeset/symbols.py +334 -0
- sage/typeset/unicode_art.py +183 -0
- sage/typeset/unicode_characters.py +101 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Subsets satisfying a hereditary property
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# Copyright (C) 2014 Nathann Cohen <nathann.cohen@gmail.com>
|
|
7
|
+
#
|
|
8
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
9
|
+
# https://www.gnu.org/licenses/
|
|
10
|
+
# *****************************************************************************
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def subsets_with_hereditary_property(f, X, max_obstruction_size=None, ncpus=1):
|
|
14
|
+
r"""
|
|
15
|
+
Return all subsets `S` of `X` such that `f(S)` is true.
|
|
16
|
+
|
|
17
|
+
The boolean function `f` must be decreasing, i.e. `f(S)\Rightarrow f(S')` if
|
|
18
|
+
`S'\subseteq S`.
|
|
19
|
+
|
|
20
|
+
This function is implemented to call `f` as few times as possible. More
|
|
21
|
+
precisely, `f` will be called on all sets `S` such that `f(S)` is true, as
|
|
22
|
+
well as on all inclusionwise minimal sets `S` such that `f(S)` is false.
|
|
23
|
+
|
|
24
|
+
The problem that this function answers is also known as the learning problem
|
|
25
|
+
on monotone boolean functions, or as computing the set of winning coalitions
|
|
26
|
+
in a simple game.
|
|
27
|
+
|
|
28
|
+
INPUT:
|
|
29
|
+
|
|
30
|
+
- ``f`` -- boolean function which takes as input a list of elements from
|
|
31
|
+
``X``
|
|
32
|
+
|
|
33
|
+
- ``X`` -- list/iterable
|
|
34
|
+
|
|
35
|
+
- ``max_obstruction_size`` -- integer; if you know that there is
|
|
36
|
+
a `k` such that `f(S)` is true if and only if `f(S')` is true
|
|
37
|
+
for all `S'\subseteq S` with `S'\leq k`, set
|
|
38
|
+
``max_obstruction_size=k``. It may dramatically decrease the
|
|
39
|
+
number of calls to `f`. Set to ``None`` by default, meaning
|
|
40
|
+
`k=|X|`.
|
|
41
|
+
|
|
42
|
+
- ``ncpus`` -- number of cpus to use for this computation. Note that
|
|
43
|
+
changing the value from `1` (default) to anything different *enables*
|
|
44
|
+
parallel computations which can have a cost by itself, so it is not
|
|
45
|
+
necessarily a good move. In some cases, however, it is a *great* move. Set
|
|
46
|
+
to ``None`` to automatically detect and use the maximum number of cpus
|
|
47
|
+
available.
|
|
48
|
+
|
|
49
|
+
.. NOTE::
|
|
50
|
+
|
|
51
|
+
Parallel computations are performed through the
|
|
52
|
+
:func:`~sage.parallel.decorate.parallel` decorator. See its
|
|
53
|
+
documentation for more information, in particular with respect to the
|
|
54
|
+
memory context.
|
|
55
|
+
|
|
56
|
+
EXAMPLES:
|
|
57
|
+
|
|
58
|
+
Sets whose elements all have the same remainder mod 2::
|
|
59
|
+
|
|
60
|
+
sage: from sage.combinat.subsets_hereditary import subsets_with_hereditary_property
|
|
61
|
+
sage: def f(x):
|
|
62
|
+
....: return (not x) or all(xx % 2 == x[0] % 2 for xx in x)
|
|
63
|
+
sage: list(subsets_with_hereditary_property(f, range(4)))
|
|
64
|
+
[[], [0], [1], [2], [3], [0, 2], [1, 3]]
|
|
65
|
+
|
|
66
|
+
Same, on two threads::
|
|
67
|
+
|
|
68
|
+
sage: sorted(subsets_with_hereditary_property(f, range(4), ncpus=2))
|
|
69
|
+
[[], [0], [0, 2], [1], [1, 3], [2], [3]]
|
|
70
|
+
|
|
71
|
+
One can use this function to compute the independent sets of a graph. We
|
|
72
|
+
know, however, that in this case the maximum obstructions are the edges, and
|
|
73
|
+
have size 2. We can thus set ``max_obstruction_size=2``, which reduces the
|
|
74
|
+
number of calls to `f` from 91 to 56::
|
|
75
|
+
|
|
76
|
+
sage: # needs sage.graphs
|
|
77
|
+
sage: num_calls = 0
|
|
78
|
+
sage: g = graphs.PetersenGraph()
|
|
79
|
+
sage: def is_independent_set(S):
|
|
80
|
+
....: global num_calls
|
|
81
|
+
....: num_calls += 1
|
|
82
|
+
....: return g.subgraph(S).size() == 0
|
|
83
|
+
sage: l1 = list(subsets_with_hereditary_property(is_independent_set,
|
|
84
|
+
....: g.vertices(sort=False)))
|
|
85
|
+
sage: num_calls
|
|
86
|
+
91
|
|
87
|
+
sage: num_calls = 0
|
|
88
|
+
sage: l2 = list(subsets_with_hereditary_property(is_independent_set,
|
|
89
|
+
....: g.vertices(sort=False),
|
|
90
|
+
....: max_obstruction_size=2))
|
|
91
|
+
sage: num_calls
|
|
92
|
+
56
|
|
93
|
+
sage: l1 == l2
|
|
94
|
+
True
|
|
95
|
+
|
|
96
|
+
TESTS::
|
|
97
|
+
|
|
98
|
+
sage: list(subsets_with_hereditary_property(lambda x: False, range(4)))
|
|
99
|
+
[]
|
|
100
|
+
sage: list(subsets_with_hereditary_property(lambda x: len(x)<1, range(4)))
|
|
101
|
+
[[]]
|
|
102
|
+
sage: list(subsets_with_hereditary_property(lambda x: True, range(2)))
|
|
103
|
+
[[], [0], [1], [0, 1]]
|
|
104
|
+
"""
|
|
105
|
+
from sage.data_structures.bitset import Bitset
|
|
106
|
+
# About the implementation:
|
|
107
|
+
#
|
|
108
|
+
# 1) We work on X={0,...,n-1} but remember X to return correctly
|
|
109
|
+
# labelled answers.
|
|
110
|
+
#
|
|
111
|
+
# 2) We maintain a list of sets S such that f(S)=0 (i.e. 'no-sets'), in
|
|
112
|
+
# order to filter out larger sets for which f is necessarily False.
|
|
113
|
+
#
|
|
114
|
+
# 3) Those sets are stored in an array: bs[i] represents the set of all
|
|
115
|
+
# no-sets S we found such that i is NOT in S. Why ? Because it makes it
|
|
116
|
+
# easy to filter out sets: if a set S' whose *complement* is
|
|
117
|
+
# {i1,i2,...,ik} is such that bs[i1]&bs[i2]&...&bs[ik] is nonempty then
|
|
118
|
+
# f(S') is necessarily False.
|
|
119
|
+
X_labels = list(X)
|
|
120
|
+
n = len(X_labels)
|
|
121
|
+
X = set(range(n))
|
|
122
|
+
if max_obstruction_size is None:
|
|
123
|
+
max_obstruction_size = n
|
|
124
|
+
|
|
125
|
+
bs = [Bitset([], 1) for _ in range(n)] # collection of no-set
|
|
126
|
+
nforb = 1 # number of no-sets stored
|
|
127
|
+
current_layer = [[]] # all yes-sets of size 'current_size'
|
|
128
|
+
current_size = 0
|
|
129
|
+
|
|
130
|
+
def explore_neighbors(s):
|
|
131
|
+
r"""
|
|
132
|
+
Explore the successors of a set s.
|
|
133
|
+
|
|
134
|
+
The successors of a set s are all the sets s+[i] where max(s)<i. This
|
|
135
|
+
function returns them all as a partition `(yes_sets,no_sets)`.
|
|
136
|
+
"""
|
|
137
|
+
new_yes_sets = []
|
|
138
|
+
new_no_sets = []
|
|
139
|
+
for i in range((s[-1] + 1 if s else 0), n): # all ways to extend it
|
|
140
|
+
s_plus_i = s + [i] # the extended set
|
|
141
|
+
s_plus_i_c = Bitset(s_plus_i, n).complement() # .. and its complement
|
|
142
|
+
|
|
143
|
+
# Filter a no-set using the data collected so far.
|
|
144
|
+
inter = Bitset([], nforb).complement()
|
|
145
|
+
for j in s_plus_i_c:
|
|
146
|
+
inter.intersection_update(bs[j])
|
|
147
|
+
|
|
148
|
+
# If we cannot decide yet we must call f(S)
|
|
149
|
+
if not inter:
|
|
150
|
+
if set_size >= max_obstruction_size or f([X_labels[xx] for xx in s_plus_i]):
|
|
151
|
+
new_yes_sets.append(s_plus_i)
|
|
152
|
+
else:
|
|
153
|
+
new_no_sets.append(s_plus_i)
|
|
154
|
+
return (new_yes_sets, new_no_sets)
|
|
155
|
+
|
|
156
|
+
# The empty set
|
|
157
|
+
if f([]):
|
|
158
|
+
yield []
|
|
159
|
+
else:
|
|
160
|
+
return
|
|
161
|
+
|
|
162
|
+
if ncpus != 1:
|
|
163
|
+
from sage.parallel.decorate import parallel
|
|
164
|
+
explore_neighbors_paral = parallel(ncpus=ncpus)(explore_neighbors)
|
|
165
|
+
|
|
166
|
+
# All sets of size 0, then size 1, then ...
|
|
167
|
+
set_size = -1
|
|
168
|
+
while current_layer:
|
|
169
|
+
set_size += 1
|
|
170
|
+
new_no_sets = []
|
|
171
|
+
new_yes_sets = []
|
|
172
|
+
|
|
173
|
+
if ncpus == 1:
|
|
174
|
+
yes_no_iter = (explore_neighbors(s) for s in current_layer)
|
|
175
|
+
else:
|
|
176
|
+
yes_no_iter = ((yes, no) for (_, (yes, no)) in explore_neighbors_paral(current_layer))
|
|
177
|
+
|
|
178
|
+
for yes, no in yes_no_iter:
|
|
179
|
+
new_yes_sets.extend(yes)
|
|
180
|
+
new_no_sets.extend(no)
|
|
181
|
+
for s in yes:
|
|
182
|
+
yield [X_labels[xx] for xx in s]
|
|
183
|
+
|
|
184
|
+
current_layer = new_yes_sets
|
|
185
|
+
|
|
186
|
+
# Update bs with the new no-sets
|
|
187
|
+
new_nforb = nforb + len(new_no_sets)
|
|
188
|
+
for b in bs: # resize the bitsets
|
|
189
|
+
b.add(new_nforb)
|
|
190
|
+
b.discard(new_nforb)
|
|
191
|
+
for i, s in enumerate(new_no_sets): # Fill the new entries
|
|
192
|
+
for j in X.difference(s):
|
|
193
|
+
bs[j].add(i + nforb)
|
|
194
|
+
nforb = new_nforb
|
|
195
|
+
current_size += 1
|
|
196
|
+
|
|
197
|
+
# Did we forget to return X itself ?
|
|
198
|
+
#
|
|
199
|
+
# If we did, this was probably the worst choice of algorithm for we computed
|
|
200
|
+
# f(X) for all 2^n sets X, but well...
|
|
201
|
+
if (current_size == len(X) and nforb == 1 and f(X_labels)):
|
|
202
|
+
yield X_labels
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Subsets whose elements satisfy a predicate pairwise
|
|
4
|
+
"""
|
|
5
|
+
#*****************************************************************************
|
|
6
|
+
# Copyright (C) 2011 Nicolas M. Thiery <nthiery at users.sf.net>
|
|
7
|
+
#
|
|
8
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
9
|
+
# http://www.gnu.org/licenses/
|
|
10
|
+
#******************************************************************************
|
|
11
|
+
|
|
12
|
+
from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
|
|
13
|
+
from sage.sets.set import Set_object_enumerated
|
|
14
|
+
from sage.sets.recursively_enumerated_set import RecursivelyEnumeratedSet_forest
|
|
15
|
+
from sage.combinat.subset import Subsets
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class PairwiseCompatibleSubsets(RecursivelyEnumeratedSet_forest):
|
|
19
|
+
r"""
|
|
20
|
+
The set of all subsets of ``ambient`` whose elements satisfy
|
|
21
|
+
``predicate`` pairwise
|
|
22
|
+
|
|
23
|
+
INPUT:
|
|
24
|
+
|
|
25
|
+
- ``ambient`` -- set (or iterable)
|
|
26
|
+
- ``predicate`` -- a binary predicate
|
|
27
|
+
|
|
28
|
+
Assumptions: ``predicate`` is symmetric (``predicate(x,y) ==
|
|
29
|
+
predicate(y,x)``) and reflexive (``predicate(x,x) == True``).
|
|
30
|
+
|
|
31
|
+
.. NOTE:: in fact, ``predicate(x,x)`` is never called.
|
|
32
|
+
|
|
33
|
+
.. warning:: The current name is suboptimal and is subject to
|
|
34
|
+
change. Suggestions for a good name, and a good user entry
|
|
35
|
+
point are welcome. Maybe ``Subsets(..., independent = predicate)``.
|
|
36
|
+
|
|
37
|
+
EXAMPLES:
|
|
38
|
+
|
|
39
|
+
We construct the set of all subsets of `\{4,5,6,8,9\}` whose
|
|
40
|
+
elements are pairwise relatively prime::
|
|
41
|
+
|
|
42
|
+
sage: from sage.combinat.subsets_pairwise import PairwiseCompatibleSubsets
|
|
43
|
+
sage: def predicate(x, y): return gcd(x, y) == 1
|
|
44
|
+
sage: P = PairwiseCompatibleSubsets( [4,5,6,8,9], predicate); P
|
|
45
|
+
An enumerated set with a forest structure
|
|
46
|
+
sage: P.list()
|
|
47
|
+
[{}, {4}, {4, 5}, {9, 4, 5}, {9, 4}, {5}, {5, 6}, {8, 5}, {8, 9, 5}, {9, 5}, {6}, {8}, {8, 9}, {9}]
|
|
48
|
+
sage: P.cardinality()
|
|
49
|
+
14
|
|
50
|
+
sage: P.category()
|
|
51
|
+
Category of finite enumerated sets
|
|
52
|
+
|
|
53
|
+
Here we consider only those subsets which are maximal for
|
|
54
|
+
inclusion (not yet implemented)::
|
|
55
|
+
|
|
56
|
+
sage: P = PairwiseCompatibleSubsets( [4,5,6,8,9], predicate, maximal = True); P
|
|
57
|
+
An enumerated set with a forest structure
|
|
58
|
+
sage: P.list() # todo: not implemented
|
|
59
|
+
[{9, 4, 5}, {5, 6}, {8, 9, 5}]
|
|
60
|
+
sage: P.cardinality() # todo: not implemented
|
|
61
|
+
14
|
|
62
|
+
sage: P.category()
|
|
63
|
+
Category of finite enumerated sets
|
|
64
|
+
|
|
65
|
+
.. rubric:: Algorithm
|
|
66
|
+
|
|
67
|
+
In the following, we order the elements of the ambient set by
|
|
68
|
+
order of apparition. The elements of ``self`` are generated by
|
|
69
|
+
organizing them in a search tree. Each node of this tree is of the
|
|
70
|
+
form ``(subset, rest)``, where:
|
|
71
|
+
|
|
72
|
+
- ``subset`` represents an element of ``self``, represented
|
|
73
|
+
by an increasing tuple
|
|
74
|
+
- ``rest`` is the set of all `y`'s such that `y` appears
|
|
75
|
+
after `x` in the ambient set and ``predicate(x,y)``
|
|
76
|
+
holds, represented by a decreasing tuple
|
|
77
|
+
|
|
78
|
+
The root of this tree is ``( (), ambient )``. All the other elements
|
|
79
|
+
are generated by recursive depth first search, which gives
|
|
80
|
+
lexicographic order.
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
# @staticmethod
|
|
84
|
+
# def __classcall__(cls, ambient, predicate):
|
|
85
|
+
# ambient = Set(ambient)
|
|
86
|
+
# return super().__classcall__(cls, ambient, predicate)
|
|
87
|
+
|
|
88
|
+
__len__ = None
|
|
89
|
+
|
|
90
|
+
def __init__(self, ambient, predicate, maximal=False, element_class=Set_object_enumerated):
|
|
91
|
+
"""
|
|
92
|
+
TESTS::
|
|
93
|
+
|
|
94
|
+
sage: from sage.combinat.subsets_pairwise import PairwiseCompatibleSubsets
|
|
95
|
+
sage: def predicate(x, y): return gcd(x, y) == 1
|
|
96
|
+
sage: P = PairwiseCompatibleSubsets( [4,5,6,8,9], predicate); P
|
|
97
|
+
An enumerated set with a forest structure
|
|
98
|
+
sage: import __main__; __main__.predicate = predicate
|
|
99
|
+
sage: TestSuite(P).run()
|
|
100
|
+
"""
|
|
101
|
+
self._ambient = set(ambient)
|
|
102
|
+
self._roots = ( ((), tuple(reversed(ambient))), )
|
|
103
|
+
self._predicate = predicate
|
|
104
|
+
self._maximal = maximal
|
|
105
|
+
# TODO: use self.element_class for consistency
|
|
106
|
+
# At this point (2011/03) TestSuite fails if we do so
|
|
107
|
+
self._element_class = element_class
|
|
108
|
+
RecursivelyEnumeratedSet_forest.__init__(self, algorithm='depth', category=FiniteEnumeratedSets())
|
|
109
|
+
|
|
110
|
+
def __eq__(self, other):
|
|
111
|
+
"""
|
|
112
|
+
Equality test; not really useful, but this pleases pickling ...
|
|
113
|
+
|
|
114
|
+
TESTS::
|
|
115
|
+
|
|
116
|
+
sage: from sage.combinat.subsets_pairwise import PairwiseCompatibleSubsets
|
|
117
|
+
sage: def predicate(x, y): return gcd(x, y) == 1
|
|
118
|
+
sage: P = PairwiseCompatibleSubsets( [4,5,6,8,9], predicate); P
|
|
119
|
+
An enumerated set with a forest structure
|
|
120
|
+
sage: P == P
|
|
121
|
+
True
|
|
122
|
+
"""
|
|
123
|
+
return self.__class__ is other.__class__ and self._ambient == other._ambient and self._predicate.__str__() == other._predicate.__str__()
|
|
124
|
+
|
|
125
|
+
def __contains__(self, subset):
|
|
126
|
+
"""
|
|
127
|
+
Membership testing.
|
|
128
|
+
|
|
129
|
+
Returns whether subset is a subset of ``self._ambient``, and
|
|
130
|
+
``predicate(x,y)`` holds for every ``x,y`` in ``self``.
|
|
131
|
+
|
|
132
|
+
EXAMPLES::
|
|
133
|
+
|
|
134
|
+
sage: from sage.combinat.subsets_pairwise import PairwiseCompatibleSubsets
|
|
135
|
+
sage: def predicate(x, y): return gcd(x, y) == 1
|
|
136
|
+
sage: P = PairwiseCompatibleSubsets( [4,5,6,8,9], predicate); P
|
|
137
|
+
An enumerated set with a forest structure
|
|
138
|
+
sage: Set([5,8,9]) in P
|
|
139
|
+
True
|
|
140
|
+
sage: Set([5,8,11]) in P
|
|
141
|
+
False
|
|
142
|
+
sage: Set([4,6]) in P
|
|
143
|
+
False
|
|
144
|
+
"""
|
|
145
|
+
return isinstance(subset, self._element_class ) and \
|
|
146
|
+
set(subset).issubset(self._ambient) and \
|
|
147
|
+
all( self._predicate(x,y) for x,y in Subsets(subset,2) )
|
|
148
|
+
|
|
149
|
+
def post_process(self, subset_rest):
|
|
150
|
+
"""
|
|
151
|
+
TESTS::
|
|
152
|
+
|
|
153
|
+
sage: from sage.combinat.subsets_pairwise import PairwiseCompatibleSubsets
|
|
154
|
+
sage: def predicate(x, y): return gcd(x, y) == 1
|
|
155
|
+
sage: P = PairwiseCompatibleSubsets( [4,5,6,8,9], predicate); P
|
|
156
|
+
An enumerated set with a forest structure
|
|
157
|
+
sage: P.post_process( ((4,5), (9)) )
|
|
158
|
+
{4, 5}
|
|
159
|
+
sage: P.post_process( ((4,5), ()) )
|
|
160
|
+
{4, 5}
|
|
161
|
+
"""
|
|
162
|
+
return self._element_class(subset_rest[0])
|
|
163
|
+
|
|
164
|
+
def children(self, subset_rest):
|
|
165
|
+
"""
|
|
166
|
+
Return the children of a node in the tree.
|
|
167
|
+
|
|
168
|
+
TESTS::
|
|
169
|
+
|
|
170
|
+
sage: from sage.combinat.subsets_pairwise import PairwiseCompatibleSubsets
|
|
171
|
+
sage: def predicate(x, y): return gcd(x, y) == 1
|
|
172
|
+
sage: P = PairwiseCompatibleSubsets( [3,5,7,11,14], predicate); P
|
|
173
|
+
An enumerated set with a forest structure
|
|
174
|
+
sage: list(P.children( ((3,5), [14,11,7]) ))
|
|
175
|
+
[((3, 5, 7), (11,)), ((3, 5, 11), (14,)), ((3, 5, 14), ())]
|
|
176
|
+
"""
|
|
177
|
+
(subset, rest) = subset_rest
|
|
178
|
+
predicate = self._predicate
|
|
179
|
+
result = []
|
|
180
|
+
rest = list(rest)
|
|
181
|
+
while rest:
|
|
182
|
+
x = rest.pop()
|
|
183
|
+
result.append((subset+(x,), tuple( y for y in rest if predicate(x,y) )))
|
|
184
|
+
return result
|
sage/combinat/tools.py
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Transitive ideal closure tool
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# Copyright (C) 2007 Mike Hansen <mhansen@gmail.com>,
|
|
7
|
+
#
|
|
8
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
9
|
+
#
|
|
10
|
+
# This code is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
13
|
+
# General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# The full text of the GPL is available at:
|
|
16
|
+
#
|
|
17
|
+
# https://www.gnu.org/licenses/
|
|
18
|
+
# ****************************************************************************
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def transitive_ideal(f, x):
|
|
22
|
+
r"""
|
|
23
|
+
Return a list of all elements reachable from `x` in the abstract
|
|
24
|
+
reduction system whose reduction relation is given by the function
|
|
25
|
+
`f`.
|
|
26
|
+
|
|
27
|
+
In more elementary terms:
|
|
28
|
+
|
|
29
|
+
If `S` is a set, and `f` is a function sending every element of `S`
|
|
30
|
+
to a list of elements of `S`, then we can define a digraph on the
|
|
31
|
+
vertex set `S` by drawing an edge from `s` to `t` for every
|
|
32
|
+
`s \in S` and every `t \in f(s)`.
|
|
33
|
+
|
|
34
|
+
If `x \in S`, then an element `y \in S` is said to be reachable
|
|
35
|
+
from `x` if there is a path `x \to y` in this graph.
|
|
36
|
+
|
|
37
|
+
Given `f` and `x`, this method computes the list of all elements of
|
|
38
|
+
`S` reachable from `x`.
|
|
39
|
+
|
|
40
|
+
Note that if there are infinitely many such elements, then this
|
|
41
|
+
method will never halt.
|
|
42
|
+
|
|
43
|
+
For more powerful versions, see :mod:`sage.combinat.backtrack`
|
|
44
|
+
|
|
45
|
+
EXAMPLES::
|
|
46
|
+
|
|
47
|
+
sage: f = lambda x: [x-1] if x > 0 else []
|
|
48
|
+
sage: sage.combinat.tools.transitive_ideal(f, 10)
|
|
49
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
50
|
+
"""
|
|
51
|
+
known = [x]
|
|
52
|
+
todo = [x]
|
|
53
|
+
|
|
54
|
+
while todo:
|
|
55
|
+
y = todo.pop(0)
|
|
56
|
+
for z in f(y):
|
|
57
|
+
if z in known:
|
|
58
|
+
continue
|
|
59
|
+
known.append(z)
|
|
60
|
+
todo.append(z)
|
|
61
|
+
|
|
62
|
+
known.sort()
|
|
63
|
+
return known
|