Changeset 7439:cea8d29e100c
- Timestamp:
- 11/10/07 12:52:39 (6 years ago)
- Branch:
- default
- Location:
- sage/rings/number_field
- Files:
-
- 3 edited
-
number_field.py (modified) (2 diffs)
-
number_field_element.pxd (modified) (2 diffs)
-
number_field_element.pyx (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
sage/rings/number_field/number_field.py
r7288 r7439 2053 2053 """ 2054 2054 return infinity.infinity 2055 2055 2056 2056 def polynomial_ntl(self): 2057 2057 """ … … 3623 3623 return K 3624 3624 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 3625 3645 def absolute_polynomial(self): 3626 3646 r""" -
sage/rings/number_field/number_field_element.pxd
r6962 r7439 8 8 from sage.structure.element cimport FieldElement, RingElement, ModuleElement 9 9 from sage.structure.parent_base cimport ParentWithBase 10 from sage.libs.ntl.ntl_ZZX cimport ntl_ZZX 11 from sage.libs.ntl.ntl_ZZ cimport ntl_ZZ 10 12 11 13 cdef class NumberFieldElement(FieldElement): 12 14 cdef ZZX_c __numerator 13 15 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 14 20 cdef object __multiplicative_order 15 21 cdef object __pari … … 23 29 cdef void _ntl_denom_as_mpz(self, mpz_t* z) 24 30 31 # _parent_poly_c_ is deprecated -- refer to doc-string 25 32 cdef void _parent_poly_c_(self, ZZX_c *num, ZZ_c *den) 26 33 cdef void _invert_c_(self, ZZX_c *num, ZZ_c *den) -
sage/rings/number_field/number_field_element.pyx
r7020 r7439 126 126 x = <NumberFieldElement>PY_NEW_SAME_TYPE(self) 127 127 x._parent = self._parent 128 x.__fld_numerator = self.__fld_numerator 129 x.__fld_denominator = self.__fld_denominator 128 130 return x 129 131 … … 176 178 """ 177 179 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() 178 184 179 185 cdef ZZ_c coeff … … 277 283 cdef NumberFieldElement x = <NumberFieldElement>PY_NEW_SAME_TYPE(self) 278 284 x._parent = <ParentWithBase>new_parent 285 x.__fld_numerator, x.__fld_denominator = new_parent.polynomial_ntl() 279 286 x.__denominator = self.__denominator 280 287 cdef ZZX_c result … … 738 745 cdef ZZX_c temp 739 746 cdef ZZ_c temp1 740 cdef ZZ_c parent_den741 cdef ZZX_c parent_num742 self._parent_poly_c_( &parent_num, &parent_den )743 747 x = self._new() 744 748 _sig_on 745 749 # MulMod doesn't handle non-monic polynomials. 746 750 # 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 ): 748 752 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) 750 754 else: 751 755 ZZ_mul(x.__denominator, self.__denominator, _right.__denominator) 752 756 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) 757 761 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) 759 763 ZZ_mul(x.__denominator, x.__denominator, temp1) 760 764 _sig_off … … 796 800 cdef ZZX_c inv_num 797 801 cdef ZZ_c inv_den 798 cdef ZZ_c parent_den799 cdef ZZX_c parent_num800 802 cdef ZZX_c temp 801 803 cdef ZZ_c temp1 802 804 if not _right: 803 805 raise ZeroDivisionError, "Number field element division by zero" 804 self._parent_poly_c_( &parent_num, &parent_den )805 806 x = self._new() 806 807 _sig_on 807 808 _right._invert_c_(&inv_num, &inv_den) 808 if ZZX_is_monic( & parent_num):809 if ZZX_is_monic( &self.__fld_numerator.x ): 809 810 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) 811 812 else: 812 813 ZZ_mul(x.__denominator, self.__denominator, inv_den) 813 814 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) 818 819 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) 820 821 ZZ_mul(x.__denominator, x.__denominator, temp1) 821 822 x._reduce_c_() … … 923 924 924 925 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 """ 925 932 raise NotImplementedError, "NumberFieldElement subclasses must override _parent_poly_c_()" 926 933 … … 939 946 Check __invert__ for doc-tests that rely on this functionality. 940 947 """ 941 cdef ZZ_c parent_den942 cdef ZZX_c parent_num943 self._parent_poly_c_( &parent_num, &parent_den )944 945 948 cdef ZZX_c t # unneeded except to be there 946 949 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 ) 949 952 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 ) 951 954 ZZX_mul_ZZ( num[0], num[0], self.__denominator ) 952 955 … … 1629 1632 1630 1633 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 """ 1631 1640 cdef ntl_ZZX _num 1632 1641 cdef ntl_ZZ _den … … 1743 1752 1744 1753 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 """ 1745 1760 f = self.number_field().absolute_polynomial() 1746 1761 _ntl_poly(f, num, den) … … 1840 1855 """ 1841 1856 cdef OrderElement_absolute x 1842 x = < NumberFieldElement>PY_NEW_SAME_TYPE(self)1857 x = <OrderElement_absolute>PY_NEW_SAME_TYPE(self) 1843 1858 x._parent = self._parent 1844 1859 x._number_field = self._parent.number_field() 1860 x.__fld_numerator = self.__fld_numerator 1861 x.__fld_denominator = self.__fld_denominator 1845 1862 return x 1846 1863 … … 1883 1900 """ 1884 1901 cdef OrderElement_relative x 1885 x = < NumberFieldElement>PY_NEW_SAME_TYPE(self)1902 x = <OrderElement_relative>PY_NEW_SAME_TYPE(self) 1886 1903 x._parent = self._parent 1887 1904 x._number_field = self._parent.number_field() 1905 x.__fld_numerator = self.__fld_numerator 1906 x.__fld_denominator = self.__fld_denominator 1888 1907 return x 1889 1908
Note: See TracChangeset
for help on using the changeset viewer.
