Skip to content

Commit a102fbd

Browse files
author
Release Manager
committed
gh-35991: Implement Goss polynomials of Drinfeld modules <!-- ^^^^^ 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" --> <!-- Describe your changes here in detail --> <!-- Why is this change required? What problem does it solve? --> <!-- If this PR resolves an open issue, please link to it here. For example "Fixes #12345". --> <!-- If your change requires a documentation PR, please link it appropriately. --> This PR implements Goss polynomials of Drinfeld modules. The interested PR reviewer should read section 3 of [this paper](https://link.springer.com/article/10.1007/BF01410204). In particular, the recurrence relation (ii) of Proposition 3.4 of op. cit. is used in order to compute the $n$-th Goss polynomial of a Drinfeld module. CC: @xcaruso @ymusleh @kryzar ### 📝 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! --> <!-- Feel free to remove irrelevant items. --> - [X] The title is concise, informative, and self-explanatory. - [X] The description explains in detail what this PR is about. - [X] I have linked a relevant issue or discussion. - [X] I have created tests covering the changes. - [X] I have updated the documentation accordingly. ### ⌛ Dependencies <!-- List all open PRs that this PR logically depends on - #12345: short description why this is a dependency - #34567: ... --> <!-- If you're unsure about any of these, don't hesitate to ask. We're here to help! --> URL: #35991 Reported by: David Ayotte Reviewer(s): Antoine Leudière, Xavier Caruso
2 parents 2e1df5a + 09fbdfa commit a102fbd

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed

src/doc/en/reference/references/index.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2665,6 +2665,9 @@ REFERENCES:
26652665
TR-737-05, (2005).
26662666
ftp://ftp.cs.princeton.edu/reports/2005/737.pdf
26672667
2668+
.. [Gek1988] \E.-U. Gekeler, On the coefficients of Drinfel'd modular
2669+
forms. Invent. Math. 93 (1988), no. 3, 667-700
2670+
26682671
.. [Gek1991] \E.-U. Gekeler. On finite Drinfeld modules. Journal of
26692672
algebra, 1(141):187–203, 1991.
26702673

src/sage/rings/function_field/drinfeld_modules/drinfeld_module.py

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,6 +1361,102 @@ def gen(self):
13611361
"""
13621362
return self._gen
13631363

1364+
@cached_method
1365+
def _compute_goss_polynomial(self, n, q, poly_ring, X):
1366+
r"""
1367+
Utility function for computing the n-th Goss polynomial.
1368+
1369+
The user should not call this method directly, but
1370+
:meth:`goss_polynomial` instead.
1371+
1372+
TESTS::
1373+
1374+
sage: A = GF(2^2)['T']
1375+
sage: K.<T> = Frac(A)
1376+
sage: phi = DrinfeldModule(A, [T, T+1, T^2, 1])
1377+
sage: poly_ring = phi.base()['X']
1378+
sage: X = poly_ring.gen()
1379+
sage: phi._compute_goss_polynomial(0, 2^2, poly_ring, X)
1380+
0
1381+
sage: phi._compute_goss_polynomial(3, 2^2, poly_ring, X)
1382+
X^3
1383+
sage: phi._compute_goss_polynomial(4*3, 2^2, poly_ring, X)
1384+
X^12
1385+
sage: phi._compute_goss_polynomial(9, 2^2, poly_ring, X)
1386+
X^9 + (1/(T^3 + T^2 + T))*X^6 + (1/(T^6 + T^4 + T^2))*X^3
1387+
1388+
"""
1389+
# Trivial cases
1390+
if n.is_zero():
1391+
return poly_ring.zero()
1392+
if n <= q - 1:
1393+
return X**n
1394+
if n % q == 0:
1395+
return self.goss_polynomial(n // q)**q
1396+
# General case
1397+
pol = sum(self._compute_coefficient_exp(i+1)
1398+
*self._compute_goss_polynomial(n - q**(i+1), q, poly_ring, X)
1399+
for i in range(0, (n.log(q).n()).floor()))
1400+
return X*(self._compute_goss_polynomial(n - 1, q, poly_ring, X) + pol)
1401+
1402+
def goss_polynomial(self, n, var='X'):
1403+
r"""
1404+
Return the `n`-th Goss polynomial of the Drinfeld module.
1405+
1406+
Note that Goss polynomials are only defined for Drinfeld modules
1407+
of characteristic zero.
1408+
1409+
INPUT:
1410+
1411+
- ``n`` (integer) -- the index of the Goss polynomial
1412+
1413+
- ``var`` (str, default: ``'X'``) -- the name of polynomial
1414+
variable.
1415+
1416+
OUTPUT:
1417+
1418+
- a univariate polynomial in ``var`` over the base `A`-field.
1419+
1420+
EXAMPLES::
1421+
1422+
sage: A = GF(3)['T']
1423+
sage: K.<T> = Frac(A)
1424+
sage: phi = DrinfeldModule(A, [T, 1]) # Carlitz module
1425+
sage: phi.goss_polynomial(1)
1426+
X
1427+
sage: phi.goss_polynomial(2)
1428+
X^2
1429+
sage: phi.goss_polynomial(4)
1430+
X^4 + (1/(T^3 + 2*T))*X^2
1431+
sage: phi.goss_polynomial(5)
1432+
X^5 + (2/(T^3 + 2*T))*X^3
1433+
sage: phi.goss_polynomial(10)
1434+
X^10 + (1/(T^3 + 2*T))*X^8 + (1/(T^6 + T^4 + T^2))*X^6 + (1/(T^9 + 2*T^3))*X^4 + (1/(T^18 + 2*T^12 + 2*T^10 + T^4))*X^2
1435+
1436+
TESTS::
1437+
1438+
sage: Fq.<z> = GF(25)
1439+
sage: A.<T> = Fq[]
1440+
sage: phi = DrinfeldModule(A, [z, 1])
1441+
sage: phi.goss_polynomial(1)
1442+
Traceback (most recent call last):
1443+
...
1444+
ValueError: characteristic must be zero (=T^2 + 4*T + 2)
1445+
1446+
REFERENCE:
1447+
1448+
Section 3 of [Gek1988]_ provides an exposition of Goss
1449+
polynomials.
1450+
"""
1451+
if self.category()._characteristic:
1452+
raise ValueError(f"characteristic must be zero (={self.characteristic()})")
1453+
n = ZZ(n)
1454+
K = self.base()
1455+
poly_ring = K[var]
1456+
X = poly_ring.gen()
1457+
q = self._Fq.cardinality()
1458+
return self._compute_goss_polynomial(n, q, poly_ring, X)
1459+
13641460
def height(self):
13651461
r"""
13661462
Return the height of the Drinfeld module if the function field

0 commit comments

Comments
 (0)