Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagesmc
Path: blob/master/src/sage/libs/singular/singular.pyx
8815 views
1
"""
2
libSingular conversion routines and initialisation.
3
4
AUTHOR:
5
6
- Martin Albrecht <[email protected]>
7
"""
8
###############################################################################
9
# Copyright (C) 2005, 2006 William Stein <[email protected]>
10
#
11
# Distributed under the terms of the GNU General Public License (GPL)
12
# as published by the Free Software Foundation; either version 2 of
13
# the License, or (at your option) any later version.
14
# http://www.gnu.org/licenses/
15
###############################################################################
16
17
include "sage/libs/ntl/decl.pxi"
18
include "sage/ext/stdsage.pxi"
19
include "sage/ext/interrupt.pxi"
20
21
cdef extern from "limits.h":
22
long INT_MAX
23
long INT_MIN
24
25
import os
26
27
from sage.misc.misc_c import is_64_bit
28
29
from sage.libs.singular.decl cimport intvec
30
from sage.libs.singular.decl cimport SR_HDL, SR_INT, SR_TO_INT
31
from sage.libs.singular.decl cimport singular_options, singular_verbose_options
32
from sage.libs.singular.decl cimport On, Off, SW_USE_NTL, SW_USE_NTL_GCD_0, SW_USE_EZGCD, SW_USE_NTL_SORT, SW_USE_NTL_GCD_P
33
from sage.libs.singular.decl cimport napoly, lnumber, Sy_bit, OPT_REDSB, OPT_INTSTRATEGY, OPT_REDTAIL, OPT_REDTHROUGH
34
from sage.libs.singular.decl cimport nlGetNumerator, nlGetDenom, nlDelete, nlInit2gmp
35
from sage.libs.singular.decl cimport naIsOne, naIsOne, naIsZero, naPar, naInit, naAdd, naMult, naDelete, naMap00
36
from sage.libs.singular.decl cimport napGetCoeff, napGetExpFrom, pNext
37
from sage.libs.singular.decl cimport nrzInit, nr2mMapZp, nrnMapGMP
38
from sage.libs.singular.decl cimport siInit
39
from sage.libs.singular.decl cimport n_Init
40
from sage.libs.singular.decl cimport rChangeCurrRing, currRing
41
from sage.libs.singular.decl cimport WerrorS_callback, const_char_ptr
42
43
from sage.rings.rational_field import RationalField
44
from sage.rings.integer_ring cimport IntegerRing_class
45
from sage.rings.finite_rings.integer_mod_ring import IntegerModRing_generic
46
from sage.rings.finite_rings.finite_field_base import FiniteField
47
from sage.rings.finite_rings.finite_field_prime_modn import FiniteField_prime_modn
48
from sage.rings.finite_rings.finite_field_givaro import FiniteField_givaro
49
from sage.rings.finite_rings.finite_field_ntl_gf2e import FiniteField_ntl_gf2e
50
from sage.libs.pari.all import pari
51
52
from sage.structure.parent_base cimport ParentWithBase
53
from sage.rings.polynomial.multi_polynomial_libsingular cimport MPolynomial_libsingular
54
55
_saved_options = (int(0),0,0)
56
57
cdef Rational si2sa_QQ(number *n, ring *_ring):
58
"""
59
TESTS::
60
61
sage: P.<x,y,z> = QQ[]
62
sage: P(1/3).lc()
63
1/3
64
sage: P(1).lc()
65
1
66
sage: P(0).lc()
67
0
68
sage: P(-1/3).lc()
69
-1/3
70
sage: type(P(3).lc())
71
<type 'sage.rings.rational.Rational'>
72
"""
73
cdef number *nom
74
cdef number *denom
75
cdef mpq_t _z
76
77
cdef mpz_t nom_z, denom_z
78
79
cdef Rational z
80
81
mpq_init(_z)
82
83
## Immediate integers handles carry the tag 'SR_INT', i.e. the last bit is 1.
84
## This distinguishes immediate integers from other handles which point to
85
## structures aligned on 4 byte boundaries and therefor have last bit zero.
86
## (The second bit is reserved as tag to allow extensions of this scheme.)
87
## Using immediates as pointers and dereferencing them gives address errors.
88
nom = nlGetNumerator(n, _ring)
89
mpz_init(nom_z)
90
91
if (SR_HDL(nom) & SR_INT): mpz_set_si(nom_z, SR_TO_INT(nom))
92
else: mpz_set(nom_z,nom.z)
93
94
mpq_set_num(_z,nom_z)
95
nlDelete(&nom,_ring)
96
mpz_clear(nom_z)
97
98
denom = nlGetDenom(n, _ring)
99
mpz_init(denom_z)
100
101
if (SR_HDL(denom) & SR_INT): mpz_set_si(denom_z, SR_TO_INT(denom))
102
else: mpz_set(denom_z,denom.z)
103
104
mpq_set_den(_z, denom_z)
105
nlDelete(&denom,_ring)
106
mpz_clear(denom_z)
107
108
z = Rational()
109
z.set_from_mpq(_z)
110
mpq_clear(_z)
111
return z
112
113
cdef Integer si2sa_ZZ(number *n, ring *_ring):
114
"""
115
TESTS::
116
117
sage: P.<x,y,z> = ZZ[]
118
sage: P(3).lc()
119
3
120
sage: P(0).lc()
121
0
122
sage: P(-3).lc()
123
-3
124
sage: P(-1234567890).lc()
125
-1234567890
126
sage: type(P(3).lc())
127
<type 'sage.rings.integer.Integer'>
128
"""
129
cdef Integer z
130
z = Integer()
131
z.set_from_mpz(<__mpz_struct*>n)
132
return z
133
134
cdef FFgivE si2sa_GFqGivaro(number *n, ring *_ring, Cache_givaro cache):
135
"""
136
TESTS::
137
138
sage: K.<a> = GF(5^3)
139
sage: R.<x,y,z> = PolynomialRing(K)
140
sage: K( (4*R(a)^2 + R(a))^3 )
141
a^2
142
sage: K(R(0))
143
0
144
"""
145
cdef napoly *z
146
cdef int c, e
147
cdef int a
148
cdef int ret
149
cdef int order
150
151
if naIsZero(n):
152
return cache._zero_element
153
elif naIsOne(n):
154
return cache._one_element
155
z = (<lnumber*>n).z
156
157
a = cache.objectptr.sage_generator()
158
ret = cache.objectptr.zero
159
order = cache.objectptr.cardinality() - 1
160
161
while z:
162
c = cache.objectptr.initi(c, <long>napGetCoeff(z))
163
e = napGetExpFrom(z,1, _ring)
164
if e == 0:
165
ret = cache.objectptr.add(ret, c, ret)
166
else:
167
a = ( e * cache.objectptr.sage_generator() ) % order
168
ret = cache.objectptr.axpy(ret, c, a, ret)
169
z = <napoly*>pNext(<poly*>z)
170
return (<FFgivE>cache._zero_element)._new_c(ret)
171
172
cdef FFgf2eE si2sa_GFqNTLGF2E(number *n, ring *_ring, Cache_ntl_gf2e cache):
173
"""
174
TESTS::
175
176
sage: K.<a> = GF(2^20)
177
sage: P.<x,y,z> = K[]
178
sage: f = a^21*x^2 + 1 # indirect doctest
179
sage: f.lc()
180
a^11 + a^10 + a^8 + a^7 + a^6 + a^5 + a^2 + a
181
sage: type(f.lc())
182
<type 'sage.rings.finite_rings.element_ntl_gf2e.FiniteField_ntl_gf2eElement'>
183
"""
184
cdef napoly *z
185
cdef long c
186
cdef int e
187
cdef FFgf2eE a
188
cdef FFgf2eE ret
189
190
if naIsZero(n):
191
return cache._zero_element
192
elif naIsOne(n):
193
return cache._one_element
194
z = (<lnumber*>n).z
195
196
a = cache._gen
197
ret = cache._zero_element
198
199
while z:
200
c = <long>napGetCoeff(z)
201
e = napGetExpFrom(z,1, _ring)
202
ret += c * a**e
203
z = <napoly*>pNext(<poly*>z)
204
return ret
205
206
cdef object si2sa_GFq_generic(number *n, ring *_ring, object base):
207
"""
208
TESTS::
209
210
sage: K.<a> = GF(3^16)
211
sage: P.<x,y,z> = K[]
212
sage: f = a^21*x^2 + 1 # indirect doctest
213
sage: f.lc()
214
a^12 + a^11 + a^9 + a^8 + a^7 + 2*a^6 + a^5
215
sage: type(f.lc())
216
<type 'sage.rings.finite_rings.element_pari_ffelt.FiniteFieldElement_pari_ffelt'>
217
218
Try the largest characteristic which Singular supports::
219
220
sage: p = previous_prime(2^31)
221
sage: F.<a> = FiniteField(p^2)
222
sage: R.<x,y> = F[]
223
sage: R(-1).constant_coefficient() # indirect doctest
224
2147483646
225
226
"""
227
cdef napoly *z
228
cdef long c
229
cdef int e
230
cdef object a
231
cdef object ret
232
233
if naIsZero(n):
234
return base.zero_element()
235
elif naIsOne(n):
236
return base.one_element()
237
z = (<lnumber*>n).z
238
239
a = base.gen()
240
ret = base.zero_element()
241
242
while z:
243
c = <long>napGetCoeff(z)
244
e = napGetExpFrom(z,1, _ring)
245
if e == 0:
246
ret = ret + c
247
elif c != 0:
248
ret = ret + c * a**e
249
z = <napoly*>pNext(<poly*>z)
250
return ret
251
252
cdef object si2sa_NF(number *n, ring *_ring, object base):
253
"""
254
TESTS::
255
256
sage: K.<a> = NumberField(x^2 - 2)
257
sage: P.<x,y,z> = K[]
258
sage: f = a^21*x^2 + 1 # indirect doctest
259
sage: f.lc()
260
1024*a
261
sage: type(f.lc())
262
<type 'sage.rings.number_field.number_field_element_quadratic.NumberFieldElement_quadratic'>
263
"""
264
cdef napoly *z
265
cdef number *c
266
cdef int e
267
cdef object a
268
cdef object ret
269
270
if naIsZero(n):
271
return base._zero_element
272
elif naIsOne(n):
273
return base._one_element
274
z = (<lnumber*>n).z
275
276
a = base.gen()
277
ret = base(0)
278
279
while z:
280
c = napGetCoeff(z)
281
coeff = si2sa_QQ(c, _ring)
282
e = napGetExpFrom(z,1, _ring)
283
if e == 0:
284
ret = ret + coeff
285
elif coeff != 0:
286
ret = ret + coeff * a**e
287
z = <napoly*>pNext(<poly*>z)
288
return base(ret)
289
290
cdef inline object si2sa_ZZmod(number *n, ring *_ring, object base):
291
"""
292
TESTS::
293
294
sage: P.<x,y,z> = Integers(10)[]
295
sage: P(3).lc()
296
3
297
sage: P(13).lc()
298
3
299
300
sage: P.<x,y,z> = Integers(16)[]
301
sage: P(3).lc()
302
3
303
sage: P(19).lc()
304
3
305
306
sage: P.<x,y,z> = Integers(3**2)[]
307
sage: P(3).lc()
308
3
309
sage: P(12).lc()
310
3
311
312
sage: P.<x,y,z> = Integers(2^32)[]
313
sage: P(2^32-1).lc()
314
4294967295
315
316
sage: P(3).lc()
317
3
318
319
sage: P.<x,y,z> = Integers(17^20)[]
320
sage: P(17^19 + 3).lc()
321
239072435685151324847156
322
323
sage: P(3)
324
3
325
"""
326
cdef Integer ret
327
if _ring.ringtype == 1:
328
return base(<long>n)
329
else:
330
ret = Integer()
331
ret.set_from_mpz(<__mpz_struct*>n)
332
return base(ret)
333
334
return base(_ring.cf.n_Int(n,_ring))
335
336
cdef number *sa2si_QQ(Rational r, ring *_ring):
337
"""
338
TESTS::
339
340
sage: P.<x,y,z> = QQ[]
341
sage: P(0) + 1/2 - 2/4
342
0
343
sage: P(1/2) + 3/5 - 3/5
344
1/2
345
sage: P(2/3) + 1/4 - 1/4
346
2/3
347
sage: P(12345678901234567890/23) + 5/2 - 5/2
348
12345678901234567890/23
349
"""
350
if _ring != currRing: rChangeCurrRing(_ring)
351
return nlInit2gmp( mpq_numref(r.value), mpq_denref(r.value) )
352
353
cdef number *sa2si_GFqGivaro(int quo, ring *_ring):
354
"""
355
"""
356
if _ring != currRing: rChangeCurrRing(_ring)
357
cdef number *n1, *n2, *a, *coeff, *apow1, *apow2
358
cdef int b = - _ring.ch
359
360
a = naPar(1)
361
362
apow1 = naInit(1, _ring)
363
n1 = naInit(0, _ring)
364
365
while quo!=0:
366
coeff = naInit(quo%b, _ring)
367
368
if not naIsZero(coeff):
369
apow2 = naMult(coeff, apow1)
370
n2 = naAdd(apow2, n1)
371
naDelete(&apow2, _ring)
372
naDelete(&n1, _ring)
373
n1 = n2
374
375
apow2 = naMult(apow1, a)
376
naDelete(&apow1, _ring)
377
apow1 = apow2
378
379
quo = quo/b
380
naDelete(&coeff, _ring)
381
382
naDelete(&apow1, _ring)
383
naDelete(&a, _ring)
384
return n1
385
386
cdef number *sa2si_GFqNTLGF2E(FFgf2eE elem, ring *_ring):
387
"""
388
"""
389
if _ring != currRing: rChangeCurrRing(_ring)
390
cdef int i
391
cdef number *n1, *n2, *a, *coeff, *apow1, *apow2
392
cdef GF2X_c rep = GF2E_rep(elem.x)
393
394
if GF2X_deg(rep) >= 1:
395
n1 = naInit(0, _ring)
396
a = naPar(1)
397
apow1 = naInit(1, _ring)
398
399
for i from 0 <= i <= GF2X_deg(rep):
400
coeff = naInit(GF2_conv_to_long(GF2X_coeff(rep,i)), _ring)
401
402
if not naIsZero(coeff):
403
apow2 = naMult(coeff, apow1)
404
n2 = naAdd(apow2, n1)
405
naDelete(&apow2, _ring)
406
naDelete(&n1, _ring);
407
n1 = n2
408
409
apow2 = naMult(apow1, a)
410
naDelete(&apow1, _ring)
411
apow1 = apow2
412
413
naDelete(&coeff, _ring)
414
415
naDelete(&apow1, _ring)
416
naDelete(&a, _ring)
417
else:
418
n1 = naInit(GF2_conv_to_long(GF2X_coeff(rep,0)), _ring)
419
420
return n1
421
422
cdef number *sa2si_GFq_generic(object elem, ring *_ring):
423
"""
424
"""
425
cdef int i
426
cdef number *n1, *n2, *a, *coeff, *apow1, *apow2
427
elem = elem.polynomial()
428
429
if _ring != currRing: rChangeCurrRing(_ring)
430
if elem.degree() > 0:
431
n1 = naInit(0, _ring)
432
a = naPar(1)
433
apow1 = naInit(1, _ring)
434
435
for i from 0 <= i <= elem.degree():
436
coeff = naInit(int(elem[i]), _ring)
437
438
if not naIsZero(coeff):
439
apow2 = naMult(coeff, apow1)
440
n2 = naAdd(apow2, n1)
441
naDelete(&apow2, _ring)
442
naDelete(&n1, _ring);
443
n1 = n2
444
445
apow2 = naMult(apow1, a)
446
naDelete(&apow1, _ring)
447
apow1 = apow2
448
449
naDelete(&coeff, _ring)
450
451
naDelete(&apow1, _ring)
452
naDelete(&a, _ring)
453
else:
454
n1 = naInit(int(elem), _ring)
455
456
return n1
457
458
cdef number *sa2si_NF(object elem, ring *_ring):
459
"""
460
"""
461
cdef int i
462
cdef number *n1, *n2, *a, *nlCoeff, *naCoeff, *apow1, *apow2
463
elem = list(elem)
464
465
if _ring != currRing: rChangeCurrRing(_ring)
466
n1 = naInit(0, _ring)
467
a = naPar(1)
468
apow1 = naInit(1, _ring)
469
470
for i from 0 <= i < len(elem):
471
nlCoeff = nlInit2gmp( mpq_numref((<Rational>elem[i]).value), mpq_denref((<Rational>elem[i]).value) )
472
naCoeff = naMap00(nlCoeff)
473
nlDelete(&nlCoeff, _ring)
474
475
# faster would be to assign the coefficient directly
476
apow2 = naMult(naCoeff, apow1)
477
n2 = naAdd(apow2, n1)
478
naDelete(&apow2, _ring)
479
naDelete(&n1, _ring);
480
naDelete(&naCoeff, _ring)
481
n1 = n2
482
483
apow2 = naMult(apow1, a)
484
naDelete(&apow1, _ring)
485
apow1 = apow2
486
487
naDelete(&apow1, _ring)
488
naDelete(&a, _ring)
489
490
return n1
491
492
cdef number *sa2si_ZZ(Integer d, ring *_ring):
493
"""
494
TESTS::
495
496
sage: P.<x,y,z> = ZZ[]
497
sage: P(0) + 1 - 1
498
0
499
sage: P(1) + 1 - 1
500
1
501
sage: P(2) + 1 - 1
502
2
503
sage: P(12345678901234567890) + 2 - 2
504
12345678901234567890
505
"""
506
if _ring != currRing: rChangeCurrRing(_ring)
507
cdef number *n = nrzInit(0, _ring)
508
mpz_set(<__mpz_struct*>n, d.value)
509
return <number*>n
510
511
cdef inline number *sa2si_ZZmod(IntegerMod_abstract d, ring *_ring):
512
"""
513
TESTS::
514
515
sage: P.<x,y,z> = Integers(10)[]
516
sage: P(3)
517
3
518
sage: P(13)
519
3
520
521
sage: P.<x,y,z> = Integers(16)[]
522
sage: P(3)
523
3
524
sage: P(19)
525
3
526
527
sage: P.<x,y,z> = Integers(3^2)[]
528
sage: P(3)
529
3
530
sage: P(12)
531
3
532
533
sage: P.<x,y,z> = Integers(2^32)[]
534
sage: P(2^32-1)
535
4294967295
536
537
sage: P(3)
538
3
539
540
sage: P.<x,y,z> = Integers(17^20)[]
541
sage: P(17^19 + 3)
542
239072435685151324847156
543
544
sage: P(3)
545
3
546
"""
547
nr2mModul = d.parent().characteristic()
548
if _ring != currRing: rChangeCurrRing(_ring)
549
cdef int _d
550
if _ring.ringtype == 1:
551
_d = long(d)
552
return nr2mMapZp(<number *>_d)
553
else:
554
lift = d.lift()
555
return nrnMapGMP(<number *>((<Integer>lift).value))
556
557
cdef object si2sa(number *n, ring *_ring, object base):
558
if PY_TYPE_CHECK(base, FiniteField_prime_modn):
559
return base(_ring.cf.n_Int(n, _ring))
560
561
elif PY_TYPE_CHECK(base, RationalField):
562
return si2sa_QQ(n,_ring)
563
564
elif PY_TYPE_CHECK(base, IntegerRing_class):
565
return si2sa_ZZ(n,_ring)
566
567
elif PY_TYPE_CHECK(base, FiniteField_givaro):
568
return si2sa_GFqGivaro(n, _ring, base._cache)
569
570
elif PY_TYPE_CHECK(base, FiniteField_ntl_gf2e):
571
return si2sa_GFqNTLGF2E(n, _ring, <Cache_ntl_gf2e>base._cache)
572
573
elif PY_TYPE_CHECK(base, FiniteField):
574
return si2sa_GFq_generic(n, _ring, base)
575
576
elif PY_TYPE_CHECK(base, NumberField) and base.is_absolute():
577
return si2sa_NF(n, _ring, base)
578
579
elif PY_TYPE_CHECK(base, IntegerModRing_generic):
580
if _ring.ringtype == 0:
581
return base(_ring.cf.n_Int(n, _ring))
582
return si2sa_ZZmod(n, _ring, base)
583
584
else:
585
raise ValueError, "cannot convert from SINGULAR number"
586
587
cdef number *sa2si(Element elem, ring * _ring):
588
cdef int i
589
if PY_TYPE_CHECK(elem._parent, FiniteField_prime_modn):
590
return n_Init(int(elem),_ring)
591
592
elif PY_TYPE_CHECK(elem._parent, RationalField):
593
return sa2si_QQ(elem, _ring)
594
595
elif PY_TYPE_CHECK(elem._parent, IntegerRing_class):
596
return sa2si_ZZ(elem, _ring)
597
598
elif isinstance(elem._parent, FiniteField_givaro):
599
return sa2si_GFqGivaro( (<FFgivE>elem)._cache.objectptr.convert(i, (<FFgivE>elem).element ), _ring )
600
601
elif PY_TYPE_CHECK(elem._parent, FiniteField_ntl_gf2e):
602
return sa2si_GFqNTLGF2E(elem, _ring)
603
604
elif PY_TYPE_CHECK(elem._parent, FiniteField):
605
return sa2si_GFq_generic(elem, _ring)
606
607
elif PY_TYPE_CHECK(elem._parent, NumberField) and elem._parent.is_absolute():
608
return sa2si_NF(elem, _ring)
609
elif PY_TYPE_CHECK(elem._parent, IntegerModRing_generic):
610
if _ring.ringtype == 0:
611
return n_Init(int(elem),_ring)
612
return sa2si_ZZmod(elem, _ring)
613
else:
614
raise ValueError, "cannot convert to SINGULAR number"
615
616
617
cdef object si2sa_intvec(intvec *v):
618
cdef int r
619
cdef list l = list()
620
for r in range(v.length()):
621
l.append(v.get(r))
622
return tuple(l)
623
624
# ==============
625
# Initialisation
626
# ==============
627
628
cdef extern from *: # hack to get at cython macro
629
int unlikely(int)
630
631
cdef extern from "dlfcn.h":
632
void *dlopen(char *, long)
633
char *dlerror()
634
void dlclose(void *handle)
635
636
cdef extern from "dlfcn.h":
637
cdef long RTLD_LAZY
638
cdef long RTLD_GLOBAL
639
640
# Our attempt at avoiding exponent overflows.
641
cdef unsigned int max_exponent_size
642
643
cdef int overflow_check(long e, ring *_ring) except -1:
644
"""
645
Raises an ``OverflowError`` if e is > ``max_exponent_size``,
646
or if it is not acceptable for Singular as exponent of the
647
given ring.
648
649
INPUT:
650
651
- ``e`` - some integer representing a degree.
652
- ``_ring`` - a pointer to some ring.
653
654
TESTS:
655
656
Whether an overflow occurs or not, partially depends
657
on the number of variables in the ring. See trac ticket
658
#11856::
659
660
sage: P.<x,y,z> = QQ[]
661
sage: y^2^30
662
Traceback (most recent call last):
663
...
664
OverflowError: Exponent overflow (1073741824).
665
sage: P.<x,y> = QQ[]
666
sage: y^2^30
667
y^1073741824 # 64-bit
668
Traceback (most recent call last): # 32-bit
669
... # 32-bit
670
OverflowError: Exponent overflow (1073741824). # 32-bit
671
672
sage: x^2^30*x^2^30
673
Traceback (most recent call last):
674
...
675
OverflowError: Exponent overflow (2147483648). # 64-bit
676
OverflowError: Exponent overflow (1073741824). # 32-bit
677
678
"""
679
if unlikely(e > min(max_exponent_size,max(_ring.N,_ring.bitmask))):
680
raise OverflowError("Exponent overflow (%d)."%(e))
681
return 0
682
683
cdef init_libsingular():
684
"""
685
This initializes the SINGULAR library. This is a hack to some
686
extent.
687
688
SINGULAR has a concept of compiled extension modules similar to
689
Sage. For this, the compiled modules need to see the symbols from
690
the main program. However, SINGULAR is a shared library in this
691
context these symbols are not known globally. The work around so
692
far is to load the library again and to specify ``RTLD_GLOBAL``.
693
"""
694
global singular_options
695
global singular_verbose_options
696
global max_exponent_size
697
global WerrorS_callback
698
global error_messages
699
700
cdef void *handle = NULL
701
702
for extension in ["so", "dylib", "dll"]:
703
lib = os.environ['SAGE_LOCAL']+"/lib/libsingular."+extension
704
if os.path.exists(lib):
705
handle = dlopen(lib, RTLD_GLOBAL|RTLD_LAZY)
706
break
707
708
if handle == NULL:
709
print dlerror()
710
raise ImportError, "cannot load libSINGULAR library"
711
712
# load SINGULAR
713
siInit(lib)
714
715
dlclose(handle)
716
717
# we set and save some global Singular options
718
singular_options = singular_options | Sy_bit(OPT_REDSB) | Sy_bit(OPT_INTSTRATEGY) | Sy_bit(OPT_REDTAIL) | Sy_bit(OPT_REDTHROUGH)
719
global _saved_options
720
global _saved_verbose_options
721
_saved_options = (int(singular_options), 0, 0)
722
_saved_verbose_options = int(singular_verbose_options)
723
724
On(SW_USE_NTL)
725
On(SW_USE_NTL_GCD_0)
726
On(SW_USE_NTL_GCD_P)
727
On(SW_USE_EZGCD)
728
Off(SW_USE_NTL_SORT)
729
730
if is_64_bit:
731
max_exponent_size = 1<<31-1;
732
else:
733
max_exponent_size = 1<<16-1;
734
735
WerrorS_callback = libsingular_error_callback
736
737
error_messages = []
738
739
cdef inline unsigned long get_max_exponent_size():
740
global max_exponent_size
741
return max_exponent_size
742
743
# call the init routine
744
init_libsingular()
745
746
cdef void libsingular_error_callback(const_char_ptr s):
747
_s = s
748
error_messages.append(_s)
749
750