Elements of Drinfeld modular forms rings#
This module defines the elements of the class
DrinfeldModularFormsRing
.
EXAMPLES:
sage: from drinfeld_modular_forms import DrinfeldModularFormsRing
sage: q = 3
sage: A = GF(q)['T']
sage: K.<T> = Frac(A)
sage: M = DrinfeldModularFormsRing(K, 2) # rank 2
sage: M.inject_variables()
Defining g1, g2
sage: g1.parent()
Ring of Drinfeld modular forms of rank 2 over Fraction Field of Univariate Polynomial Ring in T over Finite Field of size 3
A graded Drinfeld modular form is a sum of modular forms having potentially different weights:
sage: F = g1*g2 + g2
sage: F.is_drinfeld_modular_form()
False
sage: F.homogeneous_components()
{8: g2, 10: g1*g2}
sage: H = g1^4*g2^9 + T*g1^8*g2^8 + (T^2 - 1)*g1^28*g2^3
sage: H.is_drinfeld_modular_form()
True
sage: H.weight()
80
Rank 2 two case
In the rank 2 case, on can compute the expansion at infinity of any graded Drinfeld modular form:
sage: g1.expansion()
1 + ((2*T^3+T)*u^2) + O(u^7)
sage: g2.expansion()
u^2 + 2*u^6 + O(u^8)
sage: F.expansion()
2*u^2 + ((2*T^3+T)*u^4) + u^6 + O(u^8)
To access the \(i\)-th coefficient of the expansion:
sage: F[36]
T^9 + 2*T
sage: F[0:15] # i = 0...14
[0, 0, 2, 0, 2*T^3 + T, 0, 1, 0, 0, 0, 2*T^6 + 2*T^4 + 2*T^2, 0, 0, 0, 2]
It is also possible to create the ring of Drinfeld modular forms with
arbitrary type using the option has_type=True
:
sage: q = 3
sage: A = GF(q)['T']
sage: K.<T> = Frac(A)
sage: M = DrinfeldModularFormsRing(K, 2, has_type=True)
sage: M.gens()
[g1, h]
sage: M.inject_variables()
Defining g1, h
sage: h.weight()
4
sage: h.expansion()
u + u^5 + ((2*T^3+T)*u^7) + O(u^8)
sage: M.coefficient_form(1)
g1
sage: M.coefficient_form(2)
h^2
AUTHORS:
David Ayotte (2022): initial version
- class drinfeld_modular_forms.element.DrinfeldModularFormsRingElement(parent, polynomial)#
Bases:
ModuleElement
Element class of rings of Drinfeld modular forms.
EXAMPLES:
sage: from drinfeld_modular_forms import DrinfeldModularFormsRing sage: A = GF(3)['T']; K = Frac(A); T = K.gen() sage: M = DrinfeldModularFormsRing(K, 2) sage: M.inject_variables() Defining g1, g2 sage: (T^2 + 1)*(g1 + g1*g2) (T^2 + 1)*g1*g2 + (T^2 + 1)*g1 sage: (g1).parent() Ring of Drinfeld modular forms of rank 2 over Fraction Field of Univariate Polynomial Ring in T over Finite Field of size 3 sage: g2 in M True
- coefficient(n)#
Return the \(n\)-coefficient of the graded Drinfeld form.
This method is only implemented when the rank is 2.
EXAMPLES:
sage: from drinfeld_modular_forms import DrinfeldModularFormsRing sage: A = GF(3)['T']; K = Frac(A) sage: M = DrinfeldModularFormsRing(K, 2) sage: M.inject_variables() Defining g1, g2 sage: g1[2] 2*T^3 + T sage: g1[0:16] [1, 0, 2*T^3 + T, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2*T^3 + T, 0] sage: g2[24] T^9 + 2*T^3
- expansion(name='u')#
Return the expansion at infinity of the graded Drinfeld form.
Currently only implemented in rank 2.
OUTPUT: a lazy power series over the base ring.
EXAMPLES:
sage: from drinfeld_modular_forms import DrinfeldModularFormsRing sage: A = GF(3)['T']; K = Frac(A) sage: M = DrinfeldModularFormsRing(K, 2) sage: M.inject_variables() Defining g1, g2 sage: g1.expansion() 1 + ((2*T^3+T)*u^2) + O(u^7) sage: g2.expansion() u^2 + 2*u^6 + O(u^8) sage: F = (g1 + g2)*g1 sage: F.expansion() 1 + ((T^3+2*T+1)*u^2) + ((T^6+T^4+2*T^3+T^2+T)*u^4) + 2*u^6 + O(u^7)
- homogeneous_components()#
Return the homogeneous components of this graded Drinfeld modular form.
EXAMPLES:
sage: from drinfeld_modular_forms import DrinfeldModularFormsRing sage: A = GF(3)['T']; K = Frac(A) sage: M = DrinfeldModularFormsRing(K, 2) sage: M.inject_variables() Defining g1, g2 sage: F = g1 + g1^2 + g1*g2^2 + g2^4 sage: D = F.homogeneous_components(); D {2: g1, 4: g1^2, 18: g1*g2^2, 32: g2^4} sage: D[32] g2^4
- is_drinfeld_modular_form()#
Return whether
self
is a Drinfeld modular form.We recall that elements of Drinfeld modular forms ring are not necessarily modular forms as they may have mixed weight components.
EXAMPLES:
sage: from drinfeld_modular_forms import DrinfeldModularFormsRing sage: A = GF(3)['T']; K = Frac(A) sage: M = DrinfeldModularFormsRing(K, 2) sage: M.inject_variables() Defining g1, g2 sage: f = g1^5*g2^2 # homogeneous polynomial sage: f.is_drinfeld_modular_form() True sage: g = g1 + g2 # mixed weight components sage: g.is_drinfeld_modular_form() False
- is_one()#
Return
True
whether the given graded Drinfeld form is the multiplicative identity.EXAMPLES:
sage: from drinfeld_modular_forms import DrinfeldModularFormsRing sage: A = GF(3)['T']; K = Frac(A) sage: M = DrinfeldModularFormsRing(K, 2) sage: u = M.one() sage: u.is_one() True sage: (M.0).is_one() False
- is_zero()#
Return
True
whether the given graded Drinfeld form is the additive identity.EXAMPLES:
sage: from drinfeld_modular_forms import DrinfeldModularFormsRing sage: A = GF(3)['T']; K = Frac(A) sage: M = DrinfeldModularFormsRing(K, 2) sage: z = M.zero() sage: z.is_zero() True sage: f = M.0 sage: f.is_zero() False sage: (f - f).is_zero() True sage: (0 * M.0).is_zero() True
- polynomial()#
Return self as a multivariate polynomial over the generators of the ring.
OUTPUT:
A multivariate polynomial over the base ring.
EXAMPLES:
sage: from drinfeld_modular_forms import DrinfeldModularFormsRing sage: A = GF(3)['T']; K = Frac(A) sage: M = DrinfeldModularFormsRing(K, 2) sage: M.inject_variables() Defining g1, g2 sage: P1 = g1.polynomial(); sage: P2 = g2.polynomial(); sage: P2^2 + P1^2 + P1 g2^2 + g1^2 + g1 sage: P1.parent() Multivariate Polynomial Ring in g1, g2 over Fraction Field of Univariate Polynomial Ring in T over Finite Field of size 3
The degree of each variables corresponds to the weight of the generator:
sage: P1.degree() 2 sage: P2.degree() 8
- rank()#
Return the rank of the graded Drinfeld form.
EXAMPLES:
sage: from drinfeld_modular_forms import DrinfeldModularFormsRing sage: A = GF(3)['T']; K = Frac(A) sage: M2 = DrinfeldModularFormsRing(K, 2) sage: (M2.0).rank() 2 sage: M5 = DrinfeldModularFormsRing(K, 5) sage: (M5.0 + M5.3).rank() 5
- type_m()#
Return the type of the graded Drinfeld form.
Recall that the type is the integer \(m\) such that
\[f(\gamma(w)) = \mathrm{det}(\gamma)^m j(\gamma, w)^k f(w).\]This method is only implemented when the rank is two.
EXAMPLES:
sage: from drinfeld_modular_forms import DrinfeldModularFormsRing sage: A = GF(11)['T']; K = Frac(A) sage: M = DrinfeldModularFormsRing(K, 2, has_type=True) sage: M.inject_variables() Defining g1, h sage: F = g1*h^9 sage: F.type_m() 9 sage: (h^11).type_m() 1 sage: g1.type_m() 0
- weight()#
Return the weight of self.
EXAMPLES:
sage: from drinfeld_modular_forms import DrinfeldModularFormsRing sage: A = GF(3)['T']; K = Frac(A) sage: M = DrinfeldModularFormsRing(K, 2) sage: M.inject_variables() Defining g1, g2 sage: g1.weight() 2 sage: g2.weight() 8 sage: f = g1^5*g2^2 sage: f.weight() 26
If the form is not modular, then the method returns an error:
sage: f = g1 + g2 sage: f.weight() Traceback (most recent call last): ... ValueError: the given ring element is not a Drinfeld modular form