summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXavier Caruso <xavier.caruso@univ-rennes1.fr>2017-08-02 01:43:20 +0200
committerXavier Caruso <xavier.caruso@univ-rennes1.fr>2017-08-02 01:43:20 +0200
commit858492b4b0cd87dfb63fba0f3ad239801b98cb62 (patch)
tree23edca6d6222719b80a422f9cdd497dd368a78ee
parentFirst more-or-less working implementation (diff)
Second rough implementation of lattice precision
-rw-r--r--src/sage/rings/padics/all.py6
-rw-r--r--src/sage/rings/padics/factory.py393
-rw-r--r--src/sage/rings/padics/lattice_precision.py832
-rw-r--r--src/sage/rings/padics/padic_base_generic.py6
-rw-r--r--src/sage/rings/padics/padic_base_leaves.py191
-rw-r--r--src/sage/rings/padics/padic_lattice_element.py201
-rw-r--r--src/sage/rings/padics/padic_printing.pyx7
7 files changed, 1312 insertions, 324 deletions
diff --git a/src/sage/rings/padics/all.py b/src/sage/rings/padics/all.py
index 9665553..0ca7080 100644
--- a/src/sage/rings/padics/all.py
+++ b/src/sage/rings/padics/all.py
@@ -1,11 +1,9 @@
from __future__ import absolute_import
from .generic_nodes import is_pAdicField, is_pAdicRing
-from .factory import Zp, Zq, Zp as pAdicRing, ZpCR, ZpCA, ZpFM, ZpFP, ZqCR, ZqCA, ZqFM, ZqFP #, ZpL, ZqL
-from .factory import Qp, Qq, Qp as pAdicField, QpCR, QpFP, QqCR, QqFP #, QpL, QqL
+from .factory import Zp, Zq, Zp as pAdicRing, ZpCR, ZpCA, ZpFM, ZpFP, ZpLP, ZqCR, ZqCA, ZqFM, ZqFP #, ZpL, ZqL
+from .factory import Qp, Qq, Qp as pAdicField, QpCR, QpFP, QpLP, QqCR, QqFP #, QpL, QqL
from .factory import pAdicExtension
from .padic_generic import local_print_mode
from .pow_computer import PowComputer
from .pow_computer_ext import PowComputer_ext_maker
from .discrete_value_group import DiscreteValueGroup
-
-from .lattice_precision import ZpLP
diff --git a/src/sage/rings/padics/factory.py b/src/sage/rings/padics/factory.py
index 41fc26b..332bf60 100644
--- a/src/sage/rings/padics/factory.py
+++ b/src/sage/rings/padics/factory.py
@@ -31,8 +31,10 @@ from .padic_base_leaves import (pAdicRingCappedRelative,
pAdicRingCappedAbsolute,
pAdicRingFixedMod,
pAdicRingFloatingPoint,
+ pAdicRingLattice,
pAdicFieldCappedRelative,
- pAdicFieldFloatingPoint)
+ pAdicFieldFloatingPoint,
+ pAdicFieldLattice)
from . import padic_printing
######################################################
@@ -70,7 +72,7 @@ ext_table['u', pAdicFieldFloatingPoint] = UnramifiedExtensionFieldFloatingPoint
#ext_table['u', pAdicRingLazy] = UnramifiedExtensionRingLazy
-def get_key_base(p, prec, type, print_mode, halt, names, ram_name, print_pos, print_sep, print_alphabet, print_max_terms, check, valid_non_lazy_types):
+def get_key_base(p, prec, type, print_mode, halt, names, ram_name, print_pos, print_sep, print_alphabet, print_max_terms, check, valid_non_lazy_types, label=None):
"""
This implements create_key for Zp and Qp: moving it here prevents code duplication.
@@ -80,9 +82,18 @@ def get_key_base(p, prec, type, print_mode, halt, names, ram_name, print_pos, pr
sage: from sage.rings.padics.factory import get_key_base
sage: get_key_base(11, 5, 'capped-rel', None, 0, None, None, None, ':', None, None, True, ['capped-rel'])
- (11, 5, 'capped-rel', 'series', '11', True, '|', (), -1)
+ (11, 5, 'capped-rel', 'series', '11', True, '|', (), -1, None)
sage: get_key_base(12, 5, 'capped-rel', 'digits', 0, None, None, None, None, None, None, False, ['capped-rel'])
- (12, 5, 'capped-rel', 'digits', '12', True, '|', ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B'), -1)
+ (12,
+ 5,
+ 'capped-rel',
+ 'digits',
+ '12',
+ True,
+ '|',
+ ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B'),
+ -1,
+ None)
"""
if check:
if not isinstance(p, Integer):
@@ -157,9 +168,9 @@ def get_key_base(p, prec, type, print_mode, halt, names, ram_name, print_pos, pr
else:
name = str(names)
if type in valid_non_lazy_types:
- key = (p, prec, type, print_mode, name, print_pos, print_sep, tuple(print_alphabet), print_max_terms)
+ key = (p, prec, type, print_mode, name, print_pos, print_sep, tuple(print_alphabet), print_max_terms, label)
elif type == 'lazy':
- key = (p, prec, halt, print_mode, name, print_pos, print_sep, tuple(print_alphabet), print_max_terms)
+ key = (p, prec, halt, print_mode, name, print_pos, print_sep, tuple(print_alphabet), print_max_terms, label)
else:
print(type)
raise ValueError("type must be %s or lazy"%(", ".join(valid_non_lazy_types)))
@@ -471,7 +482,7 @@ class Qp_class(UniqueFactory):
"""
def create_key(self, p, prec = DEFAULT_PREC, type = 'capped-rel', print_mode = None,
halt = DEFAULT_HALT, names = None, ram_name = None, print_pos = None,
- print_sep = None, print_alphabet = None, print_max_terms = None, check = True):
+ print_sep = None, print_alphabet = None, print_max_terms = None, check = True, label = None):
"""
Creates a key from input parameters for ``Qp``.
@@ -480,9 +491,9 @@ class Qp_class(UniqueFactory):
TESTS::
sage: Qp.create_key(5,40)
- (5, 40, 'capped-rel', 'series', '5', True, '|', (), -1)
+ (5, 40, 'capped-rel', 'series', '5', True, '|', (), -1, None)
"""
- return get_key_base(p, prec, type, print_mode, halt, names, ram_name, print_pos, print_sep, print_alphabet, print_max_terms, check, ['capped-rel', 'floating-point'])
+ return get_key_base(p, prec, type, print_mode, halt, names, ram_name, print_pos, print_sep, print_alphabet, print_max_terms, check, ['capped-rel', 'floating-point', 'lattice'], label)
def create_object(self, version, key):
"""
@@ -492,14 +503,14 @@ class Qp_class(UniqueFactory):
TESTS::
- sage: Qp.create_object((3,4,2),(5, 41, 'capped-rel', 'series', '5', True, '|', (), -1))
+ sage: Qp.create_object((3,4,2),(5, 41, 'capped-rel', 'series', '5', True, '|', (), -1, None))
5-adic Field with capped relative precision 41
"""
if version[0] < 3 or (version[0] == 3 and version[1] < 2) or (version[0] == 3 and version[1] == 2 and version[2] < 3):
p, prec, type, print_mode, name = key
print_pos, print_sep, print_alphabet, print_max_terms = None, None, None, None
else:
- p, prec, type, print_mode, name, print_pos, print_sep, print_alphabet, print_max_terms = key
+ p, prec, type, print_mode, name, print_pos, print_sep, print_alphabet, print_max_terms, label = key
if isinstance(type, Integer):
# lazy
raise NotImplementedError("lazy p-adics need more work. Sorry.")
@@ -515,7 +526,7 @@ class Qp_class(UniqueFactory):
return obj
except KeyError:
pass
- p, prec, type, print_mode, name, print_pos, print_sep, print_alphabet, print_max_terms = key
+ p, prec, type, print_mode, name, print_pos, print_sep, print_alphabet, print_max_terms, label = key
if type == 'capped-rel':
if print_mode == 'terse':
@@ -531,6 +542,13 @@ class Qp_class(UniqueFactory):
else:
return pAdicFieldFloatingPoint(p, prec, {'mode': print_mode, 'pos': print_pos, 'sep': print_sep, 'alphabet': print_alphabet,
'ram_name': name, 'max_ram_terms': print_max_terms, 'show_prec': False}, name)
+ elif type == 'lattice':
+ if print_mode == 'terse':
+ return pAdicFieldLattice(p, prec, {'mode': print_mode, 'pos': print_pos, 'sep': print_sep, 'alphabet': print_alphabet,
+ 'ram_name': name, 'max_terse_terms': print_max_terms, 'show_prec': True}, name, label)
+ else:
+ return pAdicFieldLattice(p, prec, {'mode': print_mode, 'pos': print_pos, 'sep': print_sep, 'alphabet': print_alphabet,
+ 'ram_name': name, 'max_ram_terms': print_max_terms, 'show_prec': True}, name, label)
else:
raise ValueError("unexpected type")
@@ -1081,6 +1099,24 @@ def QpFP(p, prec = DEFAULT_PREC, print_mode = None, halt = DEFAULT_HALT, names =
print_pos=print_pos, print_sep=print_sep, print_alphabet=print_alphabet, print_max_terms=print_max_terms,
type = 'floating-point')
+def QpLP(p, prec = DEFAULT_PREC, print_mode = None, halt = DEFAULT_HALT, names = None, print_pos = None,
+ print_sep = None, print_alphabet = None, print_max_terms = None, check=True, label=None):
+ """
+ A shortcut function to create `p`-adic fields with lattice precision.
+
+ See :func:`ZpLP` for more information about this model of precision.
+
+ EXAMPLES::
+
+ sage: R = QpLP(2)
+ sage: R
+ 2-adic Field with lattice precision
+
+ """
+ return Qp(p=p, prec=prec, print_mode=print_mode, halt=halt, check=check, names=names,
+ print_pos=print_pos, print_sep=print_sep, print_alphabet=print_alphabet, print_max_terms=print_max_terms,
+ type = 'lattice', label=label)
+
#def QpL(p, prec = DEFAULT_PREC, print_mode = None, halt = DEFAULT_HALT, names = None, print_pos = None,
# print_sep = None, print_alphabet = None, print_max_terms = None, check=True):
# """
@@ -1521,7 +1557,7 @@ class Zp_class(UniqueFactory):
"""
def create_key(self, p, prec = DEFAULT_PREC, type = 'capped-rel', print_mode = None, halt = DEFAULT_HALT,
names = None, ram_name = None, print_pos = None, print_sep = None, print_alphabet = None,
- print_max_terms = None, check = True):
+ print_max_terms = None, check = True, label = None):
"""
Creates a key from input parameters for ``Zp``.
@@ -1530,12 +1566,21 @@ class Zp_class(UniqueFactory):
TESTS::
sage: Zp.create_key(5,40)
- (5, 40, 'capped-rel', 'series', '5', True, '|', (), -1)
+ (5, 40, 'capped-rel', 'series', '5', True, '|', (), -1, None)
sage: Zp.create_key(5,40,print_mode='digits')
- (5, 40, 'capped-rel', 'digits', '5', True, '|', ('0', '1', '2', '3', '4'), -1)
+ (5,
+ 40,
+ 'capped-rel',
+ 'digits',
+ '5',
+ True,
+ '|',
+ ('0', '1', '2', '3', '4'),
+ -1,
+ None)
"""
return get_key_base(p, prec, type, print_mode, halt, names, ram_name, print_pos, print_sep, print_alphabet,
- print_max_terms, check, ['capped-rel', 'fixed-mod', 'capped-abs', 'floating-point'])
+ print_max_terms, check, ['capped-rel', 'fixed-mod', 'capped-abs', 'floating-point', 'lattice'], label=label)
def create_object(self, version, key):
"""
@@ -1545,7 +1590,7 @@ class Zp_class(UniqueFactory):
TESTS::
- sage: Zp.create_object((3,4,2),(5, 41, 'capped-rel', 'series', '5', True, '|', (), -1))
+ sage: Zp.create_object((3,4,2),(5, 41, 'capped-rel', 'series', '5', True, '|', (), -1, None))
5-adic Ring with capped relative precision 41
"""
if (version[0] < 3 or (len(version) > 1 and version[0] == 3 and version[1] < 2) or
@@ -1553,7 +1598,7 @@ class Zp_class(UniqueFactory):
p, prec, type, print_mode, name = key
print_pos, print_sep, print_alphabet, print_max_terms = None, None, None, None
else:
- p, prec, type, print_mode, name, print_pos, print_sep, print_alphabet, print_max_terms = key
+ p, prec, type, print_mode, name, print_pos, print_sep, print_alphabet, print_max_terms, label = key
if isinstance(type, Integer):
# lazy
raise NotImplementedError("lazy p-adics need more work. Sorry.")
@@ -1562,14 +1607,14 @@ class Zp_class(UniqueFactory):
# keys changed in order to reduce irrelevant duplications: e.g. two Zps with print_mode 'series'
# that are identical except for different 'print_alphabet' now return the same object.
key = get_key_base(p, prec, type, print_mode, 0, name, None, print_pos, print_sep, print_alphabet,
- print_max_terms, False, ['capped-rel', 'fixed-mod', 'capped-abs'])
+ print_max_terms, False, ['capped-rel', 'fixed-mod', 'capped-abs', 'lattice'])
try:
obj = self._cache[version, key]()
if obj is not None:
return obj
except KeyError:
pass
- p, prec, type, print_mode, name, print_pos, print_sep, print_alphabet, print_max_terms = key
+ p, prec, type, print_mode, name, print_pos, print_sep, print_alphabet, print_max_terms, label = key
if type == 'capped-rel':
return pAdicRingCappedRelative(p, prec, {'mode': print_mode, 'pos': print_pos, 'sep': print_sep, 'alphabet': print_alphabet,
'ram_name': name, 'max_ram_terms': print_max_terms}, name)
@@ -1582,6 +1627,9 @@ class Zp_class(UniqueFactory):
elif type == 'floating-point':