Goss polynomials and exponentials#

Functions for computing Goss polynomials and exponentials of Drinfeld \(\mathbb{F}_q[T]\)-modules over fields of generic characteristics.

Exponentials and logarithms

Let \(\phi\) be a Drinfeld \(\mathbb{F}_q[T]\)-module of rank \(r\) over \(\mathbb{F}_q(T)\) defined by

\[\phi_T = T + g_1 \tau + \cdots + g_{r} \tau^r.\]

Then, there exists a power series

\[e_{\phi}(z) = z + \sum_{i = 1}^{\infty} \alpha_i z^{q^i}\]

such that the functional equation is satisfied \(e_{\phi}(az) = \phi_a(e_{\phi}(z))\). The power series \(e_{\phi}\) is called the exponential of \(\phi\).

The compositional inverse of \(e_{\phi}\) is denoted

\[\mathrm{log}_{\phi}(z) = z + \sum_{i = 1}^{\infty} \beta_i z^{q^i}\]

and is called the logarithm of \(\phi\).

One can show the following recursive formulas:

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

  • \(\alpha_k = - \sum_{i = 0}^{k - 1} \alpha_i \beta_{k - i}^{q^i}\).

Goss polynomials

Let \((\alpha_i)_{i\geq 0}\) the sequence representing the coefficients of the exponential of a Drinfeld module \(\phi\). The \(n\)-th Goss polynomial of \(\phi\) is defined by the recursive formula

\[G_n(X) = X\left(G_{n-1}(X) \sum_{i = 1}^{\lfloor \mathrm{log}_q(n)\rfloor}\alpha_i G_{k - q^i}(X)\right)\]

where \(G_n(X) = X^n\) if \(n \leq q\).

