Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Drinfeld modules #35026

Merged
merged 220 commits into from Mar 13, 2023
Merged

Drinfeld modules #35026

merged 220 commits into from Mar 13, 2023

Conversation

kryzar
Copy link
Contributor

@kryzar kryzar commented Feb 8, 2023

📚 Description

Fixes #33713.

We implement Drinfeld $\mathbb{F}_q[T]$-modules with a focus towards finite Drinfeld modules. We also implement isogenies of Drinfeld modules. More details in the issue.

📝 Checklist

  • I have made sure that the title is self-explanatory and the description concisely explains the PR.
  • I have linked an issue or discussion.
  • I have created tests covering the changes.
  • I have updated the documentation accordingly.

⌛ Dependencies

None.

kryzar and others added 30 commits April 26, 2022 18:46
This commit is a bit dirty, apologies. There are new getters (see
below), and the commit includes some refactoring of the doctests.

The added getters are:
    - characteristic,
    - constant_term,
    - delta (rank two specific),
    - g (rank two specific),
    - height,
    - j (rank two specific).
The added methods are:
    - frobenius_trace,
    - frobenius_norm,
    - invert (required by frobenius_norm),
    - is_ordinary,
    - is_supersingular,
    - characteristic_polynomial.
The added methods are:
    - is_morphism,
    - is_endomorphism,
    - is_automorphism,
    - is_isogeny,
    - velu.
Rank two finite Drinfeld modules have specific enough properties to have
their own class. Therefore, we created the class
`FiniteDrinfeldModule_rank_two`.

The following methods were moved from `FiniteDrinfeldModule` to
`FiniteDrinfeldModule_rank_two`:
    - characteristic_polynomial,
    - delta,
    - frobenius_norm,
    - frobenius_trace,
    - g,
    - is_ordinary,
    - is_supersingular.

Before this change, those methods were regular methods of just
`FiniteDrinfeldModule`; an exception was raised when the rank of the
Drinfeld module was not two.

Furthermore, the methods `_latex_` and `_repr_` were slightly changed.
- Comment constructor
- Check that codomain of input morphism is a field
- Delete various useless docstrings (they will be written later, at a
  more final stage of development)
- Change gamma to morphism
- Various small enhancements
@codecov-commenter
Copy link

codecov-commenter commented Feb 9, 2023

Codecov Report

Base: 88.59% // Head: 88.60% // Increases project coverage by +0.01% 🎉

Coverage data is based on head (4c5666a) compared to base (fbb4127).
Patch coverage: 94.76% of modified lines in pull request are covered.

Additional details and impacted files
@@             Coverage Diff             @@
##           develop   #35026      +/-   ##
===========================================
+ Coverage    88.59%   88.60%   +0.01%     
===========================================
  Files         2140     2146       +6     
  Lines       396961   397362     +401     
===========================================
+ Hits        351677   352074     +397     
- Misses       45284    45288       +4     
Impacted Files Coverage Δ
...ge/rings/function_field/drinfeld_modules/action.py 86.36% <86.36%> (ø)
...ge/rings/function_field/drinfeld_modules/homset.py 93.33% <93.33%> (ø)
src/sage/categories/drinfeld_modules.py 94.28% <94.28%> (ø)
...n_field/drinfeld_modules/finite_drinfeld_module.py 94.59% <94.59%> (ø)
...function_field/drinfeld_modules/drinfeld_module.py 96.03% <96.03%> (ø)
.../rings/function_field/drinfeld_modules/morphism.py 97.67% <97.67%> (ø)
src/sage/rings/function_field/all.py 100.00% <100.00%> (ø)
src/sage/categories/super_modules_with_basis.py 96.29% <0.00%> (-3.71%) ⬇️
src/sage/groups/additive_abelian/qmodnz.py 91.48% <0.00%> (-2.13%) ⬇️
...rc/sage/categories/super_lie_conformal_algebras.py 95.00% <0.00%> (-1.67%) ⬇️
... and 24 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

@vbraun
Copy link
Member

vbraun commented Feb 26, 2023

pdf docs do not build

@kryzar
Copy link
Contributor Author

kryzar commented Feb 28, 2023

Thanks for the comment. I think the issue is fixed. Here is the end of the output of ./sage --docbuild reference pdf (after a fresh make doc-clean doc-uninstall and make):

Build finished. The built documents can be found in $SAGE_ROOT/sage/local/share/doc/sage/html/en/reference

PDF documents have been created in subdirectories of

  $SAGE_ROOT/sage/local/share/doc/sage/pdf/en/reference

Alternatively, you can open

  $SAGE_ROOT/sage/local/share/doc/sage/pdf/en/reference/index.html

for a webpage listing all of the documents.

I also fixed a few typos.

@github-actions
Copy link

github-actions bot commented Mar 3, 2023

Documentation preview for this PR is ready! 🎉
Built with commit: cda700f

@vbraun vbraun merged commit ee3013b into sagemath:develop Mar 13, 2023
4 of 5 checks passed
@mkoeppe mkoeppe added this to the sage-10.0 milestone Mar 13, 2023
@kryzar
Copy link
Contributor Author

kryzar commented Mar 13, 2023

🍾 🍾 🍾

Many thanks to all coders and reviewers who made this contribution merged!

@kryzar kryzar deleted the drinfeld-module branch March 13, 2023 09:08
vbraun pushed a commit that referenced this pull request May 22, 2023
…odule

    
<!-- ^^^^^
Please provide a concise, informative and self-explanatory title.
Don't put issue numbers in there, do this in the PR body below.
For example, instead of "Fixes #1234" use "Introduce new method to
calculate 1+1"
-->
### 📚 Description

