Changeset 3667:4de1aa0af3cb
- Timestamp:
- 03/13/07 00:36:43 (6 years ago)
- Branch:
- default
- Location:
- sage
- Files:
-
- 39 added
- 6 deleted
- 25 edited
-
modular/modform/nodoctest.py (deleted)
-
rings/padics/README/README.pdf (modified) (previous)
-
rings/padics/README/README.tex (modified) (3 diffs)
-
rings/padics/eisenstein_extension_capped_relative_element.py (added)
-
rings/padics/eisenstein_extension_element.py (added)
-
rings/padics/eisenstein_extension_generic.py (added)
-
rings/padics/eisenstein_extension_lazy_element.py (added)
-
rings/padics/eisenstein_field_extension_capped_relative.py (added)
-
rings/padics/eisenstein_field_extension_lazy.py (added)
-
rings/padics/eisenstein_ring_extension_capped_absolute.py (added)
-
rings/padics/eisenstein_ring_extension_capped_relative.py (added)
-
rings/padics/eisenstein_ring_extension_fixed_mod.py (added)
-
rings/padics/eisenstein_ring_extension_lazy.py (added)
-
rings/padics/extension_factory.py (added)
-
rings/padics/extension_local_field.py (added)
-
rings/padics/extension_local_ring.py (added)
-
rings/padics/local_field_extension.py (deleted)
-
rings/padics/local_generic.py (modified) (2 diffs)
-
rings/padics/local_ring_extension.py (deleted)
-
rings/padics/padic_extension_capped_absolute_element.py (added)
-
rings/padics/padic_extension_capped_relative_element.py (added)
-
rings/padics/padic_extension_fixed_mod_element.py (added)
-
rings/padics/padic_extension_generic_element.py (added)
-
rings/padics/padic_extension_lazy_element.py (added)
-
rings/padics/padic_extension_ring.py (deleted)
-
rings/padics/padic_field_capped_relative.py (modified) (3 diffs)
-
rings/padics/padic_field_capped_relative_element.py (modified) (8 diffs)
-
rings/padics/padic_field_extension_capped_relative.py (added)
-
rings/padics/padic_field_extension_generic.py (added)
-
rings/padics/padic_field_extension_lazy.py (added)
-
rings/padics/padic_field_generic.py (modified) (1 diff)
-
rings/padics/padic_field_lazy.py (modified) (2 diffs)
-
rings/padics/padic_generic.py (modified) (3 diffs)
-
rings/padics/padic_generic_element.py (modified) (6 diffs)
-
rings/padics/padic_lazy_element.py (modified) (5 diffs)
-
rings/padics/padic_lazy_extension_generic_element.py (added)
-
rings/padics/padic_lazy_generic.py (added)
-
rings/padics/padic_lazy_generic_element.py (added)
-
rings/padics/padic_ring_capped_absolute.py (modified) (3 diffs)
-
rings/padics/padic_ring_capped_absolute_element.py (modified) (6 diffs)
-
rings/padics/padic_ring_capped_relative.py (modified) (4 diffs)
-
rings/padics/padic_ring_capped_relative_element.py (modified) (8 diffs)
-
rings/padics/padic_ring_extension.py (modified) (1 diff)
-
rings/padics/padic_ring_extension_capped_absolute.py (added)
-
rings/padics/padic_ring_extension_capped_relative.py (added)
-
rings/padics/padic_ring_extension_fixed_mod.py (added)
-
rings/padics/padic_ring_extension_generic.py (added)
-
rings/padics/padic_ring_extension_lazy.py (added)
-
rings/padics/padic_ring_fixed_mod.py (modified) (3 diffs)
-
rings/padics/padic_ring_fixed_mod_element.py (modified) (1 diff)
-
rings/padics/padic_ring_generic.py (modified) (1 diff)
-
rings/padics/padic_ring_generic_element.py (modified) (2 diffs)
-
rings/padics/padic_ring_lazy.py (modified) (5 diffs)
-
rings/padics/qp.py (modified) (6 diffs)
-
rings/padics/unramified_extension_capped_relative_element.py (added)
-
rings/padics/unramified_extension_element.py (added)
-
rings/padics/unramified_extension_generic.py (added)
-
rings/padics/unramified_extension_lazy_element.py (added)
-
rings/padics/unramified_field_extension_capped_relative.py (added)
-
rings/padics/unramified_field_extension_lazy.py (added)
-
rings/padics/unramified_ring_extension.py (deleted)
-
rings/padics/unramified_ring_extension_capped_absolute.py (added)
-
rings/padics/unramified_ring_extension_capped_relative.py (added)
-
rings/padics/unramified_ring_extension_element.py (deleted)
-
rings/padics/unramified_ring_extension_fixed_mod.py (added)
-
rings/padics/unramified_ring_extension_lazy.py (added)
-
rings/padics/zp.py (modified) (6 diffs)
-
rings/polynomial_ring.py (modified) (2 diffs)
-
rings/polynomial_ring_constructor.py (modified) (2 diffs)
-
structure/element.pyx (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
sage/rings/padics/README/README.tex
r3409 r3667 114 114 There are four different representations of $\Zp$ in Sage and two representations of $\Qp$: 115 115 the fixed modulus ring, the capped absolute precision ring, the capped relative precision 116 ring, the capped relative precision field, the lazy ring and the lazy field. 116 ring, the capped relative precision field, the lazy ring and the lazy field. In addition, 117 unramified extensions are also currently supported. 118 119 One uses the function \verb/Zp/ to construct $p$-adic rings and \verb/Qp/ to construct $p$-adic 120 fields. The only required parameter is the prime: the default type is capped relative. 117 121 118 122 \subsection{Fixed Modulus Rings} … … 278 282 279 283 There are two parameters that are set at the creation of a lazy ring or field. The first is \verb/prec/, which 280 controls the precision to which elements are initially computed. When computing with lazy rings, sometimes situations284 controls the precision to which elements are initially computed. The second is \verb/halt/: when computing with lazy rings, sometimes situations 281 285 arise where the insolvability of the halting problem gives us problems. For example, 282 286 \begin{verbatim} … … 287 291 sage: b.valuation() 288 292 ... 289 <class 'sage.rings.padics.precision_error.HaltingError'>: Stopped computing sum: set halting paramter higher if you want computation to continue 290 291 The second is \verb/halt/ 292 293 \begin{verbatim} 294 295 293 <class 'sage.rings.padics.precision_error.HaltingError'>: 294 Stopped computing sum: set halting paramter higher if you want computation to continue 295 \end{verbatim} 296 297 Setting the halting parameter controls to what absolute precision one computes in such a situation. 298 299 The interesting feature of lazy elements is that one can perform computations with them, discover that the answer does not have the desired precision, and then ask for more precision. For example, 300 \begin{verbatim} 301 sage: a = R(6).log() * 15 302 sage: b = a.exp() 303 sage: c = b / R(15).exp() 304 sage: c 305 1 + 2*5 + 4*5^2 + 3*5^3 + 2*5^4 + 3*5^5 + 5^6 + 5^10 + O(5^11) 306 sage: c.set_precision_absolute(15) 307 sage: c 308 1 + 2*5 + 4*5^2 + 3*5^3 + 2*5^4 + 3*5^5 + 5^6 + 5^10 + 309 4*5^11 + 2*5^12 + 4*5^13 + 3*5^14 + O(5^15) 310 \end{verbatim} 311 312 There can be a performance penalty to using lazy $p$-adics in this way. When one does computations with them, the computer construct an expression tree. As you compute, values of these elements are cached, and the overhead is reasonably low (though obviously higher than for a fixed modulus element for example). But when you set the precision, the computer has to reset precision throughout the expression tree for that element, and thus setting precision can take the same order of magnitude of time as doing the initial computation. However, lazy $p$-adics can be quite useful when experimenting. 313 314 \subsection{Unramified Extensions} 315 One can create unramified extensions of $\Zp$ and $\Qp$ using the functions \verb/Zq/ and \verb/Qq/. 316 These extensions are still in a relatively primitive state, 317 so I would suggest the following options when creating such extensions (more are available but may 318 not currently work as well). 319 320 In addition to requiring a prime power as the first argument, \verb/Zq/ also requires a name for the generator of the residue field. One can specify this name as follows: 321 \begin{verbatim} 322 sage: R.<c> = Zq(125, prec = 20) 323 sage: R 324 Unramified Extension of 5-adic Ring with capped absolute precision 20 in x 325 defined by (1 + O(5^20))*c^3 + O(5^20)*c^2 + (3 + O(5^20))*c + 3 + O(5^20) 326 \end{verbatim} 327 328 \section{New Versions of the $p$-adics} 329 The code for $p$-adics is fairly rapidly changing. If there's a bug you want fixed, let me know and I'll try to fix it. Once I do, you'll need to get the latest version of $p$-adics with the bug fixed. If you don't want to wait for the next version of SAGE to come out, you can do the following to get the most recent version: 330 \begin{verbatim} 331 sage: hg_sage.pull() 332 sage: hg_sage.apply( 333 'http://sage.math.washington.edu/home/padicgroup/development-version.hg') 334 sage: quit 335 localhost:~$ sage 336 sage: run code that generated bug. 337 \end{verbatim} 338 339 If you want a slightly more stable but older version, use \verb/semistable-version.hg/ instead. 296 340 \end{document} -
sage/rings/padics/local_generic.py
r3326 r3667 17 17 18 18 class LocalGeneric(sage.rings.ring.CommutativeRing): 19 def __init__(self, prec ):19 def __init__(self, prec, names): 20 20 self._prec = prec 21 sage.structure.parent_gens.ParentWithGens.__init__(self, self, ( 'x',), normalize=False)21 sage.structure.parent_gens.ParentWithGens.__init__(self, self, (names,), normalize=False) 22 22 23 23 def __call__(self, x): … … 61 61 return self._prec 62 62 63 def get_print_mode(self):63 def print_mode(self): 64 64 raise NotImplementedError 65 65 -
sage/rings/padics/padic_field_capped_relative.py
r3405 r3667 102 102 Rational = sage.rings.rational.Rational 103 103 Mod = sage.rings.integer_mod.Mod 104 infinity = sage.rings.infinity.infinity 104 105 pAdicFieldBaseGeneric = sage.rings.padics.padic_field_generic.pAdicFieldBaseGeneric 105 106 pAdicLazyElement = sage.rings.padics.padic_lazy_element.pAdicLazyElement … … 113 114 """ 114 115 115 def __call__(self, x, absprec = None, relprec = None):116 def __call__(self, x, absprec = infinity, relprec = infinity): 116 117 r""" 117 118 Casts x into self. Uses the constructor from pAdicFieldCappedRelativeElement. … … 193 194 """ 194 195 from sage.rings.padics.zp import Zp 195 return Zp(self.prime(), self.precision_cap(), 'capped-rel', self. get_print_mode())196 return Zp(self.prime(), self.precision_cap(), 'capped-rel', self.print_mode()) 196 197 197 198 def fraction_field(self): -
sage/rings/padics/padic_field_capped_relative_element.py
r3408 r3667 47 47 48 48 class pAdicFieldCappedRelativeElement(sage.rings.padics.padic_field_generic_element.pAdicFieldGenericElement): 49 def __init__(self, parent, x, absprec= None, relprec=None, construct=False):49 def __init__(self, parent, x, absprec=infinity, relprec=infinity, construct=False): 50 50 sage.rings.commutative_ring_element.CommutativeRingElement.__init__(self, parent) 51 51 if construct: … … 53 53 return 54 54 55 if not absprec is None and not relprec is None:55 if not absprec is infinity and not relprec is infinity: 56 56 raise ValueError, "can only specify one of absprec and relprec" 57 if absprec is None:58 if relprec is None or relprec> parent.precision_cap():57 if absprec is infinity: 58 if relprec > parent.precision_cap(): 59 59 relprec = parent.precision_cap() 60 60 61 61 if isinstance(x, pAdicLazyElement): 62 if relprec is None:62 if relprec is infinity: 63 63 try: 64 64 x.set_precision_absolute(absprec) … … 80 80 raise ValueError, "Cannot coerce between p-adic rings with different primes." 81 81 self._ordp = x.valuation() 82 if relprec is None:82 if relprec is infinity: 83 83 if self._ordp is infinity: 84 relprec = 084 relprec = Integer(0) 85 85 else: 86 86 relprec = absprec - self._ordp … … 91 91 if isinstance(x, pari_gen): 92 92 if x.type() == "t_PADIC": 93 if not absprec is None: 94 absprec = min(x.padicprec(parent.prime()), absprec) 95 else: 96 absprec = x.padicprec(parent.prime()) 93 absprec = min(x.padicprec(parent.prime()), absprec) 97 94 x = x.lift() 98 95 if x.type() == "t_INT": … … 115 112 raise TypeError, "cannot change primes in creating p-adic elements" 116 113 x = x.lift() 117 if absprec is None: 118 absprec = k 119 else: 120 absprec = min(k, absprec) 114 absprec = min(k, absprec) 121 115 122 116 # We now use the code, below, so don't make the next line elif … … 127 121 else: 128 122 raise TypeError, "cannot create a p-adic out of %s"%(type(x)) 129 if self._ordp ==infinity:123 if self._ordp is infinity: 130 124 self._unit = Mod(0, 1) 131 self._relprec = 0125 self._relprec = Integer(0) 132 126 return 133 127 x = x / self.parent().prime_pow(self._ordp) 134 if relprec is None: 135 if self._ordp is infinity: 136 self._relprec = 0 137 else: 138 self._relprec = min(absprec - self._ordp, parent.precision_cap()) 139 elif absprec is None: 140 self._relprec = relprec 128 if self._ordp is infinity: 129 self._relprec = Integer(0) 141 130 else: 142 131 self._relprec = min(relprec, absprec - self._ordp, parent.precision_cap()) 143 132 self._unit = Mod(x, self.parent().prime_pow(self._relprec)) 144 133 return 145 146 def _repr_(self, mode = None, do_latex = False):147 return sage.rings.padics.padic_generic_element.pAdicGenericElement._repr_(self, mode, do_latex, True)148 134 149 135 def __invert__(self, prec=infinity): … … 269 255 return pAdicFieldCappedRelativeElement(self.parent(), (self.valuation(), self._unit, self._relprec), construct = True) 270 256 257 def _is_exact_zero(self): 258 return self.valuation() is infinity 259 271 260 def is_zero(self, prec): 272 261 r""" … … 363 352 364 353 """ 365 return self.list()[:(n - self.valuation())] + [0 for w in range(self.precision_relative(), (n - self.valuation()))] 354 if absprec is infinity and relprec is infinity: 355 raise ValueError, "must specify at least one of absprec and relprec" 356 if self.valuation() is infinity: 357 if relprec < infinity: 358 return [self.parent().residue_class_field()(0)]*relprec 359 else: 360 return [] 361 relprec = min(relprec, absprec - self.valuation()) 362 return self.list()[:relprec] + [self.parent().residue_class_field()(0)]*(self.precision_relative() - relprec) 366 363 367 364 def precision_absolute(self): -
sage/rings/padics/padic_field_generic.py
r3350 r3667 113 113 114 114 class pAdicFieldGeneric(sage.rings.padics.padic_generic.pAdicGeneric): 115 116 def __init__(self, p, prec, print_mode):117 sage.rings.padics.padic_generic.pAdicGeneric.__init__(self, p, prec)118 self.set_print_mode(print_mode)119 120 115 def _repr_(self, do_latex = False): 121 116 return "Generic %s-adic Field"%(self.prime()) 122 123 def get_print_mode(self):124 r"""125 Returns the current print mode as a string.126 127 INPUT:128 self -- a p-adic field129 130 OUTPUT:131 string -- self's print mode132 133 EXAMPLES:134 sage: R = Qp(7,5, 'capped-rel')135 sage: R.get_print_mode()136 'series'137 """138 return self._print_mode139 140 def set_print_mode(self, print_mode):141 """142 Sets the print mode.143 144 INPUT:145 self -- a p-adic field146 print_mode -- string (see NOTES)147 148 EXAMPLES:149 sage: R = Qp(3,5,'capped-rel','val-unit')150 sage: a = R(117); a151 3^2 * 13 + O(3^7)152 sage: R.set_print_mode('series'); a153 3^2 + 3^3 + 3^4 + O(3^7)154 sage: R.set_print_mode('val-unit-p'); a155 p^2 * 13 + O(p^7)156 sage: R.set_print_mode('series-p'); a157 p^2 + p^3 + p^4 + O(p^7)158 159 NOTES:160 The options are:161 'val-unit' -- elements are displayed as p^k*u162 'integer' -- elements are displayed as an integer163 'series' -- elements are displayed as series in p164 'val-unit-p' -- same as val-unit, except that p is written as "p"165 'integer-p' -- same as integer, except that p is written as "p"166 'series-p' -- same as series, except that p is written as "p"167 """168 if (print_mode in ['val-unit', 'series', 'val-unit-p', 'series-p']):169 self._print_mode = print_mode170 else:171 raise ValueError, "print_mode must be either val-unit, integer, series, val-unit-p, integer-p, or series-p"172 117 173 118 def krull_dimension(self): -
sage/rings/padics/padic_field_lazy.py
r3405 r3667 116 116 An implementation of p-adic fields using lazy evaluation. 117 117 """ 118 def __init__(self, p, prec, print_mode, halt ):119 pAdicFieldBaseGeneric.__init__(self, p, prec, print_mode )118 def __init__(self, p, prec, print_mode, halt, names): 119 pAdicFieldBaseGeneric.__init__(self, p, prec, print_mode, names) 120 120 self._halt = halt 121 121 … … 234 234 """ 235 235 from sage.rings.padics.zp import Zp 236 return Zp(self.prime(), self.precision_cap(), 'lazy', self. get_print_mode(), self.halting_parameter())236 return Zp(self.prime(), self.precision_cap(), 'lazy', self.print_mode(), self.halting_parameter()) 237 237 238 238 def fraction_field(self): -
sage/rings/padics/padic_generic.py
r3411 r3667 61 61 class pAdicGeneric(sage.rings.padics.local_generic.LocalGeneric): 62 62 63 def __init__(self, p, prec ):64 sage.rings.padics.local_generic.LocalGeneric.__init__(self, prec )63 def __init__(self, p, prec, print_mode, names): 64 sage.rings.padics.local_generic.LocalGeneric.__init__(self, prec, names) 65 65 self._p = p 66 if (print_mode in ['val-unit', 'terse', 'series']): 67 self._print_mode = print_mode 68 else: 69 raise ValueError, "print_mode must be either val-unit, terse, series" 66 70 67 71 def _repr_(self, do_latex = False): 68 72 return "Generic %s-adic Parent."%(self.prime()) 73 74 def print_mode(self): 75 r""" 76 Returns the current print mode as a string. 77 78 INPUT: 79 self -- a p-adic field 80 81 OUTPUT: 82 string -- self's print mode 83 84 EXAMPLES: 85 sage: R = Qp(7,5, 'capped-rel') 86 sage: R.print_mode() 87 'series' 88 """ 89 return self._print_mode 90 91 #def set_print_mode(self, print_mode): 92 # """ 93 # Sets the print mode. 94 # 95 # INPUT: 96 # self -- a p-adic ring 97 # print_mode -- string (see NOTES) 98 # 99 # EXAMPLES: 100 # sage: R = Zp(3,5,'fixed-mod'); R.set_print_mode('val-unit') 101 # sage: a = R(117); a 102 # 3^2 * 13 + O(3^5) 103 # sage: R.set_print_mode('terse'); a 104 # 117 + O(3^5) 105 # sage: R.set_print_mode('series'); a 106 # 3^2 + 3^3 + 3^4 + O(3^5) 107 # 108 # NOTES: 109 # The options for print_mode are: 110 # 'val-unit' -- elements are displayed as p^k*u 111 # 'terse' -- elements are displayed as an integer if positive valuation, as u/ppow or u/p^k if negative valuation 112 # 'series' -- elements are displayed as series in p, where p is self.variable_name() (default, e.g., "5") 113 # """ 114 69 115 70 116 def characteristic(self): … … 136 182 3 137 183 """ 138 return self.prime() 184 139 185 140 186 def residue_class_field(self): … … 370 416 return self.prime() - 1 371 417 372 373 418 def extension(self, modulus, prec = None, names = None, print_mode = None, halt = None): 419 from sage.rings.padics.extension_factory import ExtensionFactory 420 return ExtensionFactory(self, modulus, prec, names, print_mode, halt, check) 421 422 ext = extension -
sage/rings/padics/padic_generic_element.py
r3409 r3667 17 17 #***************************************************************************** 18 18 19 from __future__ import with_statement 19 20 import sage.rings.padics.local_generic_element 20 21 import sage.rings.rational_field … … 76 77 return 1 77 78 78 def _repr_(self, mode = None, do_latex = False, caprel = False): 79 def _is_exact_zero(self): 80 return False 81 82 def _repr_(self, mode = None, do_latex = False): 79 83 r""" 80 84 Prints a string representation of the element. See set_print_mode for more details. … … 102 106 3*p + p^3 + O(p^5) 103 107 """ 104 import sage.rings.padics.padic_ring_generic 105 if caprel and (self.valuation() == infinity): 106 return "0" 108 if self._is_exact_zero(): 109 return "0" 107 110 if mode is None: 108 mode = self.parent().get_print_mode() 109 elif not ((mode == 'val-unit') or (mode == 'series') or (mode == 'val-unit-p') or (mode == 'series-p') or (isinstance(self.parent(), sage.rings.padics.padic_ring_generic.pAdicRingGeneric) and ((mode == 'integer') or (mode != 'integer-p')))): 110 raise TypeError, "printing mode must be one of 'val-unit', 'series', 'integer', 'val-unit-p', 'series-p', and 'integer-p'" 111 mode = self.parent().print_mode() 112 elif not ((mode == 'val-unit') or (mode == 'series') or (mode == 'terse')): 113 raise TypeError, "printing mode must be one of 'val-unit', 'series' or 'terse'" 114 pprint = self.parent().variable_name() 111 115 if self._unit_part() == 0: 112 116 if mode == 'val-unit' or mode == 'series': 113 117 if do_latex: 114 return "O(%s^{%s})"%( self.parent().prime(), self.precision_absolute())118 return "O(%s^{%s})"%(pprint, self.precision_absolute()) 115 119 else: 116 return "O(%s^%s)"%( self.parent().prime(), self.precision_absolute())117 elif mode == ' integer':120 return "O(%s^%s)"%(pprint, self.precision_absolute()) 121 elif mode == 'terse': 118 122 if do_latex: 119 return "0 + O(%s^{%s})"%( self.parent().prime(), self.precision_absolute())123 return "0 + O(%s^{%s})"%(pprint, self.precision_absolute()) 120 124 else: 121 return "0 + O(%s^%s)"%(self.parent().prime(), self.precision_absolute()) 122 elif mode == 'integer-p': 123 if do_latex: 124 return "0 + O(p^{%s})"%(self.precision_absolute()) 125 else: 126 return "0 + O(p^%s)"%(self.precision_absolute()) 127 else: 128 if do_latex: 129 return "O(p^{%s})"%(self.precision_absolute()) 130 else: 131 return "O(p^%s)"%(self.precision_absolute()) 125 return "0 + O(%s^%s)"%(pprint, self.precision_absolute()) 132 126 if mode == 'val-unit': 133 127 if do_latex: 134 128 if self.valuation() == 0: 135 return "%s + O(%s^{%s})"%(self._unit_part(), self.parent().prime(), self.precision_absolute())129 return "%s + O(%s^{%s})"%(self._unit_part(), pprint, self.precision_absolute()) 136 130 if self.valuation() == 1: 137 return "%s \\cdot %s + O(%s^{%s})"%( self.parent().prime(), self._unit_part(), self.parent().prime(), self.precision_absolute())138 return "%s^{%s} \\cdot %s + O(%s^{%s})"%( self.parent().prime(), self.valuation(), self._unit_part(), self.parent().prime(), self.precision_absolute())131 return "%s \\cdot %s + O(%s^{%s})"%(pprint, self._unit_part(), pprint, self.precision_absolute()) 132 return "%s^{%s} \\cdot %s + O(%s^{%s})"%(pprint, self.valuation(), self._unit_part(), pprint, self.precision_absolute()) 139 133 else: 140 134 if self.valuation() == 0: 141 return "%s + O(%s^%s)"%(self._unit_part(), self.parent().prime(), self.precision_absolute())135 return "%s + O(%s^%s)"%(self._unit_part(), pprint, self.precision_absolute()) 142 136 if self.valuation() == 1: 143 return "%s * %s + O(%s^%s)"%(self.parent().prime(), self._unit_part(), self.parent().prime(), self.precision_absolute()) 144 return "%s^%s * %s + O(%s^%s)"%(self.parent().prime(), self.valuation(), self._unit_part(), self.parent().prime(), self.precision_absolute()) 145 elif mode == 'val-unit-p': 146 if do_latex: 147 if self.valuation() == 0: 148 return "%s + O(p^{%s})"%(self._unit_part(), self.precision_absolute()) 149 if self.valuation() == 1: 150 return "p \\cdot %s + O(p^{%s})"%(self._unit_part(), self.precision_absolute()) 151 return "p^{%s} * %s + O(p^{%s})"%(self.valuation(), self._unit_part(), self.precision_absolute()) 137 return "%s * %s + O(%s^%s)"%(pprint, self._unit_part(), pprint, self.precision_absolute()) 138 return "%s^%s * %s + O(%s^%s)"%(pprint, self.valuation(), self._unit_part(), pprint, self.precision_absolute()) 139 elif mode == 'terse': 140 if self.valuation() < 0: 141 ppow1 = str(self.prime() ** (-self.valuation())) 142 if do_latex: 143 ppow2 = "%s^{%s}"%(pprint, -self.valuation()) 144 if len(ppow1) < len(ppow2): 145 ppow = ppow1 146 else: 147 ppow = ppow2 148 return "%s/%s + O(%s^{%s})"%(self.unit_part().lift(), ppow, pprint, self.precision_absolute()) 149 else: 150 ppow2 = "%s^%s"%(p, -self.valuation()) 151 if len(ppow1) < len(ppow2): 152 ppow = ppow1 153 else: 154 ppow = ppow2 155 return "%s/%s + O(%s^{%s})"%(self.unit_part().lift(), ppow, pprint, self.precision_absolute()) 152 156 else: 153 if self.valuation() == 0: 154 return "%s + O(p^%s)"%(self._unit_part(), self.precision_absolute()) 155 if self.valuation() == 1: 156 return "p * %s + O(p^%s)"%(self._unit_part(), self.precision_absolute()) 157 return "p^%s * %s + O(p^%s)"%(self.valuation(), self._unit_part(), self.precision_absolute()) 158 elif mode == 'integer': 159 if do_latex: 160 return "%s + O(%s^{%s})"%(self.lift(), self.parent().prime(), self.precision_absolute()) 161 else: 162 return "%s + O(%s^%s)"%(self.lift(), self.parent().prime(), self.precision_absolute()) 163 elif mode == 'integer-p': 164 if do_latex: 165 return "%s + O(p^{%s})"%(self.lift(), self.precision_absolute()) 166 else: 167 return "%s + O(p^%s)"%(self.lift(), self.precision_absolute()) 157 if do_latex: 158 return "%s + O(%s^{%s})"%(self.lift(), pprint, self.precision_absolute()) 159 else: 160 return "%s + O(%s^%s)"%(self.lift(), pprint, self.precision_absolute()) 168 161 else: 169 162 exp = self.valuation() … … 172 165 s = "" 173 166 while v != 0: 167 var = pprint 174 168 coeff = v % p 175 169 if coeff != 0: … … 177 171 s += "%s + "%coeff 178 172 else: 179 if mode == 'series':180 var = "%s"%p181 else:182 var = "p"183 173 if exp != 1: 184 174 if do_latex: … … 195 185 exp += 1 196 186 v = (v - coeff) / p 197 if mode == 'series': 198 s += "O(%s"%(p) 199 else: 200 s += "O(p" 187 s += "O(%s"%(pprint) 201 188 if self.precision_absolute() == 1: 202 189 s += ")" -
sage/rings/padics/padic_lazy_element.py
r3415 r3667 1 import sage.rings.padics.padic_ generic_element1 import sage.rings.padics.padic_lazy_generic_element 2 2 import sys 3 3 4 4 Mod = sage.rings.integer_mod.Mod 5 5 Integer = sage.rings.integer.Integer 6 pAdic GenericElement = sage.rings.padics.padic_generic_element.pAdicGenericElement6 pAdicLazyGenericElement = sage.rings.padics.padic_lazy_generic_element.pAdicLazyGenericElement 7 7 infinity = sage.rings.infinity.infinity 8 8 HaltingError = sage.rings.padics.precision_error.HaltingError … … 10 10 PrecisionError = sage.rings.padics.precision_error.PrecisionError 11 11 12 class pAdicLazyElement( sage.rings.padics.padic_generic_element.pAdicGenericElement):12 class pAdicLazyElement(pAdicLazyGenericElement): 13 13 def _add_(self, right): 14 14 if isinstance(self, pAdicLazy_zero): … … 235 235 return pAdic_logah(self) 236 236 237 def padded_list(self, absprec = infinity, relprec = infinity): 238 if absprec is infinity and relprec is infinity: 239 raise ValueError, "must specify at least one of absprec and relprec" 240 if self.parent().is_field(): 241 if self.valuation() is infinity: 242 if relprec < infinity: 243 return [self.parent().residue_class_field()(0)]*relprec 244 else: 245 return [] 246 relprec = min(relprec, absprec - self.valuation()) 247 return self.list()[:relprec] + [self.parent().residue_class_field()(0)]*(self.precision_relative() - relprec) 248 if self.valuation() is infinity: 249 if absprec < infinity: 250 return [self.parent().residue_class_field()(0)]*absprec 251 else: 252 raise ValueError, "would return infinite list" 253 absprec = min(absprec, relprec + self.valuation()) 254 return self.list()[:absprec] + [self.parent().residue_class_field()(0)]*(self.precision_absolute() - absprec) 255 256 237 257 def precision_absolute(self): 238 258 return self._cache_prec + self._base_valuation … … 293 313 return self._base_valuation + self._cache_prec 294 314 315 def _is_exact_zero(self): 316 return False 295 317 296 318 # The following subclasses are used to create pAdicLazyElements from other data … … 381 403 def set_precision_absolute(self, n, halt = None): 382 404 pass 405 406 def _is_exact_zero(self): 407 return True 383 408 384 409 class pAdicLazy_valpower(pAdicLazyElement): -
sage/rings/padics/padic_ring_capped_absolute.py
r3405 r3667 98 98 import sage.rings.padics.padic_ring_capped_relative_element 99 99 import sage.rings.padics.padic_lazy_element 100 import sage.rings.infinity 100 101 101 102 Integer = sage.rings.integer.Integer 102 103 Mod = sage.rings.integer_mod.Mod 103 Qp = sage.rings.padics.qp.Qp 104 infinity = sage.rings.infinity.infinity 104 105 pAdicRingBaseGeneric = sage.rings.padics.padic_ring_generic.pAdicRingBaseGeneric 105 106 pAdicFieldBaseGeneric = sage.rings.padics.padic_field_generic.pAdicFieldBaseGeneric … … 114 115 """ 115 116 116 def __call__(self, x, absprec = None, relprec = None):117 def __call__(self, x, absprec = infinity, relprec = infinity): 117 118 r""" 118 119 Casts x into self. Uses the constructor from pAdicRingCappedAbsoluteElement. … … 187 188 Returns the fraction field of self. 188 189 """ 189 return Qp(self.prime(), self.precision_cap(), 'capped-rel', self.get_print_mode()) 190 from sage.rings.padics.qp import Qp 191 return Qp(self.prime(), self.precision_cap(), 'capped-rel', self.print_mode()) 190 192 191 193 def random_element(self): -
sage/rings/padics/padic_ring_capped_absolute_element.py
r3408 r3667 47 47 class pAdicRingCappedAbsoluteElement(pAdicRingFixedModElement): 48 48 49 def __init__(self, parent, x, absprec= None, relprec = None, construct=False):49 def __init__(self, parent, x, absprec=infinity, relprec = infinity, construct=False): 50 50 sage.rings.commutative_ring_element.CommutativeRingElement.__init__(self,parent) 51 51 if construct: 52 52 (self._value, self._absprec) = x 53 53 return 54 if not absprec is None and not relprec is None:54 if not absprec is infinity and not relprec is infinity: 55 55 raise ValueError, "can only specify one of absprec and relprec" 56 if relprec is None:57 if absprec is None or absprec> parent.precision_cap():56 if relprec is infinity: 57 if absprec > parent.precision_cap(): 58 58 absprec = parent.precision_cap() 59 59 … … 61 61 raise ValueError, "element valuation cannot be negative." 62 62 if isinstance(x, pAdicLazyElement): 63 if relprec is None:63 if relprec is infinity: 64 64 absprec = min(absprec, parent.precision_cap()) 65 65 try: … … 77 77 return 78 78 if isinstance(x, pAdicGenericElement): 79 if relprec is None:79 if relprec is infinity: 80 80 self._absprec = min(x.precision_absolute(), absprec) 81 81 else: … … 86 86 if isinstance(x, pari_gen): 87 87 if x.type() == "t_PADIC": 88 if not absprec is None: 89 absprec = min(x.padicprec(parent.prime()), absprec) 90 else: 91 absprec = x.padicprec(parent.prime()) 88 absprec = min(x.padicprec(parent.prime()), absprec) 92 89 x = x.lift() 93 90 if x.type() == "t_INT": … … 102 99 if not k or p != parent.prime(): 103 100 raise TypeError, "cannot change primes in creating p-adic elements" 104 105 if absprec is None: 106 absprec = k 107 else: 108 absprec = min(absprec, k) 101 absprec = min(absprec, k) 109 102 x = x.lift() 110 103 … … 129 122 raise ValueError, "p divides the denominator" 130 123 if isinstance(x, (int, long, Integer, Rational)): 131 if absprec is None: 132 self._absprec = min(val + relprec, parent.precision_cap()) 133 elif relprec is None: 134 self._absprec = absprec 135 else: 136 self._absprec = min(absprec, val + relprec, parent.precision_cap()) 124 self._absprec = min(absprec, val + relprec, parent.precision_cap()) 137 125 self._value = Mod(Mod(x, parent.prime_pow(self._absprec)), parent.prime_pow(parent.precision_cap())) 138 126 else: -
sage/rings/padics/padic_ring_capped_relative.py
r3402 r3667 95 95 import sage.rings.padics.padic_ring_fixed_mod 96 96 import sage.rings.padics.padic_lazy_element 97 import sage.rings. padics.qp97 import sage.rings.infinity 98 98 99 99 from sage.rings.integer_ring import ZZ … … 101 101 Integer = sage.rings.integer.Integer 102 102 Mod = sage.rings.integer_mod.Mod 103 Qp = sage.rings.padics.qp.Qp 103 infinity = sage.rings.infinity.infinity 104 104 pAdicRingBaseGeneric = sage.rings.padics.padic_ring_generic.pAdicRingBaseGeneric 105 105 pAdicFieldBaseGeneric = sage.rings.padics.padic_field_generic.pAdicFieldBaseGeneric … … 113 113 """ 114 114 115 def __call__(self, x, absprec = None, relprec = None):115 def __call__(self, x, absprec = infinity, relprec = infinity): 116 116 r""" 117 117 Casts x into self. Uses the constructor from pAdicRingCappedRelativeElement. … … 194 194 195 195 """ 196 return Qp(self.prime(), self.precision_cap(), 'capped-rel', self.get_print_mode()) 196 from sage.rings.padics.qp import Qp 197 return Qp(self.prime(), self.precision_cap(), 'capped-rel', self.print_mode()) 197 198 198 199 def random_element(self, algorithm='default'): -
sage/rings/padics/padic_ring_capped_relative_element.py
r3409 r3667 47 47 48 48 class pAdicRingCappedRelativeElement(pAdicRingGenericElement): 49 def __init__(self, parent, x, absprec= None, relprec=None, construct=False):49 def __init__(self, parent, x, absprec=infinity, relprec=infinity, construct=False): 50 50 """ 51 51 Constructs new element with given parent and value. … … 120 120 return 121 121 122 if not absprec is None and not relprec is None:122 if not absprec is infinity and not relprec is infinity: 123 123 raise ValueError, "can only specify one of absprec and relprec" 124 if absprec is None:125 if relprec is None or relprec> parent.precision_cap():124 if absprec is infinity: 125 if relprec > parent.precision_cap(): 126 126 relprec = parent.precision_cap() 127 127 … … 129 129 raise ValueError, "element has negative valuation." 130 130 if isinstance(x, pAdicLazyElement): 131 if relprec is None: 131 if parent.prime() != x.parent().prime(): 132 raise ValueError, "Cannot coerce between p-adic rings with different primes." 133 if relprec is infinity: 132 134 try: 133 135 x.set_precision_absolute(absprec) … … 149 151 raise ValueError, "Cannot coerce between p-adic rings with different primes." 150 152 self._ordp = x.valuation() 151 if relprec is None:153 if relprec is infinity: 152 154 if self._ordp is infinity: 153 relprec = 0155 relprec = Integer(0) 154 156 else: 155 157 relprec = absprec - self._ordp … … 160 162 if isinstance(x, pari_gen): 161 163 if x.type() == "t_PADIC": 162 if not absprec is None: 163 absprec = min(x.padicprec(parent.prime()), absprec) 164 else: 165 absprec = x.padicprec(parent.prime()) 164 absprec = min(x.padicprec(parent.prime()), absprec) 166 165 x = x.lift() 167 166 if x.type() == "t_INT": … … 183 182 raise TypeError, "cannot change primes in creating p-adic elements" 184 183 x = x.lift() 185 if absprec is None: 186 absprec = k 187 else: 188 absprec = min(k, absprec) 184 absprec = min(k, absprec) 189 185 190 186 # We now use the code, below, so don't make the next line elif … … 197 193 if self._ordp < 0: 198 194 raise ValueError, "element not a p-adic integer." 199 elif self._ordp ==infinity:195 elif self._ordp is infinity: 200 196 self._unit = Mod(0, 1) 201 self._relprec = 0197 self._relprec = Integer(0) 202 198 return 203 199 x = x / self.parent().prime_pow(self._ordp) 204 if relprec is None: 205 if self._ordp is infinity: 206 self._relprec = 0 207 else: 208 self._relprec = min(absprec - self._ordp, parent.precision_cap()) 209 elif absprec is None: 210 self._relprec = relprec 200 if self._ordp is infinity: 201 self._relprec = Integer(0) 211 202 else: 212 203 self._relprec = min(relprec, absprec - self._ordp, parent.precision_cap()) 213 204 self._unit = Mod(x, self.parent().prime_pow(self._relprec)) 214 return215 216 def _repr_(self, mode = None, do_latex = False):217 return sage.rings.padics.padic_generic_element.pAdicGenericElement._repr_(self, mode, do_latex, True)218 205 219 206 #def __mod__(self, right): … … 397 384 raise NotImplementedError 398 385 386 def _is_exact_zero(self): 387 return self.valuation() is infinity 388 399 389 def is_zero(self, prec): 400 390 r""" -
sage/rings/padics/padic_ring_extension.py
r3322 r3667 34 34 def __init__(self, poly): 35 35 R = poly.base_ring() 36 pAdicRingGeneric.__init__(self, R.prime(), R.precision_cap(), R. get_print_mode())36 pAdicRingGeneric.__init__(self, R.prime(), R.precision_cap(), R.print_mode()) 37 37 PolynomialQuotientRing_domain.__init__(self, poly.parent(), poly) 38 38 -
sage/rings/padics/padic_ring_fixed_mod.py
r3405 r3667 86 86 import sage.rings.padics.padic_ring_fixed_mod_element 87 87 import sage.rings.padics.padic_ring_capped_absolute_element 88 import sage.rings.padics.qp89 88 import sage.rings.integer_mod 90 89 91 90 Integer = sage.rings.integer.Integer 92 91 Integers = sage.rings.integer_mod_ring.IntegerModRing 92 infinity = sage.rings.infinity.infinity 93 93 pAdicRingBaseGeneric = sage.rings.padics.padic_ring_generic.pAdicRingBaseGeneric 94 94 pAdicFieldBaseGeneric = sage.rings.padics.padic_field_generic.pAdicFieldBaseGeneric … … 102 102 """ 103 103 104 def __call__(self, x, absprec = None, relprec = None):104 def __call__(self, x, absprec = infinity, relprec = infinity): 105 105 r""" 106 106 Casts x into self. Uses the constructor from pAdicRingFixedModElement. 107 107 """ 108 return pAdicRingFixedModElement(self, x , absprec, relprec)108 return pAdicRingFixedModElement(self, x) 109 109 110 110 def __cmp__(self, other): … … 199 199 def principal_unit_group(self): 200 200 raise NotImplementedError 201 201 -
sage/rings/padics/padic_ring_fixed_mod_element.py
r3408 r3667 46 46 47 47 class pAdicRingFixedModElement(pAdicRingGenericElement): 48 def __init__(self, parent, x, absprec = None, relprec = None,construct=False):48 def __init__(self, parent, x, construct=False): 49 49 r""" 50 50 INPUT: -
sage/rings/padics/padic_ring_generic.py
r3411 r3667 136 136 137 137 class pAdicRingGeneric(sage.rings.padics.padic_generic.pAdicGeneric): 138 139 def __init__(self, p, prec, print_mode):140 sage.rings.padics.padic_generic.pAdicGeneric.__init__(self, p, prec)141 self.set_print_mode(print_mode)142 143 138 def _repr_(self, do_latex = False): 144 139 return "Generic %s-adic Ring"%(self.prime()) 145 146 def get_print_mode(self):147 r"""148 Returns the current print mode as a string.149 150 INPUT:151 self -- a p-adic ring152 153 OUTPUT:154 string -- self's print mode155 156 EXAMPLES:157 sage: R = Zp(7,5,'fixed-mod')158 sage: R.get_print_mode()159 'series'160 """161 return self._print_mode162 163 def set_print_mode(self, print_mode):164 """165 Sets the print mode.166 167 INPUT:168 self -- a p-adic ring169 print_mode -- string (see NOTES)170 171 EXAMPLES:172 sage: R = Zp(3,5,'fixed-mod'); R.set_print_mode('val-unit')173 sage: a = R(117); a174 3^2 * 13 + O(3^5)175 sage: R.set_print_mode('integer'); a176 117 + O(3^5)177 sage: R.set_print_mode('series'); a178 3^2 + 3^3 + 3^4 + O(3^5)179 sage: R.set_print_mode('val-unit-p'); a180 p^2 * 13 + O(p^5)181 sage: R.set_print_mode('integer-p'); a182 117 + O(p^5)183 sage: R.set_print_mode('series-p'); a184 p^2 + p^3 + p^4 + O(p^5)185 186 NOTES:187 The options for print_mode are:188 'val-unit' -- elements are displayed as p^k*u189 'integer' -- elements are displayed as an integer190 'series' -- elements are displayed as series in p191 'val-unit-p' -- same as val-unit, except that p is written as "p"192 'integer-p' -- same as integer, except that p is written as "p"193 'series-p' -- same as series, except that p is written as "p"194 """195 if (print_mode in ['val-unit', 'integer', 'series', 'val-unit-p', 'integer-p', 'series-p']):196 self._print_mode = print_mode197 else:198 raise ValueError, "print_mode must be either val-unit, integer, series, val-unit-p, integer-p, or series-p"199 140 200 141 def is_field(self): -
sage/rings/padics/padic_ring_generic_element.py
r3411 r3667 74 74 75 75 76 def padded_list(self, n):76 def padded_list(self, absprec = infinity, relprec = infinity): 77 77 """ 78 Returns a list of coeficiants of p starting with $p^0$ up to $p^n$ exclusive (padded with zeros if needed) 78 Returns a list of coeficiants of p starting with $p^0$ up to $p^n$ exclusive (padded with zeros if needed), where n is the minimum of absprec and relprec + self.valuation() 79 79 80 INPUT: 80 81 self -- a p-adic element 81 n - an integer 82 absprec -- an integer 83 relprec -- an integer 82 84 OUTPUT: 83 85 list -- the list of coeficients of self … … 89 91 this differs from the padded_list method of padic_field_element 90 92 """ 91 return self.list()[:n] + [0 for w in range(self.precision_absolute(), n)] 93 if absprec is infinity and relprec is infinity: 94 raise ValueError, "must specify at least one of absprec and relprec" 95 if self.valuation() is infinity: 96 if absprec < infinity: 97 return [self.parent().residue_class_field()(0)]*absprec 98 else: 99 raise ValueError, "would return infinite list" 100 absprec = min(absprec, relprec + self.valuation()) 101 return self.list()[:absprec] + [self.parent().residue_class_field()(0)]*(self.precision_absolute() - absprec) 102 92 103 93 104 def residue(self, prec): -
sage/rings/padics/padic_ring_lazy.py
r3405 r3667 94 94 import sage.rings.padics.padic_ring_generic 95 95 import sage.rings.padics.padic_field_generic 96 import sage.rings.padics.qp97 96 import sage.rings.infinity 98 97 import copy … … 105 104 Integer = sage.rings.integer.Integer 106 105 Rational = sage.rings.rational.Rational 107 Qp = sage.rings.padics.qp.Qp108 106 pAdicFieldGenericElement = sage.rings.padics.padic_field_generic_element.pAdicFieldGenericElement 109 107 pAdicRingGenericElement = sage.rings.padics.padic_ring_generic_element.pAdicRingGenericElement … … 115 113 An implementation of the p-adic integers with lazily evaluated elements. 116 114 """ 117 def __init__(self, p, prec, print_mode, halt ):118 pAdicRingBaseGeneric.__init__(self, p, prec, print_mode )115 def __init__(self, p, prec, print_mode, halt, names): 116 pAdicRingBaseGeneric.__init__(self, p, prec, print_mode, names) 119 117 self._halt = halt 120 118 … … 170 168 if x.type() == "t_PADIC": 171 169 try: 170 from sage.rings.padics.qp import Qp 172 171 return lazy.pAdicLazy_otherpadic(self, Qp(parent.prime(), x.padicprec(parent.prime()) - x.valuation(parent.prime()), 'capped-rel')(x), absprec, relprec) 173 172 except PariError: … … 247 246 Returns the fraction field of self. 248 247 """ 249 return Qp(self.prime(), self.precision_cap(), 'lazy', self.get_print_mode(), self.halting_parameter()) 248 from sage.rings.padics.qp import Qp 249 return Qp(self.prime(), self.precision_cap(), 'lazy', self.print_mode(), self.halting_parameter()) 250 250 251 251 def random_element(self): -
sage/rings/padics/qp.py
r3415 r3667 2 2 import sage.rings.padics.padic_field_capped_relative 3 3 import sage.rings.padics.padic_field_lazy 4 import sage.rings.padics.unramified_field_extension_capped_relative 5 import sage.rings.padics.unramified_field_extension_lazy 6 4 7 5 8 Integer = sage.rings.integer.Integer 6 9 pAdicFieldCappedRelative = sage.rings.padics.padic_field_capped_relative.pAdicFieldCappedRelative 7 10 pAdicFieldLazy = sage.rings.padics.padic_field_lazy.pAdicFieldLazy 11 UnramifiedFieldExtensionCappedRelative = sage.rings.padics.unramified_field_extension_capped_relative.UnramifiedFieldExtensionCappedRelative 12 UnramifiedFieldExtensionLazy = sage.rings.padics.unramified_field_extension_lazy.UnramifiedFieldExtensionLazy 8 13 9 14 10 15 padic_field_cache = {} 11 def Qp(p, prec = 20, type = 'capped-rel', print_mode = None, halt = 40, check = True):16 def Qp(p, prec = 20, type = 'capped-rel', print_mode = None, halt = 40, names = None, check = True): 12 17 """ 13 18 A creation function for p-adic fields. … … 54 59 elif isinstance(halt, (int, long)): 55 60 halt = Integer(halt) 61 if names is None: 62 names = str(p) 56 63 if type != 'lazy': 57 key = (p, prec, type )64 key = (p, prec, type, names) 58 65 else: 59 key = (p, prec, halt )66 key = (p, prec, halt, names) 60 67 if padic_field_cache.has_key(key): 61 68 K = padic_field_cache[key]() … … 66 73 K.set_print_mode('series') 67 74 return K 68 if print_mode ==None:75 if print_mode is None: 69 76 print_mode = 'series' 70 77 if (type == 'capped-rel'): 71 K = pAdicFieldCappedRelative(p, prec, print_mode )78 K = pAdicFieldCappedRelative(p, prec, print_mode, names) 72 79 elif (type == 'lazy'): 73 K = pAdicFieldLazy(p, prec, print_mode, halt )80 K = pAdicFieldLazy(p, prec, print_mode, halt, names) 74 81 else: 75 82 raise ValueError, "type must be either 'capped-rel' or 'lazy'" … … 79 86 pAdicField = Qp # for backwards compatibility; and it's not hard. 80 87 81 qadic_field_cache = {} 82 def Qq(q, names=None, prec=20, type='capped-rel', print_mode=None, halt=40, modulus=None, check=True): 88 def Qq(q, prec = None, type = 'capped-rel', modulus = None, names=None, print_mode="series", halt=40, qp_name = None, check=True): 83 89 r""" 84 90 Given a prime power q = p^n, return the unique unramified extension … … 90 96 91 97 from sage.rings.integer import Integer 92 from sage.rings.polynomial_ring import PolynomialRing93 from sage.rings.padics.unramified_ring_extension import UnramifiedRingExtension94 from sage.rings.integer_ring import ZZ95 96 98 if check: 97 99 if names is None: … … 117 119 raise ValueError, "q must be a prime power" 118 120 if F[0][1] == 1: 119 return Qp(q, prec, type, print_mode, halt) 120 121 if type != 'lazy': 122 key = (q, names, prec, type) 123 else: 124 key = (q, names, prec, halt) 125 if qadic_field_cache.has_key(key): 126 K = qadic_field_cache[key]() 127 if not (K is None): 128 if not (print_mode is None): 129 K.set_print_mode(print_mode) 130 return K 131 121 return Qp(q, prec, type, print_mode, halt, names, check) 122 base = Qp(F[0][0], prec, type, print_mode, halt, qp_name, check = False) 132 123 if modulus is None: 133 check = False134 124 from sage.rings.finite_field import GF 135 modulus = PolynomialRing(Qp(F[0][0], prec, type, print_mode, halt), names)(GF(q,names).modulus().change_ring(ZZ)) 136 if print_mode is None: 137 print_mode = 'series' 138 K = UnramifiedRingExtension(modulus, prec, print_mode, check) 139 qadic_field_cache[key] = weakref.ref(K) 140 141 return K 125 from sage.rings.integer_ring import ZZ 126 modulus = PolynomialRing(base, 'x')(GF(q, names).modulus().change_ring(ZZ)) 127 return ExtensionFactory(base, modulus, prec, names, print_mode, halt, check, unram = True) 142 128 -
sage/rings/padics/zp.py
r3414 r3667 5 5 import sage.rings.padics.padic_ring_lazy 6 6 import sage.rings.integer 7 import sage.rings.padics.unramified_ring_extension_capped_relative 8 import sage.rings.padics.unramified_ring_extension_capped_absolute 9 import sage.rings.padics.unramified_ring_extension_fixed_mod 10 import sage.rings.padics.unramified_ring_extension_lazy 11 7 12 8 13 from sage.rings.integer_ring import ZZ 9 14 10 15 from sage.rings.polynomial_ring import PolynomialRing 11 import sage.rings.padics.unramified_ring_extension12 16 17 UnramifiedRingExtensionCappedRelative = sage.rings.padics.unramified_ring_extension_capped_relative.UnramifiedRingExtensionCappedRelative 18 UnramifiedRingExtensionCappedAbsolute = sage.rings.padics.unramified_ring_extension_capped_absolute.UnramifiedRingExtensionCappedAbsolute 19 UnramifiedRingExtensionFixedMod = sage.rings.padics.unramified_ring_extension_fixed_mod.UnramifiedRingExtensionFixedMod 20 UnramifiedRingExtensionLazy = sage.rings.padics.unramified_ring_extension_lazy.UnramifiedRingExtensionLazy 13 21 pAdicRingCappedRelative = sage.rings.padics.padic_ring_capped_relative.pAdicRingCappedRelative 14 22 pAdicRingCappedAbsolute = sage.rings.padics.padic_ring_capped_absolute.pAdicRingCappedAbsolute … … 16 24 pAdicRingLazy = sage.rings.padics.padic_ring_lazy.pAdicRingLazy 17 25 Integer = sage.rings.integer.Integer 18 UnramifiedRingExtension = sage.rings.padics.unramified_ring_extension.UnramifiedRingExtension19 26 20 27 padic_ring_cache = {} 21 def Zp(p, prec = 20, type = 'capped-rel', print_mode = None, halt = 40, check=True):28 def Zp(p, prec = 20, type = 'capped-rel', print_mode = None, halt = 40, names = None, check=True): 22 29 """ 23 30 A creation function for p-adic rings. … … 65 72 elif isinstance(halt, (int, long)): 66 73 halt = Integer(halt) 74 if names is None: 75 names = str(p) 67 76 if type != 'lazy': 68 key = (p, prec, type )77 key = (p, prec, type, names) 69 78 else: 70 key = (p, prec, halt )79 key = (p, prec, halt, names) 71 80 if padic_ring_cache.has_key(key): 72 81 K = padic_ring_cache[key]() … … 78 87 print_mode = 'series' 79 88 if (type == 'capped-rel'): 80 K = pAdicRingCappedRelative(p, prec, print_mode )89 K = pAdicRingCappedRelative(p, prec, print_mode, names) 81 90 elif (type == 'fixed-mod'): 82 K = pAdicRingFixedMod(p, prec, print_mode )91 K = pAdicRingFixedMod(p, prec, print_mode, names) 83 92 elif (type == 'capped-abs'): 84 K = pAdicRingCappedAbsolute(p, prec, print_mode )93 K = pAdicRingCappedAbsolute(p, prec, print_mode, names) 85 94 elif (type == 'lazy'): 86 K = pAdicRingLazy(p, prec, print_mode, halt )95 K = pAdicRingLazy(p, prec, print_mode, halt, names) 87 96 else: 88 97 raise ValueError, "type must be one of 'capped-rel', 'fixed-mod', 'capped-abs' or 'lazy'" … … 90 99 return K 91 100 92 qadic_ring_cache = {} 93 def Zq(q, prec = 20, type = 'capped-abs', modulus = None, names=None, print_mode = None, halt = 40, check = True): 101 def Zq(q, prec = 20, type = 'capped-abs', modulus = None, names=None, print_mode = None, halt = 40, zp_name = None, check = True): 94 102 r""" 95 103 The creation function for unramified extensions of $\Z_p$ … … 117 125 raise ValueError, "q must be a prime power" 118 126 if F[0][1] == 1: 119 return Zp(q, prec, type, print_mode, halt) 120 if type != 'lazy': 121 key = (q, names, prec, type, modulus) 122 else: 123 key = (q, names, prec, halt, modulus) 124 if qadic_ring_cache.has_key(key): 125 K = qadic_ring_cache[key]() 126 if not (K is None): 127 if not (print_mode is None): 128 K.set_print_mode(print_mode) 129 return K 127 return Zp(q, prec, type, print_mode, halt, names, check) 128 base = Zp(F[0][0], prec, type, print_mode, halt, zp_name, check = False) 130 129 if modulus is None: 131 check = False132 130 from sage.rings.finite_field import GF 133 modulus = PolynomialRing(Zp(F[0][0], prec, type, print_mode, halt), names)(GF(q, names).modulus().change_ring(ZZ)) 134 if print_mode is None: 135 print_mode = 'series' 136 K = UnramifiedRingExtension(modulus, prec, print_mode, check) 137 qadic_ring_cache[key] = weakref.ref(K) 138 return K 139 131 if zp_name is None: 132 zp_name = str(p) 133 modulus = PolynomialRing(base, 'x')(GF(q, names).modulus().change_ring(ZZ)) 134 return ExtensionFactory(base, modulus, prec, names, print_mode, halt, check, unram = True) -
sage/rings/polynomial_ring.py
r3407 r3667 285 285 286 286 def __set_polynomial_class(self, cls=None): 287 from padics.unramified_ring_extension import UnramifiedRingExtension #here for a hack. Should be removed after hack is gone288 287 if not (cls is None): 289 288 self.__polynomial_class = cls … … 298 297 elif isinstance(R, padics.padic_field_lazy.pAdicFieldLazy): 299 298 self.__polynomial_class = polynomial_element_generic.Polynomial_padic_field_lazy_dense 300 elif isinstance(R, UnramifiedRingExtension) and R.ground_ring_of_tower().is_field():301 #hack. Should be removed after we fix inheretance structure302 self.__polynomial_class = polynomial_element_generic.Polynomial_padic_field_dense303 299 elif isinstance(R, padics.padic_ring_generic.pAdicRingGeneric): 304 300 self.__polynomial_class = polynomial_element_generic.Polynomial_padic_ring_dense -
sage/rings/polynomial_ring_constructor.py
r3407 r3667 260 260 def _single_variate(base_ring, name, sparse): 261 261 import polynomial_ring as m 262 import padics.unramified_ring_extension #needed for hack; should be deleted after hack is removed263 262 name = normalize_names(1, name) 264 263 key = (base_ring, name, sparse) … … 281 280 elif isinstance(base_ring, padics.padic_field_lazy.pAdicFieldLazy): 282 281 R = m.PolynomialRing_padic_field_lazy(base_ring, name) 283 284 elif isinstance(base_ring, padics.unramified_ring_extension.UnramifiedRingExtension) and base_ring.ground_ring_of_tower().is_field():285 # Hack to get unramified field extension polynomials working in the short term.286 R = m.PolynomialRing_padic_field(base_ring, name)287 282 288 283 elif isinstance(base_ring, padics.padic_field_generic.pAdicFieldGeneric): -
sage/structure/element.pyx
r3415 r3417 1920 1920 return op(x1,y1) 1921 1921 except TypeError, msg: 1922 print msg # this can be useful for debugging.1922 #print msg # this can be useful for debugging. 1923 1923 if not op is operator.mul: 1924 1924 raise TypeError, arith_error_message(x,y,op)
Note: See TracChangeset
for help on using the changeset viewer.
