Skip to content

Commit 6562754

Browse files
committed
using Parent in ring extensions
1 parent 1b3f398 commit 6562754

File tree

7 files changed

+64
-46
lines changed

7 files changed

+64
-46
lines changed

src/sage/rings/morphism.pyx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2879,8 +2879,10 @@ cdef class FrobeniusEndomorphism_generic(RingHomomorphism):
28792879
over Finite Field of size 5
28802880
"""
28812881
from sage.rings.ring import CommutativeRing
2882+
from sage.categories.commutative_rings import CommutativeRings
28822883
from sage.categories.homset import Hom
2883-
if not isinstance(domain, CommutativeRing):
2884+
if not (domain in CommutativeRings() or
2885+
isinstance(domain, CommutativeRing)): # TODO: remove this line
28842886
raise TypeError("The base ring must be a commutative ring")
28852887
self._p = domain.characteristic()
28862888
if not self._p.is_prime():

src/sage/rings/number_field/order.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,9 @@
7777
# https://www.gnu.org/licenses/
7878
# ****************************************************************************
7979

80+
from sage.categories.integral_domains import IntegralDomains
8081
from sage.misc.cachefunc import cached_method
81-
from sage.rings.ring import IntegralDomain
82+
from sage.structure.parent import Parent
8283
from sage.structure.sequence import Sequence
8384
from sage.rings.integer_ring import ZZ
8485
import sage.rings.abc
@@ -426,7 +427,7 @@ def EquationOrder(f, names, **kwds):
426427
return K.order(K.gens())
427428

428429

429-
class Order(IntegralDomain, sage.rings.abc.Order):
430+
class Order(Parent, sage.rings.abc.Order):
430431
r"""
431432
An order in a number field.
432433
@@ -478,8 +479,8 @@ def __init__(self, K):
478479
0.0535229072603327 + 1.20934552493846*I
479480
"""
480481
self._K = K
481-
IntegralDomain.__init__(self, ZZ, names=K.variable_names(),
482-
normalize=False)
482+
Parent.__init__(self, base=ZZ, names=K.variable_names(),
483+
normalize=False, category=IntegralDomains())
483484
self._populate_coercion_lists_(embedding=self.number_field())
484485
if self.absolute_degree() == 2:
485486
self.is_maximal() # cache
@@ -665,7 +666,7 @@ def krull_dimension(self):
665666
sage: O2.krull_dimension()
666667
1
667668
"""
668-
return ZZ(1)
669+
return ZZ.one()
669670

670671
def integral_closure(self):
671672
r"""
@@ -733,6 +734,20 @@ def ngens(self):
733734
"""
734735
return self.absolute_degree()
735736

