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,1189 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-categories
|
|
2
|
+
r"""
|
|
3
|
+
Magmas
|
|
4
|
+
"""
|
|
5
|
+
# ****************************************************************************
|
|
6
|
+
# Copyright (C) 2010 Nicolas M. Thiery <nthiery at users.sf.net>
|
|
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.misc.abstract_method import abstract_method, AbstractMethod
|
|
15
|
+
from sage.categories.subquotients import SubquotientsCategory
|
|
16
|
+
from sage.categories.cartesian_product import CartesianProductsCategory
|
|
17
|
+
from sage.categories.algebra_functor import AlgebrasCategory
|
|
18
|
+
from sage.categories.category_with_axiom import CategoryWithAxiom
|
|
19
|
+
from sage.categories.category_singleton import Category_singleton
|
|
20
|
+
import sage.categories.coercion_methods
|
|
21
|
+
from sage.categories.sets_cat import Sets
|
|
22
|
+
from sage.categories.realizations import RealizationsCategory
|
|
23
|
+
from sage.cpython.getattr import raw_getattr
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class Magmas(Category_singleton):
|
|
27
|
+
"""
|
|
28
|
+
The category of (multiplicative) magmas.
|
|
29
|
+
|
|
30
|
+
A magma is a set with a binary operation `*`.
|
|
31
|
+
|
|
32
|
+
EXAMPLES::
|
|
33
|
+
|
|
34
|
+
sage: Magmas()
|
|
35
|
+
Category of magmas
|
|
36
|
+
sage: Magmas().super_categories()
|
|
37
|
+
[Category of sets]
|
|
38
|
+
sage: Magmas().all_super_categories()
|
|
39
|
+
[Category of magmas, Category of sets,
|
|
40
|
+
Category of sets with partial maps, Category of objects]
|
|
41
|
+
|
|
42
|
+
The following axioms are defined by this category::
|
|
43
|
+
|
|
44
|
+
sage: Magmas().Associative()
|
|
45
|
+
Category of semigroups
|
|
46
|
+
sage: Magmas().Unital()
|
|
47
|
+
Category of unital magmas
|
|
48
|
+
sage: Magmas().Commutative()
|
|
49
|
+
Category of commutative magmas
|
|
50
|
+
sage: Magmas().Unital().Inverse()
|
|
51
|
+
Category of inverse unital magmas
|
|
52
|
+
sage: Magmas().Associative()
|
|
53
|
+
Category of semigroups
|
|
54
|
+
sage: Magmas().Associative().Unital()
|
|
55
|
+
Category of monoids
|
|
56
|
+
sage: Magmas().Associative().Unital().Inverse()
|
|
57
|
+
Category of groups
|
|
58
|
+
|
|
59
|
+
TESTS::
|
|
60
|
+
|
|
61
|
+
sage: C = Magmas()
|
|
62
|
+
sage: TestSuite(C).run()
|
|
63
|
+
"""
|
|
64
|
+
def super_categories(self):
|
|
65
|
+
"""
|
|
66
|
+
EXAMPLES::
|
|
67
|
+
|
|
68
|
+
sage: Magmas().super_categories()
|
|
69
|
+
[Category of sets]
|
|
70
|
+
"""
|
|
71
|
+
return [Sets()]
|
|
72
|
+
|
|
73
|
+
def __lean_init__(self):
|
|
74
|
+
return 'has_mul'
|
|
75
|
+
|
|
76
|
+
class SubcategoryMethods:
|
|
77
|
+
|
|
78
|
+
@cached_method
|
|
79
|
+
def Associative(self):
|
|
80
|
+
r"""
|
|
81
|
+
Return the full subcategory of the associative objects
|
|
82
|
+
of ``self``.
|
|
83
|
+
|
|
84
|
+
A (multiplicative) :class:`magma Magmas` `M` is
|
|
85
|
+
*associative* if, for all `x,y,z\in M`,
|
|
86
|
+
|
|
87
|
+
.. MATH:: x * (y * z) = (x * y) * z
|
|
88
|
+
|
|
89
|
+
.. SEEALSO:: :wikipedia:`Associative_property`
|
|
90
|
+
|
|
91
|
+
EXAMPLES::
|
|
92
|
+
|
|
93
|
+
sage: Magmas().Associative()
|
|
94
|
+
Category of semigroups
|
|
95
|
+
|
|
96
|
+
TESTS::
|
|
97
|
+
|
|
98
|
+
sage: TestSuite(Magmas().Associative()).run()
|
|
99
|
+
sage: Rings().Associative.__module__
|
|
100
|
+
'sage.categories.magmas'
|
|
101
|
+
"""
|
|
102
|
+
return self._with_axiom('Associative')
|
|
103
|
+
|
|
104
|
+
@cached_method
|
|
105
|
+
def Commutative(self):
|
|
106
|
+
r"""
|
|
107
|
+
Return the full subcategory of the commutative objects
|
|
108
|
+
of ``self``.
|
|
109
|
+
|
|
110
|
+
A (multiplicative) :class:`magma Magmas` `M` is
|
|
111
|
+
*commutative* if, for all `x,y\in M`,
|
|
112
|
+
|
|
113
|
+
.. MATH:: x * y = y * x
|
|
114
|
+
|
|
115
|
+
.. SEEALSO:: :wikipedia:`Commutative_property`
|
|
116
|
+
|
|
117
|
+
EXAMPLES::
|
|
118
|
+
|
|
119
|
+
sage: Magmas().Commutative()
|
|
120
|
+
Category of commutative magmas
|
|
121
|
+
sage: Monoids().Commutative()
|
|
122
|
+
Category of commutative monoids
|
|
123
|
+
|
|
124
|
+
TESTS::
|
|
125
|
+
|
|
126
|
+
sage: TestSuite(Magmas().Commutative()).run()
|
|
127
|
+
sage: Rings().Commutative.__module__
|
|
128
|
+
'sage.categories.magmas'
|
|
129
|
+
"""
|
|
130
|
+
return self._with_axiom('Commutative')
|
|
131
|
+
|
|
132
|
+
@cached_method
|
|
133
|
+
def Unital(self):
|
|
134
|
+
r"""
|
|
135
|
+
Return the subcategory of the unital objects of ``self``.
|
|
136
|
+
|
|
137
|
+
A (multiplicative) :class:`magma Magmas` `M` is *unital*
|
|
138
|
+
if it admits an element `1`, called *unit*, such that for
|
|
139
|
+
all `x\in M`,
|
|
140
|
+
|
|
141
|
+
.. MATH:: 1 * x = x * 1 = x
|
|
142
|
+
|
|
143
|
+
This element is necessarily unique, and should be provided
|
|
144
|
+
as ``M.one()``.
|
|
145
|
+
|
|
146
|
+
.. SEEALSO:: :wikipedia:`Unital_magma#unital`
|
|
147
|
+
|
|
148
|
+
EXAMPLES::
|
|
149
|
+
|
|
150
|
+
sage: Magmas().Unital()
|
|
151
|
+
Category of unital magmas
|
|
152
|
+
sage: Semigroups().Unital()
|
|
153
|
+
Category of monoids
|
|
154
|
+
sage: Monoids().Unital()
|
|
155
|
+
Category of monoids
|
|
156
|
+
sage: from sage.categories.associative_algebras import AssociativeAlgebras
|
|
157
|
+
sage: AssociativeAlgebras(QQ).Unital()
|
|
158
|
+
Category of algebras over Rational Field
|
|
159
|
+
|
|
160
|
+
TESTS::
|
|
161
|
+
|
|
162
|
+
sage: TestSuite(Magmas().Unital()).run()
|
|
163
|
+
sage: Semigroups().Unital.__module__
|
|
164
|
+
'sage.categories.magmas'
|
|
165
|
+
"""
|
|
166
|
+
return self._with_axiom("Unital")
|
|
167
|
+
|
|
168
|
+
@cached_method
|
|
169
|
+
def FinitelyGeneratedAsMagma(self):
|
|
170
|
+
r"""
|
|
171
|
+
Return the subcategory of the objects of ``self`` that are
|
|
172
|
+
endowed with a distinguished finite set of
|
|
173
|
+
(multiplicative) magma generators.
|
|
174
|
+
|
|
175
|
+
A set `S` of elements of a multiplicative magma form a
|
|
176
|
+
*set of generators* if any element of the magma can be
|
|
177
|
+
expressed recursively from elements of `S` and products
|
|
178
|
+
thereof.
|
|
179
|
+
|
|
180
|
+
It is not imposed that morphisms shall preserve the
|
|
181
|
+
distinguished set of generators; hence this is a full
|
|
182
|
+
subcategory.
|
|
183
|
+
|
|
184
|
+
.. SEEALSO:: :wikipedia:`Unital_magma#unital`
|
|
185
|
+
|
|
186
|
+
EXAMPLES::
|
|
187
|
+
|
|
188
|
+
sage: Magmas().FinitelyGeneratedAsMagma()
|
|
189
|
+
Category of finitely generated magmas
|
|
190
|
+
|
|
191
|
+
Being finitely generated does depend on the structure: for
|
|
192
|
+
a ring, being finitely generated as a magma, as an
|
|
193
|
+
additive magma, or as a ring are different concepts. Hence
|
|
194
|
+
the name of this axiom is explicit::
|
|
195
|
+
|
|
196
|
+
sage: Rings().FinitelyGeneratedAsMagma()
|
|
197
|
+
Category of finitely generated as magma enumerated rings
|
|
198
|
+
|
|
199
|
+
On the other hand, it does not depend on the
|
|
200
|
+
multiplicative structure: for example a group is finitely
|
|
201
|
+
generated if and only if it is finitely generated as a
|
|
202
|
+
magma. A short hand is provided when there is no
|
|
203
|
+
ambiguity, and the output tries to reflect that::
|
|
204
|
+
|
|
205
|
+
sage: Semigroups().FinitelyGenerated()
|
|
206
|
+
Category of finitely generated semigroups
|
|
207
|
+
sage: Groups().FinitelyGenerated()
|
|
208
|
+
Category of finitely generated enumerated groups
|
|
209
|
+
|
|
210
|
+
sage: Semigroups().FinitelyGenerated().axioms()
|
|
211
|
+
frozenset({'Associative', 'Enumerated', 'FinitelyGeneratedAsMagma'})
|
|
212
|
+
|
|
213
|
+
Note that the set of generators may depend on the actual
|
|
214
|
+
category; for example, in a group, one can often use less
|
|
215
|
+
generators since it is allowed to take inverses.
|
|
216
|
+
|
|
217
|
+
TESTS::
|
|
218
|
+
|
|
219
|
+
sage: TestSuite(Magmas().FinitelyGeneratedAsMagma()).run()
|
|
220
|
+
sage: Semigroups().FinitelyGeneratedAsMagma.__module__
|
|
221
|
+
'sage.categories.magmas'
|
|
222
|
+
"""
|
|
223
|
+
return self._with_axiom("FinitelyGeneratedAsMagma")
|
|
224
|
+
|
|
225
|
+
@cached_method
|
|
226
|
+
def FinitelyGenerated(self):
|
|
227
|
+
r"""
|
|
228
|
+
Return the subcategory of the objects of ``self`` that are
|
|
229
|
+
endowed with a distinguished finite set of
|
|
230
|
+
(multiplicative) magma generators.
|
|
231
|
+
|
|
232
|
+
EXAMPLES:
|
|
233
|
+
|
|
234
|
+
This is a shorthand for :meth:`FinitelyGeneratedAsMagma`,
|
|
235
|
+
which see::
|
|
236
|
+
|
|
237
|
+
sage: Magmas().FinitelyGenerated()
|
|
238
|
+
Category of finitely generated magmas
|
|
239
|
+
sage: Semigroups().FinitelyGenerated()
|
|
240
|
+
Category of finitely generated semigroups
|
|
241
|
+
sage: Groups().FinitelyGenerated()
|
|
242
|
+
Category of finitely generated enumerated groups
|
|
243
|
+
|
|
244
|
+
An error is raised if this is ambiguous::
|
|
245
|
+
|
|
246
|
+
sage: (Magmas() & AdditiveMagmas()).FinitelyGenerated()
|
|
247
|
+
Traceback (most recent call last):
|
|
248
|
+
...
|
|
249
|
+
ValueError: FinitelyGenerated is ambiguous for
|
|
250
|
+
Join of Category of magmas and Category of additive magmas.
|
|
251
|
+
Please use explicitly one of the FinitelyGeneratedAsXXX methods
|
|
252
|
+
|
|
253
|
+
.. NOTE::
|
|
254
|
+
|
|
255
|
+
Checking that there is no ambiguity currently assumes
|
|
256
|
+
that all the other "finitely generated" axioms involve
|
|
257
|
+
an additive structure. As of Sage 6.4, this is
|
|
258
|
+
correct.
|
|
259
|
+
|
|
260
|
+
The use of this shorthand should be reserved for casual
|
|
261
|
+
interactive use or when there is no risk of ambiguity.
|
|
262
|
+
"""
|
|
263
|
+
from sage.categories.additive_magmas import AdditiveMagmas
|
|
264
|
+
if self.is_subcategory(AdditiveMagmas()):
|
|
265
|
+
raise ValueError("FinitelyGenerated is ambiguous for {}.\nPlease use explicitly one of the FinitelyGeneratedAsXXX methods".format(self))
|
|
266
|
+
return self.FinitelyGeneratedAsMagma()
|
|
267
|
+
|
|
268
|
+
@cached_method
|
|
269
|
+
def Distributive(self):
|
|
270
|
+
"""
|
|
271
|
+
Return the full subcategory of the objects of ``self``
|
|
272
|
+
where `*` is distributive on `+`.
|
|
273
|
+
|
|
274
|
+
INPUT:
|
|
275
|
+
|
|
276
|
+
- ``self`` -- a subcategory of :class:`Magmas`
|
|
277
|
+
and :class:`AdditiveMagmas`
|
|
278
|
+
|
|
279
|
+
Given that Sage does not yet know that the category
|
|
280
|
+
:class:`MagmasAndAdditiveMagmas` is the intersection of
|
|
281
|
+
the categories :class:`Magmas` and
|
|
282
|
+
:class:`AdditiveMagmas`, the method
|
|
283
|
+
:meth:`MagmasAndAdditiveMagmas.SubcategoryMethods.Distributive`
|
|
284
|
+
is not available, as would be desirable, for this intersection.
|
|
285
|
+
|
|
286
|
+
This method is a workaround. It checks that ``self`` is a
|
|
287
|
+
subcategory of both :class:`Magmas` and
|
|
288
|
+
:class:`AdditiveMagmas` and upgrades it to a subcategory
|
|
289
|
+
of :class:`MagmasAndAdditiveMagmas` before applying the
|
|
290
|
+
axiom. It complains otherwise, since the ``Distributive``
|
|
291
|
+
axiom does not make sense for a plain magma.
|
|
292
|
+
|
|
293
|
+
EXAMPLES::
|
|
294
|
+
|
|
295
|
+
sage: (Magmas() & AdditiveMagmas()).Distributive()
|
|
296
|
+
Category of distributive magmas and additive magmas
|
|
297
|
+
sage: (Monoids() & CommutativeAdditiveGroups()).Distributive()
|
|
298
|
+
Category of rings
|
|
299
|
+
|
|
300
|
+
sage: Magmas().Distributive()
|
|
301
|
+
Traceback (most recent call last):
|
|
302
|
+
...
|
|
303
|
+
ValueError: The distributive axiom only makes sense on a magma
|
|
304
|
+
which is simultaneously an additive magma
|
|
305
|
+
sage: Semigroups().Distributive()
|
|
306
|
+
Traceback (most recent call last):
|
|
307
|
+
...
|
|
308
|
+
ValueError: The distributive axiom only makes sense on a magma
|
|
309
|
+
which is simultaneously an additive magma
|
|
310
|
+
|
|
311
|
+
TESTS::
|
|
312
|
+
|
|
313
|
+
sage: Semigroups().Distributive.__module__
|
|
314
|
+
'sage.categories.magmas'
|
|
315
|
+
sage: Rings().Distributive.__module__
|
|
316
|
+
'sage.categories.magmas_and_additive_magmas'
|
|
317
|
+
"""
|
|
318
|
+
from .additive_magmas import AdditiveMagmas
|
|
319
|
+
if not self.is_subcategory(AdditiveMagmas()):
|
|
320
|
+
raise ValueError("The distributive axiom only makes sense on a magma which is simultaneously an additive magma")
|
|
321
|
+
from .magmas_and_additive_magmas import MagmasAndAdditiveMagmas
|
|
322
|
+
return (self & MagmasAndAdditiveMagmas()).Distributive()
|
|
323
|
+
|
|
324
|
+
def JTrivial(self):
|
|
325
|
+
r"""
|
|
326
|
+
Return the full subcategory of the `J`-trivial objects of ``self``.
|
|
327
|
+
|
|
328
|
+
This axiom is in fact only meaningful for
|
|
329
|
+
:class:`semigroups <Semigroups>`. This stub definition is
|
|
330
|
+
here as a workaround for :issue:`20515`, in order to define
|
|
331
|
+
the `J`-trivial axiom as the intersection of the `L` and
|
|
332
|
+
`R`-trivial axioms.
|
|
333
|
+
|
|
334
|
+
.. SEEALSO:: :meth:`Semigroups.SubcategoryMethods.JTrivial`
|
|
335
|
+
|
|
336
|
+
TESTS::
|
|
337
|
+
|
|
338
|
+
sage: Magmas().JTrivial()
|
|
339
|
+
Category of j trivial magmas
|
|
340
|
+
sage: C = Semigroups().RTrivial() & Semigroups().LTrivial()
|
|
341
|
+
sage: C is Semigroups().JTrivial()
|
|
342
|
+
True
|
|
343
|
+
"""
|
|
344
|
+
return self._with_axiom('JTrivial')
|
|
345
|
+
|
|
346
|
+
Associative = LazyImport('sage.categories.semigroups', 'Semigroups', at_startup=True)
|
|
347
|
+
FinitelyGeneratedAsMagma = LazyImport('sage.categories.finitely_generated_magmas', 'FinitelyGeneratedMagmas')
|
|
348
|
+
|
|
349
|
+
class JTrivial(CategoryWithAxiom):
|
|
350
|
+
# Workaround for #20515; see also Magmas.SubcategoryMethods.JTrivial
|
|
351
|
+
pass
|
|
352
|
+
|
|
353
|
+
class Algebras(AlgebrasCategory):
|
|
354
|
+
|
|
355
|
+
def extra_super_categories(self):
|
|
356
|
+
"""
|
|
357
|
+
EXAMPLES::
|
|
358
|
+
|
|
359
|
+
sage: MCA = Magmas().Commutative().Algebras(QQ)
|
|
360
|
+
sage: MCA.extra_super_categories()
|
|
361
|
+
[Category of commutative magmas]
|
|
362
|
+
|
|
363
|
+
This implements the fact that the algebra of a commutative
|
|
364
|
+
magma is commutative::
|
|
365
|
+
|
|
366
|
+
sage: MCA.super_categories()
|
|
367
|
+
[Category of magma algebras over Rational Field,
|
|
368
|
+
Category of commutative magmas]
|
|
369
|
+
|
|
370
|
+
In particular, commutative monoid algebras are
|
|
371
|
+
commutative algebras::
|
|
372
|
+
|
|
373
|
+
sage: MoCA = Monoids().Commutative().Algebras(QQ)
|
|
374
|
+
sage: MoCA.is_subcategory(Algebras(QQ).Commutative())
|
|
375
|
+
True
|
|
376
|
+
"""
|
|
377
|
+
from sage.categories.magmatic_algebras import MagmaticAlgebras
|
|
378
|
+
return [MagmaticAlgebras(self.base_ring())]
|
|
379
|
+
|
|
380
|
+
class ParentMethods:
|
|
381
|
+
|
|
382
|
+
def is_field(self, proof=True):
|
|
383
|
+
r"""
|
|
384
|
+
Return ``True`` if ``self`` is a field.
|
|
385
|
+
|
|
386
|
+
For a magma algebra `R S` this is always false unless
|
|
387
|
+
`S` is trivial and the base ring `R` is a field.
|
|
388
|
+
|
|
389
|
+
EXAMPLES::
|
|
390
|
+
|
|
391
|
+
sage: SymmetricGroup(1).algebra(QQ).is_field() # needs sage.combinat sage.groups
|
|
392
|
+
True
|
|
393
|
+
sage: SymmetricGroup(1).algebra(ZZ).is_field() # needs sage.combinat sage.groups
|
|
394
|
+
False
|
|
395
|
+
sage: SymmetricGroup(2).algebra(QQ).is_field() # needs sage.combinat sage.groups
|
|
396
|
+
False
|
|
397
|
+
sage: Magmas().example().algebra(QQ).is_field() # needs sage.combinat sage.modules
|
|
398
|
+
False
|
|
399
|
+
|
|
400
|
+
"""
|
|
401
|
+
if not self.base_ring().is_field(proof):
|
|
402
|
+
return False
|
|
403
|
+
return self.basis().keys().cardinality() == 1
|
|
404
|
+
|
|
405
|
+
class Commutative(CategoryWithAxiom):
|
|
406
|
+
|
|
407
|
+
class ParentMethods:
|
|
408
|
+
def is_commutative(self) -> bool:
|
|
409
|
+
"""
|
|
410
|
+
Return ``True``, since commutative magmas are commutative.
|
|
411
|
+
|
|
412
|
+
EXAMPLES::
|
|
413
|
+
|
|
414
|
+
sage: Parent(QQ, category=CommutativeRings()).is_commutative()
|
|
415
|
+
True
|
|
416
|
+
"""
|
|
417
|
+
return True
|
|
418
|
+
|
|
419
|
+
class Algebras(AlgebrasCategory):
|
|
420
|
+
|
|
421
|
+
def extra_super_categories(self):
|
|
422
|
+
"""
|
|
423
|
+
EXAMPLES::
|
|
424
|
+
|
|
425
|
+
sage: MCA = Magmas().Commutative().Algebras(QQ)
|
|
426
|
+
sage: MCA.extra_super_categories()
|
|
427
|
+
[Category of commutative magmas]
|
|
428
|
+
|
|
429
|
+
This implements the fact that the algebra of a commutative
|
|
430
|
+
magma is commutative::
|
|
431
|
+
|
|
432
|
+
sage: MCA.super_categories()
|
|
433
|
+
[Category of magma algebras over Rational Field,
|
|
434
|
+
Category of commutative magmas]
|
|
435
|
+
|
|
436
|
+
In particular, commutative monoid algebras are
|
|
437
|
+
commutative algebras::
|
|
438
|
+
|
|
439
|
+
sage: MoCA = Monoids().Commutative().Algebras(QQ)
|
|
440
|
+
sage: MoCA.is_subcategory(Algebras(QQ).Commutative())
|
|
441
|
+
True
|
|
442
|
+
"""
|
|
443
|
+
return [Magmas().Commutative()]
|
|
444
|
+
|
|
445
|
+
class CartesianProducts(CartesianProductsCategory):
|
|
446
|
+
def extra_super_categories(self):
|
|
447
|
+
r"""
|
|
448
|
+
Implement the fact that a Cartesian product of commutative
|
|
449
|
+
additive magmas is still a commutative additive magmas.
|
|
450
|
+
|
|
451
|
+
EXAMPLES::
|
|
452
|
+
|
|
453
|
+
sage: C = Magmas().Commutative().CartesianProducts()
|
|
454
|
+
sage: C.extra_super_categories()
|
|
455
|
+
[Category of commutative magmas]
|
|
456
|
+
sage: C.axioms()
|
|
457
|
+
frozenset({'Commutative'})
|
|
458
|
+
"""
|
|
459
|
+
return [Magmas().Commutative()]
|
|
460
|
+
|
|
461
|
+
class Unital(CategoryWithAxiom):
|
|
462
|
+
|
|
463
|
+
def additional_structure(self):
|
|
464
|
+
r"""
|
|
465
|
+
Return ``self``.
|
|
466
|
+
|
|
467
|
+
Indeed, the category of unital magmas defines an
|
|
468
|
+
additional structure, namely the unit of the magma which
|
|
469
|
+
shall be preserved by morphisms.
|
|
470
|
+
|
|
471
|
+
.. SEEALSO:: :meth:`Category.additional_structure`
|
|
472
|
+
|
|
473
|
+
EXAMPLES::
|
|
474
|
+
|
|
475
|
+
sage: Magmas().Unital().additional_structure()
|
|
476
|
+
Category of unital magmas
|
|
477
|
+
"""
|
|
478
|
+
return self
|
|
479
|
+
|
|
480
|
+
class ParentMethods:
|
|
481
|
+
@cached_method
|
|
482
|
+
def one(self):
|
|
483
|
+
r"""
|
|
484
|
+
Return the unit of the monoid, that is the unique neutral
|
|
485
|
+
element for `*`.
|
|
486
|
+
|
|
487
|
+
.. NOTE::
|
|
488
|
+
|
|
489
|
+
The default implementation is to coerce `1` into ``self``.
|
|
490
|
+
It is recommended to override this method because the
|
|
491
|
+
coercion from the integers:
|
|
492
|
+
|
|
493
|
+
- is not always meaningful (except for `1`);
|
|
494
|
+
- often uses ``self.one()``.
|
|
495
|
+
|
|
496
|
+
EXAMPLES::
|
|
497
|
+
|
|
498
|
+
sage: M = Monoids().example(); M
|
|
499
|
+
An example of a monoid:
|
|
500
|
+
the free monoid generated by ('a', 'b', 'c', 'd')
|
|
501
|
+
sage: M.one()
|
|
502
|
+
''
|
|
503
|
+
"""
|
|
504
|
+
return self(1)
|
|
505
|
+
|
|
506
|
+
def _test_one(self, **options):
|
|
507
|
+
r"""
|
|
508
|
+
Test that ``self.one()`` is an element of ``self`` and is
|
|
509
|
+
neutral for the operation ``*``.
|
|
510
|
+
|
|
511
|
+
INPUT:
|
|
512
|
+
|
|
513
|
+
- ``options`` -- any keyword arguments accepted by :meth:`_tester`
|
|
514
|
+
|
|
515
|
+
EXAMPLES:
|
|
516
|
+
|
|
517
|
+
By default, this method tests only the elements returned by
|
|
518
|
+
``self.some_elements()``::
|
|
519
|
+
|
|
520
|
+
sage: S = Monoids().example()
|
|
521
|
+
sage: S._test_one()
|
|
522
|
+
|
|
523
|
+
However, the elements tested can be customized with the
|
|
524
|
+
``elements`` keyword argument::
|
|
525
|
+
|
|
526
|
+
sage: S._test_one(elements = (S('a'), S('b')))
|
|
527
|
+
|
|
528
|
+
See the documentation for :class:`TestSuite` for more information.
|
|
529
|
+
"""
|
|
530
|
+
tester = self._tester(**options)
|
|
531
|
+
one = self.one()
|
|
532
|
+
tester.assertTrue(self.is_parent_of(one))
|
|
533
|
+
for x in tester.some_elements():
|
|
534
|
+
tester.assertEqual(x * one, x)
|
|
535
|
+
tester.assertEqual(one * x, x)
|
|
536
|
+
# Check that one is immutable if it looks like we can test this
|
|
537
|
+
if hasattr(one, "is_immutable"):
|
|
538
|
+
tester.assertTrue(one.is_immutable())
|
|
539
|
+
if hasattr(one, "is_mutable"):
|
|
540
|
+
tester.assertFalse(one.is_mutable())
|
|
541
|
+
|
|
542
|
+
def is_empty(self):
|
|
543
|
+
r"""
|
|
544
|
+
Return whether ``self`` is empty.
|
|
545
|
+
|
|
546
|
+
Since this set is a unital magma it is not empty and this method
|
|
547
|
+
always return ``False``.
|
|
548
|
+
|
|
549
|
+
EXAMPLES::
|
|
550
|
+
|
|
551
|
+
sage: S = SymmetricGroup(2) # needs sage.groups
|
|
552
|
+
sage: S.is_empty() # needs sage.groups
|
|
553
|
+
False
|
|
554
|
+
|
|
555
|
+
sage: M = Monoids().example()
|
|
556
|
+
sage: M.is_empty()
|
|
557
|
+
False
|
|
558
|
+
|
|
559
|
+
TESTS::
|
|
560
|
+
|
|
561
|
+
sage: S.is_empty.__module__ # needs sage.groups
|
|
562
|
+
'sage.categories.magmas'
|
|
563
|
+
sage: M.is_empty.__module__
|
|
564
|
+
'sage.categories.magmas'
|
|
565
|
+
"""
|
|
566
|
+
return False
|
|
567
|
+
|
|
568
|
+
class ElementMethods:
|
|
569
|
+
pass
|
|
570
|
+
|
|
571
|
+
class SubcategoryMethods:
|
|
572
|
+
|
|
573
|
+
@cached_method
|
|
574
|
+
def Inverse(self):
|
|
575
|
+
r"""
|
|
576
|
+
Return the full subcategory of the inverse objects of ``self``.
|
|
577
|
+
|
|
578
|
+
An inverse :class:` (multiplicative) magma <Magmas>`
|
|
579
|
+
is a :class:`unital magma <Magmas.Unital>` such that
|
|
580
|
+
every element admits both an inverse on the left and
|
|
581
|
+
on the right. Such a magma is also called a *loop*.
|
|
582
|
+
|
|
583
|
+
.. SEEALSO::
|
|
584
|
+
|
|
585
|
+
:wikipedia:`Inverse_element`, :wikipedia:`Quasigroup`
|
|
586
|
+
|
|
587
|
+
EXAMPLES::
|
|
588
|
+
|
|
589
|
+
sage: Magmas().Unital().Inverse()
|
|
590
|
+
Category of inverse unital magmas
|
|
591
|
+
sage: Monoids().Inverse()
|
|
592
|
+
Category of groups
|
|
593
|
+
|
|
594
|
+
TESTS::
|
|
595
|
+
|
|
596
|
+
sage: TestSuite(Magmas().Unital().Inverse()).run()
|
|
597
|
+
sage: Algebras(QQ).Inverse.__module__
|
|
598
|
+
'sage.categories.magmas'
|
|
599
|
+
"""
|
|
600
|
+
return self._with_axiom("Inverse")
|
|
601
|
+
|
|
602
|
+
class Inverse(CategoryWithAxiom):
|
|
603
|
+
class CartesianProducts(CartesianProductsCategory):
|
|
604
|
+
def extra_super_categories(self):
|
|
605
|
+
"""
|
|
606
|
+
Implement the fact that a Cartesian product of magmas with
|
|
607
|
+
inverses is a magma with inverse.
|
|
608
|
+
|
|
609
|
+
EXAMPLES::
|
|
610
|
+
|
|
611
|
+
sage: C = Magmas().Unital().Inverse().CartesianProducts()
|
|
612
|
+
sage: C.extra_super_categories()
|
|
613
|
+
[Category of inverse unital magmas]
|
|
614
|
+
sage: sorted(C.axioms())
|
|
615
|
+
['Inverse', 'Unital']
|
|
616
|
+
"""
|
|
617
|
+
return [Magmas().Unital().Inverse()]
|
|
618
|
+
|
|
619
|
+
class CartesianProducts(CartesianProductsCategory):
|
|
620
|
+
def extra_super_categories(self):
|
|
621
|
+
"""
|
|
622
|
+
Implement the fact that a Cartesian product of unital magmas is
|
|
623
|
+
a unital magma
|
|
624
|
+
|
|
625
|
+
EXAMPLES::
|
|
626
|
+
|
|
627
|
+
sage: C = Magmas().Unital().CartesianProducts()
|
|
628
|
+
sage: C.extra_super_categories()
|
|
629
|
+
[Category of unital magmas]
|
|
630
|
+
sage: C.axioms()
|
|
631
|
+
frozenset({'Unital'})
|
|
632
|
+
|
|
633
|
+
sage: Monoids().CartesianProducts().is_subcategory(Monoids())
|
|
634
|
+
True
|
|
635
|
+
"""
|
|
636
|
+
return [Magmas().Unital()]
|
|
637
|
+
|
|
638
|
+
class ParentMethods:
|
|
639
|
+
|
|
640
|
+
@cached_method
|
|
641
|
+
def one(self):
|
|
642
|
+
"""
|
|
643
|
+
Return the unit of this Cartesian product.
|
|
644
|
+
|
|
645
|
+
It is built from the units for the Cartesian factors of ``self``.
|
|
646
|
+
|
|
647
|
+
EXAMPLES::
|
|
648
|
+
|
|
649
|
+
sage: cartesian_product([QQ, ZZ, RR]).one() # needs sage.rings.real_mpfr
|
|
650
|
+
(1, 1, 1.00000000000000)
|
|
651
|
+
"""
|
|
652
|
+
return self._cartesian_product_of_elements(
|
|
653
|
+
_.one() for _ in self.cartesian_factors())
|
|
654
|
+
|
|
655
|
+
class ElementMethods:
|
|
656
|
+
def __invert__(self):
|
|
657
|
+
r"""
|
|
658
|
+
Return the inverse of ``self``, if it exists.
|
|
659
|
+
|
|
660
|
+
The inverse is computed by inverting each
|
|
661
|
+
Cartesian factor and attempting to convert the
|
|
662
|
+
result back to the original parent.
|
|
663
|
+
|
|
664
|
+
For example, if one of the Cartesian factor is an
|
|
665
|
+
element ``x`` of `\ZZ`, the result of ``~x`` is in
|
|
666
|
+
`\QQ`. So we need to convert it back to `\ZZ`. As
|
|
667
|
+
a side effect, this checks that ``x`` is indeed
|
|
668
|
+
invertible in `\ZZ`.
|
|
669
|
+
|
|
670
|
+
If needed an optimized version without this
|
|
671
|
+
conversion could be implemented in
|
|
672
|
+
:class:`Magmas.Unital.Inverse.ElementMethods`.
|
|
673
|
+
|
|
674
|
+
EXAMPLES::
|
|
675
|
+
|
|
676
|
+
sage: C = cartesian_product([QQ, ZZ, RR, GF(5)])
|
|
677
|
+
sage: c = C([2,-1,2,2]); c # needs sage.rings.real_mpfr
|
|
678
|
+
(2, -1, 2.00000000000000, 2)
|
|
679
|
+
sage: ~c # needs sage.rings.real_mpfr
|
|
680
|
+
(1/2, -1, 0.500000000000000, 3)
|
|
681
|
+
|
|
682
|
+
This fails as soon as one of the entries is not
|
|
683
|
+
invertible::
|
|
684
|
+
|
|
685
|
+
sage: ~C([0,2,2,2])
|
|
686
|
+
Traceback (most recent call last):
|
|
687
|
+
...
|
|
688
|
+
ZeroDivisionError: rational division by zero
|
|
689
|
+
|
|
690
|
+
sage: ~C([2,2,2,2]) # needs sage.rings.real_mpfr
|
|
691
|
+
(1/2, 1/2, 0.500000000000000, 3)
|
|
692
|
+
"""
|
|
693
|
+
# variant without coercion:
|
|
694
|
+
# return self.parent()._cartesian_product_of_elements(
|
|
695
|
+
return self.parent()(
|
|
696
|
+
~x for x in self.cartesian_factors())
|
|
697
|
+
|
|
698
|
+
class Algebras(AlgebrasCategory):
|
|
699
|
+
|
|
700
|
+
def extra_super_categories(self):
|
|
701
|
+
"""
|
|
702
|
+
EXAMPLES::
|
|
703
|
+
|
|
704
|
+
sage: MCA = Magmas().Commutative().Algebras(QQ)
|
|
705
|
+
sage: MCA.extra_super_categories()
|
|
706
|
+
[Category of commutative magmas]
|
|
707
|
+
|
|
708
|
+
This implements the fact that the algebra of a
|
|
709
|
+
commutative magma is commutative::
|
|
710
|
+
|
|
711
|
+
sage: MCA.super_categories()
|
|
712
|
+
[Category of magma algebras over Rational Field,
|
|
713
|
+
Category of commutative magmas]
|
|
714
|
+
|
|
715
|
+
In particular, commutative monoid algebras are
|
|
716
|
+
commutative algebras::
|
|
717
|
+
|
|
718
|
+
sage: MoCA = Monoids().Commutative().Algebras(QQ)
|
|
719
|
+
sage: MoCA.is_subcategory(Algebras(QQ).Commutative())
|
|
720
|
+
True
|
|
721
|
+
"""
|
|
722
|
+
return [Magmas().Unital()]
|
|
723
|
+
|
|
724
|
+
class Realizations(RealizationsCategory):
|
|
725
|
+
|
|
726
|
+
class ParentMethods:
|
|
727
|
+
|
|
728
|
+
@cached_method
|
|
729
|
+
def one(self):
|
|
730
|
+
r"""
|
|
731
|
+
Return the unit element of ``self``.
|
|
732
|
+
|
|
733
|
+
EXAMPLES::
|
|
734
|
+
|
|
735
|
+
sage: # needs sage.combinat sage.groups
|
|
736
|
+
sage: from sage.combinat.root_system.extended_affine_weyl_group import ExtendedAffineWeylGroup
|
|
737
|
+
sage: PvW0 = ExtendedAffineWeylGroup(['A',2,1]).PvW0()
|
|
738
|
+
sage: PvW0 in Magmas().Unital().Realizations()
|
|
739
|
+
True
|
|
740
|
+
sage: PvW0.one()
|
|
741
|
+
1
|
|
742
|
+
"""
|
|
743
|
+
return self(self.realization_of().a_realization().one())
|
|
744
|
+
|
|
745
|
+
class ParentMethods:
|
|
746
|
+
|
|
747
|
+
def product(self, x, y):
|
|
748
|
+
"""
|
|
749
|
+
The binary multiplication of the magma.
|
|
750
|
+
|
|
751
|
+
INPUT:
|
|
752
|
+
|
|
753
|
+
- ``x``, ``y`` -- elements of this magma
|
|
754
|
+
|
|
755
|
+
OUTPUT:
|
|
756
|
+
|
|
757
|
+
- an element of the magma (the product of ``x`` and ``y``)
|
|
758
|
+
|
|
759
|
+
EXAMPLES::
|
|
760
|
+
|
|
761
|
+
sage: S = Semigroups().example("free")
|
|
762
|
+
sage: x = S('a'); y = S('b')
|
|
763
|
+
sage: S.product(x, y)
|
|
764
|
+
'ab'
|
|
765
|
+
|
|
766
|
+
A parent in ``Magmas()`` must either implement
|
|
767
|
+
:meth:`.product` in the parent class or ``_mul_`` in the
|
|
768
|
+
element class. By default, the addition method on elements
|
|
769
|
+
``x._mul_(y)`` calls ``S.product(x,y)``, and reciprocally.
|
|
770
|
+
|
|
771
|
+
As a bonus, ``S.product`` models the binary function from
|
|
772
|
+
``S`` to ``S``::
|
|
773
|
+
|
|
774
|
+
sage: bin = S.product
|
|
775
|
+
sage: bin(x,y)
|
|
776
|
+
'ab'
|
|
777
|
+
|
|
778
|
+
Currently, ``S.product`` is just a bound method::
|
|
779
|
+
|
|
780
|
+
sage: bin
|
|
781
|
+
<bound method FreeSemigroup.product of An example of a semigroup:
|
|
782
|
+
the free semigroup generated by ('a', 'b', 'c', 'd')>
|
|
783
|
+
|
|
784
|
+
When Sage will support multivariate morphisms, it will be
|
|
785
|
+
possible, and in fact recommended, to enrich ``S.product``
|
|
786
|
+
with extra mathematical structure. This will typically be
|
|
787
|
+
implemented using lazy attributes.::
|
|
788
|
+
|
|
789
|
+
sage: bin # todo: not implemented
|
|
790
|
+
Generic binary morphism:
|
|
791
|
+
From: (S x S)
|
|
792
|
+
To: S
|
|
793
|
+
"""
|
|
794
|
+
return x * y
|
|
795
|
+
|
|
796
|
+
product_from_element_class_mul = product
|
|
797
|
+
|
|
798
|
+
def __init_extra__(self):
|
|
799
|
+
"""
|
|
800
|
+
EXAMPLES::
|
|
801
|
+
|
|
802
|
+
sage: S = Semigroups().example("free")
|
|
803
|
+
sage: S('a') * S('b') # indirect doctest
|
|
804
|
+
'ab'
|
|
805
|
+
sage: S('a').__class__._mul_ == S('a').__class__._mul_parent
|
|
806
|
+
True
|
|
807
|
+
"""
|
|
808
|
+
# This should instead register the multiplication to the coercion model
|
|
809
|
+
# But this is not yet implemented in the coercion model
|
|
810
|
+
#
|
|
811
|
+
# Github issue #11900: The following used to test whether
|
|
812
|
+
# self.product != self.product_from_element_class_mul. But
|
|
813
|
+
# that is, of course, a bug. Namely otherwise, if the parent
|
|
814
|
+
# has an optimized `product` then its elements will *always* use
|
|
815
|
+
# a slow generic `_mul_`.
|
|
816
|
+
#
|
|
817
|
+
# So, in addition, it should be tested whether the element class exists
|
|
818
|
+
# *and* has a custom _mul_, because in this case it must not be overridden.
|
|
819
|
+
|
|
820
|
+
if (self.product.__func__ == self.product_from_element_class_mul.__func__):
|
|
821
|
+
return
|
|
822
|
+
if not (hasattr(self, "element_class") and hasattr(self.element_class, "_mul_parent")):
|
|
823
|
+
return
|
|
824
|
+
|
|
825
|
+
E = self.element_class
|
|
826
|
+
E_mul_func = raw_getattr(E, '_mul_')
|
|
827
|
+
if not isinstance(E_mul_func, AbstractMethod):
|
|
828
|
+
C = self.category().element_class
|
|
829
|
+
try:
|
|
830
|
+
C_mul_func = raw_getattr(C, '_mul_')
|
|
831
|
+
except AttributeError: # Doesn't have _mul_
|
|
832
|
+
return
|
|
833
|
+
|
|
834
|
+
if isinstance(C_mul_func, AbstractMethod):
|
|
835
|
+
return
|
|
836
|
+
|
|
837
|
+
if E_mul_func is C_mul_func:
|
|
838
|
+
# self.product is custom, thus, we rely on it
|
|
839
|
+
E._mul_ = E._mul_parent
|
|
840
|
+
else: # E._mul_ has so far been abstract
|
|
841
|
+
E._mul_ = E._mul_parent
|
|
842
|
+
|
|
843
|
+
def multiplication_table(self, names='letters', elements=None):
|
|
844
|
+
r"""
|
|
845
|
+
Return a table describing the multiplication operation.
|
|
846
|
+
|
|
847
|
+
.. NOTE:: The order of the elements in the row and column
|
|
848
|
+
headings is equal to the order given by the table's
|
|
849
|
+
:meth:`~sage.matrix.operation_table.OperationTable.list`
|
|
850
|
+
method. The association can also be retrieved with the
|
|
851
|
+
:meth:`~sage.matrix.operation_table.OperationTable.dict`
|
|
852
|
+
method.
|
|
853
|
+
|
|
854
|
+
INPUT:
|
|
855
|
+
|
|
856
|
+
- ``names`` -- the type of names used
|
|
857
|
+
|
|
858
|
+
* ``'letters'`` -- lowercase ASCII letters are used
|
|
859
|
+
for a base 26 representation of the elements'
|
|
860
|
+
positions in the list given by
|
|
861
|
+
:meth:`~sage.matrix.operation_table.OperationTable.column_keys`,
|
|
862
|
+
padded to a common width with leading 'a's.
|
|
863
|
+
* ``'digits'`` -- base 10 representation of the
|
|
864
|
+
elements' positions in the list given by
|
|
865
|
+
:meth:`~sage.matrix.operation_table.OperationTable.column_keys`,
|
|
866
|
+
padded to a common width with leading zeros.
|
|
867
|
+
* ``'elements'`` -- the string representations
|
|
868
|
+
of the elements themselves.
|
|
869
|
+
* a list - a list of strings, where the length
|
|
870
|
+
of the list equals the number of elements.
|
|
871
|
+
- ``elements`` -- (default: ``None``) a list of
|
|
872
|
+
elements of the magma, in forms that can be
|
|
873
|
+
coerced into the structure, eg. their string
|
|
874
|
+
representations. This may be used to impose an
|
|
875
|
+
alternate ordering on the elements, perhaps when
|
|
876
|
+
this is used in the context of a particular structure.
|
|
877
|
+
The default is to use whatever ordering the ``S.list``
|
|
878
|
+
method returns. Or the ``elements`` can be a subset
|
|
879
|
+
which is closed under the operation. In particular,
|
|
880
|
+
this can be used when the base set is infinite.
|
|
881
|
+
|
|
882
|
+
OUTPUT:
|
|
883
|
+
|
|
884
|
+
The multiplication table as an object of the class
|
|
885
|
+
:class:`~sage.matrix.operation_table.OperationTable`
|
|
886
|
+
which defines several methods for manipulating and
|
|
887
|
+
displaying the table. See the documentation there
|
|
888
|
+
for full details to supplement the documentation
|
|
889
|
+
here.
|
|
890
|
+
|
|
891
|
+
EXAMPLES:
|
|
892
|
+
|
|
893
|
+
The default is to represent elements as lowercase
|
|
894
|
+
ASCII letters. ::
|
|
895
|
+
|
|
896
|
+
sage: G = CyclicPermutationGroup(5) # needs sage.groups
|
|
897
|
+
sage: G.multiplication_table() # needs sage.groups sage.modules
|
|
898
|
+
* a b c d e
|
|
899
|
+
+----------
|
|
900
|
+
a| a b c d e
|
|
901
|
+
b| b c d e a
|
|
902
|
+
c| c d e a b
|
|
903
|
+
d| d e a b c
|
|
904
|
+
e| e a b c d
|
|
905
|
+
|
|
906
|
+
All that is required is that an algebraic structure
|
|
907
|
+
has a multiplication defined. A
|
|
908
|
+
:class:`~sage.categories.examples.finite_semigroups.LeftRegularBand`
|
|
909
|
+
is an example of a finite semigroup. The ``names`` argument allows
|
|
910
|
+
displaying the elements in different ways. ::
|
|
911
|
+
|
|
912
|
+
sage: from sage.categories.examples.finite_semigroups import LeftRegularBand
|
|
913
|
+
sage: L = LeftRegularBand(('a', 'b'))
|
|
914
|
+
sage: T = L.multiplication_table(names='digits') # needs sage.modules
|
|
915
|
+
sage: T.column_keys() # needs sage.modules
|
|
916
|
+
('a', 'ab', 'b', 'ba')
|
|
917
|
+
sage: T # needs sage.modules
|
|
918
|
+
* 0 1 2 3
|
|
919
|
+
+--------
|
|
920
|
+
0| 0 1 1 1
|
|
921
|
+
1| 1 1 1 1
|
|
922
|
+
2| 3 3 2 3
|
|
923
|
+
3| 3 3 3 3
|
|
924
|
+
|
|
925
|
+
Specifying the elements in an alternative order can provide
|
|
926
|
+
more insight into how the operation behaves. ::
|
|
927
|
+
|
|
928
|
+
sage: L = LeftRegularBand(('a', 'b', 'c'))
|
|
929
|
+
sage: elts = sorted(L.list())
|
|
930
|
+
sage: L.multiplication_table(elements=elts) # needs sage.modules
|
|
931
|
+
* a b c d e f g h i j k l m n o
|
|
932
|
+
+------------------------------
|
|
933
|
+
a| a b c d e b b c c c d d e e e
|
|
934
|
+
b| b b c c c b b c c c c c c c c
|
|
935
|
+
c| c c c c c c c c c c c c c c c
|
|
936
|
+
d| d e e d e e e e e e d d e e e
|
|
937
|
+
e| e e e e e e e e e e e e e e e
|
|
938
|
+
f| g g h h h f g h i j i j j i j
|
|
939
|
+
g| g g h h h g g h h h h h h h h
|
|
940
|
+
h| h h h h h h h h h h h h h h h
|
|
941
|
+
i| j j j j j i j j i j i j j i j
|
|
942
|
+
j| j j j j j j j j j j j j j j j
|
|
943
|
+
k| l m m l m n o o n o k l m n o
|
|
944
|
+
l| l m m l m m m m m m l l m m m
|
|
945
|
+
m| m m m m m m m m m m m m m m m
|
|
946
|
+
n| o o o o o n o o n o n o o n o
|
|
947
|
+
o| o o o o o o o o o o o o o o o
|
|
948
|
+
|
|
949
|
+
The ``elements`` argument can be used to provide
|
|
950
|
+
a subset of the elements of the structure. The subset
|
|
951
|
+
must be closed under the operation. Elements need only
|
|
952
|
+
be in a form that can be coerced into the set. The
|
|
953
|
+
``names`` argument can also be used to request that
|
|
954
|
+
the elements be represented with their usual string
|
|
955
|
+
representation. ::
|
|
956
|
+
|
|
957
|
+
sage: L = LeftRegularBand(('a','b','c'))
|
|
958
|
+
sage: elts=['a', 'c', 'ac', 'ca']
|
|
959
|
+
sage: L.multiplication_table(names='elements', elements=elts) # needs sage.modules
|
|
960
|
+
* 'a' 'c' 'ac' 'ca'
|
|
961
|
+
+--------------------
|
|
962
|
+
'a'| 'a' 'ac' 'ac' 'ac'
|
|
963
|
+
'c'| 'ca' 'c' 'ca' 'ca'
|
|
964
|
+
'ac'| 'ac' 'ac' 'ac' 'ac'
|
|
965
|
+
'ca'| 'ca' 'ca' 'ca' 'ca'
|
|
966
|
+
|
|
967
|
+
The table returned can be manipulated in various ways. See
|
|
968
|
+
the documentation for
|
|
969
|
+
:class:`~sage.matrix.operation_table.OperationTable` for more
|
|
970
|
+
comprehensive documentation. ::
|
|
971
|
+
|
|
972
|
+
sage: # needs sage.groups sage.modules
|
|
973
|
+
sage: G = AlternatingGroup(3)
|
|
974
|
+
sage: T = G.multiplication_table()
|
|
975
|
+
sage: T.column_keys()
|
|
976
|
+
((), (1,2,3), (1,3,2))
|
|
977
|
+
sage: T.translation()
|
|
978
|
+
{'a': (), 'b': (1,2,3), 'c': (1,3,2)}
|
|
979
|
+
sage: T.change_names(['x', 'y', 'z'])
|
|
980
|
+
sage: T.translation()
|
|
981
|
+
{'x': (), 'y': (1,2,3), 'z': (1,3,2)}
|
|
982
|
+
sage: T
|
|
983
|
+
* x y z
|
|
984
|
+
+------
|
|
985
|
+
x| x y z
|
|
986
|
+
y| y z x
|
|
987
|
+
z| z x y
|
|
988
|
+
"""
|
|
989
|
+
from sage.matrix.operation_table import OperationTable
|
|
990
|
+
import operator
|
|
991
|
+
return OperationTable(self, operation=operator.mul, names=names, elements=elements)
|
|
992
|
+
|
|
993
|
+
class ElementMethods:
|
|
994
|
+
@abstract_method(optional=True)
|
|
995
|
+
def _mul_(self, right):
|
|
996
|
+
"""
|
|
997
|
+
Product of two elements.
|
|
998
|
+
|
|
999
|
+
INPUT:
|
|
1000
|
+
|
|
1001
|
+
- ``self``, ``right`` -- two elements with the same parent
|
|
1002
|
+
|
|
1003
|
+
OUTPUT: an element of the same parent
|
|
1004
|
+
|
|
1005
|
+
EXAMPLES::
|
|
1006
|
+
|
|
1007
|
+
sage: S = Semigroups().example("free")
|
|
1008
|
+
sage: x = S('a'); y = S('b')
|
|
1009
|
+
sage: x._mul_(y)
|
|
1010
|
+
'ab'
|
|
1011
|
+
"""
|
|
1012
|
+
|
|
1013
|
+
_mul_parent = sage.categories.coercion_methods._mul_parent
|
|
1014
|
+
|
|
1015
|
+
def is_idempotent(self):
|
|
1016
|
+
r"""
|
|
1017
|
+
Test whether ``self`` is idempotent.
|
|
1018
|
+
|
|
1019
|
+
EXAMPLES::
|
|
1020
|
+
|
|
1021
|
+
sage: S = Semigroups().example("free"); S
|
|
1022
|
+
An example of a semigroup:
|
|
1023
|
+
the free semigroup generated by ('a', 'b', 'c', 'd')
|
|
1024
|
+
sage: a = S('a')
|
|
1025
|
+
sage: a^2
|
|
1026
|
+
'aa'
|
|
1027
|
+
sage: a.is_idempotent()
|
|
1028
|
+
False
|
|
1029
|
+
|
|
1030
|
+
::
|
|
1031
|
+
|
|
1032
|
+
sage: L = Semigroups().example("leftzero"); L
|
|
1033
|
+
An example of a semigroup: the left zero semigroup
|
|
1034
|
+
sage: x = L('x')
|
|
1035
|
+
sage: x^2
|
|
1036
|
+
'x'
|
|
1037
|
+
sage: x.is_idempotent()
|
|
1038
|
+
True
|
|
1039
|
+
"""
|
|
1040
|
+
return self * self == self
|
|
1041
|
+
|
|
1042
|
+
class CartesianProducts(CartesianProductsCategory):
|
|
1043
|
+
|
|
1044
|
+
def extra_super_categories(self):
|
|
1045
|
+
"""
|
|
1046
|
+
This implements the fact that a subquotient (and therefore
|
|
1047
|
+
a quotient or subobject) of a finite set is finite.
|
|
1048
|
+
|
|
1049
|
+
EXAMPLES::
|
|
1050
|
+
|
|
1051
|
+
sage: Semigroups().CartesianProducts().extra_super_categories()
|
|
1052
|
+
[Category of semigroups]
|
|
1053
|
+
sage: Semigroups().CartesianProducts().super_categories()
|
|
1054
|
+
[Category of semigroups, Category of Cartesian products of magmas]
|
|
1055
|
+
"""
|
|
1056
|
+
return [Magmas()]
|
|
1057
|
+
|
|
1058
|
+
def example(self):
|
|
1059
|
+
"""
|
|
1060
|
+
Return an example of Cartesian product of magmas.
|
|
1061
|
+
|
|
1062
|
+
EXAMPLES::
|
|
1063
|
+
|
|
1064
|
+
sage: C = Magmas().CartesianProducts().example(); C
|
|
1065
|
+
The Cartesian product of (Rational Field, Integer Ring, Integer Ring)
|
|
1066
|
+
sage: C.category()
|
|
1067
|
+
Join of Category of Cartesian products of commutative rings and
|
|
1068
|
+
Category of Cartesian products of metric spaces
|
|
1069
|
+
sage: sorted(C.category().axioms())
|
|
1070
|
+
['AdditiveAssociative', 'AdditiveCommutative', 'AdditiveInverse',
|
|
1071
|
+
'AdditiveUnital', 'Associative', 'Commutative',
|
|
1072
|
+
'Distributive', 'Unital']
|
|
1073
|
+
|
|
1074
|
+
sage: TestSuite(C).run()
|
|
1075
|
+
"""
|
|
1076
|
+
from .cartesian_product import cartesian_product
|
|
1077
|
+
from sage.rings.integer_ring import ZZ
|
|
1078
|
+
from sage.rings.rational_field import QQ
|
|
1079
|
+
return cartesian_product([QQ, ZZ, ZZ])
|
|
1080
|
+
|
|
1081
|
+
class ParentMethods:
|
|
1082
|
+
|
|
1083
|
+
def product(self, left, right):
|
|
1084
|
+
"""
|
|
1085
|
+
EXAMPLES::
|
|
1086
|
+
|
|
1087
|
+
sage: C = Magmas().CartesianProducts().example(); C
|
|
1088
|
+
The Cartesian product of (Rational Field, Integer Ring, Integer Ring)
|
|
1089
|
+
sage: x = C.an_element(); x
|
|
1090
|
+
(1/2, 1, 1)
|
|
1091
|
+
sage: x * x
|
|
1092
|
+
(1/4, 1, 1)
|
|
1093
|
+
|
|
1094
|
+
sage: # needs sage.combinat sage.groups sage.modules
|
|
1095
|
+
sage: A = SymmetricGroupAlgebra(QQ, 3)
|
|
1096
|
+
sage: x = cartesian_product([A([1,3,2]), A([2,3,1])])
|
|
1097
|
+
sage: y = cartesian_product([A([1,3,2]), A([2,3,1])])
|
|
1098
|
+
sage: cartesian_product([A,A]).product(x,y)
|
|
1099
|
+
B[(0, [1, 2, 3])] + B[(1, [3, 1, 2])]
|
|
1100
|
+
sage: x*y
|
|
1101
|
+
B[(0, [1, 2, 3])] + B[(1, [3, 1, 2])]
|
|
1102
|
+
"""
|
|
1103
|
+
prods = ((a * b) for a, b in zip(left.cartesian_factors(),
|
|
1104
|
+
right.cartesian_factors()))
|
|
1105
|
+
return self._cartesian_product_of_elements(prods)
|
|
1106
|
+
|
|
1107
|
+
class Subquotients(SubquotientsCategory):
|
|
1108
|
+
r"""
|
|
1109
|
+
The category of subquotient magmas.
|
|
1110
|
+
|
|
1111
|
+
See :meth:`Sets.SubcategoryMethods.Subquotients` for the
|
|
1112
|
+
general setup for subquotients. In the case of a subquotient
|
|
1113
|
+
magma `S` of a magma `G`, the condition that `r` be a
|
|
1114
|
+
morphism in ``As`` can be rewritten as follows:
|
|
1115
|
+
|
|
1116
|
+
- for any two `a,b \in S` the identity
|
|
1117
|
+
`a \times_S b = r(l(a) \times_G l(b))` holds.
|
|
1118
|
+
|
|
1119
|
+
This is used by this category to implement the product
|
|
1120
|
+
`\times_S` of `S` from `l` and `r` and the product of `G`.
|
|
1121
|
+
|
|
1122
|
+
EXAMPLES::
|
|
1123
|
+
|
|
1124
|
+
sage: Semigroups().Subquotients().all_super_categories()
|
|
1125
|
+
[Category of subquotients of semigroups, Category of semigroups,
|
|
1126
|
+
Category of subquotients of magmas, Category of magmas,
|
|
1127
|
+
Category of subquotients of sets, Category of sets,
|
|
1128
|
+
Category of sets with partial maps,
|
|
1129
|
+
Category of objects]
|
|
1130
|
+
"""
|
|
1131
|
+
|
|
1132
|
+
class ParentMethods:
|
|
1133
|
+
|
|
1134
|
+
def product(self, x, y):
|
|
1135
|
+
"""
|
|
1136
|
+
Return the product of two elements of ``self``.
|
|
1137
|
+
|
|
1138
|
+
EXAMPLES::
|
|
1139
|
+
|
|
1140
|
+
sage: S = Semigroups().Subquotients().example()
|
|
1141
|
+
sage: S
|
|
1142
|
+
An example of a (sub)quotient semigroup:
|
|
1143
|
+
a quotient of the left zero semigroup
|
|
1144
|
+
sage: S.product(S(19), S(3))
|
|
1145
|
+
19
|
|
1146
|
+
|
|
1147
|
+
Here is a more elaborate example involving a sub algebra::
|
|
1148
|
+
|
|
1149
|
+
sage: Z = SymmetricGroup(5).algebra(QQ).center() # needs sage.combinat sage.groups
|
|
1150
|
+
sage: B = Z.basis() # needs sage.combinat sage.groups
|
|
1151
|
+
sage: B[3] * B[2] # needs sage.combinat sage.groups
|
|
1152
|
+
4*B[2] + 6*B[3] + 5*B[6]
|
|
1153
|
+
"""
|
|
1154
|
+
assert x in self
|
|
1155
|
+
assert y in self
|
|
1156
|
+
return self.retract(self.lift(x) * self.lift(y))
|
|
1157
|
+
|
|
1158
|
+
class Realizations(RealizationsCategory):
|
|
1159
|
+
|
|
1160
|
+
class ParentMethods:
|
|
1161
|
+
|
|
1162
|
+
def product_by_coercion(self, left, right):
|
|
1163
|
+
r"""
|
|
1164
|
+
Default implementation of product for realizations.
|
|
1165
|
+
|
|
1166
|
+
This method coerces to the realization specified by
|
|
1167
|
+
``self.realization_of().a_realization()``, computes
|
|
1168
|
+
the product in that realization, and then coerces
|
|
1169
|
+
back.
|
|
1170
|
+
|
|
1171
|
+
EXAMPLES::
|
|
1172
|
+
|
|
1173
|
+
sage: # needs sage.combinat sage.modules
|
|
1174
|
+
sage: Out = Sets().WithRealizations().example().Out(); Out
|
|
1175
|
+
The subset algebra of {1, 2, 3} over Rational Field
|
|
1176
|
+
in the Out basis
|
|
1177
|
+
sage: Out.product
|
|
1178
|
+
<bound method Magmas.Realizations.ParentMethods.product_by_coercion
|
|
1179
|
+
of The subset algebra of {1, 2, 3} over Rational Field
|
|
1180
|
+
in the Out basis>
|
|
1181
|
+
sage: Out.product.__module__
|
|
1182
|
+
'sage.categories.magmas'
|
|
1183
|
+
sage: x = Out.an_element()
|
|
1184
|
+
sage: y = Out.an_element()
|
|
1185
|
+
sage: Out.product(x, y)
|
|
1186
|
+
Out[{}] + 4*Out[{1}] + 9*Out[{2}] + Out[{1, 2}]
|
|
1187
|
+
"""
|
|
1188
|
+
R = self.realization_of().a_realization()
|
|
1189
|
+
return self(R(left) * R(right))
|