passagemath-objects 10.6.44__cp314-cp314t-macosx_13_0_arm64.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.
Files changed (280) hide show
  1. passagemath_objects/.dylibs/libgmp.10.dylib +0 -0
  2. passagemath_objects/__init__.py +3 -0
  3. passagemath_objects-10.6.44.dist-info/METADATA +115 -0
  4. passagemath_objects-10.6.44.dist-info/RECORD +280 -0
  5. passagemath_objects-10.6.44.dist-info/WHEEL +6 -0
  6. passagemath_objects-10.6.44.dist-info/top_level.txt +3 -0
  7. sage/all__sagemath_objects.py +37 -0
  8. sage/arith/all__sagemath_objects.py +5 -0
  9. sage/arith/long.pxd +411 -0
  10. sage/arith/numerical_approx.cpython-314t-darwin.so +0 -0
  11. sage/arith/numerical_approx.pxd +35 -0
  12. sage/arith/numerical_approx.pyx +75 -0
  13. sage/arith/power.cpython-314t-darwin.so +0 -0
  14. sage/arith/power.pxd +31 -0
  15. sage/arith/power.pyx +127 -0
  16. sage/categories/action.cpython-314t-darwin.so +0 -0
  17. sage/categories/action.pxd +29 -0
  18. sage/categories/action.pyx +641 -0
  19. sage/categories/algebra_functor.py +745 -0
  20. sage/categories/all__sagemath_objects.py +33 -0
  21. sage/categories/basic.py +62 -0
  22. sage/categories/cartesian_product.py +295 -0
  23. sage/categories/category.py +3401 -0
  24. sage/categories/category_cy_helper.cpython-314t-darwin.so +0 -0
  25. sage/categories/category_cy_helper.pxd +8 -0
  26. sage/categories/category_cy_helper.pyx +322 -0
  27. sage/categories/category_singleton.cpython-314t-darwin.so +0 -0
  28. sage/categories/category_singleton.pxd +3 -0
  29. sage/categories/category_singleton.pyx +342 -0
  30. sage/categories/category_types.py +637 -0
  31. sage/categories/category_with_axiom.py +2876 -0
  32. sage/categories/covariant_functorial_construction.py +703 -0
  33. sage/categories/facade_sets.py +228 -0
  34. sage/categories/functor.cpython-314t-darwin.so +0 -0
  35. sage/categories/functor.pxd +7 -0
  36. sage/categories/functor.pyx +691 -0
  37. sage/categories/homset.py +1338 -0
  38. sage/categories/homsets.py +364 -0
  39. sage/categories/isomorphic_objects.py +73 -0
  40. sage/categories/map.cpython-314t-darwin.so +0 -0
  41. sage/categories/map.pxd +34 -0
  42. sage/categories/map.pyx +2106 -0
  43. sage/categories/morphism.cpython-314t-darwin.so +0 -0
  44. sage/categories/morphism.pxd +14 -0
  45. sage/categories/morphism.pyx +895 -0
  46. sage/categories/objects.py +167 -0
  47. sage/categories/primer.py +1696 -0
  48. sage/categories/pushout.py +4834 -0
  49. sage/categories/quotients.py +64 -0
  50. sage/categories/realizations.py +200 -0
  51. sage/categories/sets_cat.py +3290 -0
  52. sage/categories/sets_with_partial_maps.py +52 -0
  53. sage/categories/subobjects.py +64 -0
  54. sage/categories/subquotients.py +21 -0
  55. sage/categories/with_realizations.py +311 -0
  56. sage/cpython/__init__.py +19 -0
  57. sage/cpython/_py2_random.py +619 -0
  58. sage/cpython/all.py +3 -0
  59. sage/cpython/atexit.cpython-314t-darwin.so +0 -0
  60. sage/cpython/atexit.pyx +269 -0
  61. sage/cpython/builtin_types.cpython-314t-darwin.so +0 -0
  62. sage/cpython/builtin_types.pyx +7 -0
  63. sage/cpython/cython_metaclass.cpython-314t-darwin.so +0 -0
  64. sage/cpython/cython_metaclass.h +117 -0
  65. sage/cpython/cython_metaclass.pxd +3 -0
  66. sage/cpython/cython_metaclass.pyx +130 -0
  67. sage/cpython/debug.cpython-314t-darwin.so +0 -0
  68. sage/cpython/debug.pyx +302 -0
  69. sage/cpython/dict_del_by_value.cpython-314t-darwin.so +0 -0
  70. sage/cpython/dict_del_by_value.pxd +9 -0
  71. sage/cpython/dict_del_by_value.pyx +191 -0
  72. sage/cpython/dict_internal.h +245 -0
  73. sage/cpython/getattr.cpython-314t-darwin.so +0 -0
  74. sage/cpython/getattr.pxd +9 -0
  75. sage/cpython/getattr.pyx +439 -0
  76. sage/cpython/pycore_long.h +97 -0
  77. sage/cpython/pycore_long.pxd +10 -0
  78. sage/cpython/python_debug.h +44 -0
  79. sage/cpython/python_debug.pxd +47 -0
  80. sage/cpython/pyx_visit.h +13 -0
  81. sage/cpython/string.cpython-314t-darwin.so +0 -0
  82. sage/cpython/string.pxd +76 -0
  83. sage/cpython/string.pyx +34 -0
  84. sage/cpython/string_impl.h +60 -0
  85. sage/cpython/type.cpython-314t-darwin.so +0 -0
  86. sage/cpython/type.pxd +2 -0
  87. sage/cpython/type.pyx +40 -0
  88. sage/cpython/wrapperdescr.pxd +67 -0
  89. sage/ext/all__sagemath_objects.py +3 -0
  90. sage/ext/ccobject.h +64 -0
  91. sage/ext/cplusplus.pxd +17 -0
  92. sage/ext/mod_int.h +30 -0
  93. sage/ext/mod_int.pxd +24 -0
  94. sage/ext/stdsage.pxd +39 -0
  95. sage/groups/all__sagemath_objects.py +1 -0
  96. sage/groups/group.cpython-314t-darwin.so +0 -0
  97. sage/groups/group.pxd +14 -0
  98. sage/groups/group.pyx +322 -0
  99. sage/groups/old.cpython-314t-darwin.so +0 -0
  100. sage/groups/old.pxd +14 -0
  101. sage/groups/old.pyx +219 -0
  102. sage/libs/all__sagemath_objects.py +3 -0
  103. sage/libs/gmp/__init__.py +1 -0
  104. sage/libs/gmp/all.pxd +6 -0
  105. sage/libs/gmp/binop.pxd +23 -0
  106. sage/libs/gmp/misc.pxd +8 -0
  107. sage/libs/gmp/mpf.pxd +88 -0
  108. sage/libs/gmp/mpn.pxd +57 -0
  109. sage/libs/gmp/mpq.pxd +57 -0
  110. sage/libs/gmp/mpz.pxd +202 -0
  111. sage/libs/gmp/pylong.cpython-314t-darwin.so +0 -0
  112. sage/libs/gmp/pylong.pxd +12 -0
  113. sage/libs/gmp/pylong.pyx +150 -0
  114. sage/libs/gmp/random.pxd +25 -0
  115. sage/libs/gmp/randomize.pxd +59 -0
  116. sage/libs/gmp/types.pxd +53 -0
  117. sage/libs/gmpxx.pxd +19 -0
  118. sage/misc/abstract_method.py +276 -0
  119. sage/misc/all__sagemath_objects.py +43 -0
  120. sage/misc/bindable_class.py +253 -0
  121. sage/misc/c3_controlled.cpython-314t-darwin.so +0 -0
  122. sage/misc/c3_controlled.pxd +2 -0
  123. sage/misc/c3_controlled.pyx +1402 -0
  124. sage/misc/cachefunc.cpython-314t-darwin.so +0 -0
  125. sage/misc/cachefunc.pxd +43 -0
  126. sage/misc/cachefunc.pyx +3781 -0
  127. sage/misc/call.py +188 -0
  128. sage/misc/classcall_metaclass.cpython-314t-darwin.so +0 -0
  129. sage/misc/classcall_metaclass.pxd +14 -0
  130. sage/misc/classcall_metaclass.pyx +599 -0
  131. sage/misc/constant_function.cpython-314t-darwin.so +0 -0
  132. sage/misc/constant_function.pyx +130 -0
  133. sage/misc/decorators.py +747 -0
  134. sage/misc/fast_methods.cpython-314t-darwin.so +0 -0
  135. sage/misc/fast_methods.pxd +20 -0
  136. sage/misc/fast_methods.pyx +351 -0
  137. sage/misc/flatten.py +90 -0
  138. sage/misc/fpickle.cpython-314t-darwin.so +0 -0
  139. sage/misc/fpickle.pyx +177 -0
  140. sage/misc/function_mangling.cpython-314t-darwin.so +0 -0
  141. sage/misc/function_mangling.pxd +11 -0
  142. sage/misc/function_mangling.pyx +308 -0
  143. sage/misc/inherit_comparison.cpython-314t-darwin.so +0 -0
  144. sage/misc/inherit_comparison.pxd +5 -0
  145. sage/misc/inherit_comparison.pyx +105 -0
  146. sage/misc/instancedoc.cpython-314t-darwin.so +0 -0
  147. sage/misc/instancedoc.pyx +331 -0
  148. sage/misc/lazy_attribute.cpython-314t-darwin.so +0 -0
  149. sage/misc/lazy_attribute.pyx +607 -0
  150. sage/misc/lazy_format.py +135 -0
  151. sage/misc/lazy_import.cpython-314t-darwin.so +0 -0
  152. sage/misc/lazy_import.pyx +1299 -0
  153. sage/misc/lazy_import_cache.py +36 -0
  154. sage/misc/lazy_list.cpython-314t-darwin.so +0 -0
  155. sage/misc/lazy_list.pxd +19 -0
  156. sage/misc/lazy_list.pyx +1187 -0
  157. sage/misc/lazy_string.cpython-314t-darwin.so +0 -0
  158. sage/misc/lazy_string.pxd +7 -0
  159. sage/misc/lazy_string.pyx +546 -0
  160. sage/misc/misc.py +1066 -0
  161. sage/misc/misc_c.cpython-314t-darwin.so +0 -0
  162. sage/misc/misc_c.pxd +3 -0
  163. sage/misc/misc_c.pyx +766 -0
  164. sage/misc/namespace_package.py +37 -0
  165. sage/misc/nested_class.cpython-314t-darwin.so +0 -0
  166. sage/misc/nested_class.pxd +3 -0
  167. sage/misc/nested_class.pyx +394 -0
  168. sage/misc/persist.cpython-314t-darwin.so +0 -0
  169. sage/misc/persist.pyx +1251 -0
  170. sage/misc/prandom.py +418 -0
  171. sage/misc/randstate.cpython-314t-darwin.so +0 -0
  172. sage/misc/randstate.pxd +30 -0
  173. sage/misc/randstate.pyx +1059 -0
  174. sage/misc/repr.py +203 -0
  175. sage/misc/reset.cpython-314t-darwin.so +0 -0
  176. sage/misc/reset.pyx +196 -0
  177. sage/misc/sage_ostools.cpython-314t-darwin.so +0 -0
  178. sage/misc/sage_ostools.pyx +323 -0
  179. sage/misc/sage_timeit.py +275 -0
  180. sage/misc/sage_timeit_class.cpython-314t-darwin.so +0 -0
  181. sage/misc/sage_timeit_class.pyx +120 -0
  182. sage/misc/sage_unittest.py +637 -0
  183. sage/misc/sageinspect.py +2768 -0
  184. sage/misc/session.cpython-314t-darwin.so +0 -0
  185. sage/misc/session.pyx +392 -0
  186. sage/misc/superseded.py +557 -0
  187. sage/misc/test_nested_class.py +228 -0
  188. sage/misc/timing.py +264 -0
  189. sage/misc/unknown.py +222 -0
  190. sage/misc/verbose.py +253 -0
  191. sage/misc/weak_dict.cpython-314t-darwin.so +0 -0
  192. sage/misc/weak_dict.pxd +15 -0
  193. sage/misc/weak_dict.pyx +1231 -0
  194. sage/modules/all__sagemath_objects.py +1 -0
  195. sage/modules/module.cpython-314t-darwin.so +0 -0
  196. sage/modules/module.pxd +5 -0
  197. sage/modules/module.pyx +329 -0
  198. sage/rings/all__sagemath_objects.py +3 -0
  199. sage/rings/integer_fake.h +22 -0
  200. sage/rings/integer_fake.pxd +55 -0
  201. sage/sets/all__sagemath_objects.py +3 -0
  202. sage/sets/pythonclass.cpython-314t-darwin.so +0 -0
  203. sage/sets/pythonclass.pxd +9 -0
  204. sage/sets/pythonclass.pyx +247 -0
  205. sage/structure/__init__.py +4 -0
  206. sage/structure/all.py +30 -0
  207. sage/structure/category_object.cpython-314t-darwin.so +0 -0
  208. sage/structure/category_object.pxd +28 -0
  209. sage/structure/category_object.pyx +1087 -0
  210. sage/structure/coerce.cpython-314t-darwin.so +0 -0
  211. sage/structure/coerce.pxd +44 -0
  212. sage/structure/coerce.pyx +2107 -0
  213. sage/structure/coerce_actions.cpython-314t-darwin.so +0 -0
  214. sage/structure/coerce_actions.pxd +27 -0
  215. sage/structure/coerce_actions.pyx +988 -0
  216. sage/structure/coerce_dict.cpython-314t-darwin.so +0 -0
  217. sage/structure/coerce_dict.pxd +51 -0
  218. sage/structure/coerce_dict.pyx +1557 -0
  219. sage/structure/coerce_exceptions.py +23 -0
  220. sage/structure/coerce_maps.cpython-314t-darwin.so +0 -0
  221. sage/structure/coerce_maps.pxd +28 -0
  222. sage/structure/coerce_maps.pyx +718 -0
  223. sage/structure/debug_options.cpython-314t-darwin.so +0 -0
  224. sage/structure/debug_options.pxd +6 -0
  225. sage/structure/debug_options.pyx +54 -0
  226. sage/structure/dynamic_class.py +541 -0
  227. sage/structure/element.cpython-314t-darwin.so +0 -0
  228. sage/structure/element.pxd +272 -0
  229. sage/structure/element.pyx +4772 -0
  230. sage/structure/element_wrapper.cpython-314t-darwin.so +0 -0
  231. sage/structure/element_wrapper.pxd +12 -0
  232. sage/structure/element_wrapper.pyx +582 -0
  233. sage/structure/factorization.py +1422 -0
  234. sage/structure/factorization_integer.py +105 -0
  235. sage/structure/factory.cpython-314t-darwin.so +0 -0
  236. sage/structure/factory.pyx +786 -0
  237. sage/structure/formal_sum.py +489 -0
  238. sage/structure/gens_py.py +73 -0
  239. sage/structure/global_options.py +1743 -0
  240. sage/structure/indexed_generators.py +863 -0
  241. sage/structure/list_clone.cpython-314t-darwin.so +0 -0
  242. sage/structure/list_clone.pxd +65 -0
  243. sage/structure/list_clone.pyx +1867 -0
  244. sage/structure/list_clone_demo.cpython-314t-darwin.so +0 -0
  245. sage/structure/list_clone_demo.pyx +248 -0
  246. sage/structure/list_clone_timings.py +179 -0
  247. sage/structure/list_clone_timings_cy.cpython-314t-darwin.so +0 -0
  248. sage/structure/list_clone_timings_cy.pyx +86 -0
  249. sage/structure/mutability.cpython-314t-darwin.so +0 -0
  250. sage/structure/mutability.pxd +21 -0
  251. sage/structure/mutability.pyx +348 -0
  252. sage/structure/nonexact.py +69 -0
  253. sage/structure/parent.cpython-314t-darwin.so +0 -0
  254. sage/structure/parent.pxd +112 -0
  255. sage/structure/parent.pyx +3093 -0
  256. sage/structure/parent_base.cpython-314t-darwin.so +0 -0
  257. sage/structure/parent_base.pxd +13 -0
  258. sage/structure/parent_base.pyx +44 -0
  259. sage/structure/parent_gens.cpython-314t-darwin.so +0 -0
  260. sage/structure/parent_gens.pxd +22 -0
  261. sage/structure/parent_gens.pyx +377 -0
  262. sage/structure/parent_old.cpython-314t-darwin.so +0 -0
  263. sage/structure/parent_old.pxd +25 -0
  264. sage/structure/parent_old.pyx +294 -0
  265. sage/structure/proof/__init__.py +1 -0
  266. sage/structure/proof/all.py +243 -0
  267. sage/structure/proof/proof.py +300 -0
  268. sage/structure/richcmp.cpython-314t-darwin.so +0 -0
  269. sage/structure/richcmp.pxd +213 -0
  270. sage/structure/richcmp.pyx +495 -0
  271. sage/structure/sage_object.cpython-314t-darwin.so +0 -0
  272. sage/structure/sage_object.pxd +3 -0
  273. sage/structure/sage_object.pyx +988 -0
  274. sage/structure/sage_object_test.py +19 -0
  275. sage/structure/sequence.py +937 -0
  276. sage/structure/set_factories.py +1178 -0
  277. sage/structure/set_factories_example.py +527 -0
  278. sage/structure/support_view.py +179 -0
  279. sage/structure/test_factory.py +56 -0
  280. sage/structure/unique_representation.py +1359 -0
