Skip to content

Implementation of finite Drinfeld modules #33713

@kryzar

Description

@kryzar

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 in L.

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions