# HG changeset patch
# User Peter Bruin <peter.bruin@math.uzh.ch>
# Date 1372363347 -7200
# Node ID 40d656baff968c8dc0e8bc5301e64308171c9b5f
# Parent 0e41a7f040c15446cd1ae1b8b22f1a32deb6b12f
Trac 12142: convert finite field elements from and to Singular
diff --git a/sage/libs/singular/singular.pxd b/sage/libs/singular/singular.pxd
a
|
b
|
|
22 | 22 | |
23 | 23 | cdef FFgivE si2sa_GFqGivaro(number *n, ring *_ring, Cache_givaro cache) |
24 | 24 | cdef FFgf2eE si2sa_GFqNTLGF2E(number *n, ring *_ring, Cache_ntl_gf2e cache) |
25 | | cdef object si2sa_GFqPari(number *n, ring *_ring, object base) |
| 25 | cdef object si2sa_GFq_generic(number *n, ring *_ring, object base) |
26 | 26 | cdef object si2sa_ZZmod(number *n, ring *_ring, object base) |
27 | 27 | |
28 | 28 | cdef object si2sa_NF(number *n, ring *_ring, object base) |
… |
… |
|
40 | 40 | cdef number *sa2si_ZZ(Integer d, ring *_ring) |
41 | 41 | |
42 | 42 | cdef number *sa2si_GFqGivaro(int exp ,ring (*)) |
43 | | cdef number *sa2si_GFqPari(object vector, ring *_ring) |
44 | 43 | cdef number *sa2si_GFqNTLGF2E(FFgf2eE elem, ring *_ring) |
| 44 | cdef number *sa2si_GFq_generic(object vector, ring *_ring) |
45 | 45 | cdef inline number *sa2si_ZZmod(IntegerMod_abstract d, ring *_ring) |
46 | 46 | |
47 | 47 | cdef number *sa2si_NF(object element, ring *_ring) |
diff --git a/sage/libs/singular/singular.pyx b/sage/libs/singular/singular.pyx
a
|
b
|
|
43 | 43 | from sage.rings.rational_field import RationalField |
44 | 44 | from sage.rings.integer_ring cimport IntegerRing_class |
45 | 45 | from sage.rings.finite_rings.integer_mod_ring import IntegerModRing_generic |
| 46 | from sage.rings.finite_rings.finite_field_base import FiniteField |
46 | 47 | from sage.rings.finite_rings.finite_field_prime_modn import FiniteField_prime_modn |
47 | | from sage.rings.finite_rings.finite_field_ext_pari import FiniteField_ext_pari |
48 | 48 | from sage.rings.finite_rings.finite_field_givaro import FiniteField_givaro |
49 | 49 | from sage.rings.finite_rings.finite_field_ntl_gf2e import FiniteField_ntl_gf2e |
50 | 50 | from sage.libs.pari.all import pari |
… |
… |
|
202 | 202 | z = <napoly*>pNext(<poly*>z) |
203 | 203 | return ret |
204 | 204 | |
205 | | cdef object si2sa_GFqPari(number *n, ring *_ring, object base): |
| 205 | cdef object si2sa_GFq_generic(number *n, ring *_ring, object base): |
206 | 206 | """ |
207 | 207 | TESTS:: |
208 | 208 | |
… |
… |
|
220 | 220 | cdef object ret |
221 | 221 | |
222 | 222 | if naIsZero(n): |
223 | | return base._zero_element |
| 223 | return base.zero_element() |
224 | 224 | elif naIsOne(n): |
225 | | return base._one_element |
| 225 | return base.one_element() |
226 | 226 | z = (<lnumber*>n).z |
227 | 227 | |
228 | | a = pari("a") |
229 | | ret = pari(int(0)).Mod(int(_ring.ch)) |
| 228 | a = base.gen() |
| 229 | ret = base.zero_element() |
230 | 230 | |
231 | 231 | while z: |
232 | 232 | c = <long>napGetCoeff(z) |
… |
… |
|
236 | 236 | elif c != 0: |
237 | 237 | ret = ret + c * a**e |
238 | 238 | z = <napoly*>pNext(<poly*>z) |
239 | | return base(ret) |
| 239 | return ret |
240 | 240 | |
241 | 241 | cdef object si2sa_NF(number *n, ring *_ring, object base): |
242 | 242 | """ |
… |
… |
|
408 | 408 | |
409 | 409 | return n1 |
410 | 410 | |
411 | | cdef number *sa2si_GFqPari(object elem, ring *_ring): |
| 411 | cdef number *sa2si_GFq_generic(object elem, ring *_ring): |
412 | 412 | """ |
413 | 413 | """ |
414 | 414 | cdef int i |
415 | 415 | cdef number *n1, *n2, *a, *coeff, *apow1, *apow2 |
416 | | elem = elem._pari_().lift().lift() |
| 416 | elem = elem.polynomial() |
417 | 417 | |
418 | 418 | if _ring != currRing: rChangeCurrRing(_ring) |
419 | | if len(elem) > 1: |
| 419 | if elem.degree() > 0: |
420 | 420 | n1 = naInit(0, _ring) |
421 | 421 | a = naPar(1) |
422 | 422 | apow1 = naInit(1, _ring) |
423 | 423 | |
424 | | for i from 0 <= i < len(elem): |
| 424 | for i from 0 <= i <= elem.degree(): |
425 | 425 | coeff = naInit(int(elem[i]), _ring) |
426 | 426 | |
427 | 427 | if not naIsZero(coeff): |
… |
… |
|
556 | 556 | elif PY_TYPE_CHECK(base, FiniteField_givaro): |
557 | 557 | return si2sa_GFqGivaro(n, _ring, base._cache) |
558 | 558 | |
559 | | elif PY_TYPE_CHECK(base, FiniteField_ext_pari): |
560 | | return si2sa_GFqPari(n, _ring, base) |
561 | | |
562 | 559 | elif PY_TYPE_CHECK(base, FiniteField_ntl_gf2e): |
563 | 560 | return si2sa_GFqNTLGF2E(n, _ring, <Cache_ntl_gf2e>base._cache) |
564 | 561 | |
| 562 | elif PY_TYPE_CHECK(base, FiniteField): |
| 563 | return si2sa_GFq_generic(n, _ring, base) |
| 564 | |
565 | 565 | elif PY_TYPE_CHECK(base, NumberField) and base.is_absolute(): |
566 | 566 | return si2sa_NF(n, _ring, base) |
567 | 567 | |
… |
… |
|
587 | 587 | elif isinstance(elem._parent, FiniteField_givaro): |
588 | 588 | return sa2si_GFqGivaro( (<FFgivE>elem)._cache.objectptr.convert(i, (<FFgivE>elem).element ), _ring ) |
589 | 589 | |
590 | | elif PY_TYPE_CHECK(elem._parent, FiniteField_ext_pari): |
591 | | return sa2si_GFqPari(elem, _ring) |
592 | | |
593 | 590 | elif PY_TYPE_CHECK(elem._parent, FiniteField_ntl_gf2e): |
594 | 591 | return sa2si_GFqNTLGF2E(elem, _ring) |
595 | 592 | |
| 593 | elif PY_TYPE_CHECK(elem._parent, FiniteField): |
| 594 | return sa2si_GFq_generic(elem, _ring) |
| 595 | |
596 | 596 | elif PY_TYPE_CHECK(elem._parent, NumberField) and elem._parent.is_absolute(): |
597 | 597 | return sa2si_NF(elem, _ring) |
598 | 598 | elif PY_TYPE_CHECK(elem._parent, IntegerModRing_generic): |