12
12
13
13
EXAMPLES::
14
14
15
- sage: from sage.libs.giac import groebner_basis as gb_giac # optional - giacpy_sage
15
+ sage: from sage.libs.giac import groebner_basis as gb_giac # random
16
16
sage: P = PolynomialRing(QQ, 6, 'x')
17
17
sage: I = sage.rings.ideal.Cyclic(P)
18
- sage: B = gb_giac(I.gens()) # optional - giacpy_sage, random
19
- sage: B # optional - giacpy_sage
18
+ sage: B = gb_giac(I.gens()) # random
19
+ sage: B
20
20
Polynomial Sequence with 45 Polynomials in 6 Variables
21
21
"""
22
22
32
32
33
33
from sage .structure .proof .all import polynomial as proof_polynomial
34
34
from sage .rings .polynomial .multi_polynomial_sequence import PolynomialSequence
35
+ from .giac import giacsettings , libgiac
35
36
36
37
# Remarks for doctests:
37
38
# 1) The first time that the c++ library giac is loaded a message appears.
@@ -51,19 +52,14 @@ def __enter__(self):
51
52
"""
52
53
EXAMPLES::
53
54
54
- sage: from sage.libs.giac import GiacSettingsDefaultContext # optional - giacpy_sage
55
- sage: from giacpy_sage import giacsettings # optional - giacpy_sage
56
- sage: giacsettings.proba_epsilon = 1e-16 # optional - giacpy_sage
57
- sage: with GiacSettingsDefaultContext(): giacsettings.proba_epsilon = 1e-12 # optional - giacpy_sage
58
- sage: giacsettings.proba_epsilon < 1e-14 # optional - giacpy_sage
55
+ sage: from sage.libs.giac import GiacSettingsDefaultContext
56
+ sage: from sage.libs.giac.giac import giacsettings
57
+ sage: giacsettings.proba_epsilon = 1e-16
58
+ sage: with GiacSettingsDefaultContext(): giacsettings.proba_epsilon = 1e-12
59
+ sage: giacsettings.proba_epsilon < 1e-14
59
60
True
60
61
61
62
"""
62
- try :
63
- from giacpy_sage import giacsettings , libgiac
64
- except ImportError :
65
- raise ImportError ("""One of the optional packages giac or giacpy_sage is missing""" )
66
-
67
63
self .proba_epsilon = giacsettings .proba_epsilon
68
64
self .threads = giacsettings .threads
69
65
# Change the debug level at the end to not have messages at each modification
@@ -73,19 +69,14 @@ def __exit__(self, typ, value, tb):
73
69
"""
74
70
EXAMPLES::
75
71
76
- sage: from sage.libs.giac import GiacSettingsDefaultContext # optional - giacpy_sage
77
- sage: from giacpy_sage import giacsettings # optional - giacpy_sage
78
- sage: giacsettings.proba_epsilon = 1e-16 # optional - giacpy_sage
79
- sage: with GiacSettingsDefaultContext(): giacsettings.proba_epsilon = 1e-30 # optional - giacpy_sage
80
- sage: giacsettings.proba_epsilon < 1e-20 # optional - giacpy_sage
72
+ sage: from sage.libs.giac import GiacSettingsDefaultContext
73
+ sage: from sage.libs.giac.giac import giacsettings
74
+ sage: giacsettings.proba_epsilon = 1e-16
75
+ sage: with GiacSettingsDefaultContext(): giacsettings.proba_epsilon = 1e-30
76
+ sage: giacsettings.proba_epsilon < 1e-20
81
77
False
82
78
83
79
"""
84
- try :
85
- from giacpy_sage import giacsettings , libgiac
86
- except ImportError :
87
- raise ImportError ("""One of the optional packages giac or giacpy_sage is missing""" )
88
-
89
80
# Restore the debug level first to not have messages at each modification
90
81
libgiac ('debug_infolevel' )(self .debuginfolevel )
91
82
# NB: giacsettings.epsilon has a different meaning that giacsettings.proba_epsilon.
@@ -99,20 +90,20 @@ def local_giacsettings(func):
99
90
100
91
EXAMPLES::
101
92
102
- sage: def testf(a,b): # optional - giacpy_sage
93
+ sage: def testf(a,b):
103
94
....: giacsettings.proba_epsilon = a/100
104
95
....: giacsettings.threads = b+2
105
96
....: return (giacsettings.proba_epsilon, giacsettings.threads)
106
97
107
- sage: from giacpy_sage import giacsettings # optional - giacpy_sage
108
- sage: from sage.libs.giac import local_giacsettings # optional - giacpy_sage
109
- sage: gporig, gtorig = (giacsettings.proba_epsilon,giacsettings.threads) # optional - giacpy_sage
110
- sage: gp, gt = local_giacsettings(testf)(giacsettings.proba_epsilon,giacsettings.threads) # optional - giacpy_sage
111
- sage: gporig == giacsettings.proba_epsilon # optional - giacpy_sage
98
+ sage: from sage.libs.giac.giac import giacsettings
99
+ sage: from sage.libs.giac import local_giacsettings
100
+ sage: gporig, gtorig = (giacsettings.proba_epsilon,giacsettings.threads)
101
+ sage: gp, gt = local_giacsettings(testf)(giacsettings.proba_epsilon,giacsettings.threads)
102
+ sage: gporig == giacsettings.proba_epsilon
112
103
True
113
- sage: gtorig == giacsettings.threads # optional - giacpy_sage
104
+ sage: gtorig == giacsettings.threads
114
105
True
115
- sage: gp<gporig, gt-gtorig # optional - giacpy_sage
106
+ sage: gp<gporig, gt-gtorig
116
107
(True, 2)
117
108
118
109
"""
@@ -178,50 +169,50 @@ def groebner_basis(gens, proba_epsilon=None, threads=None, prot=False,
178
169
179
170
EXAMPLES::
180
171
181
- sage: from sage.libs.giac import groebner_basis as gb_giac # optional - giacpy_sage
182
- sage: P = PolynomialRing(GF(previous_prime(2**31)), 6, 'x') # optional - giacpy_sage
183
- sage: I = sage.rings.ideal.Cyclic(P) # optional - giacpy_sage
184
- sage: B=gb_giac(I.gens());B # optional - giacpy_sage
172
+ sage: from sage.libs.giac import groebner_basis as gb_giac
173
+ sage: P = PolynomialRing(GF(previous_prime(2**31)), 6, 'x')
174
+ sage: I = sage.rings.ideal.Cyclic(P)
175
+ sage: B=gb_giac(I.gens());B
185
176
<BLANKLINE>
186
177
// Groebner basis computation time ...
187
178
Polynomial Sequence with 45 Polynomials in 6 Variables
188
- sage: B.is_groebner() # optional - giacpy_sage
179
+ sage: B.is_groebner()
189
180
True
190
181
191
182
Elimination ideals can be computed by passing ``elim_variables``::
192
183
193
- sage: P = PolynomialRing(GF(previous_prime(2**31)), 5, 'x') # optional - giacpy_sage
194
- sage: I = sage.rings.ideal.Cyclic(P) # optional - giacpy_sage
195
- sage: B = gb_giac(I.gens(), elim_variables=[P.gen(0), P.gen(2)]) # optional - giacpy_sage
184
+ sage: P = PolynomialRing(GF(previous_prime(2**31)), 5, 'x')
185
+ sage: I = sage.rings.ideal.Cyclic(P)
186
+ sage: B = gb_giac(I.gens(), elim_variables=[P.gen(0), P.gen(2)])
196
187
<BLANKLINE>
197
188
// Groebner basis computation time ...
198
- sage: B.is_groebner() # optional - giacpy_sage
189
+ sage: B.is_groebner()
199
190
True
200
- sage: B.ideal() == I.elimination_ideal([P.gen(0), P.gen(2)]) # optional - giacpy_sage
191
+ sage: B.ideal() == I.elimination_ideal([P.gen(0), P.gen(2)])
201
192
True
202
193
203
194
Computations over QQ can benefit from
204
195
205
196
* a probabilistic lifting::
206
197
207
- sage: P = PolynomialRing(QQ,5, 'x') # optional - giacpy_sage
208
- sage: I = ideal([P.random_element(3,7) for j in range(5)]) # optional - giacpy_sage
209
- sage: B1 = gb_giac(I.gens(),1e-16) # optional - giacpy_sage, long time (1s)
198
+ sage: P = PolynomialRing(QQ,5, 'x')
199
+ sage: I = ideal([P.random_element(3,7) for j in range(5)])
200
+ sage: B1 = gb_giac(I.gens(),1e-16) # long time (1s)
210
201
...Running a probabilistic check for the reconstructed Groebner basis.
211
202
If successfull, error probability is less than 1e-16 ...
212
- sage: sage.structure.proof.all.polynomial(True) # optional - giacpy_sage
213
- sage: B2 = gb_giac(I.gens()) # optional - giacpy_sage, long time (4s)
203
+ sage: sage.structure.proof.all.polynomial(True)
204
+ sage: B2 = gb_giac(I.gens()) # long time (4s)
214
205
<BLANKLINE>
215
206
// Groebner basis computation time...
216
- sage: B1 == B2 # optional - giacpy_sage, long time
207
+ sage: B1 == B2 # long time
217
208
True
218
- sage: B1.is_groebner() # optional - giacpy_sage, long time (20s)
209
+ sage: B1.is_groebner() # long time (20s)
219
210
True
220
211
221
212
* multi threaded operations::
222
213
223
- sage: P = PolynomialRing(QQ, 8, 'x') # optional - giacpy_sage
224
- sage: I = sage.rings.ideal.Cyclic(P) # optional - giacpy_sage
214
+ sage: P = PolynomialRing(QQ, 8, 'x')
215
+ sage: I = sage.rings.ideal.Cyclic(P)
225
216
sage: time B = gb_giac(I.gens(),1e-6,threads=2) # doctest: +SKIP
226
217
Running a probabilistic check for the reconstructed Groebner basis...
227
218
Time: CPU 168.98 s, Wall: 94.13 s
@@ -230,8 +221,8 @@ def groebner_basis(gens, proba_epsilon=None, threads=None, prot=False,
230
221
231
222
::
232
223
233
- sage: I = sage.rings.ideal.Katsura(P) # optional - giacpy_sage
234
- sage: gb_giac(I,prot=True) # optional - giacpy_sage, random, long time (3s)
224
+ sage: I = sage.rings.ideal.Katsura(P)
225
+ sage: gb_giac(I,prot=True) # random, long time (3s)
235
226
9381383 begin computing basis modulo 535718473
236
227
9381501 begin new iteration zmod, number of pairs: 8, base size: 8
237
228
...end, basis size 74 prime number 1
@@ -253,49 +244,44 @@ def groebner_basis(gens, proba_epsilon=None, threads=None, prot=False,
253
244
254
245
TESTS::
255
246
256
- sage: from giacpy_sage import libgiac # optional - giacpy_sage
257
- sage: libgiac("x2:=22; x4:='whywouldyoudothis'") # optional - giacpy_sage
247
+ sage: from sage.libs.giac.giac import libgiac
248
+ sage: libgiac("x2:=22; x4:='whywouldyoudothis'")
258
249
22,whywouldyoudothis
259
- sage: gb_giac(I) # optional - giacpy_sage
250
+ sage: gb_giac(I)
260
251
Traceback (most recent call last):
261
252
...
262
253
ValueError: Variables names ['x2', 'x4'] conflict in giac. Change them or purge them from in giac with libgiac.purge('x2')
263
- sage: libgiac.purge('x2'),libgiac.purge('x4') # optional - giacpy_sage
254
+ sage: libgiac.purge('x2'),libgiac.purge('x4')
264
255
(22, whywouldyoudothis)
265
- sage: gb_giac(I) # optional - giacpy_sage, long time (3s)
256
+ sage: gb_giac(I) # long time (3s)
266
257
<BLANKLINE>
267
258
// Groebner basis computation time...
268
259
Polynomial Sequence with 74 Polynomials in 8 Variables
269
260
270
- sage: I = ideal(P(0),P(0)) # optional - giacpy_sage
271
- sage: I.groebner_basis() == gb_giac(I) # optional - giacpy_sage
261
+ sage: I = ideal(P(0),P(0))
262
+ sage: I.groebner_basis() == gb_giac(I)
272
263
True
273
264
274
265
Test the supported term orderings::
275
266
276
267
sage: from sage.rings.ideal import Cyclic
277
268
sage: P = PolynomialRing(QQ, 'x', 4, order='lex')
278
- sage: B = gb_giac(Cyclic(P)) # optional - giacpy_sage
269
+ sage: B = gb_giac(Cyclic(P))
279
270
...
280
- sage: B.is_groebner(), B.ideal() == Cyclic(P) # optional - giacpy_sage
271
+ sage: B.is_groebner(), B.ideal() == Cyclic(P)
281
272
(True, True)
282
273
sage: P = P.change_ring(order='deglex')
283
- sage: B = gb_giac(Cyclic(P)) # optional - giacpy_sage
274
+ sage: B = gb_giac(Cyclic(P))
284
275
...
285
- sage: B.is_groebner(), B.ideal() == Cyclic(P) # optional - giacpy_sage
276
+ sage: B.is_groebner(), B.ideal() == Cyclic(P)
286
277
(True, True)
287
278
sage: P = P.change_ring(order='degrevlex(2),degrevlex(2)')
288
- sage: B = gb_giac(Cyclic(P)) # optional - giacpy_sage
279
+ sage: B = gb_giac(Cyclic(P))
289
280
...
290
- sage: B.is_groebner(), B.ideal() == Cyclic(P) # optional - giacpy_sage
281
+ sage: B.is_groebner(), B.ideal() == Cyclic(P)
291
282
(True, True)
292
283
293
284
"""
294
- try :
295
- from giacpy_sage import libgiac , giacsettings
296
- except ImportError :
297
- raise ImportError ("""One of the optional packages giac or giacpy_sage is missing""" )
298
-
299
285
try :
300
286
iter (gens )
301
287
except TypeError :
0 commit comments