737+
def gens(self) -> tuple:
738+
"""
739+
Return the generators as a tuple.
740+
741+
EXAMPLES::
742+
743+
sage: x = polygen(ZZ, 'x')
744+
sage: K.<a> = NumberField(x^3 + x^2 - 2*x + 8)
745+
sage: O = K.maximal_order()
746+
sage: O.gens()
747+
(1, 1/2*a^2 + 1/2*a, a^2)
748+
"""
749+
return tuple(self.gen(i) for i in range(self.absolute_degree()))
750+
736751
def basis(self): # this must be defined in derived class
737752
r"""
738753
Return a basis over `\ZZ` of this order.

src/sage/rings/ring_extension.pxd

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from sage.categories.map cimport Map
2-
from sage.rings.ring cimport CommutativeRing
2+
from sage.structure.parent cimport Parent
33

44

5-
cdef class RingExtension_generic(CommutativeRing):
5+
cdef class RingExtension_generic(Parent):
66
cdef _type
77
cdef _backend
88
cdef _defining_morphism
@@ -15,10 +15,10 @@ cdef class RingExtension_generic(CommutativeRing):
1515
cdef type _fraction_field_type
1616

1717
cpdef is_defined_over(self, base)
18-
cpdef CommutativeRing _check_base(self, CommutativeRing base)
19-
cpdef _degree_over(self, CommutativeRing base)
20-
cpdef _is_finite_over(self, CommutativeRing base)
21-
cpdef _is_free_over(self, CommutativeRing base)
18+
cpdef Parent _check_base(self, Parent base)
19+
cpdef _degree_over(self, Parent base)
20+
cpdef _is_finite_over(self, Parent base)
21+
cpdef _is_free_over(self, Parent base)
2222
cdef Map _defining_morphism_fraction_field(self, bint extend_base)
2323

2424

@@ -31,10 +31,11 @@ cdef class RingExtensionWithBasis(RingExtension_generic):
3131
cdef _basis_names
3232
cdef _basis_latex_names
3333

34-
cpdef _basis_over(self, CommutativeRing base)
35-
# cpdef _free_module(self, CommutativeRing base, bint map)
34+
cpdef _basis_over(self, Parent base)
35+
# cpdef _free_module(self, Parent base, bint map)
3636

3737

3838
cdef class RingExtensionWithGen(RingExtensionWithBasis):
3939
cdef _gen
4040
cdef _name
41+
cdef public object _latex_names

src/sage/rings/ring_extension.pyx

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,12 @@ from sage.cpython.getattr import dir_with_other_class
117117
from sage.misc.latex import latex, latex_variable_name
118118

119119
from sage.structure.factory import UniqueFactory
120+
from sage.structure.parent cimport Parent
120121
from sage.structure.element cimport Element
121122
from sage.structure.category_object import normalize_names
122123
from sage.categories.map cimport Map
123124
from sage.categories.commutative_rings import CommutativeRings
124125
from sage.categories.fields import Fields
125-
from sage.rings.ring cimport CommutativeRing
126126
from sage.rings.integer_ring import ZZ
127127
from sage.rings.infinity import Infinity
128128

@@ -497,7 +497,7 @@ RingExtension = RingExtensionFactory("sage.rings.ring_extension.RingExtension")
497497
# General extensions
498498
####################
499499

500-
cdef class RingExtension_generic(CommutativeRing):
500+
cdef class RingExtension_generic(Parent):
501501
r"""
502502
A generic class for all ring extensions.
503503
@@ -564,8 +564,8 @@ cdef class RingExtension_generic(CommutativeRing):
564564
...
565565
ValueError: exotic defining morphism between two rings in the tower; consider using another variable name
566566
"""
567-
cdef CommutativeRing base, ring
568-
cdef CommutativeRing b, backend
567+
cdef Parent base, ring
568+
cdef Parent b, backend
569569
cdef Map f
570570

571571
base = defining_morphism.domain()
@@ -575,7 +575,7 @@ cdef class RingExtension_generic(CommutativeRing):
575575
# but CommutativeRings() seems safer, especially when dealing with
576576
# morphisms which do not need to preserve the base
577577
category = CommutativeRings()
578-
CommutativeRing.__init__(self, ZZ, category=category)
578+
Parent.__init__(self, ZZ, category=category)
579579
self._base = base
580580
self._backend = ring
581581
self._backend_defining_morphism = defining_morphism
@@ -1197,14 +1197,14 @@ cdef class RingExtension_generic(CommutativeRing):
11971197
11981198
:meth:`base`, :meth:`bases`, :meth:`absolute_base`
11991199
"""
1200-
cdef CommutativeRing b
1200+
cdef Parent b
12011201
b = self
12021202
while isinstance(b, RingExtension_generic):
12031203
if b is base or (<RingExtension_generic>b)._backend is base: return True
12041204
b = (<RingExtension_generic>b)._base
12051205
return b is base
12061206

1207-
cpdef CommutativeRing _check_base(self, CommutativeRing base):
1207+
cpdef Parent _check_base(self, Parent base):
12081208
r"""
12091209
Check if ``base`` is one of the successive bases of this
12101210
extension and, if it is, normalize it.
@@ -1243,7 +1243,7 @@ cdef class RingExtension_generic(CommutativeRing):
12431243
sage: L._check_base(None) is L.base() # needs sage.rings.finite_rings
12441244
True
12451245
"""
1246-
cdef CommutativeRing b
1246+
cdef Parent b
12471247
if base is None:
12481248
return self._base
12491249
b = self
@@ -1450,7 +1450,7 @@ cdef class RingExtension_generic(CommutativeRing):
14501450
base = self._check_base(base)
14511451
return self._degree_over(base)
14521452

1453-
cpdef _degree_over(self, CommutativeRing base):
1453+
cpdef _degree_over(self, Parent base):
14541454
r"""
14551455
Return the degree of this extension over ``base``.
14561456
@@ -1572,7 +1572,7 @@ cdef class RingExtension_generic(CommutativeRing):
15721572
sage: L.is_finite_over() # needs sage.rings.finite_rings
15731573
True
15741574
"""
1575-
cdef CommutativeRing b
1575+
cdef Parent b
15761576
base = self._check_base(base)
15771577
if base is self:
15781578
return True
@@ -1590,7 +1590,7 @@ cdef class RingExtension_generic(CommutativeRing):
15901590
b = (<RingExtension_generic?>b)._base
15911591
raise NotImplementedError
15921592