The \(n\)-th Goss polynomial is monic of degree \(n\) and satisfies \(G_{pn}(X) = (G_n(X))^p\) if \(q = p^e\). Moreover, it satisfies the relation \(X^2G_n'(X) = nG_{n+1}(X)\).

AUTHORS:

  • David Ayotte (2022): initial version

drinfeld_modular_forms.goss_polynomials.bracket(n, K)#

Return the element \([n] = T^{q^n} - T\) where \(T\) is the generator of the polynomial ring.

EXAMPLES:

sage: from drinfeld_modular_forms import bracket
sage: A.<T> = GF(3)['T']
sage: bracket(1, A)
T^3 + 2*T
sage: bracket(2, A)
T^9 + 2*T
sage: bracket(0, A)
Traceback (most recent call last):
...
ValueError: the integer n (=0) must be postive.
drinfeld_modular_forms.goss_polynomials.drinfeld_exponential(coeffs, name='z')#

Return the exponential of the Drinfeld module defined by the list coeffs.

Warning: the method does not check if the list coeffs is valid.

INPUT:

  • coeffs (list) – a list of coefficients in a field of finite characteristic representing a Drinfeld \(\mathbb{F}_q[T]\)-module.

  • name (str, default: 'z') – the name of the lazy power series ring.

OUTPUT: a lazy power series in name.

EXAMPLES:

sage: from drinfeld_modular_forms import drinfeld_exponential
sage: A = GF(3)['T']
sage: K.<T> = Frac(A)
sage: coeffs = [T, K.one()]  # Carlitz module
sage: drinfeld_exponential(coeffs)
z + ((1/(T^3+2*T))*z^3) + O(z^8)
sage: coeffs = [T, T^5 + T^2 + 2, 1/T, T^3]
sage: drinfeld_exponential(coeffs)
z + (((T^5+T^2+2)/(T^3+2*T))*z^3) + O(z^8)
drinfeld_modular_forms.goss_polynomials.drinfeld_logarithm(coeffs, name='z')#

Return the logarithm of the Drinfeld module defined by the list coeffs.

Warning: the method does not check if the list coeffs is valid.

INPUT:

  • coeffs (list) – a list of coefficients in a field of finite characteristic representing a Drinfeld \(\mathbb{F}_q[T]\)-module.

  • name (str, default: 'z') – the name of the lazy power series ring.

OUTPUT: a lazy power series in name.

EXAMPLES:

sage: from drinfeld_modular_forms import drinfeld_logarithm
sage: A = GF(3)['T']
sage: K.<T> = Frac(A)
sage: coeffs = [T, K.one()]  # Carlitz module
sage: drinfeld_logarithm(coeffs)
z + ((2/(T^3+2*T))*z^3) + O(z^8)
sage: coeffs = [T, T^5 + T^2 + 2, 1/T, T^3]
sage: drinfeld_logarithm(coeffs)
z + (((2*T^5+2*T^2+1)/(T^3+2*T))*z^3) + O(z^8)
drinfeld_modular_forms.goss_polynomials.goss_polynomial(coeffs, n, name='X')#

Return the \(n\)-th Goss polynomial of the Drinfeld module defined by the list coeffs.

Warning: the method does not check if the list coeffs is valid.

INPUT:

  • coeffs (list) – a list of coefficients in a field of finite characteristic representing a Drinfeld \(\mathbb{F}_q[T]\)-module.

  • n (integer) – the index of the Goss polynomial.

  • name (str, default: 'X') – the name of polynomial variable.

OUTPUT: a univariate polynomial in name.

EXAMPLES:

sage: from drinfeld_modular_forms import goss_polynomial
sage: A = GF(3)['T']
sage: K.<T> = Frac(A)
sage: coeffs = [T, K.one()]  # Carlitz module
sage: goss_polynomial(coeffs, 1)
X
sage: goss_polynomial(coeffs, 2)
X^2
sage: goss_polynomial(coeffs, 4)
X^4 + (1/(T^3 + 2*T))*X^2
sage: goss_polynomial(coeffs, 5)
X^5 + (2/(T^3 + 2*T))*X^3
sage: goss_polynomial(coeffs, 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
sage: coeffs = [T, 1/(T^2 + 1), T^10 + T^5 + 1, T^2 + 2]
sage: goss_polynomial(coeffs, 10)
X^10 + (1/(T^5 + 2*T))*X^8 + (1/(T^10 + T^6 + T^2))*X^6 + (1/(T^15 + 2*T^3))*X^4 + ((T^25 + 2*T^24 + 2*T^22 + T^21 + 2*T^20 + 2*T^19 + T^18 + T^17 + 2*T^15 + T^14 + T^13 + 2*T^8 + T^7 + T^5 + 2*T^4 + T^3 + T^2 + 2*T + 2)/(T^24 + 2*T^23 + 2*T^21 + T^20 + T^19 + T^17 + T^16 + 2*T^12 + T^11 + T^9 + 2*T^8 + 2*T^7 + 2*T^5 + 2*T^4))*X^2
drinfeld_modular_forms.goss_polynomials.lcm_of_monic_polynomials(n, polynomial_ring)#

Return the least common multiple of all monic polynomials of degree \(n\).

EXAMPLES:

sage: from drinfeld_modular_forms import lcm_of_monic_polynomials
sage: A.<T> = GF(3)['T']
sage: lcm_of_monic_polynomials(1, A)
T^3 + 2*T
sage: lcm_of_monic_polynomials(2, A)
T^12 + 2*T^10 + 2*T^4 + T^2
sage: lcm_of_monic_polynomials(3, A)
T^39 + 2*T^37 + 2*T^31 + T^29 + 2*T^13 + T^11 + T^5 + 2*T^3
drinfeld_modular_forms.goss_polynomials.product_of_monic_polynomials(n, K)#

Return the product of all monic polynomials of degree \(n\).

EXAMPLES:

sage: from drinfeld_modular_forms import product_of_monic_polynomials
sage: A.<T> = GF(3)['T']
sage: product_of_monic_polynomials(0, A)
1
sage: product_of_monic_polynomials(1, A)
T^3 + 2*T
sage: f = product_of_monic_polynomials(2, A); f
T^18 + 2*T^12 + 2*T^10 + T^4
sage: f.factor()
T^4 * (T + 1)^4 * (T + 2)^4 * (T^2 + 1) * (T^2 + T + 2) * (T^2 + 2*T + 2)