passagemath-objects 10.6.45__cp313-cp313-musllinux_1_2_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.
- passagemath_objects/__init__.py +3 -0
- passagemath_objects-10.6.45.dist-info/METADATA +115 -0
- passagemath_objects-10.6.45.dist-info/RECORD +280 -0
- passagemath_objects-10.6.45.dist-info/WHEEL +5 -0
- passagemath_objects-10.6.45.dist-info/top_level.txt +3 -0
- passagemath_objects.libs/libgmp-0e7fc84e.so.10.5.0 +0 -0
- sage/all__sagemath_objects.py +37 -0
- sage/arith/all__sagemath_objects.py +5 -0
- sage/arith/long.pxd +411 -0
- sage/arith/numerical_approx.cpython-313-x86_64-linux-musl.so +0 -0
- sage/arith/numerical_approx.pxd +35 -0
- sage/arith/numerical_approx.pyx +75 -0
- sage/arith/power.cpython-313-x86_64-linux-musl.so +0 -0
- sage/arith/power.pxd +31 -0
- sage/arith/power.pyx +127 -0
- sage/categories/action.cpython-313-x86_64-linux-musl.so +0 -0
- sage/categories/action.pxd +29 -0
- sage/categories/action.pyx +641 -0
- sage/categories/algebra_functor.py +745 -0
- sage/categories/all__sagemath_objects.py +33 -0
- sage/categories/basic.py +62 -0
- sage/categories/cartesian_product.py +295 -0
- sage/categories/category.py +3401 -0
- sage/categories/category_cy_helper.cpython-313-x86_64-linux-musl.so +0 -0
- sage/categories/category_cy_helper.pxd +8 -0
- sage/categories/category_cy_helper.pyx +322 -0
- sage/categories/category_singleton.cpython-313-x86_64-linux-musl.so +0 -0
- sage/categories/category_singleton.pxd +3 -0
- sage/categories/category_singleton.pyx +342 -0
- sage/categories/category_types.py +637 -0
- sage/categories/category_with_axiom.py +2876 -0
- sage/categories/covariant_functorial_construction.py +703 -0
- sage/categories/facade_sets.py +228 -0
- sage/categories/functor.cpython-313-x86_64-linux-musl.so +0 -0
- sage/categories/functor.pxd +7 -0
- sage/categories/functor.pyx +691 -0
- sage/categories/homset.py +1338 -0
- sage/categories/homsets.py +364 -0
- sage/categories/isomorphic_objects.py +73 -0
- sage/categories/map.cpython-313-x86_64-linux-musl.so +0 -0
- sage/categories/map.pxd +34 -0
- sage/categories/map.pyx +2106 -0
- sage/categories/morphism.cpython-313-x86_64-linux-musl.so +0 -0
- sage/categories/morphism.pxd +14 -0
- sage/categories/morphism.pyx +895 -0
- sage/categories/objects.py +167 -0
- sage/categories/primer.py +1696 -0
- sage/categories/pushout.py +4834 -0
- sage/categories/quotients.py +64 -0
- sage/categories/realizations.py +200 -0
- sage/categories/sets_cat.py +3290 -0
- sage/categories/sets_with_partial_maps.py +52 -0
- sage/categories/subobjects.py +64 -0
- sage/categories/subquotients.py +21 -0
- sage/categories/with_realizations.py +311 -0
- sage/cpython/__init__.py +19 -0
- sage/cpython/_py2_random.py +619 -0
- sage/cpython/all.py +3 -0
- sage/cpython/atexit.cpython-313-x86_64-linux-musl.so +0 -0
- sage/cpython/atexit.pyx +269 -0
- sage/cpython/builtin_types.cpython-313-x86_64-linux-musl.so +0 -0
- sage/cpython/builtin_types.pyx +7 -0
- sage/cpython/cython_metaclass.cpython-313-x86_64-linux-musl.so +0 -0
- sage/cpython/cython_metaclass.h +117 -0
- sage/cpython/cython_metaclass.pxd +3 -0
- sage/cpython/cython_metaclass.pyx +130 -0
- sage/cpython/debug.cpython-313-x86_64-linux-musl.so +0 -0
- sage/cpython/debug.pyx +302 -0
- sage/cpython/dict_del_by_value.cpython-313-x86_64-linux-musl.so +0 -0
- sage/cpython/dict_del_by_value.pxd +9 -0
- sage/cpython/dict_del_by_value.pyx +191 -0
- sage/cpython/dict_internal.h +245 -0
- sage/cpython/getattr.cpython-313-x86_64-linux-musl.so +0 -0
- sage/cpython/getattr.pxd +9 -0
- sage/cpython/getattr.pyx +439 -0
- sage/cpython/pycore_long.h +97 -0
- sage/cpython/pycore_long.pxd +10 -0
- sage/cpython/python_debug.h +44 -0
- sage/cpython/python_debug.pxd +47 -0
- sage/cpython/pyx_visit.h +13 -0
- sage/cpython/string.cpython-313-x86_64-linux-musl.so +0 -0
- sage/cpython/string.pxd +76 -0
- sage/cpython/string.pyx +34 -0
- sage/cpython/string_impl.h +60 -0
- sage/cpython/type.cpython-313-x86_64-linux-musl.so +0 -0
- sage/cpython/type.pxd +2 -0
- sage/cpython/type.pyx +40 -0
- sage/cpython/wrapperdescr.pxd +67 -0
- sage/ext/all__sagemath_objects.py +3 -0
- sage/ext/ccobject.h +64 -0
- sage/ext/cplusplus.pxd +17 -0
- sage/ext/mod_int.h +30 -0
- sage/ext/mod_int.pxd +24 -0
- sage/ext/stdsage.pxd +39 -0
- sage/groups/all__sagemath_objects.py +1 -0
- sage/groups/group.cpython-313-x86_64-linux-musl.so +0 -0
- sage/groups/group.pxd +14 -0
- sage/groups/group.pyx +322 -0
- sage/groups/old.cpython-313-x86_64-linux-musl.so +0 -0
- sage/groups/old.pxd +14 -0
- sage/groups/old.pyx +219 -0
- sage/libs/all__sagemath_objects.py +3 -0
- sage/libs/gmp/__init__.py +1 -0
- sage/libs/gmp/all.pxd +6 -0
- sage/libs/gmp/binop.pxd +23 -0
- sage/libs/gmp/misc.pxd +8 -0
- sage/libs/gmp/mpf.pxd +88 -0
- sage/libs/gmp/mpn.pxd +57 -0
- sage/libs/gmp/mpq.pxd +57 -0
- sage/libs/gmp/mpz.pxd +202 -0
- sage/libs/gmp/pylong.cpython-313-x86_64-linux-musl.so +0 -0
- sage/libs/gmp/pylong.pxd +12 -0
- sage/libs/gmp/pylong.pyx +150 -0
- sage/libs/gmp/random.pxd +25 -0
- sage/libs/gmp/randomize.pxd +59 -0
- sage/libs/gmp/types.pxd +53 -0
- sage/libs/gmpxx.pxd +19 -0
- sage/misc/abstract_method.py +276 -0
- sage/misc/all__sagemath_objects.py +43 -0
- sage/misc/bindable_class.py +253 -0
- sage/misc/c3_controlled.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/c3_controlled.pxd +2 -0
- sage/misc/c3_controlled.pyx +1402 -0
- sage/misc/cachefunc.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/cachefunc.pxd +43 -0
- sage/misc/cachefunc.pyx +3781 -0
- sage/misc/call.py +188 -0
- sage/misc/classcall_metaclass.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/classcall_metaclass.pxd +14 -0
- sage/misc/classcall_metaclass.pyx +599 -0
- sage/misc/constant_function.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/constant_function.pyx +130 -0
- sage/misc/decorators.py +747 -0
- sage/misc/fast_methods.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/fast_methods.pxd +20 -0
- sage/misc/fast_methods.pyx +351 -0
- sage/misc/flatten.py +90 -0
- sage/misc/fpickle.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/fpickle.pyx +177 -0
- sage/misc/function_mangling.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/function_mangling.pxd +11 -0
- sage/misc/function_mangling.pyx +308 -0
- sage/misc/inherit_comparison.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/inherit_comparison.pxd +5 -0
- sage/misc/inherit_comparison.pyx +105 -0
- sage/misc/instancedoc.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/instancedoc.pyx +331 -0
- sage/misc/lazy_attribute.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/lazy_attribute.pyx +607 -0
- sage/misc/lazy_format.py +135 -0
- sage/misc/lazy_import.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/lazy_import.pyx +1299 -0
- sage/misc/lazy_import_cache.py +36 -0
- sage/misc/lazy_list.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/lazy_list.pxd +19 -0
- sage/misc/lazy_list.pyx +1187 -0
- sage/misc/lazy_string.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/lazy_string.pxd +7 -0
- sage/misc/lazy_string.pyx +546 -0
- sage/misc/misc.py +1066 -0
- sage/misc/misc_c.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/misc_c.pxd +3 -0
- sage/misc/misc_c.pyx +766 -0
- sage/misc/namespace_package.py +37 -0
- sage/misc/nested_class.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/nested_class.pxd +3 -0
- sage/misc/nested_class.pyx +394 -0
- sage/misc/persist.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/persist.pyx +1251 -0
- sage/misc/prandom.py +418 -0
- sage/misc/randstate.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/randstate.pxd +30 -0
- sage/misc/randstate.pyx +1059 -0
- sage/misc/repr.py +203 -0
- sage/misc/reset.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/reset.pyx +196 -0
- sage/misc/sage_ostools.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/sage_ostools.pyx +323 -0
- sage/misc/sage_timeit.py +275 -0
- sage/misc/sage_timeit_class.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/sage_timeit_class.pyx +120 -0
- sage/misc/sage_unittest.py +637 -0
- sage/misc/sageinspect.py +2768 -0
- sage/misc/session.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/session.pyx +392 -0
- sage/misc/superseded.py +557 -0
- sage/misc/test_nested_class.py +228 -0
- sage/misc/timing.py +264 -0
- sage/misc/unknown.py +222 -0
- sage/misc/verbose.py +253 -0
- sage/misc/weak_dict.cpython-313-x86_64-linux-musl.so +0 -0
- sage/misc/weak_dict.pxd +15 -0
- sage/misc/weak_dict.pyx +1231 -0
- sage/modules/all__sagemath_objects.py +1 -0
- sage/modules/module.cpython-313-x86_64-linux-musl.so +0 -0
- sage/modules/module.pxd +5 -0
- sage/modules/module.pyx +329 -0
- sage/rings/all__sagemath_objects.py +3 -0
- sage/rings/integer_fake.h +22 -0
- sage/rings/integer_fake.pxd +55 -0
- sage/sets/all__sagemath_objects.py +3 -0
- sage/sets/pythonclass.cpython-313-x86_64-linux-musl.so +0 -0
- sage/sets/pythonclass.pxd +9 -0
- sage/sets/pythonclass.pyx +247 -0
- sage/structure/__init__.py +4 -0
- sage/structure/all.py +30 -0
- sage/structure/category_object.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/category_object.pxd +28 -0
- sage/structure/category_object.pyx +1087 -0
- sage/structure/coerce.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/coerce.pxd +44 -0
- sage/structure/coerce.pyx +2107 -0
- sage/structure/coerce_actions.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/coerce_actions.pxd +27 -0
- sage/structure/coerce_actions.pyx +988 -0
- sage/structure/coerce_dict.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/coerce_dict.pxd +51 -0
- sage/structure/coerce_dict.pyx +1557 -0
- sage/structure/coerce_exceptions.py +23 -0
- sage/structure/coerce_maps.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/coerce_maps.pxd +28 -0
- sage/structure/coerce_maps.pyx +718 -0
- sage/structure/debug_options.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/debug_options.pxd +6 -0
- sage/structure/debug_options.pyx +54 -0
- sage/structure/dynamic_class.py +541 -0
- sage/structure/element.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/element.pxd +272 -0
- sage/structure/element.pyx +4772 -0
- sage/structure/element_wrapper.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/element_wrapper.pxd +12 -0
- sage/structure/element_wrapper.pyx +582 -0
- sage/structure/factorization.py +1422 -0
- sage/structure/factorization_integer.py +105 -0
- sage/structure/factory.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/factory.pyx +786 -0
- sage/structure/formal_sum.py +489 -0
- sage/structure/gens_py.py +73 -0
- sage/structure/global_options.py +1743 -0
- sage/structure/indexed_generators.py +863 -0
- sage/structure/list_clone.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/list_clone.pxd +65 -0
- sage/structure/list_clone.pyx +1867 -0
- sage/structure/list_clone_demo.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/list_clone_demo.pyx +248 -0
- sage/structure/list_clone_timings.py +179 -0
- sage/structure/list_clone_timings_cy.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/list_clone_timings_cy.pyx +86 -0
- sage/structure/mutability.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/mutability.pxd +21 -0
- sage/structure/mutability.pyx +348 -0
- sage/structure/nonexact.py +69 -0
- sage/structure/parent.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/parent.pxd +112 -0
- sage/structure/parent.pyx +3093 -0
- sage/structure/parent_base.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/parent_base.pxd +13 -0
- sage/structure/parent_base.pyx +44 -0
- sage/structure/parent_gens.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/parent_gens.pxd +22 -0
- sage/structure/parent_gens.pyx +377 -0
- sage/structure/parent_old.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/parent_old.pxd +25 -0
- sage/structure/parent_old.pyx +294 -0
- sage/structure/proof/__init__.py +1 -0
- sage/structure/proof/all.py +243 -0
- sage/structure/proof/proof.py +300 -0
- sage/structure/richcmp.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/richcmp.pxd +213 -0
- sage/structure/richcmp.pyx +495 -0
- sage/structure/sage_object.cpython-313-x86_64-linux-musl.so +0 -0
- sage/structure/sage_object.pxd +3 -0
- sage/structure/sage_object.pyx +988 -0
- sage/structure/sage_object_test.py +19 -0
- sage/structure/sequence.py +937 -0
- sage/structure/set_factories.py +1178 -0
- sage/structure/set_factories_example.py +527 -0
- sage/structure/support_view.py +179 -0
- sage/structure/test_factory.py +56 -0
- 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
|
|
Binary file
|
|
@@ -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
|