Changeset 8430:2a9e6147e73f


Ignore:
Timestamp:
11/11/07 14:24:26 (6 years ago)
Author:
David Roe <roed@…>
Branch:
default
Message:

Updating padic classes to adapt to new PowComputer? infrastructure. Improved init. Added _set_from functions.

Location:
sage/rings/padics
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • sage/rings/padics/padic_generic_element.pxd

    r4471 r8430  
    11include "../../ext/cdefs.pxi" 
    22 
    3 cimport sage.rings.padics.local_generic_element 
    4 from sage.rings.padics.local_generic_element cimport LocalGenericElement 
    53cimport sage.structure.element 
    64from sage.structure.element cimport Element 
    7 cimport sage.rings.padics.pow_computer 
    8 from sage.rings.padics.pow_computer cimport PowComputer_class 
     5from sage.rings.padics.local_generic_element cimport LocalGenericElement 
     6#from sage.rings.padics.pow_computer cimport PowComputer_class 
     7from sage.rings.integer cimport Integer 
     8from sage.rings.rational cimport Rational 
    99 
    1010cdef class pAdicGenericElement(LocalGenericElement): 
    11     cdef PowComputer_class prime_pow 
    1211    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 
    1416 
    1517cdef extern void teichmuller_set_c(mpz_t value, mpz_t p, mpz_t ppow) 
  • sage/rings/padics/padic_generic_element.pyx

    r7355 r8430  
    2626cimport sage.rings.padics.local_generic_element 
    2727from sage.rings.padics.local_generic_element cimport LocalGenericElement 
    28 cimport sage.structure.element 
    29 from sage.structure.element cimport Element 
    30 cimport pow_computer 
     28#cimport sage.structure.element 
     29#from sage.structure.element cimport Element 
     30#cimport pow_computer 
    3131from sage.rings.integer cimport Integer 
     32#from sage.rings.rational import Rational 
     33from sage.rings.infinity import infinity 
     34from sage.libs.pari.gen import pari 
     35from sage.libs.pari.gen import PariError 
     36from sage.rings.rational_field import QQ 
    3237import sage.rings.rational_field 
    33 from sage.rings.padics.pow_computer cimport PowComputer_base 
    34  
    35  
    36 Rational = sage.rings.rational.Rational 
    37 infinity = sage.rings.infinity.infinity 
    38 PariError = sage.libs.pari.gen.PariError 
    39 pari = sage.libs.pari.gen.pari 
    40 QQ = sage.rings.rational_field.QQ 
     38#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 
    4146 
    4247cdef class pAdicGenericElement(LocalGenericElement): 
    43     def __init__(self, parent): 
    44         self.prime_pow = <PowComputer_class> parent.prime_pow 
    45         LocalGenericElement.__init__(self, parent) 
    46  
    4748    def __richcmp__(left, right, int op): 
    4849        return (<Element>left)._richcmp(right, op) 
     
    8384                return 0 # since both are zero 
    8485            else: 
    85                 p = left.prime_pow.prime 
     86                p = left.parent().prime() 
    8687                a = left.unit_part().lift() 
    8788                b = right.unit_part().lift() 
     
    9798                    return 1 
    9899 
     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 
    99106    def _pari_(self): 
    100107        return pari(self._pari_init_()) 
     
    163170    def _is_exact_zero(self): 
    164171        return False 
     172 
     173    def _is_inexact_zero(self): 
     174        return self.is_zero() and not self._is_exact_zero() 
    165175         
    166176    def str(self, mode=None): 
    167177        return self._repr(mode=mode) 
    168178 
    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) 
    274181 
    275182    def additive_order(self, prec): 
     
    745652            return self 
    746653 
     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     
    747668    def ordp(self): 
    748669        r""" 
     
    776697    def rational_reconstruction(self): 
    777698        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 
    794705        EXAMPLES: 
    795706            sage: R = Zp(5,20,'capped-rel') 
     
    799710            ...               continue 
    800711            ...           assert i/j == R(i/j).rational_reconstruction() 
    801  
    802         A ValueError is raised when a rational reconstruction of 
    803         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. 
    809712        """ 
    810713        if self.is_zero(self.precision_absolute()): 
     
    947850        return self.valuation(), self.unit_part().lift() 
    948851 
    949     cdef base_p_list(self, mpz_t value, lift_mode): 
    950         cdef mpz_t tmp, halfp 
    951         cdef int neg, curpower 
    952         cdef Integer list_elt 
    953         cdef unsigned long preccap 
    954         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 = 0 
    966             curpower = preccap 
    967             mpz_init(halfp) 
    968             mpz_fdiv_q_2exp(halfp, self.prime_pow.prime.value, 1) 
    969             while mpz_sgn(tmp) != 0: 
    970                 curpower -= 1 
    971                 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 = 1 
    976                 else: 
    977                     neg = 0 
    978                 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 ans 
    990852 
    991853cdef public void teichmuller_set_c(mpz_t value, mpz_t p, mpz_t ppow): 
Note: See TracChangeset for help on using the changeset viewer.