The goal of this PR is to implement the logarithm and the exponential of
a Drinfeld module.

### Background material

Let $\phi:T \mapsto \gamma(T) + g_1 \tau + \cdots + g_r \tau^r$ with
$g_r\neq 0$ be a rank $r$ Drinfeld module and let $\Lambda\subset
\mathbb{C}\_{\infty}$ be the associated rank $r$ lattice. Then recall
that the exponential $e\_{\phi}:\mathbb{C}\_{\infty} \rightarrow
\mathbb{C}\_{\infty}$ of the Drinfeld module $\phi$ is defined by:

$$
e_{\phi}(z) := z\prod_{\lambda\in \Lambda\setminus \{0\}} \left( 1 -
z/\lambda \right).
$$

It can be viewed as a power series in $z$:

$$
e_{\phi}(z) = z + \alpha_1 z^{q} + \alpha_2 z^{q^2} + \alpha_3 z^{q^3} +
\cdots
$$

Moreover, it satisfies the following functional equation:

$$
e_{\phi}(az) = \phi_a(e_{\phi}(z)).
$$

The logarithm of $\phi$ is defined to be the compositional inverse of
$e_{\phi}$, denoted $\mathrm{log}\_{\phi}$. By applying
$\mathrm{log}\_{\phi}$ on both side of the functional equation, we
obtain the following recurrence relation:

$$
\beta_k = \frac{1}{\gamma(T) - \gamma(T)^{q^i - 1}} \sum_{i = 0}^{k-1}
\beta_i g_{k-i}^{q^i}
$$

where $\beta_k$ is the $q^k$-th coefficient of $\mathrm{log}_{\phi}$ and
$\beta_0 = 1$.

### Examples

```
sage: A = GF(2)['T']
sage: K.<T> = Frac(A)
sage: phi = DrinfeldModule(A, [T, 1])
sage: q = A.base_ring().cardinality()
sage: log = phi.logarithm(); log
z + ((1/(T^2+T))*z^2) + ((1/(T^6+T^5+T^3+T^2))*z^4) + O(z^7)
sage: log[q] == -1/((T**q - T))
True
sage: log[q**2] == 1/((T**q - T)*(T**(q**2) - T))
True
sage: log[q**3] == -1/((T**q - T)*(T**(q**2) - T)*(T**(q**3) - T))
True
```

### Ideas

The idea here is to first compute the logarithm of a Drinfeld module
using lazy power series and then compute its compositional inverse to
find its exponential.


<!-- Describe your changes here in detail -->
<!-- Why is this change required? What problem does it solve? -->
<!-- If it resolves an open issue, please link to the issue here. For
example "Closes #1337" -->

### 📝 Checklist

<!-- Put an `x` in all the boxes that apply. -->
<!-- If your change requires a documentation PR, please link it
appropriately -->
<!-- If you're unsure about any of these, don't hesitate to ask. We're
here to help! -->

- [x] I have made sure that the title is self-explanatory and the
description concisely explains the PR.
- [ ] I have linked an issue or discussion.
- [x] I have created tests covering the changes.
- [x] I have updated the documentation accordingly.

### ⌛ Dependencies
<!-- List all open pull requests that this PR logically depends on -->
<!--
- #xyz: short description why this is a dependency
- #abc: ...
-->

Depends on #35026 because this PR implements Drinfeld modules.

CC: @xcaruso @ymusleh @kryzar
    
URL: #35260
Reported by: David Ayotte
Reviewer(s): Antoine Leudière, David Ayotte, Xavier Caruso
vbraun pushed a commit that referenced this pull request Jul 30, 2023
    
<!-- ^^^^^
Please provide a concise, informative and self-explanatory title.
Don't put issue numbers in there, do this in the PR body below.
For example, instead of "Fixes #1234" use "Introduce new method to
calculate 1+1"
-->
### 📚 Description

The goal of this PR is to implement basic j-invariants of Drinfeld
module as defined by Potemine in

Potemine, I.Y. Minimal Terminal ℚ-Factorial Models of Drinfeld Coarse
Moduli Schemes. Mathematical Physics, Analysis and Geometry 1, 171–191
(1998). https://doi.org/10.1023/A:1009724323513

These j-invariants allows to determine whether two Drinfeld
`Fq[T]`-modules of arbitrary ranks are isomorphic or not.

@kryzar @ymusleh @xcaruso

<!-- Describe your changes here in detail -->
<!-- Why is this change required? What problem does it solve? -->
<!-- If it resolves an open issue, please link to the issue here. For
example "Closes #1337" -->

### 📝 Checklist

<!-- Put an `x` in all the boxes that apply. -->
<!-- If your change requires a documentation PR, please link it
appropriately -->
<!-- If you're unsure about any of these, don't hesitate to ask. We're
here to help! -->

- [x] I have made sure that the title is self-explanatory and the
description concisely explains the PR.
- [] I have linked an issue or discussion.
- [x] I have created tests covering the changes.
- [x] I have updated the documentation accordingly.

### ⌛ Dependencies
<!-- List all open pull requests that this PR logically depends on -->
<!--
- #xyz: short description why this is a dependency
- #abc: ...
-->

Depends on #35026 because this PR implements Drinfeld modules.
    
URL: #35057
Reported by: David Ayotte
Reviewer(s): Antoine Leudière, David Ayotte, Xavier Caruso
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Implementation of finite Drinfeld modules
7 participants