Changeset 7439:cea8d29e100c


Ignore:
Timestamp:
11/10/07 12:52:39 (6 years ago)
Author:
Joel B. Mohler <jbm5@…>
Branch:
default
Message:

Moved the defining poly pointer into the number field element for speed.

Location:
sage/rings/number_field
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • sage/rings/number_field/number_field.py

    r7288 r7439  
    20532053        """ 
    20542054        return infinity.infinity 
    2055          
     2055 
    20562056    def polynomial_ntl(self): 
    20572057        """ 
     
    36233623        return K 
    36243624 
     3625    def absolute_polynomial_ntl(self): 
     3626        """ 
     3627        Return defining polynomial of this number field 
     3628        as a pair, an ntl polynomial and a denominator. 
     3629 
     3630        This is used mainly to implement some internal arithmetic. 
     3631 
     3632        EXAMPLES: 
     3633            sage: NumberField(x^2 + (2/3)*x - 9/17,'a').polynomial_ntl() 
     3634            ([-27 34 51], 51) 
     3635        """ 
     3636        try: 
     3637            return (self.__abs_polynomial_ntl, self.__abs_denominator_ntl) 
     3638        except AttributeError: 
     3639            self.__abs_denominator_ntl = ntl.ZZ() 
     3640            den = self.absolute_polynomial().denominator() 
     3641            self.__abs_denominator_ntl.set_from_sage_int(ZZ(den)) 
     3642            self.__abs_polynomial_ntl = ntl.ZZX((self.absolute_polynomial()*den).list()) 
     3643        return (self.__abs_polynomial_ntl, self.__abs_denominator_ntl) 
     3644 
    36253645    def absolute_polynomial(self): 
    36263646        r""" 
  • sage/rings/number_field/number_field_element.pxd

    r6962 r7439  
    88from sage.structure.element cimport FieldElement, RingElement, ModuleElement 
    99from sage.structure.parent_base cimport ParentWithBase 
     10from sage.libs.ntl.ntl_ZZX cimport ntl_ZZX 
     11from sage.libs.ntl.ntl_ZZ cimport ntl_ZZ 
    1012 
    1113cdef class NumberFieldElement(FieldElement): 
    1214    cdef ZZX_c __numerator 
    1315    cdef ZZ_c __denominator 
     16    # Pointers to the defining polynomial (with numerator) for the field. 
     17    # I keep these as pointers for arithmetic speed. 
     18    cdef ntl_ZZX __fld_numerator 
     19    cdef ntl_ZZ __fld_denominator 
    1420    cdef object __multiplicative_order 
    1521    cdef object __pari 
     
    2329    cdef void _ntl_denom_as_mpz(self, mpz_t* z) 
    2430 
     31    # _parent_poly_c_ is deprecated -- refer to doc-string 
    2532    cdef void _parent_poly_c_(self, ZZX_c *num, ZZ_c *den) 
    2633    cdef void _invert_c_(self, ZZX_c *num, ZZ_c *den) 
  • sage/rings/number_field/number_field_element.pyx

    r7020 r7439  
    126126        x = <NumberFieldElement>PY_NEW_SAME_TYPE(self) 
    127127        x._parent = self._parent 
     128        x.__fld_numerator = self.__fld_numerator 
     129        x.__fld_denominator = self.__fld_denominator 
    128130        return x 
    129131 
     
    176178        """ 
    177179        sage.rings.field_element.FieldElement.__init__(self, parent) 
     180        if isinstance(parent, number_field.NumberField_relative): 
     181            self.__fld_numerator, self.__fld_denominator = parent.absolute_polynomial_ntl() 
     182        else: 
     183            self.__fld_numerator, self.__fld_denominator = parent.polynomial_ntl() 
    178184 
    179185        cdef ZZ_c coeff 
     
    277283        cdef NumberFieldElement x = <NumberFieldElement>PY_NEW_SAME_TYPE(self) 
    278284        x._parent = <ParentWithBase>new_parent 
     285        x.__fld_numerator, x.__fld_denominator = new_parent.polynomial_ntl() 
    279286        x.__denominator = self.__denominator 
    280287        cdef ZZX_c result 
     
    738745        cdef ZZX_c temp 
    739746        cdef ZZ_c temp1 
    740         cdef ZZ_c parent_den 
    741         cdef ZZX_c parent_num 
    742         self._parent_poly_c_( &parent_num, &parent_den ) 
    743747        x = self._new() 
    744748        _sig_on 
    745749        # MulMod doesn't handle non-monic polynomials. 
    746750        # Therefore, we handle the non-monic case entirely separately. 
    747         if ZZX_is_monic( &parent_num ): 
     751        if ZZX_is_monic( &self.__fld_numerator.x ): 
    748752            ZZ_mul(x.__denominator, self.__denominator, _right.__denominator) 
    749             ZZX_MulMod(x.__numerator, self.__numerator, _right.__numerator, parent_num) 
     753            ZZX_MulMod(x.__numerator, self.__numerator, _right.__numerator, self.__fld_numerator.x) 
    750754        else: 
    751755            ZZ_mul(x.__denominator, self.__denominator, _right.__denominator) 
    752756            ZZX_mul(x.__numerator, self.__numerator, _right.__numerator) 
    753             if ZZX_deg(x.__numerator) >= ZZX_deg(parent_num): 
    754                 ZZX_mul_ZZ( x.__numerator, x.__numerator, parent_den ) 
    755                 ZZX_mul_ZZ( temp, parent_num, x.__denominator ) 
    756                 ZZ_power(temp1,ZZX_LeadCoeff(temp),ZZX_deg(x.__numerator)-ZZX_deg(parent_num)+1) 
     757            if ZZX_deg(x.__numerator) >= ZZX_deg(self.__fld_numerator.x): 
     758                ZZX_mul_ZZ( x.__numerator, x.__numerator, self.__fld_denominator.x ) 
     759                ZZX_mul_ZZ( temp, self.__fld_numerator.x, x.__denominator ) 
     760                ZZ_power(temp1,ZZX_LeadCoeff(temp),ZZX_deg(x.__numerator)-ZZX_deg(self.__fld_numerator.x)+1) 
    757761                ZZX_PseudoRem(x.__numerator, x.__numerator, temp) 
    758                 ZZ_mul(x.__denominator, x.__denominator, parent_den) 
     762                ZZ_mul(x.__denominator, x.__denominator, self.__fld_denominator.x) 
    759763                ZZ_mul(x.__denominator, x.__denominator, temp1) 
    760764        _sig_off 
     
    796800        cdef ZZX_c inv_num 
    797801        cdef ZZ_c inv_den 
    798         cdef ZZ_c parent_den 
    799         cdef ZZX_c parent_num 
    800802        cdef ZZX_c temp 
    801803        cdef ZZ_c temp1 
    802804        if not _right: 
    803805            raise ZeroDivisionError, "Number field element division by zero" 
    804         self._parent_poly_c_( &parent_num, &parent_den ) 
    805806        x = self._new() 
    806807        _sig_on 
    807808        _right._invert_c_(&inv_num, &inv_den) 
    808         if ZZX_is_monic( &parent_num ): 
     809        if ZZX_is_monic( &self.__fld_numerator.x ): 
    809810            ZZ_mul(x.__denominator, self.__denominator, inv_den) 
    810             ZZX_MulMod(x.__numerator, self.__numerator, inv_num, parent_num) 
     811            ZZX_MulMod(x.__numerator, self.__numerator, inv_num, self.__fld_numerator.x) 
    811812        else: 
    812813            ZZ_mul(x.__denominator, self.__denominator, inv_den) 
    813814            ZZX_mul(x.__numerator, self.__numerator, inv_num) 
    814             if ZZX_deg(x.__numerator) >= ZZX_deg(parent_num): 
    815                 ZZX_mul_ZZ( x.__numerator, x.__numerator, parent_den ) 
    816                 ZZX_mul_ZZ( temp, parent_num, x.__denominator ) 
    817                 ZZ_power(temp1,ZZX_LeadCoeff(temp),ZZX_deg(x.__numerator)-ZZX_deg(parent_num)+1) 
     815            if ZZX_deg(x.__numerator) >= ZZX_deg(self.__fld_numerator.x): 
     816                ZZX_mul_ZZ( x.__numerator, x.__numerator, self.__fld_denominator.x ) 
     817                ZZX_mul_ZZ( temp, self.__fld_numerator.x, x.__denominator ) 
     818                ZZ_power(temp1,ZZX_LeadCoeff(temp),ZZX_deg(x.__numerator)-ZZX_deg(self.__fld_numerator.x)+1) 
    818819                ZZX_PseudoRem(x.__numerator, x.__numerator, temp) 
    819                 ZZ_mul(x.__denominator, x.__denominator, parent_den) 
     820                ZZ_mul(x.__denominator, x.__denominator, self.__fld_denominator.x) 
    820821                ZZ_mul(x.__denominator, x.__denominator, temp1) 
    821822        x._reduce_c_() 
     
    923924 
    924925    cdef void _parent_poly_c_(self, ZZX_c *num, ZZ_c *den): 
     926        """ 
     927        I believe this function should be removed since I've put the pointer  
     928        __fld_numerator and __fld_denominator in the element class.  I'm not  
     929        going to remove it quite yet, but feel free to remove it if you agree  
     930        with me that it should go. 
     931        """ 
    925932        raise NotImplementedError, "NumberFieldElement subclasses must override _parent_poly_c_()" 
    926933 
     
    939946            Check __invert__ for doc-tests that rely on this functionality. 
    940947        """ 
    941         cdef ZZ_c parent_den 
    942         cdef ZZX_c parent_num 
    943         self._parent_poly_c_( &parent_num, &parent_den ) 
    944  
    945948        cdef ZZX_c t # unneeded except to be there 
    946949        cdef ZZX_c a, b 
    947         ZZX_mul_ZZ( a, self.__numerator, parent_den ) 
    948         ZZX_mul_ZZ( b, parent_num, self.__denominator ) 
     950        ZZX_mul_ZZ( a, self.__numerator, self.__fld_denominator.x ) 
     951        ZZX_mul_ZZ( b, self.__fld_numerator.x, self.__denominator ) 
    949952        ZZX_XGCD( den[0], num[0],  t, a, b, 1 ) 
    950         ZZX_mul_ZZ( num[0], num[0], parent_den ) 
     953        ZZX_mul_ZZ( num[0], num[0], self.__fld_denominator.x ) 
    951954        ZZX_mul_ZZ( num[0], num[0], self.__denominator ) 
    952955 
     
    16291632         
    16301633    cdef void _parent_poly_c_(self, ZZX_c *num, ZZ_c *den): 
     1634        """ 
     1635        I believe this function should be removed since I've put the pointer  
     1636        __fld_numerator and __fld_denominator in the element class.  I'm not  
     1637        going to remove it quite yet, but feel free to remove it if you agree  
     1638        with me that it should go. 
     1639        """ 
    16311640        cdef ntl_ZZX _num 
    16321641        cdef ntl_ZZ _den 
     
    17431752 
    17441753    cdef void _parent_poly_c_(self, ZZX_c *num, ZZ_c *den): 
     1754        """ 
     1755        I believe this function should be removed since I've put the pointer  
     1756        __fld_numerator and __fld_denominator in the element class.  I'm not  
     1757        going to remove it quite yet, but feel free to remove it if you agree  
     1758        with me that it should go. 
     1759        """ 
    17451760        f = self.number_field().absolute_polynomial() 
    17461761        _ntl_poly(f, num, den) 
     
    18401855        """ 
    18411856        cdef OrderElement_absolute x 
    1842         x = <NumberFieldElement>PY_NEW_SAME_TYPE(self) 
     1857        x = <OrderElement_absolute>PY_NEW_SAME_TYPE(self) 
    18431858        x._parent = self._parent 
    18441859        x._number_field = self._parent.number_field() 
     1860        x.__fld_numerator = self.__fld_numerator 
     1861        x.__fld_denominator = self.__fld_denominator 
    18451862        return x 
    18461863 
     
    18831900        """ 
    18841901        cdef OrderElement_relative x 
    1885         x = <NumberFieldElement>PY_NEW_SAME_TYPE(self) 
     1902        x = <OrderElement_relative>PY_NEW_SAME_TYPE(self) 
    18861903        x._parent = self._parent 
    18871904        x._number_field = self._parent.number_field() 
     1905        x.__fld_numerator = self.__fld_numerator 
     1906        x.__fld_denominator = self.__fld_denominator 
    18881907        return x 
    18891908 
Note: See TracChangeset for help on using the changeset viewer.