"""
This file contains a bunch of tests extracted from the published book
'Modular Forms: a Computational Approach' by William Stein, AMS 2007.

sage: G = SL(2,ZZ); G
Special Linear Group of degree 2 over Integer Ring
sage: S, T = G.gens()
sage: S
[ 0  1]
[-1  0]
sage: T
[1 1]
[0 1]
sage: delta_qexp(6)
q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 + O(q^6)
sage: bernoulli(12)
-691/2730
sage: bernoulli(50)
495057205241079648212477525/66
sage: len(str(bernoulli(10000)))
27706
sage: E4 = eisenstein_series_qexp(4, 3)
sage: E6 = eisenstein_series_qexp(6, 3)
sage: E4^6
1/191102976000000 + 1/132710400000*q + 203/44236800000*q^2 + O(q^3)
sage: E4^3*E6^2
1/3511517184000 - 1/12192768000*q - 377/4064256000*q^2 + O(q^3)
sage: E6^4
1/64524128256 - 1/32006016*q + 241/10668672*q^2 + O(q^3)
sage: victor_miller_basis(28,5)
[
1 + 15590400*q^3 + 36957286800*q^4 + O(q^5),
q + 151740*q^3 + 61032448*q^4 + O(q^5),
q^2 + 192*q^3 - 8280*q^4 + O(q^5)
]
sage: R.<q> = QQ[['q']]
sage: F4 =  240 * eisenstein_series_qexp(4,3)
sage: F6 = -504 * eisenstein_series_qexp(6,3)
sage: F4^3
1 + 720*q + 179280*q^2 + O(q^3)
sage: Delta = (F4^3 - F6^2)/1728; Delta
q - 24*q^2 + O(q^3)
sage: F4^3 - 720*Delta
1 + 196560*q^2 + O(q^3)
sage: M = ModularForms(1,36, prec=6).echelon_form()
sage: M.basis()
[
1 + 6218175600*q^4 + 15281788354560*q^5 + O(q^6),
q + 57093088*q^4 + 37927345230*q^5 + O(q^6),
q^2 + 194184*q^4 + 7442432*q^5 + O(q^6),
q^3 - 72*q^4 + 2484*q^5 + O(q^6)
]
sage: T2 = M.hecke_matrix(2); T2
[     34359738369                0       6218175600 9026867482214400]
[               0                0      34416831456    5681332472832]
[               0                1           194184       -197264484]
[               0                0              -72           -54528]
sage: T2.charpoly().factor()
(x - 34359738369) * (x^3 - 139656*x^2 - 59208339456*x - 1467625047588864)
sage: bernoulli_mod_p(23)
[1, 4, 13, 17, 13, 6, 10, 5, 10, 9, 15]
sage: set_modsym_print_mode ('modular')
sage: M = ModularSymbols(11, 2)
sage: M.basis()
({Infinity, 0}, {-1/8, 0}, {-1/9, 0})
sage: S = M.cuspidal_submodule()
sage: S.integral_basis()     # basis over ZZ.
({-1/8, 0}, {-1/9, 0})
sage: set_modsym_print_mode ('manin')    # set it back
sage: continued_fraction(4/7).convergents()
[0, 1, 1/2, 4/7]
sage: M = ModularSymbols(2,2)
sage: M
Modular Symbols space of dimension 1 for Gamma_0(2)
of weight 2 with sign 0 over Rational Field
sage: M.manin_generators()
[(0,1), (1,0), (1,1)]

sage: M = ModularSymbols(3,2)
sage: M.manin_generators()
[(0,1), (1,0), (1,1), (1,2)]

sage: M = ModularSymbols(6,2)
sage: M.manin_generators()
[(0,1), (1,0), (1,1), (1,2), (1,3), (1,4), (1,5), (2,1),
 (2,3), (2,5), (3,1), (3,2)]
sage: M = ModularSymbols(2,2)
sage: [x.lift_to_sl2z(2) for x in M.manin_generators()]
[[1, 0, 0, 1], [0, -1, 1, 0], [1, 0, 1, 1]]
sage: M = ModularSymbols(6,2)
sage: x = M.manin_generators()[9]
sage: x
(2,5)
sage: x.lift_to_sl2z(6)
[1, 2, 2, 5]
sage: M = ModularSymbols(2,2)
sage: M.manin_basis()
[1]
sage: [M.manin_generators()[i] for i in M.manin_basis()]
[(1,0)]
sage: M = ModularSymbols(6,2)
sage: M.manin_basis()
[1, 10, 11]
sage: [M.manin_generators()[i] for i in M.manin_basis()]
[(1,0), (3,1), (3,2)]
sage: M.basis()
((1,0), (3,1), (3,2))
sage: [x.modular_symbol_rep() for x in M.basis()]
[{Infinity, 0}, {0, 1/3}, {-1/2, -1/3}]
sage: M = ModularSymbols(2,2)
sage: M.manin_gens_to_basis()
[-1]
[ 1]
[ 0]
sage: M = ModularSymbols(2,2)
sage: x = (1,0); M(x)
(1,0)
sage: M( (3,1) )    # entries are reduced modulo 2 first
0
sage: M( (10,19) )
-(1,0)
sage: M = ModularSymbols(6,2)
sage: M.manin_gens_to_basis()
[-1  0  0]
[ 1  0  0]
[ 0  0  0]
[ 0 -1  1]
[ 0 -1  0]
[ 0 -1  1]
[ 0  0  0]
[ 0  1 -1]
[ 0  0 -1]
[ 0  1 -1]
[ 0  1  0]
[ 0  0  1]
sage: M = ModularSymbols(6,2)
sage: M((0,1))
-(1,0)
sage: M((1,2))
-(3,1) + (3,2)
sage: HeilbronnCremona(2).to_list()
[[1, 0, 0, 2], [2, 0, 0, 1], [2, 1, 0, 1], [1, 0, 1, 2]]
sage: HeilbronnCremona(3).to_list()
[[1, 0, 0, 3], [3, 1, 0, 1], [1, 0, 1, 3], [3, 0, 0, 1],
 [3, -1, 0, 1], [-1, 0, 1, -3]]
sage: HeilbronnCremona(5).to_list()
[[1, 0, 0, 5], [5, 2, 0, 1], [2, 1, 1, 3], [1, 0, 3, 5],
 [5, 1, 0, 1], [1, 0, 1, 5], [5, 0, 0, 1], [5, -1, 0, 1],
 [-1, 0, 1, -5], [5, -2, 0, 1], [-2, 1, 1, -3],
 [1, 0, -3, 5]]
sage: len(HeilbronnCremona(37))
128
sage: len(HeilbronnCremona(389))
1892
sage: len(HeilbronnCremona(2003))
11662
sage: M = ModularSymbols(2,2)
sage: M.T(2).matrix()
[1]
sage: M = ModularSymbols(6, 2)
sage: M.T(2).matrix()
[ 2  1 -1]
[-1  0  1]
[-1 -1  2]
sage: M.T(3).matrix()
[3 2 0]
[0 1 0]
[2 2 1]
sage: M.T(3).fcp()  # factored characteristic polynomial
(x - 3) * (x - 1)^2
sage: M = ModularSymbols(39, 2)
sage: T2 = M.T(2)
sage: T2.matrix()
[ 3  0 -1  0  0  1  1 -1  0]
[ 0  0  2  0 -1  1  0  1 -1]
[ 0  1  0 -1  1  1  0  1 -1]
[ 0  0  1  0  0  1  0  1 -1]
[ 0 -1  2  0  0  1  0  1 -1]
[ 0  0  1  1  0  1  1 -1  0]
[ 0  0  0 -1  0  1  1  2  0]
[ 0  0  0  1  0  0  2  0  1]
[ 0  0 -1  0  0  0  1  0  2]
sage: T2.fcp()     # factored characteristic polynomial
(x - 1)^2 * (x - 3)^3 * (x^2 + 2*x - 1)^2
sage: T2 = M.T(2).matrix()
sage: T5 = M.T(5).matrix()
sage: T2*T5 - T5*T2 == 0
True
sage: T5.charpoly().factor()
(x - 2)^2 * (x - 6)^3 * (x^2 - 8)^2
sage: M = ModularSymbols(39, 2)
sage: M.T(2).decomposition()
[
Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 9 for Gamma_0(39) of weight 2 with sign 0 over Rational Field,
Modular Symbols subspace of dimension 3 of Modular Symbols space of dimension 9 for Gamma_0(39) of weight 2 with sign 0 over Rational Field,
Modular Symbols subspace of dimension 4 of Modular Symbols space of dimension 9 for Gamma_0(39) of weight 2 with sign 0 over Rational Field
]
sage: M = ModularSymbols(2, 2)
sage: M.boundary_map()
Hecke module morphism boundary map defined by the matrix
[ 1 -1]
Domain: Modular Symbols space of dimension 1 for
Gamma_0(2) of weight ...
Codomain: Space of Boundary Modular Symbols for
Congruence Subgroup Gamma0(2) ...
sage: M.cuspidal_submodule()
Modular Symbols subspace of dimension 0 of Modular
Symbols space of dimension 1 for Gamma_0(2) of weight
2 with sign 0 over Rational Field
sage: M = ModularSymbols(11, 2)
sage: M.boundary_map().matrix()
[ 1 -1]
[ 0  0]
[ 0  0]
sage: M.cuspidal_submodule()
Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 3 for Gamma_0(11) of weight 2 with sign 0 over Rational Field
sage: S = M.cuspidal_submodule(); S
Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 3 for Gamma_0(11) of weight 2 with sign 0 over Rational Field
sage: S.basis()
((1,8), (1,9))
sage: S.T(2).matrix()
[-2  0]
[ 0 -2]
sage: S.T(3).matrix()
[-1  0]
[ 0 -1]
sage: S.T(5).matrix()
[1 0]
[0 1]
sage: E = EllipticCurve([0,-1,1,-10,-20])
sage: 2 + 1 - E.Np(2)
-2
sage: 3 + 1 - E.Np(3)
-1
sage: 5 + 1 - E.Np(5)
1
sage: 7 + 1 - E.Np(7)
-2
sage: [S.T(p).matrix()[0,0] for p in [2,3,5,7]]
[-2, -1, 1, -2]
sage: M = ModularSymbols(11); M.basis()
((1,0), (1,8), (1,9))
sage: S = M.cuspidal_submodule(); S
Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 3 for Gamma_0(11) of weight 2 with sign 0 over Rational Field
sage: S.T(2).matrix()
[-2  0]
[ 0 -2]
sage: S.T(3).matrix()
[-1  0]
[ 0 -1]
sage: M = ModularSymbols(33)
sage: S = M.cuspidal_submodule(); S
Modular Symbols subspace of dimension 6 of Modular
Symbols space of dimension 9 for Gamma_0(33) of weight
2 with sign 0 over Rational Field
sage: R.<q> = PowerSeriesRing(QQ)
sage: v = [S.T(n).matrix()[0,0] for n in range(1,6)]
sage: f00 = sum(v[n-1]*q^n for n in range(1,6)) + O(q^6)
sage: f00
q - q^2 - q^3 + q^4 + O(q^6)
sage: v = [S.T(n).matrix()[0,1] for n in range(1,6)]
sage: f01 = sum(v[n-1]*q^n for n in range(1,6)) + O(q^6)
sage: f01
-2*q^3 + O(q^6)
sage: v = [S.T(n).matrix()[1,0] for n in range(1,6)]
sage: f10 = sum(v[n-1]*q^n for n in range(1,6)) + O(q^6)
sage: f10
q^3 + O(q^6)
sage: v = [S.T(n).matrix()[1,1] for n in range(1,6)]
sage: f11 = sum(v[n-1]*q^n for n in range(1,6)) + O(q^6)
sage: f11
q - 2*q^2 + 2*q^4 + q^5 + O(q^6)
sage: M = ModularSymbols(23)
sage: S = M.cuspidal_submodule()
sage: S
Modular Symbols subspace of dimension 4 of Modular
Symbols space of dimension 5 for Gamma_0(23) of weight
2 with sign 0 over Rational Field
sage: f = S.q_expansion_cuspforms(6)
sage: f(0,0)
q - 2/3*q^2 + 1/3*q^3 - 1/3*q^4 - 4/3*q^5 + O(q^6)
sage: f(0,1)
O(q^6)
sage: f(1,0)
-1/3*q^2 + 2/3*q^3 + 1/3*q^4 - 2/3*q^5 + O(q^6)
sage: S.q_expansion_basis(6)
[
q - q^3 - q^4 + O(q^6),
q^2 - 2*q^3 - q^4 + 2*q^5 + O(q^6)
]
sage: R = Integers(49)
sage: R
Ring of integers modulo 49
sage: R.unit_gens()
(3,)
sage: Integers(25).unit_gens()
(2,)
sage: Integers(100).unit_gens()
(51, 77)
sage: Integers(200).unit_gens()
(151, 101, 177)
sage: Integers(2005).unit_gens()
(402, 1206)
sage: Integers(200000000).unit_gens()
(174218751, 51562501, 187109377)
sage: list(DirichletGroup(5))
[Dirichlet character modulo 5 of conductor 1 mapping 2 |--> 1,
Dirichlet character modulo 5 of conductor 5 mapping 2 |--> zeta4,
Dirichlet character modulo 5 of conductor 5 mapping 2 |--> -1,
Dirichlet character modulo 5 of conductor 5 mapping 2 |--> -zeta4]
sage: list(DirichletGroup(5, QQ))
[Dirichlet character modulo 5 of conductor 1 mapping 2 |--> 1, Dirichlet character modulo 5 of conductor 5 mapping 2 |--> -1]
sage: G = DirichletGroup(200)
sage: G
Group of Dirichlet characters of modulus 200 over
Cyclotomic Field of order 20 and degree 8
sage: G.exponent()
20
sage: G.gens()
(Dirichlet character modulo 200 of conductor 4 mapping 151 |--> -1, 101 |--> 1, 177 |--> 1,
Dirichlet character modulo 200 of conductor 8 mapping 151 |--> 1, 101 |--> -1, 177 |--> 1,
Dirichlet character modulo 200 of conductor 25 mapping 151 |--> 1, 101 |--> 1, 177 |--> zeta20)
sage: K = G.base_ring()
sage: zeta = K.0
sage: eps = G([1,-1,zeta^5])
sage: eps
Dirichlet character modulo 200 of conductor 40 mapping 151 |--> 1, 101 |--> -1, 177 |--> zeta20^5
sage: eps(3)
zeta20^5
sage: -zeta^15
zeta20^5
sage: kronecker(151,200)
1
sage: kronecker(101,200)
-1
sage: kronecker(177,200)
1
sage: G = DirichletGroup(20)
sage: G.galois_orbits()
[
[Dirichlet character modulo 20 of conductor 1 mapping 11 |--> 1, 17 |--> 1],
[Dirichlet character modulo 20 of conductor 5 mapping 11 |--> 1, 17 |--> zeta4,
Dirichlet character modulo 20 of conductor 5 mapping 11 |--> 1, 17 |--> -zeta4],
[Dirichlet character modulo 20 of conductor 5 mapping 11 |--> 1, 17 |--> -1],
[Dirichlet character modulo 20 of conductor 4 mapping 11 |--> -1, 17 |--> 1],
[Dirichlet character modulo 20 of conductor 20 mapping 11 |--> -1, 17 |--> zeta4,
Dirichlet character modulo 20 of conductor 20 mapping 11 |--> -1, 17 |--> -zeta4],
[Dirichlet character modulo 20 of conductor 20 mapping 11 |--> -1, 17 |--> -1]
]
sage: G = DirichletGroup(11, QQ); G
Group of Dirichlet characters of modulus 11 over
Rational Field
sage: list(G)
[Dirichlet character modulo 11 of conductor 1 mapping 2 |--> 1,
Dirichlet character modulo 11 of conductor 11 mapping 2 |--> -1]
sage: eps = G.0      # 0th generator for Dirichlet group
sage: eps
Dirichlet character modulo 11 of conductor 11 mapping 2 |--> -1
sage: G.unit_gens()
(2,)
sage: eps(2)
-1
sage: eps(3)
1
sage: [eps(11*n) for n in range(10)]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
sage: R = CyclotomicField(4)
sage: CyclotomicField(4)
Cyclotomic Field of order 4 and degree 2
sage: G = DirichletGroup(15, R)
sage: G
Group of Dirichlet characters of modulus 15 over
Cyclotomic Field of order 4 and degree 2
sage: list(G)
[Dirichlet character modulo 15 of conductor 1 mapping 11 |--> 1, 7 |--> 1,
Dirichlet character modulo 15 of conductor 3 mapping 11 |--> -1, 7 |--> 1,
Dirichlet character modulo 15 of conductor 5 mapping 11 |--> 1, 7 |--> zeta4,
Dirichlet character modulo 15 of conductor 15 mapping 11 |--> -1, 7 |--> zeta4,
Dirichlet character modulo 15 of conductor 5 mapping 11 |--> 1, 7 |--> -1,
Dirichlet character modulo 15 of conductor 15 mapping 11 |--> -1, 7 |--> -1,
Dirichlet character modulo 15 of conductor 5 mapping 11 |--> 1, 7 |--> -zeta4,
Dirichlet character modulo 15 of conductor 15 mapping 11 |--> -1, 7 |--> -zeta4]
sage: e = G.1
sage: e(4)
-1
sage: e(-1)
-1
sage: e(5)
0
sage: [e(n) for n in range(15)]
[0, 1, zeta4, 0, -1, 0, 0, zeta4, -zeta4,
    0, 0, 1, 0, -zeta4, -1]
sage: G = DirichletGroup(15, GF(5)); G
Group of Dirichlet characters of modulus 15
      over Finite Field of size 5
sage: list(G)
[Dirichlet character modulo 15 of conductor 1 mapping 11 |--> 1, 7 |--> 1,
Dirichlet character modulo 15 of conductor 3 mapping 11 |--> 4, 7 |--> 1,
Dirichlet character modulo 15 of conductor 5 mapping 11 |--> 1, 7 |--> 2,
Dirichlet character modulo 15 of conductor 15 mapping 11 |--> 4, 7 |--> 2,
Dirichlet character modulo 15 of conductor 5 mapping 11 |--> 1, 7 |--> 4,
Dirichlet character modulo 15 of conductor 15 mapping 11 |--> 4, 7 |--> 4,
Dirichlet character modulo 15 of conductor 5 mapping 11 |--> 1, 7 |--> 3,
Dirichlet character modulo 15 of conductor 15 mapping 11 |--> 4, 7 |--> 3]
sage: e = G.1
sage: e(-1)
4
sage: e(2)
2
sage: e(5)
0
sage: print [e(n) for n in range(15)]
[0, 1, 2, 0, 4, 0, 0, 2, 3, 0, 0, 1, 0, 3, 4]
sage: G = DirichletGroup(5)
sage: e = G.0
sage: e(2)
zeta4
sage: e.bernoulli(1)
-1/5*zeta4 - 3/5
sage: e.bernoulli(9)
-108846/5*zeta4 - 176868/5
sage: E = EisensteinForms(Gamma1(13),2)
sage: E.eisenstein_series()
[
1/2 + q + 3*q^2 + 4*q^3 + 7*q^4 + 6*q^5 + O(q^6),
-7/13*zeta6 - 11/13 + q + (2*zeta6 + 1)*q^2 + (-3*zeta6 + 1)*q^3 + (6*zeta6 - 3)*q^4 - 4*q^5 + O(q^6),
q + (zeta6 + 2)*q^2 + (-zeta6 + 3)*q^3 + (3*zeta6 + 3)*q^4 + 4*q^5 + O(q^6),
-zeta6 + q + (2*zeta6 - 1)*q^2 + (3*zeta6 - 2)*q^3 + (-2*zeta6 - 1)*q^4 + 6*q^5 + O(q^6),
q + (zeta6 + 1)*q^2 + (zeta6 + 2)*q^3 + (zeta6 + 2)*q^4 + 6*q^5 + O(q^6),
-1 + q - q^2 + 4*q^3 + 3*q^4 - 4*q^5 + O(q^6),
q + q^2 + 4*q^3 + 3*q^4 + 4*q^5 + O(q^6),
zeta6 - 1 + q + (-2*zeta6 + 1)*q^2 + (-3*zeta6 + 1)*q^3 + (2*zeta6 - 3)*q^4 + 6*q^5 + O(q^6),
q + (-zeta6 + 2)*q^2 + (-zeta6 + 3)*q^3 + (-zeta6 + 3)*q^4 + 6*q^5 + O(q^6),
7/13*zeta6 - 18/13 + q + (-2*zeta6 + 3)*q^2 + (3*zeta6 - 2)*q^3 + (-6*zeta6 + 3)*q^4 - 4*q^5 + O(q^6),
q + (-zeta6 + 3)*q^2 + (zeta6 + 2)*q^3 + (-3*zeta6 + 6)*q^4 + 4*q^5 + O(q^6)
]
sage: e = E.eisenstein_series()
sage: for e in E.eisenstein_series():
...       print e.parameters()
...
(Dirichlet character modulo 13 of conductor 1 mapping 2 |--> 1, Dirichlet character modulo 13 of conductor 1 mapping 2 |--> 1, 13)
(Dirichlet character modulo 13 of conductor 1 mapping 2 |--> 1, Dirichlet character modulo 13 of conductor 13 mapping 2 |--> zeta6, 1)
(Dirichlet character modulo 13 of conductor 13 mapping 2 |--> zeta6, Dirichlet character modulo 13 of conductor 1 mapping 2 |--> 1, 1)
(Dirichlet character modulo 13 of conductor 1 mapping 2 |--> 1, Dirichlet character modulo 13 of conductor 13 mapping 2 |--> zeta6 - 1, 1)
(Dirichlet character modulo 13 of conductor 13 mapping 2 |--> zeta6 - 1, Dirichlet character modulo 13 of conductor 1 mapping 2 |--> 1, 1)
(Dirichlet character modulo 13 of conductor 1 mapping 2 |--> 1, Dirichlet character modulo 13 of conductor 13 mapping 2 |--> -1, 1)
(Dirichlet character modulo 13 of conductor 13 mapping 2 |--> -1, Dirichlet character modulo 13 of conductor 1 mapping 2 |--> 1, 1)
(Dirichlet character modulo 13 of conductor 1 mapping 2 |--> 1, Dirichlet character modulo 13 of conductor 13 mapping 2 |--> -zeta6, 1)
(Dirichlet character modulo 13 of conductor 13 mapping 2 |--> -zeta6, Dirichlet character modulo 13 of conductor 1 mapping 2 |--> 1, 1)
(Dirichlet character modulo 13 of conductor 1 mapping 2 |--> 1, Dirichlet character modulo 13 of conductor 13 mapping 2 |--> -zeta6 + 1, 1)
(Dirichlet character modulo 13 of conductor 13 mapping 2 |--> -zeta6 + 1, Dirichlet character modulo 13 of conductor 1 mapping 2 |--> 1, 1)
sage: dimension_cusp_forms(Gamma0(2007),2)
221
sage: dimension_eis(Gamma0(2007),2)
7
sage: dimension_modular_forms(Gamma0(2007),2)
228
sage: dimension_new_cusp_forms(Gamma0(11),12)
8
sage: dimension_cusp_forms(Gamma0(11),12)
10
sage: dimension_new_cusp_forms(Gamma0(2007),12)
1017
sage: dimension_cusp_forms(Gamma0(2007),12)
2460
sage: dimension_cusp_forms(Gamma1(2007),2)
147409
sage: dimension_eis(Gamma1(2007),2)
3551
sage: dimension_modular_forms(Gamma1(2007),2)
150960
sage: G = DirichletGroup(2007)
sage: e = prod(G.gens(), G(1))
sage: dimension_cusp_forms(e,2)
222
sage: dimension_cusp_forms(e,3)
0
sage: dimension_cusp_forms(e,4)
670
sage: dimension_cusp_forms(e,24)
5150
sage: dimension_eis(e,2)
4
sage: dimension_eis(e,3)
0
sage: dimension_eis(e,4)
4
sage: dimension_eis(e,24)
4
sage: G = DirichletGroup(2007, QQ)
sage: e = prod(G.gens(), G(1))
sage: dimension_new_cusp_forms(e,2)
76
sage: p = 389
sage: k = GF(p)
sage: a = k(7/13); a
210
sage: a.rational_reconstruction()
7/13
sage: M = MatrixSpace(QQ,4,8)
sage: A = M([[-9,6,7,3,1,0,0,0],[-10,3,8,2,0,1,0,0],[3,-6,2,8,0,0,1,0],[-8,-6,-8,6,0,0,0,1]])
sage: A41 = MatrixSpace(GF(41),4,8)(A)
sage: E41 = A41.echelon_form()
sage: B = A.matrix_from_columns([0,1,2,4])
sage: E = B^(-1)*A
sage: B = A.matrix_from_columns([0,1,2,3])
sage: M = ModularSymbols(Gamma0(6)); M
Modular Symbols space of dimension 3 for Gamma_0(6)
of weight 2 with sign 0 over Rational Field
sage: M.new_subspace()
Modular Symbols subspace of dimension 1 of Modular Symbols space of dimension 3 for Gamma_0(6) of weight 2 with sign 0 over Rational Field
sage: M.old_subspace()
Modular Symbols subspace of dimension 3 of Modular
Symbols space of dimension 3 for Gamma_0(6) of weight
2 with sign 0 over Rational Field
sage: G = DirichletGroup(13)
sage: G
Group of Dirichlet characters of modulus 13 over
Cyclotomic Field of order 12 and degree 4
sage: dimension_modular_forms(Gamma1(13),2)
13
sage: [dimension_modular_forms(e,2) for e in G]
[1, 0, 3, 0, 2, 0, 2, 0, 2, 0, 3, 0]
sage: G = DirichletGroup(100)
sage: G
Group of Dirichlet characters of modulus 100 over
Cyclotomic Field of order 20 and degree 8
sage: dimension_modular_forms(Gamma1(100),2)
370
sage: v = [dimension_modular_forms(e,2) for e in G]; v
[24, 0, 0, 17, 18, 0, 0, 17, 18, 0, 0, 21, 18, 0, 0, 17,
  18, 0, 0, 17, 24, 0, 0, 17, 18, 0, 0, 17, 18, 0, 0, 21,
  18, 0, 0, 17, 18, 0, 0, 17]
sage: sum(v)
370
sage: S = CuspForms(Gamma0(45), 2, prec=14); S
Cuspidal subspace of dimension 3 of Modular Forms space
of dimension 10 for Congruence Subgroup Gamma0(45) of
weight 2 over Rational Field
sage: S.basis()
[
q - q^4 - q^10 - 2*q^13 + O(q^14),
q^2 - q^5 - 3*q^8 + 4*q^11 + O(q^14),
q^3 - q^6 - q^9 - q^12 + O(q^14)
]
sage: S.new_subspace().basis()
[
q + q^2 - q^4 - q^5 - 3*q^8 - q^10 + 4*q^11 - 2*q^13 + O(q^14)
]
sage: CuspForms(Gamma0(9),2)
Cuspidal subspace of dimension 0 of Modular Forms space
of dimension 3 for Congruence Subgroup Gamma0(9) of
weight 2 over Rational Field
sage: CuspForms(Gamma0(15),2, prec=10).basis()
[
q - q^2 - q^3 - q^4 + q^5 + q^6 + 3*q^8 + q^9 + O(q^10)
]
"""