1593-
cpdef _is_finite_over(self, CommutativeRing base):
1593+
cpdef _is_finite_over(self, Parent base):
15941594
r"""
15951595
Return whether or not this extension is finite over ``base``.
15961596
@@ -1635,7 +1635,7 @@ cdef class RingExtension_generic(CommutativeRing):
16351635
sage: L.is_free_over() # needs sage.rings.finite_rings
16361636
True
16371637
"""
1638-
cdef CommutativeRing b
1638+
cdef Parent b
16391639
base = self._check_base(base)
16401640
if base is self or base.is_field():
16411641
return True
@@ -1653,7 +1653,7 @@ cdef class RingExtension_generic(CommutativeRing):
16531653
b = (<RingExtension_generic?>b)._base
16541654
raise NotImplementedError
16551655

1656-
cpdef _is_free_over(self, CommutativeRing base):
1656+
cpdef _is_free_over(self, Parent base):
16571657
r"""
16581658
Return whether or not this extension is finite over ``base``.
16591659
@@ -2191,7 +2191,7 @@ cdef class RingExtensionWithBasis(RingExtension_generic):
21912191
b = b.base_ring()
21922192
return base
21932193

2194-
cpdef _degree_over(self, CommutativeRing base):
2194+
cpdef _degree_over(self, Parent base):
21952195
r"""
21962196
Return the degree of this extension over ``base``.
21972197
@@ -2218,7 +2218,7 @@ cdef class RingExtensionWithBasis(RingExtension_generic):
22182218
else:
22192219
return len(self._basis) * self._base._degree_over(base)
22202220

2221-
cpdef _is_finite_over(self, CommutativeRing base):
2221+
cpdef _is_finite_over(self, Parent base):
22222222
r"""
22232223
Return whether or not this extension is finite over ``base``.
22242224
@@ -2237,7 +2237,7 @@ cdef class RingExtensionWithBasis(RingExtension_generic):
22372237
return True
22382238
return self._base._is_finite_over(base)
22392239

2240-
cpdef _is_free_over(self, CommutativeRing base):
2240+
cpdef _is_free_over(self, Parent base):
22412241
r"""
22422242
Return whether or not this extension is free over ``base``.
22432243
@@ -2298,7 +2298,7 @@ cdef class RingExtensionWithBasis(RingExtension_generic):
22982298
base = self._check_base(base)
22992299
return self._basis_over(base)
23002300

2301-
cpdef _basis_over(self, CommutativeRing base):
2301+
cpdef _basis_over(self, Parent base):
23022302
r"""
23032303
Return a basis of this extension over ``base``.
23042304
@@ -2588,7 +2588,6 @@ cdef class RingExtensionWithGen(RingExtensionWithBasis):
25882588
RingExtensionWithBasis.__init__(self, defining_morphism, basis, basis_names, check, **kwargs)
25892589
self._gen = self._backend(gen)
25902590
self._names = (self._name,)
2591-
self._latex_names = (latex_variable_name(self._name),)
25922591
self._basis_latex_names = basis_latex_names
25932592

25942593
def _repr_topring(self, **options):

src/sage/rings/ring_extension_element.pxd

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sage.rings.ring cimport CommutativeRing
1+
from sage.structure.parent cimport Parent
22
from sage.structure.element cimport Element
33
from sage.structure.element cimport CommutativeAlgebraElement
44
from sage.rings.ring_extension cimport RingExtension_generic
@@ -13,10 +13,10 @@ cdef class RingExtensionFractionFieldElement(RingExtensionElement):
1313
pass
1414

1515
cdef class RingExtensionWithBasisElement(RingExtensionElement):
16-
cdef _vector(self, CommutativeRing base)
17-
cdef _matrix(self, CommutativeRing base)
18-
cdef _trace(self, CommutativeRing base)
19-
cdef _norm(self, CommutativeRing base)
16+
cdef _vector(self, Parent base)
17+
cdef _matrix(self, Parent base)
18+
cdef _trace(self, Parent base)
19+
cdef _norm(self, Parent base)
2020
cpdef minpoly(self, base=*, var=*)
2121

2222

src/sage/rings/ring_extension_element.pyx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ from sage.misc.latex import latex
2424

2525
from sage.structure.category_object import normalize_names
2626
from sage.structure.element cimport CommutativeAlgebraElement
27+
from sage.structure.parent cimport Parent
2728
from sage.rings.integer_ring import ZZ
2829
from sage.categories.fields import Fields
2930
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
@@ -1033,7 +1034,7 @@ cdef class RingExtensionWithBasisElement(RingExtensionElement):
10331034
base = (<RingExtension_generic>self._parent)._check_base(base)
10341035
return self._vector(base)
10351036

1036-
cdef _vector(self, CommutativeRing base):
1037+
cdef _vector(self, Parent base):
10371038
r"""
10381039
Return the vector of coordinates of this element over ``base``
10391040
(in the basis output by the method :meth:`basis_over`).
@@ -1198,7 +1199,7 @@ cdef class RingExtensionWithBasisElement(RingExtensionElement):
11981199
raise ValueError("the extension is not finite free")
11991200
return self._matrix(base)
12001201

