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,1146 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Enumerated sets
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# Copyright (C) 2009 Florent Hivert <Florent.Hivert@univ-rouen.fr>
|
|
7
|
+
#
|
|
8
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
9
|
+
# https://www.gnu.org/licenses/
|
|
10
|
+
# *****************************************************************************
|
|
11
|
+
|
|
12
|
+
from sage.misc.cachefunc import cached_method
|
|
13
|
+
from sage.misc.lazy_import import LazyImport
|
|
14
|
+
from sage.categories.category_with_axiom import CategoryWithAxiom
|
|
15
|
+
from sage.categories.sets_cat import Sets
|
|
16
|
+
from sage.categories.sets_cat import EmptySetError
|
|
17
|
+
from sage.categories.cartesian_product import CartesianProductsCategory
|
|
18
|
+
from sage.misc.lazy_import import lazy_import
|
|
19
|
+
lazy_import("sage.rings.integer", "Integer")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class EnumeratedSets(CategoryWithAxiom):
|
|
23
|
+
"""
|
|
24
|
+
The category of enumerated sets.
|
|
25
|
+
|
|
26
|
+
An *enumerated set* is a *finite* or *countable* set or multiset `S`
|
|
27
|
+
together with a canonical enumeration of its elements;
|
|
28
|
+
conceptually, this is very similar to an immutable list. The main
|
|
29
|
+
difference lies in the names and the return type of the methods,
|
|
30
|
+
and of course the fact that the list of elements is not supposed to
|
|
31
|
+
be expanded in memory. Whenever possible one should use one of the
|
|
32
|
+
two sub-categories :class:`FiniteEnumeratedSets` or
|
|
33
|
+
:class:`InfiniteEnumeratedSets`.
|
|
34
|
+
|
|
35
|
+
The purpose of this category is threefold:
|
|
36
|
+
|
|
37
|
+
- to fix a common interface for all these sets;
|
|
38
|
+
- to provide a bunch of default implementations;
|
|
39
|
+
- to provide consistency tests.
|
|
40
|
+
|
|
41
|
+
The standard methods for an enumerated set ``S`` are:
|
|
42
|
+
|
|
43
|
+
- ``S.cardinality()`` -- the number of elements of the set. This
|
|
44
|
+
is the equivalent for ``len`` on a list except that the
|
|
45
|
+
return value is specified to be a Sage :class:`Integer` or
|
|
46
|
+
``infinity``, instead of a Python ``int``.
|
|
47
|
+
|
|
48
|
+
- ``iter(S)`` -- an iterator for the elements of the set;
|
|
49
|
+
|
|
50
|
+
- ``S.list()`` -- a fresh list of the elements of the set, when
|
|
51
|
+
possible; raises a :exc:`NotImplementedError` if the list is
|
|
52
|
+
predictably too large to be expanded in memory.
|
|
53
|
+
|
|
54
|
+
- ``S.tuple()`` -- a tuple of the elements of the set, when
|
|
55
|
+
possible; raises a :exc:`NotImplementedError` if the tuple is
|
|
56
|
+
predictably too large to be expanded in memory.
|
|
57
|
+
|
|
58
|
+
- ``S.unrank(n)`` -- the ``n``-th element of the set when ``n`` is a sage
|
|
59
|
+
``Integer``. This is the equivalent for ``l[n]`` on a list.
|
|
60
|
+
|
|
61
|
+
- ``S.rank(e)`` -- the position of the element ``e`` in the set;
|
|
62
|
+
This is equivalent to ``l.index(e)`` for a list except that
|
|
63
|
+
the return value is specified to be a Sage :class:`Integer`,
|
|
64
|
+
instead of a Python ``int``.
|
|
65
|
+
|
|
66
|
+
- ``S.first()`` -- the first object of the set; it is equivalent to
|
|
67
|
+
``S.unrank(0)``.
|
|
68
|
+
|
|
69
|
+
- ``S.next(e)`` -- the object of the set which follows ``e``; it is
|
|
70
|
+
equivalent to ``S.unrank(S.rank(e) + 1)``.
|
|
71
|
+
|
|
72
|
+
- ``S.random_element()`` -- a random generator for an element of
|
|
73
|
+
the set. Unless otherwise stated, and for finite enumerated
|
|
74
|
+
sets, the probability is uniform.
|
|
75
|
+
|
|
76
|
+
For examples and tests see:
|
|
77
|
+
|
|
78
|
+
- ``FiniteEnumeratedSets().example()``
|
|
79
|
+
- ``InfiniteEnumeratedSets().example()``
|
|
80
|
+
|
|
81
|
+
EXAMPLES::
|
|
82
|
+
|
|
83
|
+
sage: EnumeratedSets()
|
|
84
|
+
Category of enumerated sets
|
|
85
|
+
sage: EnumeratedSets().super_categories()
|
|
86
|
+
[Category of sets]
|
|
87
|
+
sage: EnumeratedSets().all_super_categories()
|
|
88
|
+
[Category of enumerated sets, Category of sets,
|
|
89
|
+
Category of sets with partial maps, Category of objects]
|
|
90
|
+
|
|
91
|
+
TESTS::
|
|
92
|
+
|
|
93
|
+
sage: C = EnumeratedSets()
|
|
94
|
+
sage: TestSuite(C).run()
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
def super_categories(self):
|
|
98
|
+
"""
|
|
99
|
+
EXAMPLES::
|
|
100
|
+
|
|
101
|
+
sage: EnumeratedSets().super_categories()
|
|
102
|
+
[Category of sets]
|
|
103
|
+
"""
|
|
104
|
+
return [Sets()]
|
|
105
|
+
|
|
106
|
+
def additional_structure(self):
|
|
107
|
+
"""
|
|
108
|
+
Return ``None``.
|
|
109
|
+
|
|
110
|
+
Indeed, morphisms of enumerated sets are not required to
|
|
111
|
+
preserve the enumeration.
|
|
112
|
+
|
|
113
|
+
.. SEEALSO:: :meth:`Category.additional_structure`
|
|
114
|
+
|
|
115
|
+
EXAMPLES::
|
|
116
|
+
|
|
117
|
+
sage: EnumeratedSets().additional_structure()
|
|
118
|
+
"""
|
|
119
|
+
return None
|
|
120
|
+
|
|
121
|
+
def _call_(self, X):
|
|
122
|
+
"""
|
|
123
|
+
Construct an object in this category from the data in ``X``.
|
|
124
|
+
|
|
125
|
+
EXAMPLES::
|
|
126
|
+
|
|
127
|
+
sage: EnumeratedSets()(Primes())
|
|
128
|
+
Set of all prime numbers: 2, 3, 5, 7, ...
|
|
129
|
+
|
|
130
|
+
For now, lists, tuples, sets, Sets are coerced into finite
|
|
131
|
+
enumerated sets::
|
|
132
|
+
|
|
133
|
+
sage: S = EnumeratedSets()([1, 2, 3]); S
|
|
134
|
+
{1, 2, 3}
|
|
135
|
+
sage: S.category()
|
|
136
|
+
Category of facade finite enumerated sets
|
|
137
|
+
|
|
138
|
+
sage: S = EnumeratedSets()((1, 2, 3)); S
|
|
139
|
+
{1, 2, 3}
|
|
140
|
+
sage: S = EnumeratedSets()(set([1, 2, 3])); S
|
|
141
|
+
{1, 2, 3}
|
|
142
|
+
sage: S = EnumeratedSets()(Set([1, 2, 3])); S
|
|
143
|
+
{1, 2, 3}
|
|
144
|
+
sage: S.category()
|
|
145
|
+
Category of finite enumerated sets
|
|
146
|
+
|
|
147
|
+
Also Python3 range are now accepted::
|
|
148
|
+
|
|
149
|
+
sage: S = EnumeratedSets()(range(4)); S
|
|
150
|
+
{0, 1, 2, 3}
|
|
151
|
+
"""
|
|
152
|
+
import sage.sets.set
|
|
153
|
+
if isinstance(X, (tuple, list, set, range, sage.sets.set.Set_object_enumerated)):
|
|
154
|
+
return sage.sets.finite_enumerated_set.FiniteEnumeratedSet(X)
|
|
155
|
+
raise NotImplementedError
|
|
156
|
+
|
|
157
|
+
class ParentMethods:
|
|
158
|
+
|
|
159
|
+
def __iter__(self):
|
|
160
|
+
"""
|
|
161
|
+
An iterator for the enumerated set.
|
|
162
|
+
|
|
163
|
+
``iter(self)`` allows the combinatorial class to be treated as an
|
|
164
|
+
iterable. This is the default implementation from the category
|
|
165
|
+
``EnumeratedSets()``; it just goes through the iterator of the set
|
|
166
|
+
to count the number of objects.
|
|
167
|
+
|
|
168
|
+
By decreasing order of priority, the second column of the
|
|
169
|
+
following array shows which method is used to define
|
|
170
|
+
``__iter__``, when the methods of the first column are overloaded:
|
|
171
|
+
|
|
172
|
+
+------------------------+---------------------------------+
|
|
173
|
+
| Needed methods | Default ``__iterator`` provided |
|
|
174
|
+
+========================+=================================+
|
|
175
|
+
| ``first`` and ``next`` | ``_iterator_from_next`` |
|
|
176
|
+
+------------------------+---------------------------------+
|
|
177
|
+
| ``unrank`` | ``_iterator_from_unrank`` |
|
|
178
|
+
+------------------------+---------------------------------+
|
|
179
|
+
| ``list`` | ``_iterator_from_next`` |
|
|
180
|
+
+------------------------+---------------------------------+
|
|
181
|
+
|
|
182
|
+
It is also possible to override ``__iter__`` method itself. Then
|
|
183
|
+
the methods of the first column are defined using ``__iter__``
|
|
184
|
+
|
|
185
|
+
If none of these are provided, this raises
|
|
186
|
+
a :exc:`NotImplementedError`.
|
|
187
|
+
|
|
188
|
+
EXAMPLES:
|
|
189
|
+
|
|
190
|
+
We start with an example where nothing is implemented::
|
|
191
|
+
|
|
192
|
+
sage: class broken(UniqueRepresentation, Parent):
|
|
193
|
+
....: def __init__(self):
|
|
194
|
+
....: Parent.__init__(self, category = EnumeratedSets())
|
|
195
|
+
sage: it = iter(broken()); [next(it), next(it), next(it)]
|
|
196
|
+
Traceback (most recent call last):
|
|
197
|
+
...
|
|
198
|
+
NotImplementedError: iterator called but not implemented
|
|
199
|
+
|
|
200
|
+
Here is what happens when ``first`` and ``next`` are implemented::
|
|
201
|
+
|
|
202
|
+
sage: class set_first_next(UniqueRepresentation, Parent):
|
|
203
|
+
....: def __init__(self):
|
|
204
|
+
....: Parent.__init__(self, category = EnumeratedSets())
|
|
205
|
+
....: def first(self):
|
|
206
|
+
....: return 0
|
|
207
|
+
....: def next(self, elt):
|
|
208
|
+
....: return elt+1
|
|
209
|
+
sage: it = iter(set_first_next()); [next(it), next(it), next(it)]
|
|
210
|
+
[0, 1, 2]
|
|
211
|
+
|
|
212
|
+
Let us try with ``unrank``::
|
|
213
|
+
|
|
214
|
+
sage: class set_unrank(UniqueRepresentation, Parent):
|
|
215
|
+
....: def __init__(self):
|
|
216
|
+
....: Parent.__init__(self, category = EnumeratedSets())
|
|
217
|
+
....: def unrank(self, i):
|
|
218
|
+
....: return i + 5
|
|
219
|
+
sage: it = iter(set_unrank()); [next(it), next(it), next(it)]
|
|
220
|
+
[5, 6, 7]
|
|
221
|
+
|
|
222
|
+
Let us finally try with ``list``::
|
|
223
|
+
|
|
224
|
+
sage: class set_list(UniqueRepresentation, Parent):
|
|
225
|
+
....: def __init__(self):
|
|
226
|
+
....: Parent.__init__(self, category = EnumeratedSets())
|
|
227
|
+
....: def list(self):
|
|
228
|
+
....: return [5, 6, 7]
|
|
229
|
+
sage: it = iter(set_list()); [next(it), next(it), next(it)]
|
|
230
|
+
[5, 6, 7]
|
|
231
|
+
"""
|
|
232
|
+
# Check if .first() and .next(x) are overridden in the subclass
|
|
233
|
+
if ( self.first != self._first_from_iterator and
|
|
234
|
+
self.next != self._next_from_iterator ):
|
|
235
|
+
return self._iterator_from_next()
|
|
236
|
+
#Check to see if .unrank() is overridden in the subclass
|
|
237
|
+
elif self.unrank != self._unrank_from_iterator:
|
|
238
|
+
return self._iterator_from_unrank()
|
|
239
|
+
#Finally, check to see if .list() is overridden in the subclass
|
|
240
|
+
elif self.list != self._list_default:
|
|
241
|
+
return self._iterator_from_list()
|
|
242
|
+
else:
|
|
243
|
+
raise NotImplementedError("iterator called but not implemented")
|
|
244
|
+
|
|
245
|
+
def is_empty(self):
|
|
246
|
+
r"""
|
|
247
|
+
Return whether this set is empty.
|
|
248
|
+
|
|
249
|
+
EXAMPLES::
|
|
250
|
+
|
|
251
|
+
sage: F = FiniteEnumeratedSet([1,2,3])
|
|
252
|
+
sage: F.is_empty()
|
|
253
|
+
False
|
|
254
|
+
sage: F = FiniteEnumeratedSet([])
|
|
255
|
+
sage: F.is_empty()
|
|
256
|
+
True
|
|
257
|
+
|
|
258
|
+
TESTS::
|
|
259
|
+
|
|
260
|
+
sage: F.is_empty.__module__
|
|
261
|
+
'sage.categories.enumerated_sets'
|
|
262
|
+
"""
|
|
263
|
+
try:
|
|
264
|
+
next(iter(self))
|
|
265
|
+
except StopIteration:
|
|
266
|
+
return True
|
|
267
|
+
else:
|
|
268
|
+
return False
|
|
269
|
+
|
|
270
|
+
def iterator_range(self, start=None, stop=None, step=None):
|
|
271
|
+
r"""
|
|
272
|
+
Iterate over the range of elements of ``self`` starting
|
|
273
|
+
at ``start``, ending at ``stop``, and stepping by ``step``.
|
|
274
|
+
|
|
275
|
+
.. SEEALSO::
|
|
276
|
+
|
|
277
|
+
``unrank()``, ``unrank_range()``
|
|
278
|
+
|
|
279
|
+
EXAMPLES::
|
|
280
|
+
|
|
281
|
+
sage: # needs sage.combinat
|
|
282
|
+
sage: P = Partitions()
|
|
283
|
+
sage: list(P.iterator_range(stop=5))
|
|
284
|
+
[[], [1], [2], [1, 1], [3]]
|
|
285
|
+
sage: list(P.iterator_range(0, 5))
|
|
286
|
+
[[], [1], [2], [1, 1], [3]]
|
|
287
|
+
sage: list(P.iterator_range(3, 5))
|
|
288
|
+
[[1, 1], [3]]
|
|
289
|
+
sage: list(P.iterator_range(3, 10))
|
|
290
|
+
[[1, 1], [3], [2, 1], [1, 1, 1], [4], [3, 1], [2, 2]]
|
|
291
|
+
sage: list(P.iterator_range(3, 10, 2))
|
|
292
|
+
[[1, 1], [2, 1], [4], [2, 2]]
|
|
293
|
+
sage: it = P.iterator_range(3)
|
|
294
|
+
sage: [next(it) for x in range(10)]
|
|
295
|
+
[[1, 1],
|
|
296
|
+
[3], [2, 1], [1, 1, 1],
|
|
297
|
+
[4], [3, 1], [2, 2], [2, 1, 1], [1, 1, 1, 1],
|
|
298
|
+
[5]]
|
|
299
|
+
sage: it = P.iterator_range(3, step=2)
|
|
300
|
+
sage: [next(it) for x in range(5)]
|
|
301
|
+
[[1, 1],
|
|
302
|
+
[2, 1],
|
|
303
|
+
[4], [2, 2], [1, 1, 1, 1]]
|
|
304
|
+
sage: next(P.iterator_range(stop=-3))
|
|
305
|
+
Traceback (most recent call last):
|
|
306
|
+
...
|
|
307
|
+
NotImplementedError: cannot list an infinite set
|
|
308
|
+
sage: next(P.iterator_range(start=-3))
|
|
309
|
+
Traceback (most recent call last):
|
|
310
|
+
...
|
|
311
|
+
NotImplementedError: cannot list an infinite set
|
|
312
|
+
"""
|
|
313
|
+
if stop is None:
|
|
314
|
+
if start is None:
|
|
315
|
+
if step is None:
|
|
316
|
+
yield from self
|
|
317
|
+
return
|
|
318
|
+
start = 0
|
|
319
|
+
elif start < 0:
|
|
320
|
+
yield from self.tuple()[start::step]
|
|
321
|
+
return
|
|
322
|
+
if step is None:
|
|
323
|
+
step = 1
|
|
324
|
+
while True:
|
|
325
|
+
try:
|
|
326
|
+
yield self.unrank(start)
|
|
327
|
+
except ValueError:
|
|
328
|
+
return
|
|
329
|
+
start += step
|
|
330
|
+
|
|
331
|
+
elif stop < 0:
|
|
332
|
+
yield from self.tuple()[start:stop:step]
|
|
333
|
+
return
|
|
334
|
+
|
|
335
|
+
if start is None:
|
|
336
|
+
if step is None:
|
|
337
|
+
it = self.__iter__()
|
|
338
|
+
for j in range(stop):
|
|
339
|
+
yield next(it)
|
|
340
|
+
return
|
|
341
|
+
start = 0
|
|
342
|
+
elif start < 0:
|
|
343
|
+
yield from self.tuple()[start:stop:step]
|
|
344
|
+
if step is None:
|
|
345
|
+
step = 1
|
|
346
|
+
for j in range(start, stop, step):
|
|
347
|
+
yield self.unrank(j)
|
|
348
|
+
|
|
349
|
+
def unrank_range(self, start=None, stop=None, step=None):
|
|
350
|
+
"""
|
|
351
|
+
Return the range of elements of ``self`` starting at ``start``,
|
|
352
|
+
ending at ``stop``, and stepping by ``step``.
|
|
353
|
+
|
|
354
|
+
.. SEEALSO::
|
|
355
|
+
|
|
356
|
+
``unrank()``, ``iterator_range()``
|
|
357
|
+
|
|
358
|
+
EXAMPLES::
|
|
359
|
+
|
|
360
|
+
sage: # needs sage.combinat
|
|
361
|
+
sage: P = Partitions()
|
|
362
|
+
sage: P.unrank_range(stop=5)
|
|
363
|
+
[[], [1], [2], [1, 1], [3]]
|
|
364
|
+
sage: P.unrank_range(0, 5)
|
|
365
|
+
[[], [1], [2], [1, 1], [3]]
|
|
366
|
+
sage: P.unrank_range(3, 5)
|
|
367
|
+
[[1, 1], [3]]
|
|
368
|
+
sage: P.unrank_range(3, 10)
|
|
369
|
+
[[1, 1], [3], [2, 1], [1, 1, 1], [4], [3, 1], [2, 2]]
|
|
370
|
+
sage: P.unrank_range(3, 10, 2)
|
|
371
|
+
[[1, 1], [2, 1], [4], [2, 2]]
|
|
372
|
+
sage: P.unrank_range(3)
|
|
373
|
+
Traceback (most recent call last):
|
|
374
|
+
...
|
|
375
|
+
NotImplementedError: cannot list an infinite set
|
|
376
|
+
sage: P.unrank_range(stop=-3)
|
|
377
|
+
Traceback (most recent call last):
|
|
378
|
+
...
|
|
379
|
+
NotImplementedError: cannot list an infinite set
|
|
380
|
+
sage: P.unrank_range(start=-3)
|
|
381
|
+
Traceback (most recent call last):
|
|
382
|
+
...
|
|
383
|
+
NotImplementedError: cannot list an infinite set
|
|
384
|
+
"""
|
|
385
|
+
if stop is None:
|
|
386
|
+
return list(self.tuple()[start::step])
|
|
387
|
+
|
|
388
|
+
if stop < 0:
|
|
389
|
+
return list(self.tuple()[start:stop:step])
|
|
390
|
+
|
|
391
|
+
if start is not None and start < 0:
|
|
392
|
+
return list(self.tuple()[start:stop:step])
|
|
393
|
+
|
|
394
|
+
return list(self.iterator_range(start, stop, step))
|
|
395
|
+
|
|
396
|
+
def __getitem__(self, i):
|
|
397
|
+
r"""
|
|
398
|
+
Return the item indexed by ``i``.
|
|
399
|
+
|
|
400
|
+
.. WARNING::
|
|
401
|
+
|
|
402
|
+
This method is only meant as a convenience shorthand for
|
|
403
|
+
``self.unrank(i)`` and
|
|
404
|
+
``self.unrank_range(start, stop, step)`` respectively, for
|
|
405
|
+
casual use (e.g. in interactive sessions). Subclasses are
|
|
406
|
+
hereby explicitly permitted to overload ``__getitem__``
|
|
407
|
+
with a different semantic, typically for enumerated sets
|
|
408
|
+
that are naturally indexed by some `I` not of the
|
|
409
|
+
form `\{0, 1, \ldots\}`. In particular, generic code
|
|
410
|
+
*should not* use this shorthand.
|
|
411
|
+
|
|
412
|
+
EXAMPLES::
|
|
413
|
+
|
|
414
|
+
sage: # needs sage.combinat
|
|
415
|
+
sage: P = Partitions()
|
|
416
|
+
sage: P[:5]
|
|
417
|
+
[[], [1], [2], [1, 1], [3]]
|
|
418
|
+
sage: P[0:5]
|
|
419
|
+
[[], [1], [2], [1, 1], [3]]
|
|
420
|
+
sage: P[3:5]
|
|
421
|
+
[[1, 1], [3]]
|
|
422
|
+
sage: P[3:10]
|
|
423
|
+
[[1, 1], [3], [2, 1], [1, 1, 1], [4], [3, 1], [2, 2]]
|
|
424
|
+
sage: P[3:10:2]
|
|
425
|
+
[[1, 1], [2, 1], [4], [2, 2]]
|
|
426
|
+
sage: P[3:]
|
|
427
|
+
Traceback (most recent call last):
|
|
428
|
+
...
|
|
429
|
+
NotImplementedError: cannot list an infinite set
|
|
430
|
+
sage: P[3]
|
|
431
|
+
[1, 1]
|
|
432
|
+
sage: P[-1]
|
|
433
|
+
Traceback (most recent call last):
|
|
434
|
+
...
|
|
435
|
+
ValueError: infinite list
|
|
436
|
+
|
|
437
|
+
::
|
|
438
|
+
|
|
439
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
440
|
+
sage: C.list()
|
|
441
|
+
[1, 2, 3]
|
|
442
|
+
sage: C[1]
|
|
443
|
+
2
|
|
444
|
+
sage: C[:]
|
|
445
|
+
[1, 2, 3]
|
|
446
|
+
sage: C[1:]
|
|
447
|
+
[2, 3]
|
|
448
|
+
sage: C[0:1:2]
|
|
449
|
+
[1]
|
|
450
|
+
|
|
451
|
+
sage: F = FiniteEnumeratedSet([1,2,3])
|
|
452
|
+
sage: F[1:]
|
|
453
|
+
[2, 3]
|
|
454
|
+
sage: F[:2]
|
|
455
|
+
[1, 2]
|
|
456
|
+
sage: F[:2:2]
|
|
457
|
+
[1]
|
|
458
|
+
sage: F[1::2]
|
|
459
|
+
[2]
|
|
460
|
+
|
|
461
|
+
TESTS:
|
|
462
|
+
|
|
463
|
+
Verify that an infinite index raises an error::
|
|
464
|
+
|
|
465
|
+
sage: F = FiniteEnumeratedSet([1,2,3,4,5])
|
|
466
|
+
sage: F[oo]
|
|
467
|
+
Traceback (most recent call last):
|
|
468
|
+
...
|
|
469
|
+
TypeError: unable to coerce <class 'sage.rings.infinity.PlusInfinity'>
|
|
470
|
+
to an integer
|
|
471
|
+
"""
|
|
472
|
+
from sage.rings.infinity import Infinity
|
|
473
|
+
if isinstance(i, slice):
|
|
474
|
+
return self.unrank_range(i.start, i.stop, i.step)
|
|
475
|
+
i = Integer(i)
|
|
476
|
+
if i < 0:
|
|
477
|
+
i += self.cardinality()
|
|
478
|
+
if i < 0:
|
|
479
|
+
raise IndexError("index out of range")
|
|
480
|
+
if i is Infinity:
|
|
481
|
+
raise ValueError("infinite list")
|
|
482
|
+
return self.unrank(i)
|
|
483
|
+
|
|
484
|
+
def __len__(self):
|
|
485
|
+
"""
|
|
486
|
+
Return the number of elements of ``self``.
|
|
487
|
+
|
|
488
|
+
EXAMPLES::
|
|
489
|
+
|
|
490
|
+
sage: len(GF(5))
|
|
491
|
+
5
|
|
492
|
+
sage: len(MatrixSpace(GF(2), 3, 3)) # needs sage.modules
|
|
493
|
+
512
|
|
494
|
+
"""
|
|
495
|
+
from sage.rings.infinity import Infinity
|
|
496
|
+
try:
|
|
497
|
+
c = self.cardinality()
|
|
498
|
+
if c is Infinity:
|
|
499
|
+
raise NotImplementedError('infinite set')
|
|
500
|
+
return int(c)
|
|
501
|
+
except AttributeError:
|
|
502
|
+
return len(self.tuple())
|
|
503
|
+
|
|
504
|
+
def tuple(self):
|
|
505
|
+
r"""
|
|
506
|
+
Return a tuple of the elements of ``self``.
|
|
507
|
+
|
|
508
|
+
The tuple of elements of ``x`` is created and cached on the first call
|
|
509
|
+
of ``x.tuple()``. Each following call of ``x.tuple()`` returns the same tuple.
|
|
510
|
+
|
|
511
|
+
For looping, it may be better to do ``for e in x:``, not ``for e in x.tuple():``.
|
|
512
|
+
|
|
513
|
+
If ``x`` is not known to be finite, then an exception is raised.
|
|
514
|
+
|
|
515
|
+
EXAMPLES::
|
|
516
|
+
|
|
517
|
+
sage: (GF(3)^2).tuple() # needs sage.modules
|
|
518
|
+
((0, 0), (1, 0), (2, 0), (0, 1), (1, 1), (2, 1), (0, 2), (1, 2), (2, 2))
|
|
519
|
+
sage: R = Integers(11)
|
|
520
|
+
sage: l = R.tuple(); l
|
|
521
|
+
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
|
|
522
|
+
sage: l is R.tuple()
|
|
523
|
+
True
|
|
524
|
+
"""
|
|
525
|
+
try: # shortcut
|
|
526
|
+
if self._list is not None:
|
|
527
|
+
return self._tuple_from_list()
|
|
528
|
+
except AttributeError:
|
|
529
|
+
pass
|
|
530
|
+
|
|
531
|
+
if self.list != self._list_default:
|
|
532
|
+
return tuple(self.list())
|
|
533
|
+
|
|
534
|
+
from sage.rings.infinity import Infinity
|
|
535
|
+
try:
|
|
536
|
+
if self.cardinality() is Infinity:
|
|
537
|
+
raise NotImplementedError('cannot list an infinite set')
|
|
538
|
+
else: # finite cardinality
|
|
539
|
+
return self._tuple_from_iterator()
|
|
540
|
+
except AttributeError:
|
|
541
|
+
raise NotImplementedError('unknown cardinality')
|
|
542
|
+
_tuple_default = tuple
|
|
543
|
+
|
|
544
|
+
def _tuple_from_iterator(self):
|
|
545
|
+
r"""
|
|
546
|
+
Return a tuple of the elements of ``self``.
|
|
547
|
+
|
|
548
|
+
This implementation of :meth:`tuple` creates the tuple of elements and caches it for
|
|
549
|
+
later uses.
|
|
550
|
+
|
|
551
|
+
TESTS::
|
|
552
|
+
|
|
553
|
+
sage: R = Integers(11)
|
|
554
|
+
sage: R._list is None
|
|
555
|
+
False
|
|
556
|
+
sage: R._tuple_from_iterator()
|
|
557
|
+
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
|
|
558
|
+
sage: _ is R._list
|
|
559
|
+
True
|
|
560
|
+
"""
|
|
561
|
+
# This creates one throw-away list.
|
|
562
|
+
self._list_from_iterator()
|
|
563
|
+
return self._tuple_from_list()
|
|
564
|
+
|
|
565
|
+
def _tuple_from_list(self):
|
|
566
|
+
r"""
|
|
567
|
+
Return a tuple of the elements of ``self``.
|
|
568
|
+
|
|
569
|
+
This implementation of :meth:`tuple` assumes that the tuple of elements is already
|
|
570
|
+
cached and just returns it.
|
|
571
|
+
|
|
572
|
+
TESTS::
|
|
573
|
+
|
|
574
|
+
sage: R = Integers(11)
|
|
575
|
+
sage: R.tuple()
|
|
576
|
+
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
|
|
577
|
+
sage: R._tuple_from_list() is R.tuple()
|
|
578
|
+
True
|
|
579
|
+
"""
|
|
580
|
+
# Implementation classes may put any Sequence type in self._list.
|
|
581
|
+
# Traditionally, self._list was an actual list.
|
|
582
|
+
# When self._list is already a tuple, calling tuple on it is a no-op.
|
|
583
|
+
return tuple(self._list)
|
|
584
|
+
|
|
585
|
+
def list(self):
|
|
586
|
+
r"""
|
|
587
|
+
Return a list of the elements of ``self``.
|
|
588
|
+
|
|
589
|
+
The elements of set ``x`` are created and cached on the first call
|
|
590
|
+
of ``x.list()``. Then each call of ``x.list()`` returns a new list
|
|
591
|
+
from the cached result. Thus in looping, it may be better to do
|
|
592
|
+
``for e in x:``, not ``for e in x.list():``.
|
|
593
|
+
|
|
594
|
+
If ``x`` is not known to be finite, then an exception is raised.
|
|
595
|
+
|
|
596
|
+
EXAMPLES::
|
|
597
|
+
|
|
598
|
+
sage: (GF(3)^2).list() # needs sage.modules
|
|
599
|
+
[(0, 0), (1, 0), (2, 0), (0, 1), (1, 1), (2, 1), (0, 2), (1, 2), (2, 2)]
|
|
600
|
+
sage: R = Integers(11)
|
|
601
|
+
sage: R.list()
|
|
602
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
603
|
+
sage: l = R.list(); l
|
|
604
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
605
|
+
sage: l.remove(0); l
|
|
606
|
+
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
607
|
+
sage: R.list()
|
|
608
|
+
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
609
|
+
|
|
610
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
611
|
+
sage: C.list()
|
|
612
|
+
[1, 2, 3]
|
|
613
|
+
"""
|
|
614
|
+
return list(self.tuple())
|
|
615
|
+
_list_default = list # needed by the check system.
|
|
616
|
+
|
|
617
|
+
def _list_from_iterator(self):
|
|
618
|
+
r"""
|
|
619
|
+
Return a list of the elements of ``self`` after cached.
|
|
620
|
+
|
|
621
|
+
TESTS:
|
|
622
|
+
|
|
623
|
+
Trying to list an infinite vector space raises an error
|
|
624
|
+
instead of running forever (see :issue:`10470`)::
|
|
625
|
+
|
|
626
|
+
sage: (QQ^2).list() # indirect test # needs sage.modules
|
|
627
|
+
Traceback (most recent call last):
|
|
628
|
+
...
|
|
629
|
+
AttributeError: 'FreeModule_ambient_field_with_category' object has no attribute 'list'...
|
|
630
|
+
|
|
631
|
+
Here we test that for an object that does not know whether it
|
|
632
|
+
is finite or not. Calling ``x.list()`` simply tries to create
|
|
633
|
+
the list (but here it fails, since the object is not
|
|
634
|
+
iterable). This was fixed :issue:`11350` ::
|
|
635
|
+
|
|
636
|
+
sage: R.<t,p> = QQ[]
|
|
637
|
+
sage: Q = R.quotient(t^2-t+1)
|
|
638
|
+
sage: Q.is_finite()
|
|
639
|
+
Traceback (most recent call last):
|
|
640
|
+
...
|
|
641
|
+
AttributeError: 'QuotientRing_generic_with_category' object has no attribute 'is_finite'...
|
|
642
|
+
sage: Q.list() # indirect test
|
|
643
|
+
Traceback (most recent call last):
|
|
644
|
+
...
|
|
645
|
+
AttributeError: 'QuotientRing_generic_with_category' object has no attribute 'list'...
|
|
646
|
+
|
|
647
|
+
Here is another example. We artificially create a version of
|
|
648
|
+
the ring of integers that does not know whether it is finite
|
|
649
|
+
or not::
|
|
650
|
+
|
|
651
|
+
sage: from sage.rings.integer_ring import IntegerRing_class
|
|
652
|
+
sage: class MyIntegers_class(IntegerRing_class):
|
|
653
|
+
....: def is_finite(self):
|
|
654
|
+
....: raise NotImplementedError
|
|
655
|
+
sage: MyIntegers = MyIntegers_class()
|
|
656
|
+
sage: MyIntegers.is_finite()
|
|
657
|
+
Traceback (most recent call last):
|
|
658
|
+
...
|
|
659
|
+
NotImplementedError
|
|
660
|
+
|
|
661
|
+
Asking for ``list(MyIntegers)`` will also raise an exception::
|
|
662
|
+
|
|
663
|
+
sage: list(MyIntegers) # indirect test
|
|
664
|
+
Traceback (most recent call last):
|
|
665
|
+
...
|
|
666
|
+
NotImplementedError
|
|
667
|
+
"""
|
|
668
|
+
try:
|
|
669
|
+
if self._list is not None:
|
|
670
|
+
return list(self._list)
|
|
671
|
+
except AttributeError:
|
|
672
|
+
pass
|
|
673
|
+
result = tuple(self.__iter__())
|
|
674
|
+
try:
|
|
675
|
+
self._list = result
|
|
676
|
+
except AttributeError:
|
|
677
|
+
pass
|
|
678
|
+
return list(result)
|
|
679
|
+
|
|
680
|
+
def _first_from_iterator(self):
|
|
681
|
+
"""
|
|
682
|
+
The "first" element of ``self``.
|
|
683
|
+
|
|
684
|
+
``self.first()`` returns the first element of the set
|
|
685
|
+
``self``. This is a generic implementation from the category
|
|
686
|
+
``EnumeratedSets()`` which can be used when the method ``__iter__`` is
|
|
687
|
+
provided.
|
|
688
|
+
|
|
689
|
+
EXAMPLES::
|
|
690
|
+
|
|
691
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
692
|
+
sage: C.first() # indirect doctest
|
|
693
|
+
1
|
|
694
|
+
"""
|
|
695
|
+
return next(iter(self))
|
|
696
|
+
first = _first_from_iterator
|
|
697
|
+
|
|
698
|
+
def _next_from_iterator(self, obj):
|
|
699
|
+
"""
|
|
700
|
+
The "next" element after ``obj`` in ``self``.
|
|
701
|
+
|
|
702
|
+
``self.next(e)`` returns the element of the set ``self`` which
|
|
703
|
+
follows ``e``. This is a generic implementation from the category
|
|
704
|
+
``EnumeratedSets()`` which can be used when the method ``__iter__``
|
|
705
|
+
is provided.
|
|
706
|
+
|
|
707
|
+
Remark: this is the default (brute force) implementation
|
|
708
|
+
of the category ``EnumeratedSets()``. Its complexity is
|
|
709
|
+
`O(r)`, where `r` is the rank of ``obj``.
|
|
710
|
+
|
|
711
|
+
EXAMPLES::
|
|
712
|
+
|
|
713
|
+
sage: C = InfiniteEnumeratedSets().example()
|
|
714
|
+
sage: C._next_from_iterator(10) # indirect doctest
|
|
715
|
+
11
|
|
716
|
+
|
|
717
|
+
TODO: specify the behavior when ``obj`` is not in ``self``.
|
|
718
|
+
"""
|
|
719
|
+
it = iter(self)
|
|
720
|
+
el = next(it)
|
|
721
|
+
while el != obj:
|
|
722
|
+
el = next(it)
|
|
723
|
+
return next(it)
|
|
724
|
+
next = _next_from_iterator
|
|
725
|
+
|
|
726
|
+
def _unrank_from_iterator(self, r):
|
|
727
|
+
"""
|
|
728
|
+
The ``r``-th element of ``self``.
|
|
729
|
+
|
|
730
|
+
``self.unrank(r)`` returns the ``r``-th element of ``self``, where
|
|
731
|
+
``r`` is an integer between ``0`` and ``n-1`` where ``n`` is the
|
|
732
|
+
cardinality of ``self``.
|
|
733
|
+
|
|
734
|
+
This is the default (brute force) implementation from the
|
|
735
|
+
category ``EnumeratedSets()`` which can be used when the
|
|
736
|
+
method ``__iter__`` is provided. Its complexity is `O(r)`,
|
|
737
|
+
where `r` is the rank of ``obj``.
|
|
738
|
+
|
|
739
|
+
EXAMPLES::
|
|
740
|
+
|
|
741
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
742
|
+
sage: C.unrank(2) # indirect doctest
|
|
743
|
+
3
|
|
744
|
+
sage: C._unrank_from_iterator(5)
|
|
745
|
+
Traceback (most recent call last):
|
|
746
|
+
...
|
|
747
|
+
ValueError: the rank must be in the range from 0 to 2
|
|
748
|
+
sage: ZZ._unrank_from_iterator(-1)
|
|
749
|
+
Traceback (most recent call last):
|
|
750
|
+
...
|
|
751
|
+
ValueError: the rank must be greater than or equal to 0
|
|
752
|
+
"""
|
|
753
|
+
from sage.rings.integer_ring import ZZ
|
|
754
|
+
if r < 0:
|
|
755
|
+
raise ValueError("the rank must be greater than or equal to 0")
|
|
756
|
+
if r not in ZZ:
|
|
757
|
+
raise ValueError(f"{r=} must be an integer")
|
|
758
|
+
for counter, u in enumerate(self):
|
|
759
|
+
if counter == r:
|
|
760
|
+
return u
|
|
761
|
+
raise ValueError("the rank must be in the range from %s to %s" % (0,counter))
|
|
762
|
+
unrank = _unrank_from_iterator
|
|
763
|
+
|
|
764
|
+
def _rank_from_iterator(self, x):
|
|
765
|
+
"""
|
|
766
|
+
The rank of an element of ``self``.
|
|
767
|
+
|
|
768
|
+
``self.rank(x)`` returns the rank of `x`, that is its
|
|
769
|
+
position in the enumeration of ``self``. This is an
|
|
770
|
+
integer between ``0`` and ``n-1`` where ``n`` is the
|
|
771
|
+
cardinality of ``self``, or None if `x` is not in ``self``.
|
|
772
|
+
|
|
773
|
+
This is the default (brute force) implementation from the
|
|
774
|
+
category ``EnumeratedSets()`` which can be used when the
|
|
775
|
+
method ``__iter__`` is provided. Its complexity is `O(r)`,
|
|
776
|
+
where `r` is the rank of ``obj``. For infinite enumerated
|
|
777
|
+
sets, this won't terminate when `x` is not in ``self``
|
|
778
|
+
|
|
779
|
+
EXAMPLES::
|
|
780
|
+
|
|
781
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
782
|
+
sage: list(C)
|
|
783
|
+
[1, 2, 3]
|
|
784
|
+
sage: C.rank(3) # indirect doctest
|
|
785
|
+
2
|
|
786
|
+
sage: C.rank(5) # indirect doctest
|
|
787
|
+
"""
|
|
788
|
+
counter = 0
|
|
789
|
+
for u in self:
|
|
790
|
+
if u == x:
|
|
791
|
+
return counter
|
|
792
|
+
counter += 1
|
|
793
|
+
return None
|
|
794
|
+
rank = _rank_from_iterator
|
|
795
|
+
|
|
796
|
+
def _iterator_from_list(self):
|
|
797
|
+
"""
|
|
798
|
+
An iterator for the elements of ``self``.
|
|
799
|
+
|
|
800
|
+
``iter(self)`` returns an iterator for the elements
|
|
801
|
+
of ``self``. This is a generic implementation from the
|
|
802
|
+
category ``EnumeratedSets()`` which can be used when the
|
|
803
|
+
method ``list`` is provided.
|
|
804
|
+
|
|
805
|
+
EXAMPLES::
|
|
806
|
+
|
|
807
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
808
|
+
sage: it = C._iterator_from_list()
|
|
809
|
+
sage: [next(it), next(it), next(it)]
|
|
810
|
+
[1, 2, 3]
|
|
811
|
+
"""
|
|
812
|
+
yield from self.tuple()
|
|
813
|
+
|
|
814
|
+
def _iterator_from_next(self):
|
|
815
|
+
"""
|
|
816
|
+
An iterator for the elements of ``self``.
|
|
817
|
+
|
|
818
|
+
``iter(self)`` returns an iterator for the element of
|
|
819
|
+
the set ``self``. This is a generic implementation from
|
|
820
|
+
the category ``EnumeratedSets()`` which can be used when
|
|
821
|
+
the methods ``first`` and ``next`` are provided.
|
|
822
|
+
|
|
823
|
+
EXAMPLES::
|
|
824
|
+
|
|
825
|
+
sage: C = InfiniteEnumeratedSets().example()
|
|
826
|
+
sage: it = C._iterator_from_next()
|
|
827
|
+
sage: [next(it), next(it), next(it), next(it), next(it)]
|
|
828
|
+
[0, 1, 2, 3, 4]
|
|
829
|
+
"""
|
|
830
|
+
f = self.first()
|
|
831
|
+
while not (f is None or f is False):
|
|
832
|
+
yield f
|
|
833
|
+
try:
|
|
834
|
+
f = self.next(f)
|
|
835
|
+
except (TypeError, ValueError):
|
|
836
|
+
f = None
|
|
837
|
+
|
|
838
|
+
def _iterator_from_unrank(self):
|
|
839
|
+
"""
|
|
840
|
+
An iterator for the elements of ``self``.
|
|
841
|
+
|
|
842
|
+
``iter(self)`` returns an iterator for the elements
|
|
843
|
+
of the set ``self``. This is a generic implementation from
|
|
844
|
+
the category ``EnumeratedSets()`` which can be used when
|
|
845
|
+
the method ``unrank`` is provided.
|
|
846
|
+
|
|
847
|
+
EXAMPLES::
|
|
848
|
+
|
|
849
|
+
sage: C = InfiniteEnumeratedSets().example()
|
|
850
|
+
sage: it = C._iterator_from_unrank()
|
|
851
|
+
sage: [next(it), next(it), next(it), next(it), next(it)]
|
|
852
|
+
[0, 1, 2, 3, 4]
|
|
853
|
+
"""
|
|
854
|
+
r = 0
|
|
855
|
+
try:
|
|
856
|
+
u = self.unrank(r)
|
|
857
|
+
except (TypeError, ValueError, IndexError):
|
|
858
|
+
return
|
|
859
|
+
yield u
|
|
860
|
+
while True:
|
|
861
|
+
r += 1
|
|
862
|
+
try:
|
|
863
|
+
u = self.unrank(r)
|
|
864
|
+
except (TypeError, ValueError, IndexError):
|
|
865
|
+
break
|
|
866
|
+
|
|
867
|
+
if u is None:
|
|
868
|
+
break
|
|
869
|
+
else:
|
|
870
|
+
yield u
|
|
871
|
+
|
|
872
|
+
# This @cached_method is not really needed, since the method
|
|
873
|
+
# an_element itself is cached. We leave it for the moment, so
|
|
874
|
+
# that Parents that do not yet inherit properly from categories
|
|
875
|
+
# (e.g. Set([1,2,3]) can use the following trick:
|
|
876
|
+
# _an_element_ = EnumeratedSets.ParentMethods._an_element_
|
|
877
|
+
@cached_method
|
|
878
|
+
def _an_element_from_iterator(self):
|
|
879
|
+
"""
|
|
880
|
+
Return the first element of ``self`` returned by :meth:`__iter__`.
|
|
881
|
+
|
|
882
|
+
If ``self`` is empty, the exception
|
|
883
|
+
:class:`~sage.categories.sets_cat.EmptySetError` is raised instead.
|
|
884
|
+
|
|
885
|
+
This provides a generic implementation of the method
|
|
886
|
+
:meth:`_an_element_` for all parents in :class:`EnumeratedSets`.
|
|
887
|
+
|
|
888
|
+
EXAMPLES::
|
|
889
|
+
|
|
890
|
+
sage: C = FiniteEnumeratedSets().example(); C
|
|
891
|
+
An example of a finite enumerated set: {1,2,3}
|
|
892
|
+
sage: C.an_element() # indirect doctest
|
|
893
|
+
1
|
|
894
|
+
sage: S = Set([])
|
|
895
|
+
sage: S.an_element()
|
|
896
|
+
Traceback (most recent call last):
|
|
897
|
+
...
|
|
898
|
+
EmptySetError
|
|
899
|
+
|
|
900
|
+
TESTS::
|
|
901
|
+
|
|
902
|
+
sage: super(Parent, C)._an_element_
|
|
903
|
+
Cached version of <function ..._an_element_from_iterator at ...>
|
|
904
|
+
"""
|
|
905
|
+
it = iter(self)
|
|
906
|
+
try:
|
|
907
|
+
return next(it)
|
|
908
|
+
except StopIteration:
|
|
909
|
+
raise EmptySetError
|
|
910
|
+
|
|
911
|
+
# Should this be implemented from first instead?
|
|
912
|
+
_an_element_ = _an_element_from_iterator
|
|
913
|
+
|
|
914
|
+
#FIXME: use combinatorial_class_from_iterator once class_from_iterator.patch is in
|
|
915
|
+
def _some_elements_from_iterator(self):
|
|
916
|
+
"""
|
|
917
|
+
Return some elements in ``self``.
|
|
918
|
+
|
|
919
|
+
See :class:`TestSuite` for a typical use case.
|
|
920
|
+
|
|
921
|
+
This is a generic implementation from the category
|
|
922
|
+
``EnumeratedSets()`` which can be used when the method
|
|
923
|
+
``__iter__`` is provided. It returns an iterator for up to
|
|
924
|
+
the first 100 elements of ``self``
|
|
925
|
+
|
|
926
|
+
EXAMPLES::
|
|
927
|
+
|
|
928
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
929
|
+
sage: list(C.some_elements()) # indirect doctest
|
|
930
|
+
[1, 2, 3]
|
|
931
|
+
"""
|
|
932
|
+
nb = 0
|
|
933
|
+
for i in self:
|
|
934
|
+
yield i
|
|
935
|
+
nb += 1
|
|
936
|
+
if nb >= 100:
|
|
937
|
+
break
|
|
938
|
+
some_elements = _some_elements_from_iterator
|
|
939
|
+
|
|
940
|
+
def random_element(self):
|
|
941
|
+
"""
|
|
942
|
+
Return a random element in ``self``.
|
|
943
|
+
|
|
944
|
+
Unless otherwise stated, and for finite enumerated sets,
|
|
945
|
+
the probability is uniform.
|
|
946
|
+
|
|
947
|
+
This is a generic implementation from the category
|
|
948
|
+
``EnumeratedSets()``. It raises a :exc:`NotImplementedError`
|
|
949
|
+
since one does not know whether the set is finite.
|
|
950
|
+
|
|
951
|
+
EXAMPLES::
|
|
952
|
+
|
|
953
|
+
sage: class broken(UniqueRepresentation, Parent):
|
|
954
|
+
....: def __init__(self):
|
|
955
|
+
....: Parent.__init__(self, category = EnumeratedSets())
|
|
956
|
+
sage: broken().random_element()
|
|
957
|
+
Traceback (most recent call last):
|
|
958
|
+
...
|
|
959
|
+
NotImplementedError: unknown cardinality
|
|
960
|
+
"""
|
|
961
|
+
raise NotImplementedError("unknown cardinality")
|
|
962
|
+
|
|
963
|
+
def map(self, f, name=None, *, is_injective=True):
|
|
964
|
+
r"""
|
|
965
|
+
Return the image `\{f(x) | x \in \text{self}\}` of this
|
|
966
|
+
enumerated set by `f`, as an enumerated set.
|
|
967
|
+
|
|
968
|
+
INPUT:
|
|
969
|
+
|
|
970
|
+
- ``is_injective`` -- boolean (default: ``True``); whether to assume
|
|
971
|
+
that `f` is injective
|
|
972
|
+
|
|
973
|
+
EXAMPLES::
|
|
974
|
+
|
|
975
|
+
sage: R = Compositions(4).map(attrcall('partial_sums')); R
|
|
976
|
+
Image of Compositions of 4 by The map *.partial_sums()
|
|
977
|
+
from Compositions of 4
|
|
978
|
+
sage: R.cardinality()
|
|
979
|
+
8
|
|
980
|
+
sage: R.list()
|
|
981
|
+
[[1, 2, 3, 4], [1, 2, 4], [1, 3, 4], [1, 4], [2, 3, 4], [2, 4], [3, 4], [4]]
|
|
982
|
+
sage: [r for r in R]
|
|
983
|
+
[[1, 2, 3, 4], [1, 2, 4], [1, 3, 4], [1, 4], [2, 3, 4], [2, 4], [3, 4], [4]]
|
|
984
|
+
sage: R.category()
|
|
985
|
+
Category of finite enumerated subobjects of sets
|
|
986
|
+
|
|
987
|
+
.. WARNING::
|
|
988
|
+
|
|
989
|
+
If the function is not injective, then there may be
|
|
990
|
+
repeated elements::
|
|
991
|
+
|
|
992
|
+
sage: P = Compositions(4)
|
|
993
|
+
sage: P.list()
|
|
994
|
+
[[1, 1, 1, 1], [1, 1, 2], [1, 2, 1], [1, 3], [2, 1, 1], [2, 2], [3, 1], [4]]
|
|
995
|
+
sage: P.map(attrcall('major_index')).list()
|
|
996
|
+
[6, 3, 4, 1, 5, 2, 3, 0]
|
|
997
|
+
|
|
998
|
+
Pass ``is_injective=False`` to get a correct result in this case::
|
|
999
|
+
|
|
1000
|
+
sage: P.map(attrcall('major_index'), is_injective=False).list()
|
|
1001
|
+
[6, 3, 4, 1, 5, 2, 0]
|
|
1002
|
+
|
|
1003
|
+
TESTS::
|
|
1004
|
+
|
|
1005
|
+
sage: TestSuite(R).run(skip=['_test_an_element',
|
|
1006
|
+
....: '_test_enumerated_set_contains',
|
|
1007
|
+
....: '_test_some_elements'])
|
|
1008
|
+
"""
|
|
1009
|
+
from sage.sets.image_set import ImageSubobject
|
|
1010
|
+
|
|
1011
|
+
image = ImageSubobject(f, self, is_injective=is_injective)
|
|
1012
|
+
if name:
|
|
1013
|
+
image.rename(name)
|
|
1014
|
+
return image
|
|
1015
|
+
|
|
1016
|
+
#
|
|
1017
|
+
# Consistency test suite for an enumerated set:
|
|
1018
|
+
#
|
|
1019
|
+
def _test_enumerated_set_contains(self, **options):
|
|
1020
|
+
"""
|
|
1021
|
+
Check that the methods :meth:`.__contains__` and :meth:`.__iter__` are consistent.
|
|
1022
|
+
|
|
1023
|
+
See also :class:`TestSuite`.
|
|
1024
|
+
|
|
1025
|
+
TESTS::
|
|
1026
|
+
|
|
1027
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
1028
|
+
sage: C._test_enumerated_set_contains()
|
|
1029
|
+
sage: TestSuite(C).run()
|
|
1030
|
+
|
|
1031
|
+
Let us now break the class::
|
|
1032
|
+
|
|
1033
|
+
sage: from sage.categories.examples.finite_enumerated_sets import Example
|
|
1034
|
+
sage: class CCls(Example):
|
|
1035
|
+
....: def __contains__(self, obj):
|
|
1036
|
+
....: if obj == 3:
|
|
1037
|
+
....: return False
|
|
1038
|
+
....: else:
|
|
1039
|
+
....: return obj in C
|
|
1040
|
+
sage: CC = CCls()
|
|
1041
|
+
sage: CC._test_enumerated_set_contains()
|
|
1042
|
+
Traceback (most recent call last):
|
|
1043
|
+
...
|
|
1044
|
+
AssertionError: 3 not found in An example
|
|
1045
|
+
of a finite enumerated set: {1,2,3}
|
|
1046
|
+
"""
|
|
1047
|
+
tester = self._tester(**options)
|
|
1048
|
+
i = 0
|
|
1049
|
+
for w in self:
|
|
1050
|
+
tester.assertIn(w, self)
|
|
1051
|
+
i += 1
|
|
1052
|
+
if i > tester._max_runs:
|
|
1053
|
+
return
|
|
1054
|
+
|
|
1055
|
+
def _test_enumerated_set_iter_list(self, **options):
|
|
1056
|
+
"""
|
|
1057
|
+
Check that the methods :meth:`.list` and :meth:`.__iter__` are consistent.
|
|
1058
|
+
|
|
1059
|
+
See also: :class:`TestSuite`.
|
|
1060
|
+
|
|
1061
|
+
.. NOTE::
|
|
1062
|
+
|
|
1063
|
+
This test does nothing if the cardinality of the set
|
|
1064
|
+
is larger than the max_runs argument.
|
|
1065
|
+
|
|
1066
|
+
EXAMPLES::
|
|
1067
|
+
|
|
1068
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
1069
|
+
sage: C._test_enumerated_set_iter_list()
|
|
1070
|
+
sage: TestSuite(C).run()
|
|
1071
|
+
|
|
1072
|
+
Let us now break the class::
|
|
1073
|
+
|
|
1074
|
+
sage: from sage.categories.examples.finite_enumerated_sets import Example
|
|
1075
|
+
sage: class CCls(Example):
|
|
1076
|
+
....: def list(self):
|
|
1077
|
+
....: return [1,2,3,4]
|
|
1078
|
+
sage: CC = CCls()
|
|
1079
|
+
sage: CC._test_enumerated_set_iter_list()
|
|
1080
|
+
Traceback (most recent call last):
|
|
1081
|
+
...
|
|
1082
|
+
AssertionError: 3 != 4
|
|
1083
|
+
|
|
1084
|
+
For a large enumerated set this test does nothing:
|
|
1085
|
+
increase tester._max_runs if you want to actually run the
|
|
1086
|
+
test::
|
|
1087
|
+
|
|
1088
|
+
sage: class CCls(Example):
|
|
1089
|
+
....: def list(self):
|
|
1090
|
+
....: return [1,2,3]
|
|
1091
|
+
sage: CC = CCls()
|
|
1092
|
+
sage: CC._test_enumerated_set_iter_list(verbose=True,max_runs=2)
|
|
1093
|
+
Enumerated set too big; skipping test; increase tester._max_runs
|
|
1094
|
+
"""
|
|
1095
|
+
tester = self._tester(**options)
|
|
1096
|
+
if self.list != self._list_default:
|
|
1097
|
+
# TODO: if self._cardinality is self._cardinality_from_iterator
|
|
1098
|
+
# we could make sure to stop the counting at
|
|
1099
|
+
# self.max_test_enumerated_set_loop
|
|
1100
|
+
if self.cardinality() > tester._max_runs:
|
|
1101
|
+
tester.info("Enumerated set too big; skipping test; increase tester._max_runs")
|
|
1102
|
+
return
|
|
1103
|
+
ls = self.list()
|
|
1104
|
+
i = 0
|
|
1105
|
+
for obj in self:
|
|
1106
|
+
tester.assertEqual(obj, ls[i])
|
|
1107
|
+
i += 1
|
|
1108
|
+
tester.assertEqual(i, len(ls))
|
|
1109
|
+
|
|
1110
|
+
class ElementMethods:
|
|
1111
|
+
|
|
1112
|
+
def rank(self):
|
|
1113
|
+
"""
|
|
1114
|
+
Return the rank of ``self`` in its parent.
|
|
1115
|
+
|
|
1116
|
+
See also :meth:`EnumeratedSets.ElementMethods.rank`
|
|
1117
|
+
|
|
1118
|
+
EXAMPLES::
|
|
1119
|
+
|
|
1120
|
+
sage: F = FiniteSemigroups().example(('a','b','c'))
|
|
1121
|
+
sage: L = list(F)
|
|
1122
|
+
sage: L[7].rank()
|
|
1123
|
+
7
|
|
1124
|
+
sage: all(x.rank() == i for i,x in enumerate(L))
|
|
1125
|
+
True
|
|
1126
|
+
"""
|
|
1127
|
+
return self.parent().rank(self)
|
|
1128
|
+
|
|
1129
|
+
Finite = LazyImport('sage.categories.finite_enumerated_sets', 'FiniteEnumeratedSets', at_startup=True)
|
|
1130
|
+
Infinite = LazyImport('sage.categories.infinite_enumerated_sets', 'InfiniteEnumeratedSets', at_startup=True)
|
|
1131
|
+
|
|
1132
|
+
class CartesianProducts(CartesianProductsCategory):
|
|
1133
|
+
|
|
1134
|
+
class ParentMethods:
|
|
1135
|
+
|
|
1136
|
+
def first(self):
|
|
1137
|
+
r"""
|
|
1138
|
+
Return the first element.
|
|
1139
|
+
|
|
1140
|
+
EXAMPLES::
|
|
1141
|
+
|
|
1142
|
+
sage: cartesian_product([ZZ]*10).first()
|
|
1143
|
+
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
|
1144
|
+
"""
|
|
1145
|
+
return self._cartesian_product_of_elements(
|
|
1146
|
+
tuple(c.first() for c in self.cartesian_factors()))
|