Skip to content
This repository has been archived by the owner on Jan 30, 2023. It is now read-only.

Commit

Permalink
Add methods to deal with isogenies in FiniteDrinfeldModule
Browse files Browse the repository at this point in the history
The added methods are:
    - is_morphism,
    - is_endomorphism,
    - is_automorphism,
    - is_isogeny,
    - velu.
  • Loading branch information
kryzar committed May 12, 2022
1 parent 2c24562 commit 0499221
Showing 1 changed file with 44 additions and 0 deletions.
44 changes: 44 additions & 0 deletions src/sage/modules/finite_drinfeld_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,30 @@ def is_supersingular(self):
def is_ordinary(self):
return not self.is_supersingular()

def is_morphism(self, candidate):
return candidate == 0 and self.is_isogeny(candidate)

def is_isogeny(self, candidate):
if not candidate in self.ore_polring():
raise TypeError('The candidate must be in the Ore polynomial ' \
'ring')
if candidate == 0:
return False
elif candidate in self.ore_polring().base_ring():
return True
else:
return self.characteristic().degree().divides(candidate.valuation()) \
and candidate.right_divides(candidate * self.gen())

def is_endomorphism(self, candidate):
return candidate == 0 or self == self.velu(candidate)

def is_automorphism(self, candidate):
if not candidate in self.ore_polring():
raise TypeError('The candidate must be in the Ore polynomial ' \
'ring')
return candidate != 0 and candidate in self._Fq()

def j(self):
if self.rank() != 2:
raise ValueError('The j-invariant is only defined for rank 2 ' \
Expand All @@ -288,6 +312,26 @@ def j(self):
def rank(self):
return self.gen().degree()

def velu(self, candidate):
if not candidate in self.ore_polring():
raise TypeError('The candidate must be in the Ore polynomial ' \
'ring')
# There are two main ways to give the result. The first way is
# to return the Drinfeld module generated by the right-quotient
# of `candidate * self(X)` right-divided by `candidate`. The
# second way is to recursively find the coefficients (see
# arXiv:2203.06970, Eq. 1.1). For now, the former is
# implemented, as it is very easy to write.
if candidate == 0:
return None
if not self.characteristic().degree().divides(candidate.valuation()):
return None
q, r = (candidate * self.gen()).right_quo_rem(candidate)
if r != 0:
return None
else:
return FiniteDrinfeldModule(self.polring(), q, self.characteristic())

##########################
# Special Sage functions #
##########################
Expand Down

0 comments on commit 0499221

Please sign in to comment.