Ticket #9051: 9051-FpT_3.patch

File 9051-FpT_3.patch, 11.7 KB (added by robertwb, 12 years ago)
  • sage/libs/flint/zmod_poly.pxd

    # HG changeset patch
    # User Robert Bradshaw <robertwb@math.washington.edu>
    # Date 1274945114 25200
    # Node ID fd62305c8ad108443c7b522f2b5f4407f35c05da
    # Parent  94d83ba48ac5454178e9b05cac64a19512f5de6e
    Finish up F_p(t)
    
    diff -r 94d83ba48ac5 -r fd62305c8ad1 sage/libs/flint/zmod_poly.pxd
    a b  
    259259
    260260    # Factorization
    261261
    262     cdef int zmod_poly_isirreducible(zmod_poly_t p)
     262    cdef bint zmod_poly_isirreducible(zmod_poly_t p)
    263263
    264264    ctypedef struct zmod_poly_factors_struct:
    265265        unsigned long num_factors
     
    270270
    271271    cdef void zmod_poly_factor_init(zmod_poly_factor_t)
    272272    cdef void zmod_poly_factor_clear(zmod_poly_factor_t)
     273    cdef unsigned long zmod_poly_factor(zmod_poly_factor_t, zmod_poly_t)
    273274    cdef void zmod_poly_factor_square_free(zmod_poly_factor_t, zmod_poly_t)
    274     cdef void zmod_poly_factor(zmod_poly_factor_t, zmod_poly_t)
     275    cdef void zmod_poly_factor_berlekamp(zmod_poly_factor_t factors, zmod_poly_t f)
     276
     277    cdef void zmod_poly_factor_add(zmod_poly_factor_t fac, zmod_poly_t poly)
     278    cdef void zmod_poly_factor_concat(zmod_poly_factor_t res, zmod_poly_factor_t fac)
     279    cdef void zmod_poly_factor_print(zmod_poly_factor_t fac)
     280    cdef void zmod_poly_factor_pow(zmod_poly_factor_t fac, unsigned long exp)
    275281
    276282    #
    277283    # Differentiation
     
    285291   
    286292    cdef void zmod_poly_mulmod(zmod_poly_t res, zmod_poly_t poly1, zmod_poly_t poly2, zmod_poly_t f)
    287293    cdef void zmod_poly_powmod(zmod_poly_t res,zmod_poly_t pol, long exp, zmod_poly_t f)
    288 
    289     #
    290     # Polynomial factorization
    291     #
    292 
    293     cdef void zmod_poly_factor_init(zmod_poly_factor_t fac)
    294     cdef void zmod_poly_factor_clear(zmod_poly_factor_t fac)
    295     cdef void zmod_poly_factor_add(zmod_poly_factor_t fac, zmod_poly_t poly)
    296     cdef void zmod_poly_factor_concat(zmod_poly_factor_t res, zmod_poly_factor_t fac)
    297     cdef void zmod_poly_factor_print(zmod_poly_factor_t fac)
    298     cdef void zmod_poly_factor_pow(zmod_poly_factor_t fac, unsigned long exp)
    299     cdef void zmod_poly_factor_square_free(zmod_poly_factor_t res, zmod_poly_t f)
    300     cdef void zmod_poly_factor_berlekamp(zmod_poly_factor_t factors, zmod_poly_t f)
    301     cdef unsigned long zmod_poly_factor(zmod_poly_factor_t result, zmod_poly_t input)
    302     cdef int zmod_poly_isirreducible(zmod_poly_t f)
    303 
  • sage/libs/flint/zmod_poly_linkage.pxi

    diff -r 94d83ba48ac5 -r fd62305c8ad1 sage/libs/flint/zmod_poly_linkage.pxi
    a b  
    456456        24998*x^2 + 29761*x + 2252
    457457
    458458        sage: f^-1
    459         1/(24998*x^2 + 29761*x + 2252)
     459        18649/(x^2 + 16863*x + 9612)
    460460
    461461        sage: f^-5
    462         1/(20269*x^10 + 20535*x^9 + 7313*x^8 + 7311*x^7 + 16853*x^6 + 142*x^5 + 23853*x^4 + 12065*x^3 + 516*x^2 + 8473*x + 17945)
     462        24620/(x^10 + 20309*x^9 + 29185*x^8 + 11948*x^7 + 1965*x^6 + 7713*x^5 + 5810*x^4 + 20457*x^3 + 30732*x^2 + 9706*x + 4485)
    463463
    464464     Testing the modulus:
    465465
     
    471471        15328*x + 6968
    472472
    473473        sage: pow(f, -2, g)
    474         1/(15328*x + 6968)
     474        16346/(x + 251)
    475475        sage: (f^2 % g)^-1
    476         1/(15328*x + 6968)
     476        16346/(x + 251)
    477477
    478478        sage: pow(f, 5, g)
    479479        7231*x + 17274
  • sage/rings/finite_rings/integer_mod.pxd

    diff -r 94d83ba48ac5 -r fd62305c8ad1 sage/rings/finite_rings/integer_mod.pxd
    a b  
    4747    cdef void set_from_int(IntegerMod_int64 self, int_fast64_t value)
    4848    cdef int_fast64_t get_int_value(IntegerMod_int64 self)
    4949    cdef IntegerMod_int64 _new_c(self, int_fast64_t value)
     50    cdef shift(IntegerMod_int64 self, int k)
    5051
    5152cdef int jacobi_int(int_fast32_t a, int_fast32_t m) except -2
    5253cdef int_fast32_t mod_inverse_int(int_fast32_t x, int_fast32_t n) except 0
    5354cdef int_fast32_t mod_pow_int(int_fast32_t base, int_fast32_t exp, int_fast32_t n)
    54     cdef shift(IntegerMod_int64 self, int k)
    55 
  • sage/rings/fraction_field_FpT.pxd

    diff -r 94d83ba48ac5 -r fd62305c8ad1 sage/rings/fraction_field_FpT.pxd
    a b  
    2222    cdef long degree
    2323    cdef FpTElement cur
    2424    cdef zmod_poly_t g
    25    
    26 cdef class Polyring_FpT_coerce(RingHomomorphism_coercion):
    27     cdef long p
    28 cdef class FpT_Polyring_section(Section):
    29     cdef long p
    30 cdef class Fp_FpT_coerce(RingHomomorphism_coercion):
    31     cdef long p
    32 cdef class FpT_Fp_section(Section):
    33     cdef long p
    34 cdef class ZZ_FpT_coerce(RingHomomorphism_coercion):
    35     cdef long p
    36 #cdef class int_FpT_coerce(Morphism):
    37 #    cdef long p
    38 
    39 
    40 
  • sage/rings/fraction_field_FpT.pyx

    diff -r 94d83ba48ac5 -r fd62305c8ad1 sage/rings/fraction_field_FpT.pyx
    a b  
    1111from sage.libs.flint.zmod_poly cimport *
    1212from sage.structure.element cimport Element, ModuleElement, RingElement
    1313from sage.rings.integer_ring import ZZ
    14 from sage.rings.fraction_field import FractionField_generic
    15 from sage.rings.integer_mod cimport IntegerMod_int
     14from sage.rings.fraction_field import FractionField_generic, FractionField_1poly_field
     15from sage.rings.finite_rings.integer_mod cimport IntegerMod_int
    1616from sage.rings.integer cimport Integer
    1717from sage.rings.polynomial.polynomial_zmod_flint cimport Polynomial_zmod_flint
    1818import sage.algebras.algebra
    1919
    20 from sage.rings.integer_mod cimport jacobi_int, mod_inverse_int, mod_pow_int
     20from sage.rings.finite_rings.integer_mod cimport jacobi_int, mod_inverse_int, mod_pow_int
    2121
    22 class FpT(FractionField_generic):
     22class FpT(FractionField_1poly_field):
    2323    """
    2424    This class represents the fraction field GF(p)(T) for `2 < p < 2^16`.
    2525
     
    2828        sage: R.<T> = GF(71)[]
    2929        sage: K = FractionField(R); K
    3030        Fraction Field of Univariate Polynomial Ring in T over Finite Field of size 71
    31         sage: TestSuite(R).run()
     31        sage: 1-1/T
     32        (T + 70)/T
     33        sage: parent(1-1/T) is K
     34        True
    3235    """
    3336    def __init__(self, R, names=None):  # we include names so that one can use the syntax K.<t> = FpT(GF(5)['t']).  It's actually ignored
    3437        """
     
    125128            zmod_poly_clear(self._numer)
    126129            zmod_poly_clear(self._denom)
    127130   
     131    def __reduce__(self):
     132        """
     133        For pickling.
     134       
     135        TESTS::
     136       
     137            sage: K = GF(11)['t'].fraction_field()
     138            sage: loads(dumps(K.gen()))
     139            t
     140            sage: loads(dumps(1/K.gen()))
     141            1/t
     142        """
     143        return (unpickle_FpT_element,
     144                (self._parent, self.numer(), self.denom()))
     145   
    128146    cdef FpTElement _new_c(self):
    129147        """
    130148        Creates a new FpTElement in the same field, leaving the value to be initialized.
     
    309327            sage: hash(K(5))
    310328            5
    311329            sage: set([1, t, 1/t, t, t, 1/t, 1+1/t, t/t])
    312             set([1/t, 1, t, (t + 1)/t])
     330            set([1, t, 1/t, (t + 1)/t])
    313331        """
    314332        if self.denom() == 1:
    315333            return hash(self.numer())
    316         return hash(str(self))
     334        return hash((self.numer(), self.numer()))
    317335       
    318336    def __neg__(self):
    319337        """
     
    326344            sage: -a # indirect doctest
    327345            (4*t^2 + 3)/(t + 4)
    328346        """
    329         cdef FpTElement x = self._new_c()
    330         zmod_poly_neg(x._numer, self._numer)
    331         zmod_poly_set(x._denom, self._denom)
     347        cdef FpTElement x = self._copy_c()
     348        zmod_poly_neg(x._numer, x._numer)
    332349        return x
    333350       
    334351    def __invert__(self):
     
    344361        """
    345362        if zmod_poly_degree(self._numer) == -1:
    346363            raise ZeroDivisionError
    347         cdef FpTElement x = self._new_c()
    348         zmod_poly_set(x._denom, self._numer)
    349         zmod_poly_set(x._numer, self._denom)
     364        cdef FpTElement x = self._copy_c()
     365        zmod_poly_swap(x._numer, x._denom)
    350366        return x
    351367
    352368    cpdef ModuleElement _add_(self, ModuleElement _other):
     
    915931        return self.cur
    916932
    917933cdef class Polyring_FpT_coerce(RingHomomorphism_coercion):
     934    cdef long p
    918935    """
    919936    This class represents the coercion map from GF(p)[t] to GF(p)(t)
    920937
     
    10391056        return FpT_Polyring_section(self)
    10401057
    10411058cdef class FpT_Polyring_section(Section):
     1059    cdef long p
    10421060    """
    10431061    This class represents the section from GF(p)(t) back to GF(p)[t]
    10441062
     
    11051123        return ans
    11061124
    11071125cdef class Fp_FpT_coerce(RingHomomorphism_coercion):
     1126    cdef long p
    11081127    """
    11091128    This class represents the coercion map from GF(p) to GF(p)(t)
    11101129
     
    12341253        return FpT_Fp_section(self)
    12351254
    12361255cdef class FpT_Fp_section(Section):
     1256    cdef long p
    12371257    """
    12381258    This class represents the section from GF(p)(t) back to GF(p)[t]
    12391259
     
    13081328        return ans
    13091329
    13101330cdef class ZZ_FpT_coerce(RingHomomorphism_coercion):
     1331    cdef long p
    13111332    """
    13121333    This class represents the coercion map from ZZ to GF(p)(t)
    13131334
     
    14281449                      From: Fraction Field of Univariate Polynomial Ring in t over Finite Field of size 5
    14291450                      To:   Finite Field of size 5
    14301451                    then
    1431                       Lifting morphism:
     1452                      Conversion via _integer_ method map:
    14321453                      From: Finite Field of size 5
    14331454                      To:   Integer Ring
    14341455            sage: t = K.gen()
     
    14431464            ...
    14441465            ValueError: not integral
    14451466        """
    1446         return self._codomain.base_ring().coerce_map_from(ZZ).section() * Fp_FpT_coerce(self._codomain).section()
    1447 
    1448 # cdef class int_FpT_coerce(Morphism):
    1449 #     """
    1450 #     This class represents the coercion map from int to GF(p)(t)
    1451 
    1452 #     EXAMPLES::
    1453 
    1454 #         sage: R.<t> = GF(17)[]
    1455 #         sage: K = R.fraction_field()
    1456 #         sage: f = K.coerce_map_from(int); f
    1457 #         Ring Coercion morphism:
    1458 #           From: Integer Ring
    1459 #           To:   Fraction Field of Univariate Polynomial Ring in t over Finite Field of size 17
    1460 #         sage: type(f)
    1461 #         <type 'sage.rings.fraction_field_FpT.ZZ_FpT_coerce'>
    1462 #     """
    1463 #     def __init__(self, R):
    1464 #         import sage.categories.homset
    1465 #         from sage.structure.parent import Set_PythonType
    1466 #         Morphism.__init__(self, sage.categories.homset.Hom(Set_PythonType(int), R))
    1467 #         self.p = R.base_ring().characteristic()
    1468 
    1469 #     cpdef Element _call_(self, a):
    1470 #         cdef FpTElement ans = <FpTElement>PY_NEW(FpTElement)
    1471 #         ans._parent = self._codomain
    1472 #         ans.p = self.p
    1473 #         zmod_poly_init(ans._numer, ans.p)
    1474 #         zmod_poly_init(ans._denom, ans.p)
    1475 #         cdef long amodp = PyInt_AS_LONG(a) % self.p
    1476 #         if amodp < 0:
    1477 #             amodp = self.p - amodp
    1478 #         zmod_poly_set_coeff_ui(ans._numer, 0, amodp)
    1479 #         zmod_poly_set_coeff_ui(ans._denom, 0, 1)
    1480 #         ans.initalized = True
    1481 #         return ans
    1482 
    1483 #     def _repr_type(self):
    1484 #         return "Native" 
     1467        return ZZ.convert_map_from(self._codomain.base_ring()) * Fp_FpT_coerce(self._codomain).section()
    14851468
    14861469cdef inline bint normalize(zmod_poly_t numer, zmod_poly_t denom, long p):
    14871470    """
     
    17091692                return False
    17101693    finally:
    17111694        zmod_poly_clear(g)
     1695
     1696def unpickle_FpT_element(K, numer, denom):
     1697    """
     1698    Used for pickling.
     1699   
     1700    TESTS::
     1701       
     1702        sage: from sage.rings.fraction_field_FpT import unpickle_FpT_element
     1703        sage: R.<t> = GF(13)['t']
     1704        sage: unpickle_FpT_element(Frac(R), t+1, t)
     1705        (t + 1)/t
     1706    """
     1707    return FpTElement(K, numer, denom, coerce=False, reduce=False)