Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
r""" Subspaces of modular forms for Hecke triangle groups
AUTHORS:
- Jonas Jermann (2013): initial version
"""
#***************************************************************************** # Copyright (C) 2013-2014 Jonas Jermann <jjermann2@gmail.com> # # Distributed under the terms of the GNU General Public License (GPL) # as published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # http://www.gnu.org/licenses/ #*****************************************************************************
r""" Return a canonical version of the parameters. In particular the list/tuple ``basis`` is replaced by a tuple of linearly independent elements in the ambient space.
If ``check=False`` (default: ``True``) then ``basis`` is assumed to already be a basis.
EXAMPLES::
sage: from sage.modular.modform_hecketriangle.subspace import canonical_parameters sage: from sage.modular.modform_hecketriangle.space import ModularForms sage: MF = ModularForms(n=6, k=12, ep=1) sage: canonical_parameters(MF, [MF.Delta().as_ring_element(), MF.gen(0), 2*MF.gen(0)]) (ModularForms(n=6, k=12, ep=1) over Integer Ring, (q + 30*q^2 + 333*q^3 + 1444*q^4 + O(q^5), 1 + 26208*q^3 + 530712*q^4 + O(q^5))) """
else:
r""" Create a modular forms subspace generated by the supplied arguments if possible. Instead of a list of generators also multiple input arguments can be used. If ``reduce=True`` then the corresponding ambient space is choosen as small as possible. If no subspace is available then the ambient space is returned.
EXAMPLES::
sage: from sage.modular.modform_hecketriangle.subspace import ModularFormsSubSpace sage: from sage.modular.modform_hecketriangle.space import ModularForms sage: MF = ModularForms() sage: subspace = ModularFormsSubSpace(MF.E4()^3, MF.E6()^2+MF.Delta(), MF.Delta()) sage: subspace Subspace of dimension 2 of ModularForms(n=3, k=12, ep=1) over Integer Ring sage: subspace.ambient_space() ModularForms(n=3, k=12, ep=1) over Integer Ring sage: subspace.gens() [1 + 720*q + 179280*q^2 + 16954560*q^3 + 396974160*q^4 + O(q^5), 1 - 1007*q + 220728*q^2 + 16519356*q^3 + 399516304*q^4 + O(q^5)] sage: ModularFormsSubSpace(MF.E4()^3-MF.E6()^2, reduce=True).ambient_space() CuspForms(n=3, k=12, ep=1) over Integer Ring sage: ModularFormsSubSpace(MF.E4()^3-MF.E6()^2, MF.J_inv()*MF.E4()^3, reduce=True) WeakModularForms(n=3, k=12, ep=1) over Integer Ring """
generators += arg else:
raise ValueError("No generators specified")
else:
# This works if and only if ambient_space supports subspaces
r""" Submodule of (Hecke) forms in the given ambient space for the given basis. """
r""" Return a (cached) instance with canonical parameters.
EXAMPLES::
sage: from sage.modular.modform_hecketriangle.subspace import (canonical_parameters, SubSpaceForms) sage: from sage.modular.modform_hecketriangle.space import ModularForms sage: MF = ModularForms(n=6, k=12, ep=1) sage: (ambient_space, basis) = canonical_parameters(MF, [MF.Delta().as_ring_element(), MF.gen(0)]) sage: SubSpaceForms(MF, [MF.Delta().as_ring_element(), MF.gen(0)]) == SubSpaceForms(ambient_space, basis) True """
# we return check=True to ensure only one cached instance
r""" Return the Submodule of (Hecke) forms in ``ambient_space`` for the given ``basis``.
INPUT:
- ``ambient_space`` -- An ambient forms space.
- ``basis`` -- A tuple of (not necessarily linearly independent) elements of ``ambient_space``.
- ``check`` -- If ``True`` (default) then a maximal linearly independent subset of ``basis`` is choosen. Otherwise it is assumed that ``basis`` is linearly independent.
OUTPUT:
The corresponding submodule.
EXAMPLES::
sage: from sage.modular.modform_hecketriangle.space import ModularForms, QuasiCuspForms sage: MF = ModularForms(n=6, k=20, ep=1) sage: MF ModularForms(n=6, k=20, ep=1) over Integer Ring sage: MF.dimension() 4 sage: subspace = MF.subspace([MF.Delta()*MF.E4()^2, MF.gen(0), 2*MF.gen(0)]) sage: subspace Subspace of dimension 2 of ModularForms(n=6, k=20, ep=1) over Integer Ring sage: subspace.analytic_type() modular sage: subspace.category() Category of modules over Integer Ring sage: subspace in subspace.category() True sage: subspace.module() Vector space of degree 4 and dimension 2 over Fraction Field of Univariate Polynomial Ring in d over Integer Ring Basis matrix: [ 1 0 0 0] [ 0 1 13/(18*d) 103/(432*d^2)] sage: subspace.ambient_module() Vector space of dimension 4 over Fraction Field of Univariate Polynomial Ring in d over Integer Ring sage: subspace.ambient_module() == MF.module() True sage: subspace.ambient_space() == MF True sage: subspace.basis() [q + 78*q^2 + 2781*q^3 + 59812*q^4 + O(q^5), 1 + 360360*q^4 + O(q^5)] sage: subspace.basis()[0].parent() == MF True sage: subspace.gens() [q + 78*q^2 + 2781*q^3 + 59812*q^4 + O(q^5), 1 + 360360*q^4 + O(q^5)] sage: subspace.gens()[0].parent() == subspace True sage: subspace.is_ambient() False
sage: MF = QuasiCuspForms(n=infinity, k=12, ep=1) sage: MF.dimension() 4 sage: subspace = MF.subspace([MF.Delta(), MF.E4()*MF.f_inf()*MF.E2()*MF.f_i(), MF.E4()*MF.f_inf()*MF.E2()^2, MF.E4()*MF.f_inf()*(MF.E4()-MF.E2()^2)]) sage: subspace.default_prec(3) sage: subspace Subspace of dimension 3 of QuasiCuspForms(n=+Infinity, k=12, ep=1) over Integer Ring sage: subspace.gens() [q + 24*q^2 + O(q^3), q - 24*q^2 + O(q^3), q - 8*q^2 + O(q^3)] """
# self(v) instead would somehow mess up the coercion model # TODO: get the analytic type from the basis #self._analytic_type=self.AT(["quasi", "mero"])
r""" Return the string representation of ``self``.
EXAMPLES::
sage: from sage.modular.modform_hecketriangle.space import ModularForms sage: MF = ModularForms(n=6, k=20, ep=1) sage: subspace = MF.subspace([MF.Delta()*MF.E4()^2, MF.gen(0)]) sage: subspace Subspace of dimension 2 of ModularForms(n=6, k=20, ep=1) over Integer Ring """
# If we list the basis the representation usually gets too long... # return "Subspace with basis {} of {}".format([v.as_ring_element() for v in self.basis()], self._ambient_space)
r""" Return the same space as ``self`` but over a new base ring ``new_base_ring``.
EXAMPLES::
sage: from sage.modular.modform_hecketriangle.space import ModularForms sage: MF = ModularForms(n=6, k=20, ep=1) sage: subspace = MF.subspace([MF.Delta()*MF.E4()^2, MF.gen(0)]) sage: subspace.change_ring(CC) Subspace of dimension 2 of ModularForms(n=6, k=20, ep=1) over Complex Field with 53 bits of precision """
r""" Return a new subspace with the same basis but inside a different ambient space (if possible).
EXAMPLES::
sage: from sage.modular.modform_hecketriangle.space import ModularForms, QuasiModularForms sage: MF = ModularForms(n=6, k=20, ep=1) sage: subspace = MF.subspace([MF.Delta()*MF.E4()^2, MF.gen(0)]) sage: new_ambient_space = QuasiModularForms(n=6, k=20, ep=1) sage: subspace.change_ambient_space(new_ambient_space) # long time Subspace of dimension 2 of QuasiModularForms(n=6, k=20, ep=1) over Integer Ring """
def contains_coeff_ring(self): r""" Return whether ``self`` contains its coefficient ring.
EXAMPLES::
sage: from sage.modular.modform_hecketriangle.space import ModularForms sage: MF = ModularForms(k=0, ep=1, n=8) sage: subspace = MF.subspace([1]) sage: subspace.contains_coeff_ring() True sage: subspace = MF.subspace([]) sage: subspace.contains_coeff_ring() False sage: MF = ModularForms(k=0, ep=-1, n=8) sage: subspace = MF.subspace([]) sage: subspace.contains_coeff_ring() False """
def basis(self): r""" Return the basis of ``self`` in the ambient space.
EXAMPLES::
sage: from sage.modular.modform_hecketriangle.space import ModularForms sage: MF = ModularForms(n=6, k=20, ep=1) sage: subspace = MF.subspace([(MF.Delta()*MF.E4()^2).as_ring_element(), MF.gen(0)]) sage: subspace.basis() [q + 78*q^2 + 2781*q^3 + 59812*q^4 + O(q^5), 1 + 360360*q^4 + O(q^5)] sage: subspace.basis()[0].parent() == MF True """
def gens(self): r""" Return the basis of ``self``.
EXAMPLES::
sage: from sage.modular.modform_hecketriangle.space import ModularForms sage: MF = ModularForms(n=6, k=20, ep=1) sage: subspace = MF.subspace([(MF.Delta()*MF.E4()^2).as_ring_element(), MF.gen(0)]) sage: subspace.gens() [q + 78*q^2 + 2781*q^3 + 59812*q^4 + O(q^5), 1 + 360360*q^4 + O(q^5)] sage: subspace.gens()[0].parent() == subspace True """
def dimension(self): r""" Return the dimension of ``self``.
EXAMPLES::
sage: from sage.modular.modform_hecketriangle.space import ModularForms sage: MF = ModularForms(n=6, k=20, ep=1) sage: subspace = MF.subspace([(MF.Delta()*MF.E4()^2).as_ring_element(), MF.gen(0)]) sage: subspace.dimension() 2 sage: subspace.dimension() == len(subspace.gens()) True """
def degree(self): r""" Return the degree of ``self``.
EXAMPLES::
sage: from sage.modular.modform_hecketriangle.space import ModularForms sage: MF = ModularForms(n=6, k=20, ep=1) sage: subspace = MF.subspace([(MF.Delta()*MF.E4()^2).as_ring_element(), MF.gen(0)]) sage: subspace.degree() 4 sage: subspace.degree() == subspace.ambient_space().degree() True """
def rank(self): r""" Return the rank of ``self``.
EXAMPLES::
sage: from sage.modular.modform_hecketriangle.space import ModularForms sage: MF = ModularForms(n=6, k=20, ep=1) sage: subspace = MF.subspace([(MF.Delta()*MF.E4()^2).as_ring_element(), MF.gen(0)]) sage: subspace.rank() 2 sage: subspace.rank() == subspace.dimension() True """
def coordinate_vector(self, v): r""" Return the coordinate vector of ``v`` with respect to the basis ``self.gens()``.
INPUT:
- ``v`` -- An element of ``self``.
OUTPUT:
The coordinate vector of ``v`` with respect to the basis ``self.gens()``.
Note: The coordinate vector is not an element of ``self.module()``.
EXAMPLES::
sage: from sage.modular.modform_hecketriangle.space import ModularForms, QuasiCuspForms sage: MF = ModularForms(n=6, k=20, ep=1) sage: subspace = MF.subspace([(MF.Delta()*MF.E4()^2).as_ring_element(), MF.gen(0)]) sage: subspace.coordinate_vector(MF.gen(0) + MF.Delta()*MF.E4()^2).parent() Vector space of dimension 2 over Fraction Field of Univariate Polynomial Ring in d over Integer Ring sage: subspace.coordinate_vector(MF.gen(0) + MF.Delta()*MF.E4()^2) (1, 1)
sage: MF = ModularForms(n=4, k=24, ep=-1) sage: subspace = MF.subspace([MF.gen(0), MF.gen(2)]) sage: subspace.coordinate_vector(subspace.gen(0)).parent() Vector space of dimension 2 over Fraction Field of Univariate Polynomial Ring in d over Integer Ring sage: subspace.coordinate_vector(subspace.gen(0)) (1, 0)
sage: MF = QuasiCuspForms(n=infinity, k=12, ep=1) sage: subspace = MF.subspace([MF.Delta(), MF.E4()*MF.f_inf()*MF.E2()*MF.f_i(), MF.E4()*MF.f_inf()*MF.E2()^2, MF.E4()*MF.f_inf()*(MF.E4()-MF.E2()^2)]) sage: el = MF.E4()*MF.f_inf()*(7*MF.E4() - 3*MF.E2()^2) sage: subspace.coordinate_vector(el) (7, 0, -3) sage: subspace.ambient_coordinate_vector(el) (7, 21/(8*d), 0, -3) """
|