22r"""
33Drinfeld modules over rings of characteristic zero
44
5- This module provides the class
5+ This module provides the classes
66:class:`sage.rings.function_fields.drinfeld_module.charzero_drinfeld_module.DrinfeldModule_charzero`,
7+ :class:`sage.rings.function_fields.drinfeld_module.charzero_drinfeld_module.DrinfeldModule_rational`,
78which inherits
89:class:`sage.rings.function_fields.drinfeld_module.drinfeld_module.DrinfeldModule`.
910
1011AUTHORS:
1112
1213- David Ayotte (2023-09)
14+ - Xavier Caruso (2024-12) - computation of class polynomials and Taelman's units
1315"""
1416
1517# *****************************************************************************
@@ -427,11 +429,45 @@ class DrinfeldModule_rational(DrinfeldModule_charzero):
427429 """
428430 def _phiT_matrix (self , polynomial_part ):
429431 r"""
430- Return the matrix of `\phi_T` modulo `\pi ^s` where `s` is
431- chosen such that `\pi^s` is in the domain of convergence
432- of the logarithm.
432+ Return the matrix giving the action of `\phi_T` modulo `u ^s`
433+ where `u = 1/T` is the uniformizer at infinity `s` is chosen
434+ such that `u^s` is in the domain of convergence of the logarithm.
433435
434436 It is an helper function; do not call it directly.
437+
438+ INPUT:
439+
440+ - ``polynomial_part`` -- boolean; if ``False``, omit the
441+ part with negative powers of `u`; if ``True``, return this
442+ part as a polynomial vector in `T`
443+
444+ TESTS::
445+
446+ sage: q = 5
447+ sage: Fq = GF(q)
448+ sage: A = Fq['T']
449+ sage: K.<T> = Frac(A)
450+ sage: phi = DrinfeldModule(A, [T, T^20])
451+ sage: phi._phiT_matrix(False)
452+ [0 0 0 0]
453+ [1 0 0 0]
454+ [0 1 0 0]
455+ [0 0 1 0]
456+ sage: phi._phiT_matrix(True)
457+ (
458+ [0 0 0 0]
459+ [1 0 0 0]
460+ [0 1 0 0]
461+ [0 0 1 0], (T^15 + 1, T^10, T^5, 1)
462+ )
463+
464+ ::
465+
466+ sage: psi = DrinfeldModule(A, [T, 1/T])
467+ sage: psi._phiT_matrix(False)
468+ Traceback (most recent call last):
469+ ...
470+ ValueError: the Drinfeld module must have polynomial coefficients
435471 """
436472 A = self .function_ring ()
437473 Fq = A .base_ring ()
@@ -502,13 +538,23 @@ def class_polynomial(self):
502538 sage: phi = DrinfeldModule(A, [T, -T^(2*q-1) + 2*T^(q-1)])
503539 sage: phi.class_polynomial()
504540 T + 3
541+
542+ TESTS:
543+
544+ The Drinfeld module must have polynomial coefficients::
545+
546+ sage: phi = DrinfeldModule(A, [T, 1/T])
547+ sage: phi.class_polynomial()
548+ Traceback (most recent call last):
549+ ...
550+ ValueError: the Drinfeld module must have polynomial coefficients
505551 """
506552 A = self .function_ring ()
507553 Fq = A .base_ring ()
508554 M = self ._phiT_matrix (False )
509555 s = M .nrows ()
510556 if s == 0 :
511- # self is small
557+ # small case
512558 return A .one ()
513559
514560 v = vector (Fq , s )
@@ -534,7 +580,16 @@ def class_polynomial(self):
534580
535581 def taelman_exponential_unit (self ):
536582 r"""
537- Return the exponential of the fundamental Taelman unit.
583+ Return the exponential of a fundamental Taelman's unit
584+ of this Drinfeld module.
585+
586+ A Taelman's unit is by definition an element `x \in
587+ \FF_q((1/T))` whose exponential falls in `\FF_q[T]`.
588+
589+ Taelman's units form a `\FF_q[T]`-line in `\FF_q((1/T))`;
590+ a fundamental unit is by definition a generator of this line.
591+
592+ We refer to [Tae2012]_ for more details about this construction.
538593
539594 EXAMPLES:
540595
@@ -570,8 +625,8 @@ def taelman_exponential_unit(self):
570625 M , P = self ._phiT_matrix (True )
571626 s = M .nrows ()
572627 if s == 0 :
573- # self is small
574- return A ( 1 )
628+ # small case
629+ return self . base (). one ( )
575630
576631 gs = self .coefficients (sparse = False )
577632 v = vector (Fq , s )
0 commit comments