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,769 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Finite 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.categories.category_with_axiom import CategoryWithAxiom
|
|
13
|
+
from sage.categories.enumerated_sets import EnumeratedSets
|
|
14
|
+
from sage.categories.sets_cat import Sets
|
|
15
|
+
from sage.categories.cartesian_product import CartesianProductsCategory
|
|
16
|
+
from sage.categories.isomorphic_objects import IsomorphicObjectsCategory
|
|
17
|
+
from sage.misc.cachefunc import cached_method
|
|
18
|
+
from sage.misc.lazy_import import lazy_import
|
|
19
|
+
from sage.cpython.getattr import raw_getattr
|
|
20
|
+
lazy_import("sage.rings.integer", "Integer")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class FiniteEnumeratedSets(CategoryWithAxiom):
|
|
24
|
+
"""
|
|
25
|
+
The category of finite enumerated sets.
|
|
26
|
+
|
|
27
|
+
EXAMPLES::
|
|
28
|
+
|
|
29
|
+
sage: FiniteEnumeratedSets()
|
|
30
|
+
Category of finite enumerated sets
|
|
31
|
+
sage: FiniteEnumeratedSets().super_categories()
|
|
32
|
+
[Category of enumerated sets, Category of finite sets]
|
|
33
|
+
sage: FiniteEnumeratedSets().all_super_categories()
|
|
34
|
+
[Category of finite enumerated sets,
|
|
35
|
+
Category of enumerated sets,
|
|
36
|
+
Category of finite sets,
|
|
37
|
+
Category of sets,
|
|
38
|
+
Category of sets with partial maps,
|
|
39
|
+
Category of objects]
|
|
40
|
+
|
|
41
|
+
TESTS::
|
|
42
|
+
|
|
43
|
+
sage: C = FiniteEnumeratedSets()
|
|
44
|
+
sage: TestSuite(C).run()
|
|
45
|
+
sage: sorted(C.Algebras(QQ).super_categories(), key=str)
|
|
46
|
+
[Category of finite dimensional vector spaces with basis over Rational Field,
|
|
47
|
+
Category of set algebras over Rational Field]
|
|
48
|
+
|
|
49
|
+
.. TODO::
|
|
50
|
+
|
|
51
|
+
:class:`sage.combinat.debruijn_sequence.DeBruijnSequences` should
|
|
52
|
+
not inherit from this class. If that is solved, then
|
|
53
|
+
:class:`FiniteEnumeratedSets` shall be turned into a subclass of
|
|
54
|
+
:class:`~sage.categories.category_singleton.Category_singleton`.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
def _call_(self, X):
|
|
58
|
+
"""
|
|
59
|
+
Construct an object in this category from the data in ``X``.
|
|
60
|
+
|
|
61
|
+
EXAMPLES::
|
|
62
|
+
|
|
63
|
+
sage: FiniteEnumeratedSets()(GF(3))
|
|
64
|
+
Finite Field of size 3
|
|
65
|
+
sage: Partitions(3)
|
|
66
|
+
Partitions of the integer 3
|
|
67
|
+
|
|
68
|
+
For now, lists, tuples, sets, Sets are coerced into finite
|
|
69
|
+
enumerated sets::
|
|
70
|
+
|
|
71
|
+
sage: FiniteEnumeratedSets()([1, 2, 3])
|
|
72
|
+
{1, 2, 3}
|
|
73
|
+
sage: FiniteEnumeratedSets()((1, 2, 3))
|
|
74
|
+
{1, 2, 3}
|
|
75
|
+
sage: FiniteEnumeratedSets()(set([1, 2, 3]))
|
|
76
|
+
{1, 2, 3}
|
|
77
|
+
sage: FiniteEnumeratedSets()(Set([1, 2, 3]))
|
|
78
|
+
{1, 2, 3}
|
|
79
|
+
"""
|
|
80
|
+
return EnumeratedSets()._call_(X)
|
|
81
|
+
|
|
82
|
+
class ParentMethods:
|
|
83
|
+
|
|
84
|
+
def __len__(self):
|
|
85
|
+
"""
|
|
86
|
+
Return the number of elements of ``self``.
|
|
87
|
+
|
|
88
|
+
EXAMPLES::
|
|
89
|
+
|
|
90
|
+
sage: len(GF(5))
|
|
91
|
+
5
|
|
92
|
+
sage: len(MatrixSpace(GF(2), 3, 3)) # needs sage.modules
|
|
93
|
+
512
|
|
94
|
+
"""
|
|
95
|
+
return int(self.cardinality())
|
|
96
|
+
|
|
97
|
+
def _cardinality_from_iterator(self, *ignored_args, **ignored_kwds):
|
|
98
|
+
"""
|
|
99
|
+
Return the cardinality of ``self``.
|
|
100
|
+
|
|
101
|
+
This brute force implementation of :meth:`cardinality`
|
|
102
|
+
iterates through the elements of ``self`` to count them.
|
|
103
|
+
|
|
104
|
+
EXAMPLES::
|
|
105
|
+
|
|
106
|
+
sage: C = FiniteEnumeratedSets().example(); C
|
|
107
|
+
An example of a finite enumerated set: {1,2,3}
|
|
108
|
+
sage: C._cardinality_from_iterator()
|
|
109
|
+
3
|
|
110
|
+
|
|
111
|
+
TESTS:
|
|
112
|
+
|
|
113
|
+
This is the default implementation of :meth:`cardinality`
|
|
114
|
+
from the category ``FiniteEnumeratedSet()``. To test this,
|
|
115
|
+
we need a fresh example::
|
|
116
|
+
|
|
117
|
+
sage: from sage.categories.examples.finite_enumerated_sets import Example
|
|
118
|
+
sage: class FreshExample(Example): pass
|
|
119
|
+
sage: C = FreshExample(); C.rename('FreshExample')
|
|
120
|
+
sage: C.cardinality
|
|
121
|
+
<bound method FiniteEnumeratedSets.ParentMethods._cardinality_from_iterator of FreshExample>
|
|
122
|
+
|
|
123
|
+
This method shall return an ``Integer``; we test this
|
|
124
|
+
here, because :meth:`_test_enumerated_set_iter_cardinality`
|
|
125
|
+
does not do it for us::
|
|
126
|
+
|
|
127
|
+
sage: type(C._cardinality_from_iterator())
|
|
128
|
+
<class 'sage.rings.integer.Integer'>
|
|
129
|
+
|
|
130
|
+
We ignore additional inputs since during doctests classes which
|
|
131
|
+
override ``cardinality()`` call up to the category rather than
|
|
132
|
+
their own ``cardinality()`` method (see :issue:`13688`)::
|
|
133
|
+
|
|
134
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
135
|
+
sage: C._cardinality_from_iterator(algorithm='testing')
|
|
136
|
+
3
|
|
137
|
+
|
|
138
|
+
Here is a more complete example::
|
|
139
|
+
|
|
140
|
+
sage: class TestParent(Parent):
|
|
141
|
+
....: def __init__(self):
|
|
142
|
+
....: Parent.__init__(self, category=FiniteEnumeratedSets())
|
|
143
|
+
....: def __iter__(self):
|
|
144
|
+
....: yield 1
|
|
145
|
+
....: return
|
|
146
|
+
....: def cardinality(self, dummy_arg):
|
|
147
|
+
....: return 1 # we don't want to change the semantics of cardinality()
|
|
148
|
+
sage: P = TestParent()
|
|
149
|
+
sage: P.cardinality(-1)
|
|
150
|
+
1
|
|
151
|
+
sage: v = P.list(); v
|
|
152
|
+
[1]
|
|
153
|
+
sage: P.cardinality()
|
|
154
|
+
1
|
|
155
|
+
sage: P.cardinality('use alt algorithm') # Used to break here: see trac #13688
|
|
156
|
+
1
|
|
157
|
+
sage: P.cardinality(dummy_arg='use alg algorithm') # Used to break here: see trac #13688
|
|
158
|
+
1
|
|
159
|
+
"""
|
|
160
|
+
c = 0
|
|
161
|
+
for _ in self:
|
|
162
|
+
c += 1
|
|
163
|
+
return Integer(c)
|
|
164
|
+
|
|
165
|
+
#Set cardinality to the default implementation
|
|
166
|
+
cardinality = _cardinality_from_iterator
|
|
167
|
+
|
|
168
|
+
def _cardinality_from_list(self, *ignored_args, **ignored_kwds):
|
|
169
|
+
"""
|
|
170
|
+
The cardinality of ``self``.
|
|
171
|
+
|
|
172
|
+
This implementation of :meth:`cardinality` computes the
|
|
173
|
+
cardinality from :meth:`list` (which is
|
|
174
|
+
cached). Reciprocally, calling ``self.list()`` makes this
|
|
175
|
+
method the default implementation of :meth:`cardinality`.
|
|
176
|
+
|
|
177
|
+
EXAMPLES::
|
|
178
|
+
|
|
179
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
180
|
+
sage: C._cardinality_from_list()
|
|
181
|
+
3
|
|
182
|
+
|
|
183
|
+
We ignore additional inputs since during doctests classes which
|
|
184
|
+
override ``cardinality()`` call up to the category rather than
|
|
185
|
+
their own ``cardinality()`` method (see :issue:`13688`)::
|
|
186
|
+
|
|
187
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
188
|
+
sage: C._cardinality_from_list(algorithm='testing')
|
|
189
|
+
3
|
|
190
|
+
"""
|
|
191
|
+
return Integer(len(self.tuple()))
|
|
192
|
+
|
|
193
|
+
def _unrank_from_list(self, r):
|
|
194
|
+
r"""
|
|
195
|
+
The `r`-th element of ``self``.
|
|
196
|
+
|
|
197
|
+
INPUT:
|
|
198
|
+
|
|
199
|
+
- ``r`` -- integer between `0` and `n-1`,
|
|
200
|
+
where `n` is the cardinality of ``self``
|
|
201
|
+
|
|
202
|
+
OUTPUT: the `r`-th element of ``self``
|
|
203
|
+
|
|
204
|
+
This implementation of :meth:`unrank` uses the method
|
|
205
|
+
:meth:`list` (which is cached). Reciprocally, calling
|
|
206
|
+
``self.list()`` makes this method the default
|
|
207
|
+
implementation of :meth:`unrank`.
|
|
208
|
+
|
|
209
|
+
EXAMPLES::
|
|
210
|
+
|
|
211
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
212
|
+
sage: C._unrank_from_list(1)
|
|
213
|
+
2
|
|
214
|
+
"""
|
|
215
|
+
lst = self.tuple()
|
|
216
|
+
try:
|
|
217
|
+
return lst[r]
|
|
218
|
+
except IndexError:
|
|
219
|
+
raise ValueError("the value must be in the range from %s to %s" % (0, len(lst) - 1))
|
|
220
|
+
|
|
221
|
+
def tuple(self):
|
|
222
|
+
r"""
|
|
223
|
+
Return a :class:`tuple`of the elements of ``self``.
|
|
224
|
+
|
|
225
|
+
EXAMPLES::
|
|
226
|
+
|
|
227
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
228
|
+
sage: C.tuple()
|
|
229
|
+
(1, 2, 3)
|
|
230
|
+
sage: C.tuple() is C.tuple()
|
|
231
|
+
True
|
|
232
|
+
"""
|
|
233
|
+
# Simpler implementation because it does not have to check whether cardinality is finite
|
|
234
|
+
try: # shortcut
|
|
235
|
+
if self._list is not None:
|
|
236
|
+
return self._tuple_from_list()
|
|
237
|
+
except AttributeError:
|
|
238
|
+
pass
|
|
239
|
+
|
|
240
|
+
if self.list != self._list_default:
|
|
241
|
+
return tuple(self.list())
|
|
242
|
+
|
|
243
|
+
return self._tuple_from_iterator()
|
|
244
|
+
_tuple_default = tuple
|
|
245
|
+
|
|
246
|
+
def _list_from_iterator(self):
|
|
247
|
+
r"""
|
|
248
|
+
Return a list of the elements of ``self`` after cached.
|
|
249
|
+
|
|
250
|
+
It moreover overrides the following methods to use this cache:
|
|
251
|
+
|
|
252
|
+
- ``self.__iter__()``
|
|
253
|
+
- ``self.cardinality()``
|
|
254
|
+
- ``self.unrank()``
|
|
255
|
+
|
|
256
|
+
.. SEEALSO:: :meth:`_cardinality_from_list`,
|
|
257
|
+
:meth:`_iterator_from_list`, and :meth:`_unrank_from_list`
|
|
258
|
+
|
|
259
|
+
.. WARNING::
|
|
260
|
+
|
|
261
|
+
The overriding of ``self.__iter__`` to use the cache
|
|
262
|
+
is ignored upon calls such as ``for x in C:`` or
|
|
263
|
+
``list(C)`` (which essentially ruins its purpose).
|
|
264
|
+
Indeed, Python looks up the ``__iter__`` method
|
|
265
|
+
directly in the class of ``C``, bypassing ``C``'s
|
|
266
|
+
dictionary (see the Python reference manual,
|
|
267
|
+
`Special method lookup for new-style classes <http://docs.python.org/reference/datamodel.html#special-method-lookup-for-new-style-classes>`_)
|
|
268
|
+
|
|
269
|
+
Let's take an example::
|
|
270
|
+
|
|
271
|
+
sage: class Example(Parent):
|
|
272
|
+
....: def __init__(self):
|
|
273
|
+
....: Parent.__init__(self, category = FiniteEnumeratedSets())
|
|
274
|
+
....: def __iter__(self):
|
|
275
|
+
....: print("hello!")
|
|
276
|
+
....: for x in [1,2,3]: yield x
|
|
277
|
+
sage: C = Example()
|
|
278
|
+
sage: list(C)
|
|
279
|
+
hello!
|
|
280
|
+
...
|
|
281
|
+
[1, 2, 3]
|
|
282
|
+
sage: list(C)
|
|
283
|
+
hello!
|
|
284
|
+
...
|
|
285
|
+
[1, 2, 3]
|
|
286
|
+
|
|
287
|
+
Note that ``hello!`` actually gets printed more than once in
|
|
288
|
+
the calls to ``list(C)``. That's because of the
|
|
289
|
+
implicit calls to :meth:`__len__`, which also relies
|
|
290
|
+
on :meth:`__iter__`. Let's call :meth:`list`::
|
|
291
|
+
|
|
292
|
+
sage: C.list()
|
|
293
|
+
hello!
|
|
294
|
+
[1, 2, 3]
|
|
295
|
+
sage: C.list()
|
|
296
|
+
[1, 2, 3]
|
|
297
|
+
|
|
298
|
+
Now we would want the original iterator of ``C`` not
|
|
299
|
+
to be called anymore, but that's not the case::
|
|
300
|
+
|
|
301
|
+
sage: list(C)
|
|
302
|
+
hello!
|
|
303
|
+
[1, 2, 3]
|
|
304
|
+
|
|
305
|
+
TESTS:
|
|
306
|
+
|
|
307
|
+
To test if the caching and overriding works, we need a
|
|
308
|
+
fresh finite enumerated set example, because the caching
|
|
309
|
+
mechanism has already been triggered::
|
|
310
|
+
|
|
311
|
+
sage: from sage.categories.examples.finite_enumerated_sets import Example
|
|
312
|
+
sage: class FreshExample(Example): pass
|
|
313
|
+
sage: C = FreshExample(); C.rename('FreshExample')
|
|
314
|
+
sage: C.list
|
|
315
|
+
<bound method EnumeratedSets.ParentMethods.list of FreshExample>
|
|
316
|
+
sage: C.unrank
|
|
317
|
+
<bound method EnumeratedSets.ParentMethods._unrank_from_iterator of FreshExample>
|
|
318
|
+
sage: C.cardinality
|
|
319
|
+
<bound method FiniteEnumeratedSets.ParentMethods._cardinality_from_iterator of FreshExample>
|
|
320
|
+
sage: l1 = C.list(); l1
|
|
321
|
+
[1, 2, 3]
|
|
322
|
+
sage: C.list
|
|
323
|
+
<bound method EnumeratedSets.ParentMethods.list of FreshExample>
|
|
324
|
+
sage: C.unrank
|
|
325
|
+
<bound method FiniteEnumeratedSets.ParentMethods._unrank_from_list of FreshExample>
|
|
326
|
+
sage: C.cardinality
|
|
327
|
+
<bound method FiniteEnumeratedSets.ParentMethods._cardinality_from_list of FreshExample>
|
|
328
|
+
sage: C.__iter__
|
|
329
|
+
<bound method EnumeratedSets.ParentMethods._iterator_from_list of FreshExample>
|
|
330
|
+
|
|
331
|
+
We finally check that nothing breaks before and after
|
|
332
|
+
calling explicitly the method ``.list()``::
|
|
333
|
+
|
|
334
|
+
sage: class FreshExample(Example): pass
|
|
335
|
+
sage: import __main__; __main__.FreshExample = FreshExample # Fake FreshExample being defined in a python module
|
|
336
|
+
sage: C = FreshExample()
|
|
337
|
+
sage: TestSuite(C).run()
|
|
338
|
+
sage: C.list()
|
|
339
|
+
[1, 2, 3]
|
|
340
|
+
sage: TestSuite(C).run()
|
|
341
|
+
"""
|
|
342
|
+
try:
|
|
343
|
+
if self._list is not None:
|
|
344
|
+
return list(self._list)
|
|
345
|
+
except AttributeError:
|
|
346
|
+
pass
|
|
347
|
+
result = tuple(self.__iter__())
|
|
348
|
+
try:
|
|
349
|
+
self._list = result
|
|
350
|
+
self.__iter__ = self._iterator_from_list
|
|
351
|
+
self.cardinality = self._cardinality_from_list
|
|
352
|
+
self.tuple = self._tuple_from_list
|
|
353
|
+
self.unrank = self._unrank_from_list
|
|
354
|
+
except AttributeError:
|
|
355
|
+
pass
|
|
356
|
+
return list(result)
|
|
357
|
+
|
|
358
|
+
def unrank_range(self, start=None, stop=None, step=None):
|
|
359
|
+
r"""
|
|
360
|
+
Return the range of elements of ``self`` starting at ``start``,
|
|
361
|
+
ending at ``stop``, and stepping by ``step``.
|
|
362
|
+
|
|
363
|
+
See also ``unrank()``.
|
|
364
|
+
|
|
365
|
+
EXAMPLES::
|
|
366
|
+
|
|
367
|
+
sage: F = FiniteEnumeratedSet([1,2,3])
|
|
368
|
+
sage: F.unrank_range(1)
|
|
369
|
+
[2, 3]
|
|
370
|
+
sage: F.unrank_range(stop=2)
|
|
371
|
+
[1, 2]
|
|
372
|
+
sage: F.unrank_range(stop=2, step=2)
|
|
373
|
+
[1]
|
|
374
|
+
sage: F.unrank_range(start=1, step=2)
|
|
375
|
+
[2]
|
|
376
|
+
sage: F.unrank_range(stop=-1)
|
|
377
|
+
[1, 2]
|
|
378
|
+
|
|
379
|
+
sage: F = FiniteEnumeratedSet([1,2,3,4])
|
|
380
|
+
sage: F.unrank_range(stop=10)
|
|
381
|
+
[1, 2, 3, 4]
|
|
382
|
+
"""
|
|
383
|
+
try:
|
|
384
|
+
return list(self._list[start:stop:step])
|
|
385
|
+
except AttributeError:
|
|
386
|
+
pass
|
|
387
|
+
card = self.cardinality() # This may set the list
|
|
388
|
+
try:
|
|
389
|
+
return list(self._list[start:stop:step])
|
|
390
|
+
except AttributeError:
|
|
391
|
+
pass
|
|
392
|
+
if start is None and stop is not None and stop >= 0 and step is None:
|
|
393
|
+
if stop < card:
|
|
394
|
+
it = self.__iter__()
|
|
395
|
+
return [next(it) for j in range(stop)]
|
|
396
|
+
return self.list()
|
|
397
|
+
return list(self.tuple()[start:stop:step])
|
|
398
|
+
|
|
399
|
+
def iterator_range(self, start=None, stop=None, step=None):
|
|
400
|
+
r"""
|
|
401
|
+
Iterate over the range of elements of ``self`` starting
|
|
402
|
+
at ``start``, ending at ``stop``, and stepping by ``step``.
|
|
403
|
+
|
|
404
|
+
.. SEEALSO::
|
|
405
|
+
|
|
406
|
+
``unrank()``, ``unrank_range()``
|
|
407
|
+
|
|
408
|
+
EXAMPLES::
|
|
409
|
+
|
|
410
|
+
sage: F = FiniteEnumeratedSet([1,2,3])
|
|
411
|
+
sage: list(F.iterator_range(1))
|
|
412
|
+
[2, 3]
|
|
413
|
+
sage: list(F.iterator_range(stop=2))
|
|
414
|
+
[1, 2]
|
|
415
|
+
sage: list(F.iterator_range(stop=2, step=2))
|
|
416
|
+
[1]
|
|
417
|
+
sage: list(F.iterator_range(start=1, step=2))
|
|
418
|
+
[2]
|
|
419
|
+
sage: list(F.iterator_range(start=1, stop=2))
|
|
420
|
+
[2]
|
|
421
|
+
sage: list(F.iterator_range(start=0, stop=1))
|
|
422
|
+
[1]
|
|
423
|
+
sage: list(F.iterator_range(start=0, stop=3, step=2))
|
|
424
|
+
[1, 3]
|
|
425
|
+
sage: list(F.iterator_range(stop=-1))
|
|
426
|
+
[1, 2]
|
|
427
|
+
|
|
428
|
+
sage: F = FiniteEnumeratedSet([1,2,3,4])
|
|
429
|
+
sage: list(F.iterator_range(start=1, stop=3))
|
|
430
|
+
[2, 3]
|
|
431
|
+
sage: list(F.iterator_range(stop=10))
|
|
432
|
+
[1, 2, 3, 4]
|
|
433
|
+
"""
|
|
434
|
+
L = None
|
|
435
|
+
try:
|
|
436
|
+
L = self._list
|
|
437
|
+
except AttributeError:
|
|
438
|
+
pass
|
|
439
|
+
card = self.cardinality() # This may set the list
|
|
440
|
+
try:
|
|
441
|
+
L = self._list
|
|
442
|
+
except AttributeError:
|
|
443
|
+
pass
|
|
444
|
+
if L is None and start is None and stop is not None and stop >= 0 and step is None:
|
|
445
|
+
if stop < card:
|
|
446
|
+
it = self.__iter__()
|
|
447
|
+
for j in range(stop):
|
|
448
|
+
yield next(it)
|
|
449
|
+
return
|
|
450
|
+
yield from self
|
|
451
|
+
return
|
|
452
|
+
if L is None:
|
|
453
|
+
L = self.tuple()
|
|
454
|
+
yield from L[start:stop:step]
|
|
455
|
+
|
|
456
|
+
def _random_element_from_unrank(self):
|
|
457
|
+
"""
|
|
458
|
+
A random element in ``self``.
|
|
459
|
+
|
|
460
|
+
``self.random_element()`` returns a random element in
|
|
461
|
+
``self`` with uniform probability.
|
|
462
|
+
|
|
463
|
+
This is the default implementation from the category
|
|
464
|
+
``EnumeratedSet()`` which uses the method ``unrank``.
|
|
465
|
+
|
|
466
|
+
EXAMPLES::
|
|
467
|
+
|
|
468
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
469
|
+
sage: n = C.random_element()
|
|
470
|
+
sage: n in C
|
|
471
|
+
True
|
|
472
|
+
|
|
473
|
+
sage: n = C._random_element_from_unrank()
|
|
474
|
+
sage: n in C
|
|
475
|
+
True
|
|
476
|
+
|
|
477
|
+
TODO: implement _test_random which checks uniformity
|
|
478
|
+
"""
|
|
479
|
+
from sage.misc.prandom import randint
|
|
480
|
+
c = self.cardinality()
|
|
481
|
+
r = randint(0, c-1)
|
|
482
|
+
return self.unrank(r)
|
|
483
|
+
# Set the default implementation of random_element
|
|
484
|
+
random_element = _random_element_from_unrank
|
|
485
|
+
|
|
486
|
+
@cached_method
|
|
487
|
+
def _last_from_iterator(self):
|
|
488
|
+
"""
|
|
489
|
+
The last element of ``self``.
|
|
490
|
+
|
|
491
|
+
``self.last()`` returns the last element of ``self``.
|
|
492
|
+
|
|
493
|
+
This is the default (brute force) implementation from the
|
|
494
|
+
category ``FiniteEnumeratedSet()`` which can be used when
|
|
495
|
+
the method ``__iter__`` is provided. Its complexity is
|
|
496
|
+
`O(n)` where `n` is the size of ``self``.
|
|
497
|
+
|
|
498
|
+
EXAMPLES::
|
|
499
|
+
|
|
500
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
501
|
+
sage: C.last()
|
|
502
|
+
3
|
|
503
|
+
sage: C._last_from_iterator()
|
|
504
|
+
3
|
|
505
|
+
"""
|
|
506
|
+
for i in self:
|
|
507
|
+
pass
|
|
508
|
+
return i
|
|
509
|
+
last = _last_from_iterator
|
|
510
|
+
|
|
511
|
+
def _last_from_unrank(self):
|
|
512
|
+
"""
|
|
513
|
+
The last element of ``self``.
|
|
514
|
+
|
|
515
|
+
``self.last()`` returns the last element of ``self``
|
|
516
|
+
|
|
517
|
+
This is a generic implementation from the category
|
|
518
|
+
``FiniteEnumeratedSet()`` which can be used when the
|
|
519
|
+
method ``unrank`` is provided.
|
|
520
|
+
|
|
521
|
+
EXAMPLES::
|
|
522
|
+
|
|
523
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
524
|
+
sage: C._last_from_unrank()
|
|
525
|
+
3
|
|
526
|
+
"""
|
|
527
|
+
return self.unrank(self.cardinality() - 1)
|
|
528
|
+
|
|
529
|
+
def _test_enumerated_set_iter_cardinality(self, **options):
|
|
530
|
+
"""
|
|
531
|
+
Check that the methods :meth:`.cardinality` and
|
|
532
|
+
:meth:`.__iter__` are consistent. Also checks that
|
|
533
|
+
:meth:`.cardinality` returns an ``Integer``.
|
|
534
|
+
|
|
535
|
+
For efficiency reasons, those tests are not run if
|
|
536
|
+
:meth:`.cardinality` is
|
|
537
|
+
:meth:`._cardinality_from_iterator`, or if ``self`` is too
|
|
538
|
+
big.
|
|
539
|
+
|
|
540
|
+
.. SEEALSO:: :class:`TestSuite`.
|
|
541
|
+
|
|
542
|
+
EXAMPLES::
|
|
543
|
+
|
|
544
|
+
sage: C = FiniteEnumeratedSets().example()
|
|
545
|
+
sage: C._test_enumerated_set_iter_cardinality()
|
|
546
|
+
|
|
547
|
+
Let us now break the class::
|
|
548
|
+
|
|
549
|
+
sage: from sage.categories.examples.finite_enumerated_sets import Example
|
|
550
|
+
sage: class CCls(Example):
|
|
551
|
+
....: def cardinality(self):
|
|
552
|
+
....: return 4
|
|
553
|
+
sage: CC = CCls()
|
|
554
|
+
sage: CC._test_enumerated_set_iter_cardinality()
|
|
555
|
+
Traceback (most recent call last):
|
|
556
|
+
...
|
|
557
|
+
AssertionError: 4 != 3
|
|
558
|
+
"""
|
|
559
|
+
tester = self._tester(**options)
|
|
560
|
+
if self.cardinality != self._cardinality_from_iterator:
|
|
561
|
+
card = self.cardinality()
|
|
562
|
+
if card <= tester._max_runs:
|
|
563
|
+
tester.assertEqual(card,
|
|
564
|
+
self._cardinality_from_iterator())
|
|
565
|
+
|
|
566
|
+
class CartesianProducts(CartesianProductsCategory):
|
|
567
|
+
|
|
568
|
+
def extra_super_categories(self):
|
|
569
|
+
"""
|
|
570
|
+
A Cartesian product of finite enumerated sets is a finite
|
|
571
|
+
enumerated set.
|
|
572
|
+
|
|
573
|
+
EXAMPLES::
|
|
574
|
+
|
|
575
|
+
sage: C = FiniteEnumeratedSets().CartesianProducts()
|
|
576
|
+
sage: C.extra_super_categories()
|
|
577
|
+
[Category of finite enumerated sets]
|
|
578
|
+
"""
|
|
579
|
+
return [FiniteEnumeratedSets()]
|
|
580
|
+
|
|
581
|
+
class ParentMethods:
|
|
582
|
+
r"""
|
|
583
|
+
TESTS:
|
|
584
|
+
|
|
585
|
+
Ideally, these tests should be just after the declaration of the
|
|
586
|
+
associated attributes. But doing this way, Sage will not consider
|
|
587
|
+
them as a doctest.
|
|
588
|
+
|
|
589
|
+
We check that Cartesian products of finite enumerated sets
|
|
590
|
+
inherit various methods from `Sets.CartesianProducts`
|
|
591
|
+
and not from :class:`EnumeratedSets.Finite`::
|
|
592
|
+
|
|
593
|
+
sage: C = cartesian_product([Partitions(10), Permutations(20)])
|
|
594
|
+
sage: C in EnumeratedSets().Finite()
|
|
595
|
+
True
|
|
596
|
+
|
|
597
|
+
sage: C.random_element.__module__
|
|
598
|
+
'sage.categories.sets_cat'
|
|
599
|
+
|
|
600
|
+
sage: C.cardinality.__module__
|
|
601
|
+
'sage.categories.sets_cat'
|
|
602
|
+
|
|
603
|
+
sage: C.__iter__.__module__
|
|
604
|
+
'sage.categories.sets_cat'
|
|
605
|
+
"""
|
|
606
|
+
random_element = raw_getattr(Sets.CartesianProducts.ParentMethods, "random_element")
|
|
607
|
+
cardinality = raw_getattr(Sets.CartesianProducts.ParentMethods, "cardinality")
|
|
608
|
+
__iter__ = raw_getattr(Sets.CartesianProducts.ParentMethods, "__iter__")
|
|
609
|
+
|
|
610
|
+
def last(self):
|
|
611
|
+
r"""
|
|
612
|
+
Return the last element.
|
|
613
|
+
|
|
614
|
+
EXAMPLES::
|
|
615
|
+
|
|
616
|
+
sage: C = cartesian_product([Zmod(42), Partitions(10),
|
|
617
|
+
....: IntegerRange(5)])
|
|
618
|
+
sage: C.last()
|
|
619
|
+
(41, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 4)
|
|
620
|
+
"""
|
|
621
|
+
return self._cartesian_product_of_elements(
|
|
622
|
+
tuple(c.last() for c in self.cartesian_factors()))
|
|
623
|
+
|
|
624
|
+
def rank(self, x):
|
|
625
|
+
r"""
|
|
626
|
+
Return the rank of an element of this Cartesian product.
|
|
627
|
+
|
|
628
|
+
The *rank* of ``x`` is its position in the
|
|
629
|
+
enumeration. It is an integer between ``0`` and
|
|
630
|
+
``n-1`` where ``n`` is the cardinality of this set.
|
|
631
|
+
|
|
632
|
+
.. SEEALSO::
|
|
633
|
+
|
|
634
|
+
- :meth:`EnumeratedSets.ParentMethods.rank`
|
|
635
|
+
- :meth:`unrank`
|
|
636
|
+
|
|
637
|
+
EXAMPLES::
|
|
638
|
+
|
|
639
|
+
sage: C = cartesian_product([GF(2), GF(11), GF(7)])
|
|
640
|
+
sage: C.rank(C((1,2,5)))
|
|
641
|
+
96
|
|
642
|
+
sage: C.rank(C((0,0,0)))
|
|
643
|
+
0
|
|
644
|
+
|
|
645
|
+
sage: for c in C: print(C.rank(c))
|
|
646
|
+
0
|
|
647
|
+
1
|
|
648
|
+
2
|
|
649
|
+
3
|
|
650
|
+
4
|
|
651
|
+
5
|
|
652
|
+
...
|
|
653
|
+
150
|
|
654
|
+
151
|
|
655
|
+
152
|
|
656
|
+
153
|
|
657
|
+
|
|
658
|
+
sage: # needs sage.combinat sage.libs.flint
|
|
659
|
+
sage: F1 = FiniteEnumeratedSet('abcdefgh')
|
|
660
|
+
sage: F2 = IntegerRange(250)
|
|
661
|
+
sage: F3 = Partitions(20)
|
|
662
|
+
sage: C = cartesian_product([F1, F2, F3])
|
|
663
|
+
sage: c = C(('a', 86, [7,5,4,4]))
|
|
664
|
+
sage: C.rank(c)
|
|
665
|
+
54213
|
|
666
|
+
sage: C.unrank(54213)
|
|
667
|
+
('a', 86, [7, 5, 4, 4])
|
|
668
|
+
"""
|
|
669
|
+
from sage.rings.integer_ring import ZZ
|
|
670
|
+
x = self(x)
|
|
671
|
+
b = ZZ.one()
|
|
672
|
+
rank = ZZ.zero()
|
|
673
|
+
for f, c in zip(reversed(x.cartesian_factors()),
|
|
674
|
+
reversed(self.cartesian_factors())):
|
|
675
|
+
rank += b * c.rank(f)
|
|
676
|
+
b *= c.cardinality()
|
|
677
|
+
return rank
|
|
678
|
+
|
|
679
|
+
def unrank(self, i):
|
|
680
|
+
r"""
|
|
681
|
+
Return the `i`-th element of this Cartesian product.
|
|
682
|
+
|
|
683
|
+
INPUT:
|
|
684
|
+
|
|
685
|
+
- ``i`` -- integer between `0` and `n-1` where
|
|
686
|
+
`n` is the cardinality of this set
|
|
687
|
+
|
|
688
|
+
.. SEEALSO::
|
|
689
|
+
|
|
690
|
+
- :meth:`EnumeratedSets.ParentMethods.unrank`
|
|
691
|
+
- :meth:`rank`
|
|
692
|
+
|
|
693
|
+
EXAMPLES::
|
|
694
|
+
|
|
695
|
+
sage: C = cartesian_product([GF(3), GF(11), GF(7), GF(5)])
|
|
696
|
+
sage: c = C.unrank(123); c
|
|
697
|
+
(0, 3, 3, 3)
|
|
698
|
+
sage: C.rank(c)
|
|
699
|
+
123
|
|
700
|
+
|
|
701
|
+
sage: c = C.unrank(857); c
|
|
702
|
+
(2, 2, 3, 2)
|
|
703
|
+
sage: C.rank(c)
|
|
704
|
+
857
|
|
705
|
+
|
|
706
|
+
sage: C.unrank(2500)
|
|
707
|
+
Traceback (most recent call last):
|
|
708
|
+
...
|
|
709
|
+
IndexError: index i (=2) is greater than the cardinality
|
|
710
|
+
"""
|
|
711
|
+
from sage.rings.integer_ring import ZZ
|
|
712
|
+
i = ZZ(i)
|
|
713
|
+
if i < 0:
|
|
714
|
+
raise IndexError("i (={}) must be a nonnegative integer")
|
|
715
|
+
elt = []
|
|
716
|
+
for c in reversed(self.cartesian_factors()):
|
|
717
|
+
card = c.cardinality()
|
|
718
|
+
elt.insert(0, c.unrank(i % card))
|
|
719
|
+
i //= card
|
|
720
|
+
if i:
|
|
721
|
+
raise IndexError("index i (={}) is greater than the cardinality".format(i))
|
|
722
|
+
return self._cartesian_product_of_elements(elt)
|
|
723
|
+
|
|
724
|
+
class IsomorphicObjects(IsomorphicObjectsCategory):
|
|
725
|
+
|
|
726
|
+
def example(self):
|
|
727
|
+
"""
|
|
728
|
+
Return an example of isomorphic object of a finite
|
|
729
|
+
enumerated set, as per :meth:`Category.example
|
|
730
|
+
<sage.categories.category.Category.example>`.
|
|
731
|
+
|
|
732
|
+
EXAMPLES::
|
|
733
|
+
|
|
734
|
+
sage: FiniteEnumeratedSets().IsomorphicObjects().example()
|
|
735
|
+
The image by some isomorphism of An example of a finite enumerated set: {1,2,3}
|
|
736
|
+
"""
|
|
737
|
+
from sage.categories.examples.finite_enumerated_sets import IsomorphicObjectOfFiniteEnumeratedSet
|
|
738
|
+
return IsomorphicObjectOfFiniteEnumeratedSet()
|
|
739
|
+
|
|
740
|
+
class ParentMethods:
|
|
741
|
+
|
|
742
|
+
def cardinality(self):
|
|
743
|
+
r"""
|
|
744
|
+
Return the cardinality of ``self`` which is the same
|
|
745
|
+
as that of the ambient set ``self`` is isomorphic to.
|
|
746
|
+
|
|
747
|
+
EXAMPLES::
|
|
748
|
+
|
|
749
|
+
sage: A = FiniteEnumeratedSets().IsomorphicObjects().example(); A
|
|
750
|
+
The image by some isomorphism of An example of a finite enumerated set: {1,2,3}
|
|
751
|
+
sage: A.cardinality()
|
|
752
|
+
3
|
|
753
|
+
"""
|
|
754
|
+
return self.ambient().cardinality()
|
|
755
|
+
|
|
756
|
+
def __iter__(self):
|
|
757
|
+
r"""
|
|
758
|
+
Return an iterator over ``self``, using the bijection
|
|
759
|
+
with the ambient space.
|
|
760
|
+
|
|
761
|
+
EXAMPLES::
|
|
762
|
+
|
|
763
|
+
sage: A = FiniteEnumeratedSets().IsomorphicObjects().example(); A
|
|
764
|
+
The image by some isomorphism of An example of a finite enumerated set: {1,2,3}
|
|
765
|
+
sage: list(A) # indirect doctest
|
|
766
|
+
[1, 4, 9]
|
|
767
|
+
"""
|
|
768
|
+
for x in self.ambient():
|
|
769
|
+
yield self.retract(x)
|