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,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,212 @@
1
+ # sage_setup: distribution = sagemath-objects
2
+ from libc.stdint cimport uint32_t
3
+ from cpython.object cimport (Py_LT, Py_LE, Py_EQ, Py_NE, Py_GT, Py_GE,
4
+ PyObject_RichCompare)
5
+
6
+
7
+ cpdef inline richcmp(x, y, int op):
8
+ """
9
+ Return the result of the rich comparison of ``x`` and ``y`` with
10
+ operator ``op``.
11
+
12
+ INPUT:
13
+
14
+ - ``x``, ``y`` -- arbitrary Python objects
15
+
16
+ - ``op`` -- comparison operator (one of ``op_LT``, ``op_LE``,
17
+ ``op_EQ``, ``op_NE``, ``op_GT``, ``op_GE``)
18
+
19
+ EXAMPLES::
20
+
21
+ sage: from sage.structure.richcmp import *
22
+ sage: richcmp(3, 4, op_LT)
23
+ True
24
+ sage: richcmp(x, x^2, op_EQ) # needs sage.symbolic
25
+ x == x^2
26
+
27
+ The two examples above are completely equivalent to ``3 < 4``
28
+ and ``x == x^2``. For this reason, it only makes sense in practice
29
+ to call ``richcmp`` with a non-constant value for ``op``.
30
+
31
+ We can write a custom ``Element`` class which shows a more
32
+ realistic example of how to use this::
33
+
34
+ sage: from sage.structure.element import Element
35
+ sage: class MyElement(Element):
36
+ ....: def __init__(self, parent, value):
37
+ ....: Element.__init__(self, parent)
38
+ ....: self.v = value
39
+ ....: def _richcmp_(self, other, op):
40
+ ....: return richcmp(self.v, other.v, op)
41
+ sage: P = Parent()
42
+ sage: x = MyElement(P, 3)
43
+ sage: y = MyElement(P, 3)
44
+ sage: x < y
45
+ False
46
+ sage: x == y
47
+ True
48
+ sage: x > y
49
+ False
50
+ """
51
+ return PyObject_RichCompare(x, y, op)
52
+
53
+
54
+ cpdef richcmp_item(x, y, int op)
55
+
56
+
57
+ cpdef inline richcmp_not_equal(x, y, int op):
58
+ """
59
+ Like ``richcmp(x, y, op)`` but assuming that `x` is not equal to `y`.
60
+
61
+ INPUT:
62
+
63
+ - ``op`` -- a rich comparison operation (e.g. ``Py_EQ``)
64
+
65
+ OUTPUT:
66
+
67
+ If ``op`` is not ``op_EQ`` or ``op_NE``, the result of
68
+ ``richcmp(x, y, op)``. If ``op`` is ``op_EQ``, return
69
+ ``False``. If ``op`` is ``op_NE``, return ``True``.
70
+
71
+ This is useful to compare lazily two objects A and B according to 2
72
+ (or more) different parameters, say width and height for example.
73
+ One could use::
74
+
75
+ return richcmp((A.width(), A.height()), (B.width(), B.height()), op)
76
+
77
+ but this will compute both width and height in all cases, even if
78
+ A.width() and B.width() are enough to decide the comparison.
79
+
80
+ Instead one can do::
81
+
82
+ wA = A.width()
83
+ wB = B.width()
84
+ if wA != wB:
85
+ return richcmp_not_equal(wA, wB, op)
86
+ return richcmp(A.height(), B.height(), op)
87
+
88
+ The difference with ``richcmp`` is that ``richcmp_not_equal``
89
+ assumes that its arguments are not equal, which is excluding the case
90
+ where the comparison cannot be decided so far, without
91
+ knowing the rest of the parameters.
92
+
93
+ EXAMPLES::
94
+
95
+ sage: from sage.structure.richcmp import (richcmp_not_equal,
96
+ ....: op_EQ, op_NE, op_LT, op_LE, op_GT, op_GE)
97
+ sage: for op in (op_LT, op_LE, op_EQ, op_NE, op_GT, op_GE):
98
+ ....: print(richcmp_not_equal(3, 4, op))
99
+ True
100
+ True
101
+ False
102
+ True
103
+ False
104
+ False
105
+ sage: for op in (op_LT, op_LE, op_EQ, op_NE, op_GT, op_GE):
106
+ ....: print(richcmp_not_equal(5, 4, op))
107
+ False
108
+ False
109
+ False
110
+ True
111
+ True
112
+ True
113
+ """
114
+ if op == Py_EQ:
115
+ return False
116
+ elif op == Py_NE:
117
+ return True
118
+ return richcmp(x, y, op)
119
+
120
+
121
+ cpdef inline bint rich_to_bool(int op, int c) noexcept:
122
+ """
123
+ Return the corresponding ``True`` or ``False`` value for a rich
124
+ comparison, given the result of an old-style comparison.
125
+
126
+ INPUT:
127
+
128
+ - ``op`` -- a rich comparison operation (e.g. ``Py_EQ``)
129
+
130
+ - ``c`` -- the result of an old-style comparison: -1, 0 or 1
131
+
132
+ OUTPUT: 1 or 0 (corresponding to ``True`` and ``False``)
133
+
134
+ .. SEEALSO::
135
+
136
+ :func:`rich_to_bool_sgn` if ``c`` could be outside the
137
+ [-1, 0, 1] range.
138
+
139
+ EXAMPLES::
140
+
141
+ sage: from sage.structure.richcmp import (rich_to_bool,
142
+ ....: op_EQ, op_NE, op_LT, op_LE, op_GT, op_GE)
143
+ sage: for op in (op_LT, op_LE, op_EQ, op_NE, op_GT, op_GE):
144
+ ....: for c in (-1,0,1):
145
+ ....: print(rich_to_bool(op, c))
146
+ True False False
147
+ True True False
148
+ False True False
149
+ True False True
150
+ False False True
151
+ False True True
152
+
153
+ Indirect tests using integers::
154
+
155
+ sage: 0 < 5, 5 < 5, 5 < -8
156
+ (True, False, False)
157
+ sage: 0 <= 5, 5 <= 5, 5 <= -8
158
+ (True, True, False)
159
+ sage: 0 >= 5, 5 >= 5, 5 >= -8
160
+ (False, True, True)
161
+ sage: 0 > 5, 5 > 5, 5 > -8
162
+ (False, False, True)
163
+ sage: 0 == 5, 5 == 5, 5 == -8
164
+ (False, True, False)
165
+ sage: 0 != 5, 5 != 5, 5 != -8
166
+ (True, False, True)
167
+ """
168
+ # op is a value in [0,5], c a value in [-1,1]. We implement this
169
+ # function very efficiently using a bitfield. Note that the masking
170
+ # below implies we consider c mod 4, so c = -1 implicitly becomes
171
+ # c = 3.
172
+
173
+ # The 4 lines below involve just constants, so the compiler should
174
+ # optimize them to just one constant value for "bits".
175
+ cdef uint32_t less_bits = (1 << Py_LT) + (1 << Py_LE) + (1 << Py_NE)
176
+ cdef uint32_t equal_bits = (1 << Py_LE) + (1 << Py_GE) + (1 << Py_EQ)
177
+ cdef uint32_t greater_bits = (1 << Py_GT) + (1 << Py_GE) + (1 << Py_NE)
178
+ cdef uint32_t bits = (less_bits << 24) + (equal_bits) + (greater_bits << 8)
179
+
180
+ cdef int shift = 8*c + op
181
+
182
+ # The shift masking (shift & 31) will likely be optimized away by
183
+ # the compiler since shift and bit test instructions implicitly
184
+ # mask their offset.
185
+ return (bits >> (shift & 31)) & 1
186
+
187
+
188
+ cpdef inline bint rich_to_bool_sgn(int op, Py_ssize_t c) noexcept:
189
+ """
190
+ Same as ``rich_to_bool``, but allow any `c < 0` and `c > 0`
191
+ instead of only `-1` and `1`.
192
+
193
+ .. NOTE::
194
+
195
+ This is in particular needed for ``mpz_cmp()``.
196
+ """
197
+ return rich_to_bool(op, (c > 0) - (c < 0))
198
+
199
+
200
+ cpdef inline int revop(int op) noexcept:
201
+ """
202
+ Return the reverse operation of ``op``.
203
+
204
+ For example, <= becomes >=, etc.
205
+
206
+ EXAMPLES::
207
+
208
+ sage: from sage.structure.richcmp import revop
209
+ sage: [revop(i) for i in range(6)]
210
+ [4, 5, 2, 3, 0, 1]
211
+ """
212
+ return (5 - op) ^ 1