Changeset 8430:2a9e6147e73f
- Timestamp:
- 11/11/07 14:24:26 (6 years ago)
- Branch:
- default
- Location:
- sage/rings/padics
- Files:
-
- 2 edited
-
padic_generic_element.pxd (modified) (1 diff)
-
padic_generic_element.pyx (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
sage/rings/padics/padic_generic_element.pxd
r4471 r8430 1 1 include "../../ext/cdefs.pxi" 2 2 3 cimport sage.rings.padics.local_generic_element4 from sage.rings.padics.local_generic_element cimport LocalGenericElement5 3 cimport sage.structure.element 6 4 from sage.structure.element cimport Element 7 cimport sage.rings.padics.pow_computer 8 from sage.rings.padics.pow_computer cimport PowComputer_class 5 from sage.rings.padics.local_generic_element cimport LocalGenericElement 6 #from sage.rings.padics.pow_computer cimport PowComputer_class 7 from sage.rings.integer cimport Integer 8 from sage.rings.rational cimport Rational 9 9 10 10 cdef class pAdicGenericElement(LocalGenericElement): 11 cdef PowComputer_class prime_pow12 11 cdef int _cmp_c_impl(left, Element right) except -2 13 cdef base_p_list(self, mpz_t value, lift_mode) 12 cdef long valuation_c(self) 13 cdef val_unit_c(self) 14 cdef int _set_from_Integer(self, Integer x, absprec, relprec) except -1 15 cdef int _set_from_Rational(self, Rational x, absprec, relprec) except -1 14 16 15 17 cdef extern void teichmuller_set_c(mpz_t value, mpz_t p, mpz_t ppow) -
sage/rings/padics/padic_generic_element.pyx
r7355 r8430 26 26 cimport sage.rings.padics.local_generic_element 27 27 from sage.rings.padics.local_generic_element cimport LocalGenericElement 28 cimport sage.structure.element29 from sage.structure.element cimport Element30 cimport pow_computer28 #cimport sage.structure.element 29 #from sage.structure.element cimport Element 30 #cimport pow_computer 31 31 from sage.rings.integer cimport Integer 32 #from sage.rings.rational import Rational 33 from sage.rings.infinity import infinity 34 from sage.libs.pari.gen import pari 35 from sage.libs.pari.gen import PariError 36 from sage.rings.rational_field import QQ 32 37 import sage.rings.rational_field 33 from sage.rings.padics.pow_computer cimport PowComputer_base34 35 36 Rational = sage.rings.rational.Rational37 infinity = sage.rings.infinity.infinity38 PariError = sage.libs.pari.gen.PariError39 pari = sage.libs.pari.gen.pari40 QQ = sage.rings.rational_field.QQ38 #from sage.rings.padics.pow_computer cimport PowComputer_base 39 40 41 #Rational = sage.rings.rational.Rational 42 #infinity = sage.rings.infinity.infinity 43 #PariError = sage.libs.pari.gen.PariError 44 #pari = sage.libs.pari.gen.pari 45 #QQ = sage.rings.rational_field.QQ 41 46 42 47 cdef class pAdicGenericElement(LocalGenericElement): 43 def __init__(self, parent):44 self.prime_pow = <PowComputer_class> parent.prime_pow45 LocalGenericElement.__init__(self, parent)46 47 48 def __richcmp__(left, right, int op): 48 49 return (<Element>left)._richcmp(right, op) … … 83 84 return 0 # since both are zero 84 85 else: 85 p = left.p rime_pow.prime86 p = left.parent().prime() 86 87 a = left.unit_part().lift() 87 88 b = right.unit_part().lift() … … 97 98 return 1 98 99 100 cdef int _set_from_Integer(self, Integer x, absprec, relprec) except -1: 101 raise NotImplementedError 102 103 cdef int _set_from_Rational(self, Rational x, absprec, relprec) except -1: 104 raise NotImplementedError 105 99 106 def _pari_(self): 100 107 return pari(self._pari_init_()) … … 163 170 def _is_exact_zero(self): 164 171 return False 172 173 def _is_inexact_zero(self): 174 return self.is_zero() and not self._is_exact_zero() 165 175 166 176 def str(self, mode=None): 167 177 return self._repr(mode=mode) 168 178 169 def _repr(self, mode = None, do_latex = False): 170 r""" 171 Prints a string representation of the element. See __init__ for more details on print modes. 172 173 EXAMPLES: 174 sage: R = Zp(7,4,'capped-rel','val-unit'); a = R(364); a 175 7 * 52 + O(7^5) 176 sage: print a.str('terse') 177 364 + O(7^5) 178 sage: print a.str('series') 179 3*7 + 7^3 + O(7^5) 180 sage: K = Qp(7,4,'capped-rel','val-unit'); a = K(364); a 181 7 * 52 + O(7^5) 182 sage: print a.str('series') 183 3*7 + 7^3 + O(7^5) 184 """ 185 if self._is_exact_zero(): 186 return "0" 187 if mode is None: 188 mode = self.parent().print_mode() 189 elif not ((mode == 'val-unit') or (mode == 'series') or (mode == 'terse')): 190 raise TypeError, "printing mode must be one of 'val-unit', 'series' or 'terse'" 191 pprint = self.parent().variable_name() 192 if self.lift() == 0: 193 if mode == 'val-unit' or mode == 'series': 194 if do_latex: 195 return "O(%s^{%s})"%(pprint, self.precision_absolute()) 196 else: 197 return "O(%s^%s)"%(pprint, self.precision_absolute()) 198 elif mode == 'terse': 199 if do_latex: 200 return "0 + O(%s^{%s})"%(pprint, self.precision_absolute()) 201 else: 202 return "0 + O(%s^%s)"%(pprint, self.precision_absolute()) 203 if mode == 'val-unit': 204 if do_latex: 205 if self.valuation() == 0: 206 return "%s + O(%s^{%s})"%(self.lift(), pprint, self.precision_absolute()) 207 if self.valuation() == 1: 208 return "%s \\cdot %s + O(%s^{%s})"%(pprint, self.unit_part().lift(), pprint, self.precision_absolute()) 209 return "%s^{%s} \\cdot %s + O(%s^{%s})"%(pprint, self.valuation(), self.unit_part().lift(), pprint, self.precision_absolute()) 210 else: 211 if self.valuation() == 0: 212 return "%s + O(%s^%s)"%(self.lift(), pprint, self.precision_absolute()) 213 if self.valuation() == 1: 214 return "%s * %s + O(%s^%s)"%(pprint, self.unit_part().lift(), pprint, self.precision_absolute()) 215 return "%s^%s * %s + O(%s^%s)"%(pprint, self.valuation(), self.unit_part().lift(), pprint, self.precision_absolute()) 216 elif mode == 'terse': 217 if self.valuation() < 0: 218 ppow1 = str(self.prime() ** (-self.valuation())) 219 if do_latex: 220 ppow2 = "%s^{%s}"%(pprint, -self.valuation()) 221 if len(ppow1) < len(ppow2): 222 ppow = ppow1 223 else: 224 ppow = ppow2 225 return "%s/%s + O(%s^{%s})"%(self.unit_part().lift(), ppow, pprint, self.precision_absolute()) 226 else: 227 ppow2 = "%s^%s"%(p, -self.valuation()) 228 if len(ppow1) < len(ppow2): 229 ppow = ppow1 230 else: 231 ppow = ppow2 232 return "%s/%s + O(%s^{%s})"%(self.unit_part().lift(), ppow, pprint, self.precision_absolute()) 233 else: 234 if do_latex: 235 return "%s + O(%s^{%s})"%(self.lift(), pprint, self.precision_absolute()) 236 else: 237 return "%s + O(%s^%s)"%(self.lift(), pprint, self.precision_absolute()) 238 else: 239 slist = self.list() 240 s = "" 241 p = self.prime_pow.prime 242 if self.parent().is_field(): 243 exp = self.valuation() 244 else: 245 exp = 0 246 for a in slist: 247 if a != 0: 248 if exp == 0: 249 s += "%s + "%a 250 else: 251 var = pprint 252 if exp != 1: 253 if do_latex: 254 var += "^{%s}"%exp 255 else: 256 var += "^%s"%exp 257 if a != 1: 258 if do_latex: 259 s += "%s \\cdot %s + "%(a, var) 260 else: 261 s += "%s*%s + "%(a, var) 262 else: 263 s += "%s + "%var 264 exp += 1 265 s += "O(%s"%(pprint) 266 if self.precision_absolute() == 1: 267 s += ")" 268 else: 269 if do_latex: 270 s += "^{%s})"%self.precision_absolute() 271 else: 272 s += "^%s)"%self.precision_absolute() 273 return s 179 def _repr(self, mode=None, do_latex=False): 180 return self.parent()._printer.repr_gen(self, do_latex, mode=mode) 274 181 275 182 def additive_order(self, prec): … … 745 652 return self 746 653 654 def valuation(self): 655 cdef Integer ans = PY_NEW(Integer) 656 mpz_set_si(ans.value, self.valuation_c()) 657 return ans 658 659 cdef long valuation_c(self): 660 raise NotImplementedError 661 662 def val_unit(self): 663 return self.val_unit_c() 664 665 cdef val_unit_c(self): 666 raise NotImplementedError 667 747 668 def ordp(self): 748 669 r""" … … 776 697 def rational_reconstruction(self): 777 698 r""" 778 Returns the unique rational approximation to this p-adic 779 number with certain properties, or raises a ValueError (see 780 OUTPUT below). Uses the rational reconstruction algorithm 781 applied to the unit part of this rational number. 782 783 INPUT: 784 self -- a p-adic element 785 786 OUTPUT: 787 Numerator and denominator n, d of the unique rational 788 number r=n/d, if it exists, with 789 |n| and |d| <= sqrt(N/2), 790 where N = p^prec, i.e., where the *unit part* of self 791 is ... + O(p^prec). If no such r exists, a ValueError 792 is raised. 793 699 Returns a rational approximation to this p-adic number 700 701 INPUT: 702 self -- a p-adic element 703 OUTPUT: 704 rational -- an approximation to self 794 705 EXAMPLES: 795 706 sage: R = Zp(5,20,'capped-rel') … … 799 710 ... continue 800 711 ... assert i/j == R(i/j).rational_reconstruction() 801 802 A ValueError is raised when a rational reconstruction of803 the unit part does not exist:804 sage: R = Zp(5, 5)805 sage: R(1413*5).rational_reconstruction()806 Traceback (most recent call last):807 ...808 ValueError: Rational reconstruction of 1413 (mod 3125) does not exist.809 712 """ 810 713 if self.is_zero(self.precision_absolute()): … … 947 850 return self.valuation(), self.unit_part().lift() 948 851 949 cdef base_p_list(self, mpz_t value, lift_mode):950 cdef mpz_t tmp, halfp951 cdef int neg, curpower952 cdef Integer list_elt953 cdef unsigned long preccap954 preccap = self.prime_pow._prec_cap()955 ans = PyList_New(0)956 mpz_init_set(tmp, value)957 if lift_mode == 'simple':958 while mpz_sgn(tmp) != 0:959 list_elt = PY_NEW(Integer)960 mpz_mod(list_elt.value, tmp, self.prime_pow.prime.value)961 mpz_sub(tmp, tmp, list_elt.value)962 mpz_divexact(tmp, tmp, self.prime_pow.prime.value)963 PyList_Append(ans, list_elt)964 elif lift_mode == 'smallest':965 neg = 0966 curpower = preccap967 mpz_init(halfp)968 mpz_fdiv_q_2exp(halfp, self.prime_pow.prime.value, 1)969 while mpz_sgn(tmp) != 0:970 curpower -= 1971 list_elt = PY_NEW(Integer)972 mpz_mod(list_elt.value, tmp, self.prime_pow.prime.value)973 if mpz_cmp(list_elt.value, halfp) >= 0:974 mpz_sub(list_elt.value, list_elt.value, self.prime_pow.prime.value)975 neg = 1976 else:977 neg = 0978 mpz_sub(tmp, tmp, list_elt.value)979 mpz_divexact(tmp, tmp, self.prime_pow.prime.value)980 if neg == 1:981 if mpz_cmp(tmp, self.prime_pow.pow_mpz_t_tmp(curpower)[0]) >= 0:982 mpz_sub(tmp, tmp, self.prime_pow.pow_mpz_t_tmp(curpower)[0])983 PyList_Append(ans, list_elt)984 mpz_clear(halfp)985 else:986 mpz_clear(tmp)987 raise ValueError, "lift mode must be one of 'simple', 'smallest' or 'teichmuller'"988 mpz_clear(tmp)989 return ans990 852 991 853 cdef public void teichmuller_set_c(mpz_t value, mpz_t p, mpz_t ppow):
Note: See TracChangeset
for help on using the changeset viewer.
