Ticket #12625: 12625.patch

File 12625.patch, 3.6 KB (added by roed, 8 years ago)
  • sage/libs/pari/gen.pyx

    # HG changeset patch
    # User David Roe <roed@math.harvard.edu>
    # Date 1330800771 28800
    # Node ID 35f4bf3971e358e68258870f3de5564351e8bfc8
    # Parent  a149a04f144a63d4d3a2fc3e96d8aab03d59b165
    #12625: conversion of p-adics back from pari
    
    diff --git a/sage/libs/pari/gen.pyx b/sage/libs/pari/gen.pyx
    a b  
    36263626       
    36273627        OUTPUT: int
    36283628       
    3629         EXAMPLES:
     3629        EXAMPLES::
     3630
     3631            sage: K = Qp(11,5)
     3632            sage: x = K(11^-10 + 5*11^-7 + 11^-6)
     3633            sage: y = pari(x)
     3634            sage: y.padicprec(11)
     3635            -5
    36303636        """
    36313637        cdef gen _p
    36323638        _p = pari(p)
     
    36343640            raise TypeError, "p (=%s) must be of type t_INT, but is of type %s."%(
    36353641                _p, _p.type())
    36363642        return padicprec(x.g, _p.g)
     3643
     3644    def padicprime(gen x):
     3645        """
     3646        The uniformizer of the p-adic ring this element lies in, as a t_INT.
     3647
     3648        INPUT:
     3649
     3650        - ``x`` - gen, of type t_PADIC
     3651
     3652        OUTPUT:
     3653
     3654        - ``p`` - gen, of type t_INT
     3655
     3656        EXAMPLES::
     3657
     3658            sage: K = Qp(11,5)
     3659            sage: x = K(11^-10 + 5*11^-7 + 11^-6)
     3660            sage: y = pari(x)
     3661            sage: y.padicprime()
     3662            11
     3663        """
     3664        sig_on()
     3665        return P.new_gen(gel(x.g, 2))
    36373666   
    36383667    def permtonum(gen x):
    36393668        """
  • sage/libs/pari/gen_py.py

    diff --git a/sage/libs/pari/gen_py.py b/sage/libs/pari/gen_py.py
    a b  
    193193        Traceback (most recent call last):
    194194        ...
    195195        NameError: name 'x' is not defined
     196
     197    Conversion of p-adics::
     198
     199        sage: K = Qp(11,5)
     200        sage: x = K(11^-10 + 5*11^-7 + 11^-6); x
     201        11^-10 + 5*11^-7 + 11^-6 + O(11^-5)
     202        sage: y = pari(x); y
     203        11^-10 + 5*11^-7 + 11^-6 + O(11^-5)
     204        sage: y.sage()
     205        11^-10 + 5*11^-7 + 11^-6 + O(11^-5)
     206        sage: pari(K(11^-5)).sage()
     207        11^-5 + O(11^0)
    196208    """
    197209    t = z.type()
    198210    if t == "t_REAL":
     
    232244    elif t == "t_MAT":
    233245        from sage.matrix.constructor import matrix
    234246        return matrix(z.nrows(),z.ncols(),[python(z[i,j]) for i in range(z.nrows()) for j in range(z.ncols())])
     247    elif t == "t_PADIC":
     248        from sage.rings.padics.factory import Qp
     249        Z = IntegerRing()
     250        p = z.padicprime()
     251        rprec = Z(z.padicprec(p)) - Z(z._valp())
     252        K = Qp(Z(p), rprec)
     253        return K(z.lift())
    235254    else:
    236255        return sage_eval(str(z), locals=locals)
  • sage/rings/integer.pyx

    diff --git a/sage/rings/integer.pyx b/sage/rings/integer.pyx
    a b  
    598598            Traceback (most recent call last):
    599599            ...
    600600            TypeError: Unable to coerce PARI x to an Integer
     601
     602        Test coercion of p-adic with negative valuation::
     603
     604            sage: ZZ(pari(Qp(11)(11^-7)))
     605            Traceback (most recent call last):
     606            ...
     607            TypeError: Cannot convert p-adic with negative valuation to an integer
    601608        """
    602609        # TODO: All the code below should somehow be in an external
    603610        # cdef'd function.  Then e.g., if a matrix or vector or
     
    656663                        x = x.floor()
    657664                        break
    658665                    elif paritype == t_PADIC:
     666                        if x._valp() < 0:
     667                            raise TypeError("Cannot convert p-adic with negative valuation to an integer")
    659668                        # Lifting a PADIC yields an integer
    660669                        x = x.lift()
    661670                        break