-
-
Notifications
You must be signed in to change notification settings - Fork 654
Description
Edit (2022-09-27). A lot has changed since the original post. Here is a quick update.
What is a Drinfeld module?
Let L
be a finite field extension of \Fq
and fix a ring morphism \gamma: \Fq[X] \to L
. Let \Ltau
be the ring of Ore polynomials with coefficients in L
and whose generator is the Frobenius endomorphism \tau: x \mapsto x^q
. A Drinfeld module over the morphism \gamma
\phi
is uniquely defined by an \Fq
-algebra morphism \Fq[X] \to \Ltau, P \mapsto \phi_P
, verifying \phi_X = \gamma(X) + a_1\tau + \dots + a_r\tau^r
and r > 0
.
A morphism of Drinfeld modules u: \phi \to \psi
is defined by an Ore polynomial u \in \Ltau
verifying u \phi_X = \psi_X u
.
Drinfeld modules and their morphisms are the object and morphisms of the category of Drinfeld modules defined over the morphism \gamma
.
A Drinfeld module induces an \Fq[X]
-module law on L
, defined by a \star z = \phi_a(z)
, where a \in \Fq[X]
and z \in L
. This is referred to as the Drinfeld module action induced by \phi
.
Overview
We created:
DrinfeldModule(Parent, UniqueRepresentation)
;FiniteDrinfeldModule(DrinfeldModule)
;DrinfeldModuleAction(Action)
;DrinfeldModules(Category_over_base)
;DrinfeldModuleHomset(Homset)
;DrinfeldModuleMorphism(Morphism, UniqueRepresentation)
.
Here is a short demo:
sage: Fq = GF(2)
sage: FqX.<X> = Fq[]
sage: K.<i> = Fq.extension(2)
sage: phi = DrinfeldModule(FqX, [i, i, 1])
sage: phi
Drinfeld module defined by X |--> t^2 + i*t + i over base Ring morphism:
From: Univariate Polynomial Ring in X over Finite Field of size 2 (using GF2X)
To: Finite Field in i of size 2^2
Defn: X |--> i
sage: phi(X)
t^2 + i*t + i
sage: psi = DrinfeldModule(FqX, [i, i+1, 1])
sage: t = phi.ore_polring().gen()
sage: i + t in Hom(phi, psi)
True
sage: phi.velu(i + t)
Drinfeld module defined by X |--> t^2 + (i + 1)*t + i over base Ring morphism:
From: Univariate Polynomial Ring in X over Finite Field of size 2 (using GF2X)
To: Finite Field in i of size 2^2
Defn: X |--> i
I would like to propose an implementation for finite Drinfeld modules. I
opened this ticket to discuss this idea and have feedback on implementation
directions, in order to comply with Sage's guidelines. Please feel free to express any doubt or criticism, or give ideas! I very much value the collaborative aspect of the SageMath community.
Motivation
A finite Drinfeld module is defined as follows. Let Fq
be a finite fields
with q
elements, let L
be a finite extension of Fq
. Consider the
\Fqbar
-linear endomorphism \tau: x \mapsto x^q
, and define L\{\tau\}
as
the ring of Ore polynomials in \tau
with coefficients in L
(see [ticket: 29629]). Also fix \omega
a non zero element of
L
. An \Fq
-Drinfeld module defined over L
is, by definition, an
\Fq
-algebra morphism \phi: \Fq[X]\toL\{\tau\}
such that:
\phi(X)
as constant coefficient\omega
,\phi(\Fq[X])
is not contained inL
.
At the moment, there exists no such implementation in Sage.
Drinfeld modules are standard arithmetic tools in the theory of function
fields. See [Goss, Basic structures of function field arithmetic, 1998],
[Rosen, Number theory in function fields, 2002]. Good resources are also
[Gekeler, On finite Drinfeld modules, 1991], [Hayes, ''A brief introduction to
Drinfeld modules*, 1991] and [Caranay, Greenberg, Scheidler, *Computing modular
polynomials and isogenies of rank two Drinfeld modules'', 2020]. The author of
this ticket got interested in Drinfeld modules with isogeny-based cryptographic
applications in mind; see https://arxiv.org/abs/2203.06970.
I am a first-year PhD student working with
P.-J. Spaenlehauer and
E. Thomé.
Implementation details
I propose three classes: FiniteDrinfeldModule
, FiniteDrinfeldModulesRankSet
and FiniteDrinfeldModulesSet
.
The FiniteDrinfeldModule
class
This is the class for representing finite Drinfeld modules. It must be
instantiated with a polynomial ring and an Ore polynomial ring:
sage: Fq = GF(2)
sage: L = Fq.extension(2)
sage: FqX.<X> = Fq[]
sage: Ltau.<t> = OrePolynomialRing(L, L.frobenius_endomorphism())
sage: omega = L.gen()
sage: phi_X = omega + t + t^2
sage: phi = FiniteDrinfeldModule(FqX, Ltau, phi_X) # phi is only defined by the image of X
Here are the methods that I wish to add in the first version:
sage: phi.generator() # phi_X
t^2 + t + z2
sage: phi(X^2) # Magic method __call__
t^4 + t^2 + t + z2 + 1
sage: phi.polynomial_ring # Property, reference to FqX
Univariate Polynomial Ring in X over Finite Field of size 2 (using GF2X)
sage: phi.ore_polynomial_ring # Property, reference to Ltau
Ore Polynomial Ring in t over Finite Field in z2 of size 2^2 twisted by z2 |--> z2^2
sage: phi.rank # Property, rank of phi
2
sage: phi.frobenius # Property, returns t
t
sage: phi.omega # Property, returns omega
z2
sage: phi.Fq # Property, reference to Fq
Finite Field of size 2
sage: phi.definition_field # Property, reference to L
Finite Field in z2 of size 2^2
sage: phi.j_invariant # Only if rank is 2, returns j-invariant
1
A crucial feature of finite Drinfeld module is that they endow the algebraic
closure \Fqbar
with a structure of left-\Fq[X]
-module. I think the most
appropriate mechanism is to have a method algebraic_closure_action
return a
LeftModuleAction
(see
https://doc.sagemath.org/html/en/reference/coercion/sage/structure/coerce_actions.html#sage.structure.coerce_actions.LeftModuleAction).
I am not yet sure if it is the best way to do it.
On top of this, the first version should be well doctested and include Sage's
own magic method (_repr_
, _latex
, etc).
In further versions, I wish to include:
- methods in isogenies of Drinfeld modules (esp. Vélu's formula for Drinfeld modules);
- methods on the torsion of Drinfeld modules (module law and vector space law);
- class methods (instanciate a random Drinfeld module, or from a j-invariant);
- methods on the well-definition of a Drinfeld module on some sub-field of L.
Naturally, any input (especially negative) is more than welcome!
The FiniteDrinfeldModulesRankSet
and FiniteDrinfeldModulesSet
classes
To comply with the coercion model (see
https://doc.sagemath.org/html/en/developer/coding_in_python.html#the-sage-coercion-model,
https://doc.sagemath.org/html/en/reference/coercion/index.html), any instance
of FiniteDrinfeldModule
must have a parent. I was thinking about creating a
class FiniteDrinfeldModulesRankSet
, representing the set of all finite
Drinfeld modules (with FqX
, Ltau
and omega
fixed) with a prescribed rank.
The class FiniteDrinfeldModulesSet
is the same, except the rank can be
arbitrary.
The details are not clear to me at this point.
Development environment
It is not clear to me yet in which environment I should work: tox virtual
environment, Docker ?.. Any advice is more than welcome.
Depends on #34692
CC: @xcaruso @mbombar @zimmermann6 @DavidAyotte @spaenlehauer
Component: number theory
Keywords: Drinfeld modules, Ore polynomials, Function fields
Author: Antoine Leudière
Branch/Commit: public/drinfeld_module @ 6982ae0
Issue created by migration from https://trac.sagemath.org/ticket/33713