passagemath-objects 10.6.46__cp314-cp314t-macosx_13_0_x86_64.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.

Potentially problematic release.


This version of passagemath-objects might be problematic. Click here for more details.

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.46.dist-info/METADATA +115 -0
  4. passagemath_objects-10.6.46.dist-info/RECORD +280 -0
  5. passagemath_objects-10.6.46.dist-info/WHEEL +6 -0
  6. passagemath_objects-10.6.46.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,300 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ "Global proof preferences"
3
+
4
+ from sage.structure.sage_object import SageObject
5
+
6
+
7
+ class _ProofPref(SageObject):
8
+ """
9
+ An object that holds global proof preferences. For now these are merely
10
+ boolean flags for various parts of Sage that use probabilistic
11
+ algorithms.
12
+
13
+ A ``True`` flag means that the subsystem (such as linear algebra or number
14
+ fields) should return results that are true unconditionally: the
15
+ correctness should not depend on an algorithm with a nonzero probability of
16
+ returning an incorrect answer or on the truth of any unproven conjectures.
17
+
18
+ A ``False`` flag means that the subsystem can use faster methods to return
19
+ answers that have a very small probability of being wrong.
20
+ """
21
+ def __init__(self, proof=True):
22
+ self._require_proof = {}
23
+ self._require_proof["arithmetic"] = proof
24
+ self._require_proof["elliptic_curve"] = proof
25
+ self._require_proof["linear_algebra"] = proof
26
+ self._require_proof["number_field"] = proof
27
+ self._require_proof["polynomial"] = proof
28
+ self._require_proof["other"] = proof
29
+
30
+ def arithmetic(self, t=None):
31
+ """
32
+ Controls the default proof strategy for integer arithmetic algorithms (such as primality testing).
33
+
34
+ INPUT:
35
+
36
+ - ``t`` -- boolean or ``None``
37
+
38
+ OUTPUT:
39
+
40
+ - if ``t == True``, requires integer arithmetic operations to (by
41
+ default) return results that are true unconditionally: the
42
+ correctness will not depend on an algorithm with a nonzero
43
+ probability of returning an incorrect answer or on the truth of any
44
+ unproven conjectures.
45
+ - if ``t == False``, allows integer arithmetic operations to (by
46
+ default) return results that may depend on unproven conjectures or on
47
+ probabilistic algorithms. Such algorithms often have a substantial
48
+ speed improvement over those requiring proof.
49
+ - if ``t == None``, returns the integer arithmetic proof status.
50
+
51
+ EXAMPLES::
52
+
53
+ sage: proof.arithmetic()
54
+ True
55
+ sage: proof.arithmetic(False)
56
+ sage: proof.arithmetic()
57
+ False
58
+ sage: proof.arithmetic(True)
59
+ sage: proof.arithmetic()
60
+ True
61
+ """
62
+ if t is None:
63
+ return self._require_proof["arithmetic"]
64
+ self._require_proof["arithmetic"] = bool(t)
65
+
66
+ def elliptic_curve(self, t=None):
67
+ """
68
+ Controls the default proof strategy for elliptic curve algorithms.
69
+
70
+ INPUT:
71
+
72
+ - ``t`` -- boolean or ``None``
73
+
74
+ OUTPUT:
75
+
76
+ - if ``t == True``, requires elliptic curve algorithms to (by default)
77
+ return results that are true unconditionally: the correctness will
78
+ not depend on an algorithm with a nonzero probability of returning an
79
+ incorrect answer or on the truth of any unproven conjectures.
80
+ - if ``t == False``, allows elliptic curve algorithms to (by default)
81
+ return results that may depend on unproven conjectures or on
82
+ probabilistic algorithms. Such algorithms often have a substantial
83
+ speed improvement over those requiring proof.
84
+ - if ``t == None``, returns the current elliptic curve proof status.
85
+
86
+ EXAMPLES::
87
+
88
+ sage: proof.elliptic_curve()
89
+ True
90
+ sage: proof.elliptic_curve(False)
91
+ sage: proof.elliptic_curve()
92
+ False
93
+ sage: proof.elliptic_curve(True)
94
+ sage: proof.elliptic_curve()
95
+ True
96
+ """
97
+ if t is None:
98
+ return self._require_proof["elliptic_curve"]
99
+ self._require_proof["elliptic_curve"] = bool(t)
100
+
101
+ def linear_algebra(self, t=None):
102
+ """
103
+ Controls the default proof strategy for linear algebra algorithms.
104
+
105
+ INPUT:
106
+
107
+ - ``t`` -- boolean or ``None``
108
+
109
+ OUTPUT:
110
+
111
+ - if ``t == True``, requires linear algebra algorithms to (by default)
112
+ return results that are true unconditionally: the correctness will
113
+ not depend on an algorithm with a nonzero probability of returning an
114
+ incorrect answer or on the truth of any unproven conjectures.
115
+ - if ``t == False``, allows linear algebra algorithms to (by default)
116
+ return results that may depend on unproven conjectures or on
117
+ probabilistic algorithms. Such algorithms often have a substantial
118
+ speed improvement over those requiring proof.
119
+ - if ``t == None``, returns the current linear algebra proof status.
120
+
121
+ EXAMPLES::
122
+
123
+ sage: proof.linear_algebra()
124
+ True
125
+ sage: proof.linear_algebra(False)
126
+ sage: proof.linear_algebra()
127
+ False
128
+ sage: proof.linear_algebra(True)
129
+ sage: proof.linear_algebra()
130
+ True
131
+ """
132
+ if t is None:
133
+ return self._require_proof["linear_algebra"]
134
+ self._require_proof["linear_algebra"] = bool(t)
135
+
136
+ def number_field(self, t=None):
137
+ """
138
+ Controls the default proof strategy for number field algorithms.
139
+
140
+ INPUT:
141
+
142
+ - ``t`` -- boolean or ``None``
143
+
144
+ OUTPUT:
145
+
146
+ - if ``t == True``, requires number field algorithms to (by default)
147
+ return results that are true unconditionally: the correctness will
148
+ not depend on an algorithm with a nonzero probability of returning an
149
+ incorrect answer or on the truth of any unproven conjectures.
150
+ - if ``t == False``, allows number field algorithms to (by default)
151
+ return results that may depend on unproven conjectures or on
152
+ probabilistic algorithms. Such algorithms often have a substantial
153
+ speed improvement over those requiring proof.
154
+ - if ``t == None``, returns the current number field proof status.
155
+
156
+ EXAMPLES::
157
+
158
+ sage: proof.number_field()
159
+ True
160
+ sage: proof.number_field(False)
161
+ sage: proof.number_field()
162
+ False
163
+ sage: proof.number_field(True)
164
+ sage: proof.number_field()
165
+ True
166
+ """
167
+ if t is None:
168
+ return self._require_proof["number_field"]
169
+ self._require_proof["number_field"] = bool(t)
170
+
171
+ def polynomial(self, t=None):
172
+ """
173
+ Controls the default proof strategy for polynomial algorithms.
174
+
175
+ INPUT:
176
+
177
+ - ``t`` -- boolean or ``None``
178
+
179
+ OUTPUT:
180
+
181
+ - if ``t == True``, requires polynomial algorithms to (by default)
182
+ return results that are true unconditionally: the correctness will
183
+ not depend on an algorithm with a nonzero probability of returning an
184
+ incorrect answer or on the truth of any unproven conjectures.
185
+ - if ``t == False``, allows polynomial algorithms to (by default)
186
+ return results that may depend on unproven conjectures or on
187
+ probabilistic algorithms. Such algorithms often have a substantial
188
+ speed improvement over those requiring proof.
189
+ - if ``t == None``, returns the current polynomial proof status.
190
+
191
+ EXAMPLES::
192
+
193
+ sage: proof.polynomial()
194
+ True
195
+ sage: proof.polynomial(False)
196
+ sage: proof.polynomial()
197
+ False
198
+ sage: proof.polynomial(True)
199
+ sage: proof.polynomial()
200
+ True
201
+ """
202
+ if t is None:
203
+ return self._require_proof["polynomial"]
204
+ self._require_proof["polynomial"] = bool(t)
205
+
206
+
207
+ _proof_prefs = _ProofPref(True) # Creates the global object that stores proof preferences.
208
+
209
+
210
+ def get_flag(t=None, subsystem=None):
211
+ """
212
+ Used for easily determining the correct proof flag to use.
213
+
214
+ EXAMPLES::
215
+
216
+ sage: from sage.structure.proof.proof import get_flag
217
+ sage: get_flag(False)
218
+ False
219
+ sage: get_flag(True)
220
+ True
221
+ sage: get_flag()
222
+ True
223
+ sage: proof.all(False)
224
+ sage: get_flag()
225
+ False
226
+ """
227
+ if t is None:
228
+ if subsystem in ["arithmetic", "elliptic_curve",
229
+ "linear_algebra", "number_field", "polynomial"]:
230
+ return _proof_prefs._require_proof[subsystem]
231
+ else:
232
+ return _proof_prefs._require_proof["other"]
233
+ return t
234
+
235
+
236
+ class WithProof:
237
+ """
238
+ Use :class:`WithProof` to temporarily set the value of one of the proof
239
+ systems for a block of code, with a guarantee that it will be set
240
+ back to how it was before after the block is done, even if there is an error.
241
+
242
+ EXAMPLES:
243
+
244
+ This would hang "forever" if attempted with ``proof=True``::
245
+
246
+ sage: proof.arithmetic(True)
247
+ sage: with proof.WithProof('arithmetic', False): # needs sage.libs.pari
248
+ ....: print((10^1000 + 453).is_prime())
249
+ ....: print(1/0)
250
+ Traceback (most recent call last):
251
+ ...
252
+ ZeroDivisionError: rational division by zero
253
+ sage: proof.arithmetic()
254
+ True
255
+ """
256
+ def __init__(self, subsystem, t):
257
+ """
258
+ TESTS::
259
+
260
+ sage: proof.arithmetic(True)
261
+ sage: P = proof.WithProof('arithmetic',False); P
262
+ <sage.structure.proof.proof.WithProof object at ...>
263
+ sage: P._subsystem
264
+ 'arithmetic'
265
+ sage: P._t
266
+ False
267
+ sage: P._t_orig
268
+ True
269
+ """
270
+ self._subsystem = str(subsystem)
271
+ self._t = bool(t)
272
+ self._t_orig = _proof_prefs._require_proof[subsystem]
273
+
274
+ def __enter__(self):
275
+ """
276
+ TESTS::
277
+
278
+ sage: proof.arithmetic(True)
279
+ sage: P = proof.WithProof('arithmetic',False)
280
+ sage: P.__enter__()
281
+ sage: proof.arithmetic()
282
+ False
283
+ sage: proof.arithmetic(True)
284
+ """
285
+ _proof_prefs._require_proof[self._subsystem] = self._t
286
+
287
+ def __exit__(self, *args):
288
+ """
289
+ TESTS::
290
+
291
+ sage: proof.arithmetic(True)
292
+ sage: P = proof.WithProof('arithmetic',False)
293
+ sage: P.__enter__()
294
+ sage: proof.arithmetic()
295
+ False
296
+ sage: P.__exit__()
297
+ sage: proof.arithmetic()
298
+ True
299
+ """
300
+ _proof_prefs._require_proof[self._subsystem] = self._t_orig
@@ -0,0 +1,213 @@
1
+ # cython: binding=True
2
+ # sage_setup: distribution = sagemath-objects
3
+ from libc.stdint cimport uint32_t
4
+ from cpython.object cimport (Py_LT, Py_LE, Py_EQ, Py_NE, Py_GT, Py_GE,
5
+ PyObject_RichCompare)
6
+
7
+
8
+ cpdef inline richcmp(x, y, int op):
9
+ """
10
+ Return the result of the rich comparison of ``x`` and ``y`` with
11
+ operator ``op``.
12
+
13
+ INPUT:
14
+
15
+ - ``x``, ``y`` -- arbitrary Python objects
16
+
17
+ - ``op`` -- comparison operator (one of ``op_LT``, ``op_LE``,
18
+ ``op_EQ``, ``op_NE``, ``op_GT``, ``op_GE``)
19
+
20
+ EXAMPLES::
21
+
22
+ sage: from sage.structure.richcmp import *
23
+ sage: richcmp(3, 4, op_LT)
24
+ True
25
+ sage: richcmp(x, x^2, op_EQ) # needs sage.symbolic
26
+ x == x^2
27
+
28
+ The two examples above are completely equivalent to ``3 < 4``
29
+ and ``x == x^2``. For this reason, it only makes sense in practice
30
+ to call ``richcmp`` with a non-constant value for ``op``.
31
+
32
+ We can write a custom ``Element`` class which shows a more
33
+ realistic example of how to use this::
34
+
35
+ sage: from sage.structure.element import Element
36
+ sage: class MyElement(Element):
37
+ ....: def __init__(self, parent, value):
38
+ ....: Element.__init__(self, parent)
39
+ ....: self.v = value
40
+ ....: def _richcmp_(self, other, op):
41
+ ....: return richcmp(self.v, other.v, op)
42
+ sage: P = Parent()
43
+ sage: x = MyElement(P, 3)
44
+ sage: y = MyElement(P, 3)
45
+ sage: x < y
46
+ False
47
+ sage: x == y
48
+ True
49
+ sage: x > y
50
+ False
51
+ """
52
+ return PyObject_RichCompare(x, y, op)
53
+
54
+
55
+ cpdef richcmp_item(x, y, int op)
56
+
57
+
58
+ cpdef inline richcmp_not_equal(x, y, int op):
59
+ """
60
+ Like ``richcmp(x, y, op)`` but assuming that `x` is not equal to `y`.
61
+
62
+ INPUT:
63
+
64
+ - ``op`` -- a rich comparison operation (e.g. ``Py_EQ``)
65
+
66
+ OUTPUT:
67
+
68
+ If ``op`` is not ``op_EQ`` or ``op_NE``, the result of
69
+ ``richcmp(x, y, op)``. If ``op`` is ``op_EQ``, return
70
+ ``False``. If ``op`` is ``op_NE``, return ``True``.
71
+
72
+ This is useful to compare lazily two objects A and B according to 2
73
+ (or more) different parameters, say width and height for example.
74
+ One could use::
75
+
76
+ return richcmp((A.width(), A.height()), (B.width(), B.height()), op)
77
+
78
+ but this will compute both width and height in all cases, even if
79
+ A.width() and B.width() are enough to decide the comparison.
80
+
81
+ Instead one can do::
82
+
83
+ wA = A.width()
84
+ wB = B.width()
85
+ if wA != wB:
86
+ return richcmp_not_equal(wA, wB, op)
87
+ return richcmp(A.height(), B.height(), op)
88
+
89
+ The difference with ``richcmp`` is that ``richcmp_not_equal``
90
+ assumes that its arguments are not equal, which is excluding the case
91
+ where the comparison cannot be decided so far, without
92
+ knowing the rest of the parameters.
93
+
94
+ EXAMPLES::
95
+
96
+ sage: from sage.structure.richcmp import (richcmp_not_equal,
97
+ ....: op_EQ, op_NE, op_LT, op_LE, op_GT, op_GE)
98
+ sage: for op in (op_LT, op_LE, op_EQ, op_NE, op_GT, op_GE):
99
+ ....: print(richcmp_not_equal(3, 4, op))
100
+ True
101
+ True
102
+ False
103
+ True
104
+ False
105
+ False
106
+ sage: for op in (op_LT, op_LE, op_EQ, op_NE, op_GT, op_GE):
107
+ ....: print(richcmp_not_equal(5, 4, op))
108
+ False
109
+ False
110
+ False
111
+ True
112
+ True
113
+ True
114
+ """
115
+ if op == Py_EQ:
116
+ return False
117
+ elif op == Py_NE:
118
+ return True
119
+ return richcmp(x, y, op)
120
+
121
+
122
+ cpdef inline bint rich_to_bool(int op, int c) noexcept:
123
+ """
124
+ Return the corresponding ``True`` or ``False`` value for a rich
125
+ comparison, given the result of an old-style comparison.
126
+
127
+ INPUT:
128
+
129
+ - ``op`` -- a rich comparison operation (e.g. ``Py_EQ``)
130
+
131
+ - ``c`` -- the result of an old-style comparison: -1, 0 or 1
132
+
133
+ OUTPUT: 1 or 0 (corresponding to ``True`` and ``False``)
134
+
135
+ .. SEEALSO::
136
+
137
+ :func:`rich_to_bool_sgn` if ``c`` could be outside the
138
+ [-1, 0, 1] range.
139
+
140
+ EXAMPLES::
141
+
142
+ sage: from sage.structure.richcmp import (rich_to_bool,
143
+ ....: op_EQ, op_NE, op_LT, op_LE, op_GT, op_GE)
144
+ sage: for op in (op_LT, op_LE, op_EQ, op_NE, op_GT, op_GE):
145
+ ....: for c in (-1,0,1):
146
+ ....: print(rich_to_bool(op, c))
147
+ True False False
148
+ True True False
149
+ False True False
150
+ True False True
151
+ False False True
152
+ False True True
153
+
154
+ Indirect tests using integers::
155
+
156
+ sage: 0 < 5, 5 < 5, 5 < -8
157
+ (True, False, False)
158
+ sage: 0 <= 5, 5 <= 5, 5 <= -8
159
+ (True, True, False)
160
+ sage: 0 >= 5, 5 >= 5, 5 >= -8
161
+ (False, True, True)
162
+ sage: 0 > 5, 5 > 5, 5 > -8
163
+ (False, False, True)
164
+ sage: 0 == 5, 5 == 5, 5 == -8
165
+ (False, True, False)
166
+ sage: 0 != 5, 5 != 5, 5 != -8
167
+ (True, False, True)
168
+ """
169
+ # op is a value in [0,5], c a value in [-1,1]. We implement this
170
+ # function very efficiently using a bitfield. Note that the masking
171
+ # below implies we consider c mod 4, so c = -1 implicitly becomes
172
+ # c = 3.
173
+
174
+ # The 4 lines below involve just constants, so the compiler should
175
+ # optimize them to just one constant value for "bits".
176
+ cdef uint32_t less_bits = (1 << Py_LT) + (1 << Py_LE) + (1 << Py_NE)
177
+ cdef uint32_t equal_bits = (1 << Py_LE) + (1 << Py_GE) + (1 << Py_EQ)
178
+ cdef uint32_t greater_bits = (1 << Py_GT) + (1 << Py_GE) + (1 << Py_NE)
179
+ cdef uint32_t bits = (less_bits << 24) + (equal_bits) + (greater_bits << 8)
180
+
181
+ cdef int shift = 8*c + op
182
+
183
+ # The shift masking (shift & 31) will likely be optimized away by
184
+ # the compiler since shift and bit test instructions implicitly
185
+ # mask their offset.
186
+ return (bits >> (shift & 31)) & 1
187
+
188
+
189
+ cpdef inline bint rich_to_bool_sgn(int op, Py_ssize_t c) noexcept:
190
+ """
191
+ Same as ``rich_to_bool``, but allow any `c < 0` and `c > 0`
192
+ instead of only `-1` and `1`.
193
+
194
+ .. NOTE::
195
+
196
+ This is in particular needed for ``mpz_cmp()``.
197
+ """
198
+ return rich_to_bool(op, (c > 0) - (c < 0))
199
+
200
+
201
+ cpdef inline int revop(int op) noexcept:
202
+ """
203
+ Return the reverse operation of ``op``.
204
+
205
+ For example, <= becomes >=, etc.
206
+
207
+ EXAMPLES::
208
+
209
+ sage: from sage.structure.richcmp import revop
210
+ sage: [revop(i) for i in range(6)]
211
+ [4, 5, 2, 3, 0, 1]
212
+ """
213
+ return (5 - op) ^ 1