1201-
cdef _matrix(self, CommutativeRing base):
1202+
cdef _matrix(self, Parent base):
12021203
r"""
12031204
Return the matrix of the multiplication by this element (in
12041205
the basis output by :meth:`basis_over`).
@@ -1286,7 +1287,7 @@ cdef class RingExtensionWithBasisElement(RingExtensionElement):
12861287
raise ValueError("the extension is not finite free")
12871288
return self._trace(base)
12881289

1289-
cdef _trace(self, CommutativeRing base):
1290+
cdef _trace(self, Parent base):
12901291
r"""
12911292
Return the trace of this element over ``base``.
12921293
@@ -1314,7 +1315,7 @@ cdef class RingExtensionWithBasisElement(RingExtensionElement):
13141315
....: assert((x+y).trace(base) == x.trace(base) + y.trace(base))
13151316
"""
13161317
cdef RingExtensionWithBasis parent = self._parent
1317-
cdef CommutativeRing b
1318+
cdef Parent b
13181319
if base is parent:
13191320
return self
13201321
b = parent._base
@@ -1379,7 +1380,7 @@ cdef class RingExtensionWithBasisElement(RingExtensionElement):
13791380
raise ValueError("the extension is not finite free")
13801381
return self._norm(base)
13811382

1382-
cdef _norm(self, CommutativeRing base):
1383+
cdef _norm(self, Parent base):
13831384
r"""
13841385
Return the norm of this element over ``base``.
13851386
@@ -1407,7 +1408,7 @@ cdef class RingExtensionWithBasisElement(RingExtensionElement):
14071408
....: assert((x*y).norm(base) == x.norm(base) * y.norm(base))
14081409
"""
14091410
cdef RingExtensionWithBasis parent = self._parent
1410-
cdef CommutativeRing b
1411+
cdef Parent b
14111412
if base is parent:
14121413
return self
14131414
b = parent._base

src/sage/rings/ring_extension_morphism.pyx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ from sage.structure.richcmp import op_EQ, op_NE
2121

2222
from sage.structure.element cimport Element
2323
from sage.categories.map import Map
24-
from sage.rings.ring cimport CommutativeRing
24+
from sage.structure.parent cimport Parent
2525
from sage.rings.morphism cimport RingMap
2626
from sage.rings.ring_extension cimport RingExtension_generic, RingExtensionWithBasis
2727
from sage.rings.ring_extension_element cimport RingExtensionElement
@@ -57,7 +57,7 @@ cdef are_equal_morphisms(f, g):
5757
sage: H(f^2) == H(g^2) # indirect doctest
5858
True
5959
"""
60-
cdef CommutativeRing b
60+
cdef Parent b
6161
cdef tuple gens
6262
if f is None and g is None:
6363
return True
@@ -821,7 +821,7 @@ cdef class MapRelativeRingToFreeModule(Map):
821821
From: Field in z6 with defining polynomial x^2 + (10*z3^2 + z3 + 6)*x + z3 over its base
822822
To: Vector space of dimension 2 over Finite Field in z3 of size 11^3
823823
"""
824-
cdef CommutativeRing L, base
824+
cdef Parent L, base
825825

826826
self._degree = (<RingExtensionWithBasis>E)._degree_over(K)
827827
self._basis = [ (<RingExtensionElement>x)._backend for x in E.basis_over(K) ]

0 commit comments

Comments
 (0)