Skip to content

Commit

Permalink
is_ordinary/is_supersingular + more doctests
Browse files Browse the repository at this point in the history
  • Loading branch information
xcaruso committed Jul 9, 2023
1 parent f87597c commit 1e75afd
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 36 deletions.
21 changes: 0 additions & 21 deletions src/sage/rings/function_field/drinfeld_modules/drinfeld_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -1341,27 +1341,6 @@ def is_isomorphic(self, other, absolutely=False):
raise NotImplementedError(f"cannot solve the equation u^{e} == {ue}")
return True

def is_supersingular(self):
r"""
Return ``True`` if the Drinfeld module is supersingular.
A Drinfeld module is supersingular if and only if its
height equals its rank.
EXAMPLES::
sage: Fq = GF(343)
sage: A.<T> = Fq[]
sage: K.<z6> = Fq.extension(2)
sage: phi = DrinfeldModule(A, [1, 0, z6])
sage: phi.is_supersingular()
True
sage: phi(phi.characteristic()) # Purely inseparable
z6*t^2
"""
return self.height() == self.rank()

def is_finite(self) -> bool:
r"""
Return ``True`` if this Drinfeld module is finite,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -487,13 +487,43 @@ def invert(self, ore_pol):
pass
raise ValueError('input must be in the image of the Drinfeld module')

def is_supersingular(self):
r"""
Return ``True`` if this Drinfeld module is supersingular.
A Drinfeld module is supersingular if and only if its
height equals its rank.
EXAMPLES::
sage: Fq = GF(343)
sage: A.<T> = Fq[]
sage: K.<z6> = Fq.extension(2)
sage: phi = DrinfeldModule(A, [1, 0, z6])
sage: phi.is_supersingular()
True
sage: phi(phi.characteristic()) # Purely inseparable
z6*t^2
In rank two, a Drinfeld module is either ordinary or
supersinguler. In higher ranks, it could be neither of
the two::
sage: psi = DrinfeldModule(A, [1, 0, z6, z6])
sage: psi.is_ordinary()
False
sage: psi.is_supersingular()
False
"""
return self.height() == self.rank()

def is_ordinary(self):
r"""
Return ``True`` if the Drinfeld module is ordinary; raise a
NotImplementedError if the rank is not two.
Return ``True`` if this Drinfeld module is ordinary.
A rank two Drinfeld module is *ordinary* if and only if it is
not supersingular; see :meth:`is_supersingular`.
A Drinfeld module is supersingular if and only if its
height is one.
EXAMPLES::
Expand All @@ -503,9 +533,12 @@ def is_ordinary(self):
sage: phi = DrinfeldModule(A, [1, 0, z6])
sage: phi.is_ordinary()
False
sage: phi_p = phi(phi.characteristic())
sage: phi_p # Purely inseparable
z6*t^2
::
sage: phi = DrinfeldModule(A, [1, z6, 0, z6])
sage: phi.is_ordinary()
True
"""
self._check_rank_two()
return not self.is_supersingular()
return self.height() == 1
42 changes: 39 additions & 3 deletions src/sage/rings/function_field/drinfeld_modules/homset.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,39 @@
class DrinfeldModuleMorphismAction(Action):
r"""
Action of the function ring on the homset of a Drinfeld module.
"""
EXAMPLES::
sage: Fq = GF(5)
sage: A.<T> = Fq[]
sage: K.<z> = Fq.extension(3)
sage: phi = DrinfeldModule(A, [z, 1, z])
sage: psi = DrinfeldModule(A, [z, z^2 + 4*z + 3, 2*z^2 + 4*z + 4])
sage: H = Hom(phi, psi)
sage: t = phi.ore_variable()
sage: f = H(t + 2)
Left action::
sage: (T + 1) * f
Drinfeld Module morphism:
From: Drinfeld module defined by T |--> z*t^2 + t + z
To: Drinfeld module defined by T |--> (2*z^2 + 4*z + 4)*t^2 + (z^2 + 4*z + 3)*t + z
Defn: (2*z^2 + 4*z + 4)*t^3 + (2*z + 1)*t^2 + (2*z^2 + 4*z + 2)*t + 2*z + 2
Right action currently does not work (it is a known bug, due to an
incompatibility between multiplication of morphisms and the coercion
system)::
sage: f * (T + 1)
Traceback (most recent call last):
...
TypeError: right (=T + 1) must be a map to multiply it by Drinfeld Module morphism:
From: Drinfeld module defined by T |--> z*t^2 + t + z
To: Drinfeld module defined by T |--> (2*z^2 + 4*z + 4)*t^2 + (z^2 + 4*z + 3)*t + z
Defn: t + 2
"""
def __init__(self, A, H, is_left, op):
r"""
Initialize this action.
Expand Down Expand Up @@ -349,8 +380,6 @@ def _element_constructor_(self, *args, **kwds):
Return the Drinfeld module morphism defined by the given Ore
polynomial.
INPUT: an Ore polynomial
EXAMPLES::
sage: Fq = GF(27)
Expand All @@ -365,6 +394,13 @@ def _element_constructor_(self, *args, **kwds):
sage: identity_morphism
Identity morphism of Drinfeld module defined by T |--> 2*t^2 + z6*t + z6
::
sage: scalar_multiplication = E(T)
sage: scalar_multiplication
Endomorphism of Drinfeld module defined by T |--> 2*t^2 + z6*t + z6
Defn: 2*t^2 + z6*t + z6
::
sage: frobenius_endomorphism = E(t^6)
Expand Down
13 changes: 10 additions & 3 deletions src/sage/rings/function_field/drinfeld_modules/morphism.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,17 +135,24 @@ def __classcall_private__(cls, parent, x):
- ``parent`` -- the Drinfeld module homset
- ``x`` -- the Ore polynomial defining the morphism or a
DrinfeldModuleMorphism
- ``x`` -- a morphism of Drinfeld modules or an element
(either an Ore polynomial or an element in the base
ring) defining it
TESTS::
sage: Fq = GF(2)
sage: A.<T> = Fq[]
sage: K.<z6> = Fq.extension(6)
sage: phi = DrinfeldModule(A, [z6, 1, 1])
sage: psi = DrinfeldModule(A, [z6, z6^4 + z6^2 + 1, 1])
sage: End(phi)(T + 1)
Endomorphism of Drinfeld module defined by T |--> t^2 + t + z6
Defn: t^2 + t + z6 + 1
::
sage: t = phi.ore_polring().gen()
sage: psi = DrinfeldModule(A, [z6, z6^4 + z6^2 + 1, 1])
sage: morphism = Hom(phi, psi)(t + z6^5 + z6^2 + 1)
sage: morphism is Hom(phi, psi)(morphism)
True
Expand Down

0 comments on commit 1e75afd

Please sign in to comment.