Drinfeld modules over rings of characteristic zero#
This module provides the class
sage.rings.function_fields.drinfeld_module.charzero_drinfeld_module.DrinfeldModule_charzero
,
which inherits
sage.rings.function_fields.drinfeld_module.drinfeld_module.DrinfeldModule
.
AUTHORS:
David Ayotte (2023-09)
- class sage.rings.function_field.drinfeld_modules.charzero_drinfeld_module.DrinfeldModule_charzero(gen, category)[source]#
Bases:
DrinfeldModule
This class implements Drinfeld \(\mathbb{F}_q[T]\)-modules defined over fields of \(\mathbb{F}_q[T]\)-characteristic zero.
Recall that the \(\mathbb{F}_q[T]\)-characteristic is defined as the kernel of the underlying structure morphism. For general definitions and help on Drinfeld modules, see class
sage.rings.function_fields.drinfeld_module.drinfeld_module.DrinfeldModule
.Construction:
The user does not ever need to directly call
DrinfeldModule_charzero
— the metaclassDrinfeldModule
is responsible for instantiating the right class depending on the input:sage: A = GF(3)['T'] sage: K.<T> = Frac(A) sage: phi = DrinfeldModule(A, [T, 1]) sage: phi Drinfeld module defined by T |--> t + T
>>> from sage.all import * >>> A = GF(Integer(3))['T'] >>> K = Frac(A, names=('T',)); (T,) = K._first_ngens(1) >>> phi = DrinfeldModule(A, [T, Integer(1)]) >>> phi Drinfeld module defined by T |--> t + T
sage: isinstance(phi, DrinfeldModule) True sage: from sage.rings.function_field.drinfeld_modules.charzero_drinfeld_module import DrinfeldModule_charzero sage: isinstance(phi, DrinfeldModule_charzero) True
>>> from sage.all import * >>> isinstance(phi, DrinfeldModule) True >>> from sage.rings.function_field.drinfeld_modules.charzero_drinfeld_module import DrinfeldModule_charzero >>> isinstance(phi, DrinfeldModule_charzero) True
Logarithm and exponential
It is possible to calculate the logarithm and the exponential of any Drinfeld modules of characteristic zero:
sage: A = GF(2)['T'] sage: K.<T> = Frac(A) sage: phi = DrinfeldModule(A, [T, 1]) sage: phi.exponential() z + ((1/(T^2+T))*z^2) + ((1/(T^8+T^6+T^5+T^3))*z^4) + O(z^8) sage: phi.logarithm() z + ((1/(T^2+T))*z^2) + ((1/(T^6+T^5+T^3+T^2))*z^4) + O(z^8)
>>> from sage.all import * >>> A = GF(Integer(2))['T'] >>> K = Frac(A, names=('T',)); (T,) = K._first_ngens(1) >>> phi = DrinfeldModule(A, [T, Integer(1)]) >>> phi.exponential() z + ((1/(T^2+T))*z^2) + ((1/(T^8+T^6+T^5+T^3))*z^4) + O(z^8) >>> phi.logarithm() z + ((1/(T^2+T))*z^2) + ((1/(T^6+T^5+T^3+T^2))*z^4) + O(z^8)
Goss polynomials
Goss polynomials are a sequence of polynomials related with the analytic theory of Drinfeld module. They provide a function field analogue of certain classical trigonometric functions:
sage: A = GF(2)['T'] sage: K.<T> = Frac(A) sage: phi = DrinfeldModule(A, [T, 1]) sage: phi.goss_polynomial(1) X sage: phi.goss_polynomial(2) X^2 sage: phi.goss_polynomial(3) X^3 + (1/(T^2 + T))*X^2
>>> from sage.all import * >>> A = GF(Integer(2))['T'] >>> K = Frac(A, names=('T',)); (T,) = K._first_ngens(1) >>> phi = DrinfeldModule(A, [T, Integer(1)]) >>> phi.goss_polynomial(Integer(1)) X >>> phi.goss_polynomial(Integer(2)) X^2 >>> phi.goss_polynomial(Integer(3)) X^3 + (1/(T^2 + T))*X^2
Base fields of \(\mathbb{F}_q[T]\)-characteristic zero
The base fields need not only be fraction fields of polynomials ring. In the following example, we construct a Drinfeld module over \(\mathbb{F}_q((1/T))\), the completion of the rational function field at the place \(1/T\):
sage: A.<T> = GF(2)[] sage: L.<s> = LaurentSeriesRing(GF(2)) # s = 1/T sage: phi = DrinfeldModule(A, [1/s, s + s^2 + s^5 + O(s^6), 1+1/s]) sage: phi(T) (s^-1 + 1)*t^2 + (s + s^2 + s^5 + O(s^6))*t + s^-1
>>> from sage.all import * >>> A = GF(Integer(2))['T']; (T,) = A._first_ngens(1) >>> L = LaurentSeriesRing(GF(Integer(2)), names=('s',)); (s,) = L._first_ngens(1)# s = 1/T >>> phi = DrinfeldModule(A, [Integer(1)/s, s + s**Integer(2) + s**Integer(5) + O(s**Integer(6)), Integer(1)+Integer(1)/s]) >>> phi(T) (s^-1 + 1)*t^2 + (s + s^2 + s^5 + O(s^6))*t + s^-1
One can also construct Drinfeld modules over SageMath’s global function fields:
sage: A.<T> = GF(5)[] sage: K.<z> = FunctionField(GF(5)) # z = T sage: phi = DrinfeldModule(A, [z, 1, z^2]) sage: phi(T) z^2*t^2 + t + z
>>> from sage.all import * >>> A = GF(Integer(5))['T']; (T,) = A._first_ngens(1) >>> K = FunctionField(GF(Integer(5)), names=('z',)); (z,) = K._first_ngens(1)# z = T >>> phi = DrinfeldModule(A, [z, Integer(1), z**Integer(2)]) >>> phi(T) z^2*t^2 + t + z
- exponential(name='z')[source]#
Return the exponential of this Drinfeld module.
Note that the exponential is only defined when the \(\mathbb{F}_q[T]\)-characteristic is zero.
INPUT:
name
(string, default:'z'
) – the name of the generator of the lazy power series ring.
OUTPUT:
A lazy power series over the base field.
EXAMPLES:
sage: A = GF(2)['T'] sage: K.<T> = Frac(A) sage: phi = DrinfeldModule(A, [T, 1]) sage: q = A.base_ring().cardinality() sage: exp = phi.exponential(); exp z + ((1/(T^2+T))*z^2) + ((1/(T^8+T^6+T^5+T^3))*z^4) + O(z^8)
>>> from sage.all import * >>> A = GF(Integer(2))['T'] >>> K = Frac(A, names=('T',)); (T,) = K._first_ngens(1) >>> phi = DrinfeldModule(A, [T, Integer(1)]) >>> q = A.base_ring().cardinality() >>> exp = phi.exponential(); exp z + ((1/(T^2+T))*z^2) + ((1/(T^8+T^6+T^5+T^3))*z^4) + O(z^8)
The exponential is returned as a lazy power series, meaning that any of its coefficients can be computed on demands:
sage: exp[2^4] 1/(T^64 + T^56 + T^52 + ... + T^27 + T^23 + T^15) sage: exp[2^5] 1/(T^160 + T^144 + T^136 + ... + T^55 + T^47 + T^31)
>>> from sage.all import * >>> exp[Integer(2)**Integer(4)] 1/(T^64 + T^56 + T^52 + ... + T^27 + T^23 + T^15) >>> exp[Integer(2)**Integer(5)] 1/(T^160 + T^144 + T^136 + ... + T^55 + T^47 + T^31)
Example in higher rank:
sage: A = GF(5)['T'] sage: K.<T> = Frac(A) sage: phi = DrinfeldModule(A, [T, T^2, T + T^2 + T^4, 1]) sage: exp = phi.exponential(); exp z + ((T/(T^4+4))*z^5) + O(z^8)
>>> from sage.all import * >>> A = GF(Integer(5))['T'] >>> K = Frac(A, names=('T',)); (T,) = K._first_ngens(1) >>> phi = DrinfeldModule(A, [T, T**Integer(2), T + T**Integer(2) + T**Integer(4), Integer(1)]) >>> exp = phi.exponential(); exp z + ((T/(T^4+4))*z^5) + O(z^8)
The exponential is the compositional inverse of the logarithm (see
logarithm()
):sage: log = phi.logarithm(); log z + ((4*T/(T^4+4))*z^5) + O(z^8) sage: exp.compose(log) z + O(z^8) sage: log.compose(exp) z + O(z^8)
>>> from sage.all import * >>> log = phi.logarithm(); log z + ((4*T/(T^4+4))*z^5) + O(z^8) >>> exp.compose(log) z + O(z^8) >>> log.compose(exp) z + O(z^8)
REFERENCE:
See section 4.6 of [Gos1998] for the definition of the exponential.
- goss_polynomial(n, var='X')[source]#
Return the \(n\)-th Goss polynomial of the Drinfeld module.
Note that Goss polynomials are only defined for Drinfeld modules of characteristic zero.
INPUT:
n
(integer) – the index of the Goss polynomialvar
(str, default:'X'
) – the name of polynomial variable.
OUTPUT:
a univariate polynomial in
var
over the base \(A\)-field.
EXAMPLES:
sage: A = GF(3)['T'] sage: K.<T> = Frac(A) sage: phi = DrinfeldModule(A, [T, 1]) # Carlitz module sage: phi.goss_polynomial(1) X sage: phi.goss_polynomial(2) X^2 sage: phi.goss_polynomial(4) X^4 + (1/(T^3 + 2*T))*X^2 sage: phi.goss_polynomial(5) X^5 + (2/(T^3 + 2*T))*X^3 sage: phi.goss_polynomial(10) 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
>>> from sage.all import * >>> A = GF(Integer(3))['T'] >>> K = Frac(A, names=('T',)); (T,) = K._first_ngens(1) >>> phi = DrinfeldModule(A, [T, Integer(1)]) # Carlitz module >>> phi.goss_polynomial(Integer(1)) X >>> phi.goss_polynomial(Integer(2)) X^2 >>> phi.goss_polynomial(Integer(4)) X^4 + (1/(T^3 + 2*T))*X^2 >>> phi.goss_polynomial(Integer(5)) X^5 + (2/(T^3 + 2*T))*X^3 >>> phi.goss_polynomial(Integer(10)) 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
REFERENCE:
Section 3 of [Gek1988] provides an exposition of Goss polynomials.
- logarithm(name='z')[source]#
Return the logarithm of the given Drinfeld module.
By definition, the logarithm is the compositional inverse of the exponential (see
exponential()
). Note that the logarithm is only defined when the \(\mathbb{F}_q[T]\)-characteristic is zero.INPUT:
name
(string, default:'z'
) – the name of the generator of the lazy power series ring.
OUTPUT:
A lazy power series over the base field.
EXAMPLES:
sage: A = GF(2)['T'] sage: K.<T> = Frac(A) sage: phi = DrinfeldModule(A, [T, 1]) 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^8)
>>> from sage.all import * >>> A = GF(Integer(2))['T'] >>> K = Frac(A, names=('T',)); (T,) = K._first_ngens(1) >>> phi = DrinfeldModule(A, [T, Integer(1)]) >>> log = phi.logarithm(); log z + ((1/(T^2+T))*z^2) + ((1/(T^6+T^5+T^3+T^2))*z^4) + O(z^8)
The logarithm is returned as a lazy power series, meaning that any of its coefficients can be computed on demands:
sage: log[2^4] 1/(T^30 + T^29 + T^27 + ... + T^7 + T^5 + T^4) sage: log[2^5] 1/(T^62 + T^61 + T^59 + ... + T^8 + T^6 + T^5)
>>> from sage.all import * >>> log[Integer(2)**Integer(4)] 1/(T^30 + T^29 + T^27 + ... + T^7 + T^5 + T^4) >>> log[Integer(2)**Integer(5)] 1/(T^62 + T^61 + T^59 + ... + T^8 + T^6 + T^5)
Example in higher rank:
sage: A = GF(5)['T'] sage: K.<T> = Frac(A) sage: phi = DrinfeldModule(A, [T, T^2, T + T^2 + T^4, 1]) sage: phi.logarithm() z + ((4*T/(T^4+4))*z^5) + O(z^8)
>>> from sage.all import * >>> A = GF(Integer(5))['T'] >>> K = Frac(A, names=('T',)); (T,) = K._first_ngens(1) >>> phi = DrinfeldModule(A, [T, T**Integer(2), T + T**Integer(2) + T**Integer(4), Integer(1)]) >>> phi.logarithm() z + ((4*T/(T^4+4))*z^5) + O(z^8)