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