@@ -0,0 +1,33 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ # Subset of sage.categories.all that is made available by the sage-objects distribution
3
+
4
+ from sage.misc.lazy_import import lazy_import
5
+
6
+ # Resolve a circular import so that "import sage.categories.all" can succeed
7
+ # in initializing the category system.
8
+ import sage.structure.category_object # imports sage.categories.category
9
+
10
+ # Small part of "from sage.categories.basic import *":
11
+ from sage.categories.objects import Objects
12
+ from sage.categories.sets_cat import Sets, EmptySetError
13
+
14
+
15
+ from sage.categories.category import Category
16
+
17
+ from sage.categories.category_types import Elements
18
+
19
+ from sage.categories.cartesian_product import cartesian_product
20
+
21
+ from sage.categories.functor import (ForgetfulFunctor,
22
+ IdentityFunctor)
23
+
24
+ from sage.categories.homset import (Hom, hom,
25
+ End, end,
26
+ Homset, HomsetWithBase)
27
+
28
+ from sage.categories.morphism import Morphism
29
+
30
+ from sage.categories.realizations import Realizations
31
+
32
+ from sage.categories.sets_with_partial_maps import SetsWithPartialMaps
33
+ del lazy_import
@@ -0,0 +1,62 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ # delvewheel: patch
3
+ r"""
4
+ A subset of sage.categories.all with just the basic categories needed
5
+ for sage startup (i.e. to define ZZ, QQ, ...).
6
+ """
7
+ # *****************************************************************************
8
+ # Copyright (C) 2008-2009 Nicolas M. Thiery <nthiery at users.sf.net>
9
+ #
10
+ # Distributed under the terms of the GNU General Public License (GPL)
11
+ # http://www.gnu.org/licenses/
12
+ # ******************************************************************************
13
+
14
+ from sage.categories.objects import Objects
15
+ from sage.categories.sets_cat import Sets, EmptySetError
16
+ from sage.categories.posets import Posets
17
+
18
+ # For backward compatibility; will be deprecated at some point
19
+ PartiallyOrderedSets = Posets
20
+ OrderedSets = Posets
21
+
22
+ from sage.categories.additive_magmas import AdditiveMagmas
23
+ from sage.categories.commutative_additive_semigroups import (
24
+ CommutativeAdditiveSemigroups,
25
+ )
26
+ from sage.categories.commutative_additive_monoids import CommutativeAdditiveMonoids
27
+ from sage.categories.commutative_additive_groups import CommutativeAdditiveGroups
28
+
29
+ from sage.categories.magmas import Magmas
30
+ from sage.categories.semigroups import Semigroups
31
+ from sage.categories.monoids import Monoids
32
+ from sage.categories.groups import Groups
33
+ from sage.categories.partially_ordered_monoids import PartiallyOrderedMonoids
34
+
35
+ # For backward compatibility; might be deprecated at some point
36
+ OrderedMonoids = PartiallyOrderedMonoids
37
+
38
+ from sage.categories.rngs import Rngs
39
+ from sage.categories.semirings import Semirings
40
+ from sage.categories.rings import Rings
41
+ from sage.categories.domains import Domains
42
+ from sage.categories.division_rings import DivisionRings
43
+
44
+ from sage.categories.commutative_rings import CommutativeRings
45
+ from sage.categories.integral_domains import IntegralDomains
46
+ from sage.categories.gcd_domains import GcdDomains
47
+ from sage.categories.dedekind_domains import DedekindDomains
48
+ from sage.categories.principal_ideal_domains import PrincipalIdealDomains
49
+ from sage.categories.euclidean_domains import EuclideanDomains
50
+ from sage.categories.unique_factorization_domains import UniqueFactorizationDomains
51
+
52
+ from sage.categories.fields import Fields
53
+ from sage.categories.quotient_fields import QuotientFields
54
+ from sage.categories.finite_fields import FiniteFields
55
+ from sage.categories.discrete_valuation import (
56
+ DiscreteValuationRings,
57
+ DiscreteValuationFields,
58
+ )
59
+ from sage.categories.complete_discrete_valuation import (
60
+ CompleteDiscreteValuationRings,
61
+ CompleteDiscreteValuationFields,
62
+ )
@@ -0,0 +1,295 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ """
3
+ Cartesian Product Functorial Construction
4
+
5
+ AUTHORS:
6
+
7
+ - Nicolas M. Thiery (2008-2010): initial revision and refactorization
8
+ """
9
+ #*****************************************************************************
10
+ # Copyright (C) 2010 Nicolas M. Thiery <nthiery at users.sf.net>
11
+ #
12
+ # Distributed under the terms of the GNU General Public License (GPL)
13
+ # http://www.gnu.org/licenses/
14
+ #*****************************************************************************
15
+
16
+ try:
17
+ from typing import Self # type: ignore (Python >= 3.11)
18
+ except ImportError:
19
+ from typing_extensions import Self # type: ignore (Python 3.10)
20
+
21
+ from sage.categories.covariant_functorial_construction import (
22
+ CovariantConstructionCategory,
23
+ CovariantFunctorialConstruction,
24
+ )
25
+ from sage.categories.pushout import MultivariateConstructionFunctor
26
+ from sage.misc.lazy_import import lazy_import
27
+
28
+ native_python_containers = {tuple, list, set, frozenset, range}
29
+
30
+
31
+ class CartesianProductFunctor(CovariantFunctorialConstruction, MultivariateConstructionFunctor):
32
+ """
33
+ The Cartesian product functor.
34
+
35
+ EXAMPLES::
36
+
37
+ sage: cartesian_product
38
+ The cartesian_product functorial construction
39
+
40
+ ``cartesian_product`` takes a finite collection of sets, and
41
+ constructs the Cartesian product of those sets::
42
+
43
+ sage: A = FiniteEnumeratedSet(['a','b','c'])
44
+ sage: B = FiniteEnumeratedSet([1,2])
45
+ sage: C = cartesian_product([A, B]); C
46
+ The Cartesian product of ({'a', 'b', 'c'}, {1, 2})
47
+ sage: C.an_element()
48
+ ('a', 1)
49
+ sage: C.list() # todo: not implemented
50
+ [['a', 1], ['a', 2], ['b', 1], ['b', 2], ['c', 1], ['c', 2]]
51
+
52
+ If those sets are endowed with more structure, say they are
53
+ monoids (hence in the category ``Monoids()``), then the result is
54
+ automatically endowed with its natural monoid structure::
55
+
56
+ sage: M = Monoids().example()
57
+ sage: M
58
+ An example of a monoid: the free monoid generated by ('a', 'b', 'c', 'd')
59
+ sage: M.rename('M')
60
+ sage: C = cartesian_product([M, ZZ, QQ])
61
+ sage: C
62
+ The Cartesian product of (M, Integer Ring, Rational Field)
63
+ sage: C.an_element()
64
+ ('abcd', 1, 1/2)
65
+ sage: C.an_element()^2
66
+ ('abcdabcd', 1, 1/4)
67
+ sage: C.category()
68
+ Category of Cartesian products of monoids
69
+
70
+ sage: Monoids().CartesianProducts()
71
+ Category of Cartesian products of monoids
72
+
73
+ The Cartesian product functor is covariant: if ``A`` is a
74
+ subcategory of ``B``, then ``A.CartesianProducts()`` is a
75
+ subcategory of ``B.CartesianProducts()`` (see also
76
+ :class:`~sage.categories.covariant_functorial_construction.CovariantFunctorialConstruction`)::
77
+
78
+ sage: C.categories()
79
+ [Category of Cartesian products of monoids,
80
+ Category of monoids,
81
+ Category of Cartesian products of semigroups,
82
+ Category of semigroups,
83
+ Category of Cartesian products of unital magmas,
84
+ Category of Cartesian products of magmas,
85
+ Category of unital magmas,
86
+ Category of magmas,
87
+ Category of Cartesian products of sets,
88
+ Category of sets, ...]
89
+
90
+ [Category of Cartesian products of monoids,
91
+ Category of monoids,
92
+ Category of Cartesian products of semigroups,
93
+ Category of semigroups,
94
+ Category of Cartesian products of magmas,
95
+ Category of unital magmas,
96
+ Category of magmas,
97
+ Category of Cartesian products of sets,
98
+ Category of sets,
99
+ Category of sets with partial maps,
100
+ Category of objects]
101
+
102
+ Hence, the role of ``Monoids().CartesianProducts()`` is solely to
103
+ provide mathematical information and algorithms which are relevant
104
+ to Cartesian product of monoids. For example, it specifies that
105
+ the result is again a monoid, and that its multiplicative unit is
106
+ the Cartesian product of the units of the underlying sets::
107
+
108
+ sage: C.one()
109
+ ('', 1, 1)
110
+
111
+ Those are implemented in the nested class
112
+ :class:`Monoids.CartesianProducts
113
+ <sage.categories.monoids.Monoids.CartesianProducts>` of
114
+ ``Monoids(QQ)``. This nested class is itself a subclass of
115
+ :class:`CartesianProductsCategory`.
116
+ """
117
+ _functor_name = "cartesian_product"
118
+ _functor_category = "CartesianProducts"
119
+ symbol = " (+) "
120
+
121
+ def __init__(self, category=None):
122
+ r"""
123
+ Constructor. See :class:`CartesianProductFunctor` for details.
124
+
125
+ TESTS::
126
+
127
+ sage: from sage.categories.cartesian_product import CartesianProductFunctor
128
+ sage: CartesianProductFunctor()
129
+ The cartesian_product functorial construction
130
+ """
131
+ CovariantFunctorialConstruction.__init__(self)
132
+ self._forced_category = category
133
+ from sage.categories.sets_cat import Sets
134
+ if self._forced_category is not None:
135
+ codomain = self._forced_category
136
+ else:
137
+ codomain = Sets()
138
+ MultivariateConstructionFunctor.__init__(self, Sets(), codomain)
139
+
140
+ def __call__(self, args, **kwds):
141
+ r"""
142
+ Functorial construction application.
143
+
144
+ This specializes the generic ``__call__`` from
145
+ :class:`CovariantFunctorialConstruction` to:
146
+
147
+ - handle the following plain Python containers as input:
148
+ :class:`frozenset`, :class:`list`, :class:`set`,
149
+ :class:`tuple`, and :class:`xrange` (Python3 ``range``).
150
+
151
+ - handle the empty list of factors.
152
+
153
+ See the examples below.
154
+
155
+ EXAMPLES::
156
+
157
+ sage: cartesian_product([[0,1], ('a','b','c')])
158
+ The Cartesian product of ({0, 1}, {'a', 'b', 'c'})
159
+ sage: _.category()
160
+ Category of Cartesian products of finite enumerated sets
161
+
162
+ sage: cartesian_product([set([0,1,2]), [0,1]])
163
+ The Cartesian product of ({0, 1, 2}, {0, 1})
164
+ sage: _.category()
165
+ Category of Cartesian products of finite enumerated sets
166
+
167
+ Check that the empty product is handled correctly::
168
+
169
+ sage: C = cartesian_product([])
170
+ sage: C
171
+ The Cartesian product of ()
172
+ sage: C.cardinality()
173
+ 1
174
+ sage: C.an_element()
175
+ ()
176
+ sage: C.category()
177
+ Category of Cartesian products of sets
178
+
179
+ Check that Python3 ``range`` is handled correctly::
180
+
181
+ sage: C = cartesian_product([range(2), range(2)])
182
+ sage: list(C)
183
+ [(0, 0), (0, 1), (1, 0), (1, 1)]
184
+ sage: C.category()
185
+ Category of Cartesian products of finite enumerated sets
186
+ """
187
+ if any(type(arg) in native_python_containers for arg in args):
188
+ from sage.categories.sets_cat import Sets
189
+ S = Sets()
190
+ args = [S(a, enumerated_set=True) for a in args]
191
+ elif not args:
192
+ if self._forced_category is None:
193
+ from sage.categories.sets_cat import Sets
194
+ cat = Sets().CartesianProducts()
195
+ else:
196
+ cat = self._forced_category
197
+ from sage.sets.cartesian_product import CartesianProduct
198
+ return CartesianProduct((), cat)
199
+ elif self._forced_category is not None:
200
+ return super().__call__(args, category=self._forced_category, **kwds)
201
+
202
+ return super().__call__(args, **kwds)
203
+
204
+ def __eq__(self, other):
205
+ r"""
206
+ Comparison ignores the ``category`` parameter.
207
+
208
+ TESTS::
209
+
210
+ sage: from sage.categories.cartesian_product import CartesianProductFunctor
211
+ sage: cartesian_product([ZZ, ZZ]).construction()[0] == CartesianProductFunctor()
212
+ True
213
+ """
214
+ return isinstance(other, CartesianProductFunctor)
215
+
216
+ def __ne__(self, other):
217
+ r"""
218
+ Comparison ignores the ``category`` parameter.
219
+
220
+ TESTS::
221
+
222
+ sage: from sage.categories.cartesian_product import CartesianProductFunctor
223
+ sage: cartesian_product([ZZ, ZZ]).construction()[0] != CartesianProductFunctor()
224
+ False
225
+ """
226
+ return not (self == other)
227
+
228
+
229
+ class CartesianProductsCategory(CovariantConstructionCategory):
230
+ r"""
231
+ An abstract base class for all ``CartesianProducts`` categories.
232
+
233
+ TESTS::
234
+
235
+ sage: C = Sets().CartesianProducts()
236
+ sage: C
237
+ Category of Cartesian products of sets
238
+ sage: C.base_category()
239
+ Category of sets
240
+ sage: latex(C)
241
+ \mathbf{CartesianProducts}(\mathbf{Sets})
242
+ """
243
+
244
+ _functor_category = "CartesianProducts"
245
+
246
+ def _repr_object_names(self):
247
+ """
248
+ EXAMPLES::
249
+
250
+ sage: ModulesWithBasis(QQ).CartesianProducts() # indirect doctest
251
+ Category of Cartesian products of vector spaces with basis over Rational Field
252
+ """
253
+ # This method is only required for the capital `C`
254
+ return "Cartesian products of %s" % (self.base_category()._repr_object_names())
255
+
256
+ def CartesianProducts(self) -> Self:
257
+ """
258
+ Return the category of (finite) Cartesian products of objects
259
+ of ``self``.
260
+
261
+ By associativity of Cartesian products, this is ``self`` (a Cartesian
262
+ product of Cartesian products of `A`'s is a Cartesian product of
263
+ `A`'s).
264
+
265
+ EXAMPLES::
266
+
267
+ sage: ModulesWithBasis(QQ).CartesianProducts().CartesianProducts()
268
+ Category of Cartesian products of vector spaces with basis over Rational Field
269
+ """
270
+ return self
271
+
272
+ def base_ring(self):
273
+ """
274
+ The base ring of a Cartesian product is the base ring of the underlying category.
275
+
276
+ EXAMPLES::
277
+
278
+ sage: Algebras(ZZ).CartesianProducts().base_ring()
279
+ Integer Ring
280
+ """
281
+ return self.base_category().base_ring()
282
+
283
+
284
+ # Moved to avoid circular imports
285
+ lazy_import('sage.categories.sets_cat', 'cartesian_product')
286
+ """
287
+ The Cartesian product functorial construction
288
+
289
+ See :class:`CartesianProductFunctor` for more information
290
+
291
+ EXAMPLES::
292
+
293
+ sage: cartesian_product
294
+ The cartesian_product functorial construction
295
+ """