# HG changeset patch
# User David Roe <roed@math.harvard.edu>
# Date 1330802610 28800
# Node ID 17647daf5397ce88abb7987f30ceeba34562e69e
# Parent  35f4bf3971e358e68258870f3de5564351e8bfc8
#12555: update printing for templated p-adics

diff --git a/sage/rings/padics/padic_extension_leaves.py b/sage/rings/padics/padic_extension_leaves.py
--- a/sage/rings/padics/padic_extension_leaves.py
+++ b/sage/rings/padics/padic_extension_leaves.py
@@ -406,7 +406,7 @@
 
             sage: R = ZpCA(3, 10000, print_pos=False); S.<x> = ZZ[]; f = x^3 + 9*x - 3
             sage: W.<w> = R.ext(f); W #indirect doctest
-            Eisenstein Extension of 3-adic Ring with capped absolute precision 10000 in w defined by (1 + O(3^10000))*x^3 + (3^2 + O(3^10000))*x + (-3 + 3^10000 + O(3^10000))
+            Eisenstein Extension of 3-adic Ring with capped absolute precision 10000 in w defined by (1 + O(3^10000))*x^3 + (3^2 + O(3^10000))*x + (-3 + O(3^10000))
             sage: W.precision_cap()
             30000
 
diff --git a/sage/rings/padics/padic_printing.pxd b/sage/rings/padics/padic_printing.pxd
--- a/sage/rings/padics/padic_printing.pxd
+++ b/sage/rings/padics/padic_printing.pxd
@@ -21,7 +21,7 @@
     cdef long max_unram_terms
     cdef long max_terse_terms
 
-    cdef base_p_list(self, mpz_t value, bint pos)
+    cdef base_p_list(self, value, bint pos)
     cdef _repr_gen(self, pAdicGenericElement elt, bint do_latex, bint pos, int mode, pname)
     cdef _repr_spec(self, pAdicGenericElement elt, bint do_latex, bint pos, int _mode, bint paren, pname)
     cdef _print_list_as_poly(self, L, bint do_latex, polyname, long expshift, bint increasing)
diff --git a/sage/rings/padics/padic_printing.pyx b/sage/rings/padics/padic_printing.pyx
--- a/sage/rings/padics/padic_printing.pyx
+++ b/sage/rings/padics/padic_printing.pyx
@@ -737,11 +737,14 @@
             [2, 15, 5, 9, 15]
             sage: P._base_p_list(1298734,False)
             [2, -2, 6, -8, -1, 1]
+            sage: P._base_p_list(Zp(17)(1298734),True)
+            [2, 15, 5, 9, 15]
+            sage: P._base_p_list(Zp(17)(1298734),False)
+            [2, -2, 6, -8, -1, 1]
         """
-        cdef Integer _value = Integer(value)
-        return self.base_p_list(_value.value, pos)
+        return self.base_p_list(value, pos)
 
-    cdef base_p_list(self, mpz_t value, bint pos):
+    cdef base_p_list(self, value, bint pos):
         """
         Returns a list of integers forming the base p expansion of
         value.
@@ -760,46 +763,13 @@
             sage: P._base_p_list(1298734,False)
             [2, -2, 6, -8, -1, 1]
         """
-        cdef mpz_t tmp, halfp
-        cdef int neg, curpower
-        cdef Integer list_elt
-        cdef unsigned long preccap = self.prime_pow.prec_cap
-        ans = PyList_New(0)
-        mpz_init_set(tmp, value)
-
-
-        list_elt = PY_NEW(Integer)
-        mpz_set(list_elt.value, value)
-        if pos:
-            while mpz_sgn(tmp) != 0:
-                list_elt = PY_NEW(Integer)
-                mpz_mod(list_elt.value, tmp, self.prime_pow.prime.value)
-                mpz_sub(tmp, tmp, list_elt.value)
-                mpz_divexact(tmp, tmp, self.prime_pow.prime.value)
-                PyList_Append(ans, list_elt)
+        if PY_TYPE_CHECK(value, Integer):
+            from sage.rings.padics.padic_capped_relative_element import base_p_list
+            return base_p_list(value, pos, self.prime_pow)
+        elif pos:
+            return value.unit_part().list()
         else:
-            neg = 0
-            curpower = preccap
-            mpz_init(halfp)
-            mpz_fdiv_q_2exp(halfp, self.prime_pow.prime.value, 1)
-            while mpz_sgn(tmp) != 0:
-                curpower -= 1
-                list_elt = PY_NEW(Integer)
-                mpz_mod(list_elt.value, tmp, self.prime_pow.prime.value)
-                if mpz_cmp(list_elt.value, halfp) > 0:
-                    mpz_sub(list_elt.value, list_elt.value, self.prime_pow.prime.value)
-                    neg = 1
-                else:
-                    neg = 0
-                mpz_sub(tmp, tmp, list_elt.value)
-                mpz_divexact(tmp, tmp, self.prime_pow.prime.value)
-                if neg == 1:
-                    if mpz_cmp(tmp, self.prime_pow.pow_mpz_t_tmp(curpower)[0]) >= 0:
-                        mpz_sub(tmp, tmp, self.prime_pow.pow_mpz_t_tmp(curpower)[0])
-                PyList_Append(ans, list_elt)
-            mpz_clear(halfp)
-        mpz_clear(tmp)
-        return ans
+            return value.unit_part().list('smallest')
 
     def repr_gen(self, elt, do_latex, pos = None, mode = None, ram_name = None):
         """
@@ -901,7 +871,7 @@
         elif mode == digits:
             n = elt.valuation()
             if self.base:
-                L = self.base_p_list((<Integer>elt.unit_part().lift()).value, True)
+                L = self.base_p_list(elt, True)
             else:
                 L = elt._ext_p_list(True)
             if self.max_ram_terms != -1:
@@ -920,7 +890,7 @@
         elif mode == bars:
             n = elt.valuation()
             if self.base:
-                L = self.base_p_list((<Integer>elt.unit_part().lift()).value, self.pos)
+                L = self.base_p_list(elt, self.pos)
             else:
                 L = elt._ext_p_list(self.pos)
             if self.max_ram_terms != -1:
@@ -999,7 +969,7 @@
                 else:
                     return s
             else: # mode == series
-                slist = self.base_p_list((<Integer>elt.unit_part().lift()).value, pos)
+                slist = self.base_p_list(elt, pos)
                 slist, ellipsis = self._truncate_list(slist, self.max_ram_terms, 0)
                 s = ""
                 exp = elt.valuation()
