Level One Modular Forms#

Computing \(\Delta\)#

The modular form

\[\Delta = q\prod(1-q^n)^{24} = \sum \tau(n)q^n\]

is perhaps the world’s most famous modular form. We compute some terms from the definition.

sage: R.<q> = QQ[[]]
sage: q * prod( 1-q^n+O(q^6) for n in (1..5) )^24
q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 + O(q^7)
>>> from sage.all import *
>>> R = QQ[['q']]; (q,) = R._first_ngens(1)
>>> q * prod( Integer(1)-q**n+O(q**Integer(6)) for n in (ellipsis_iter(Integer(1),Ellipsis,Integer(5))) )**Integer(24)
q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 + O(q^7)

There are much better ways to compute \(\Delta\), which amount to just a few polynomial multiplications over \(\ZZ\).

sage: D = delta_qexp(10^5)      # less than 10 seconds
sage: D[:10]
q - 24*q^2 + 252*q^3 - 1472*q^4 + ...
sage: [p for p in primes(10^5) if D[p] % p == 0]
[2, 3, 5, 7, 2411]
sage: D[2411]
4542041100095889012
sage: f = eisenstein_series_qexp(12,6) - D[:6]; f
691/65520 + 2073*q^2 + 176896*q^3 + 4197825*q^4 + 48823296*q^5 + O(q^6)
sage: f % 691
O(q^6)
>>> from sage.all import *
>>> D = delta_qexp(Integer(10)**Integer(5))      # less than 10 seconds
>>> D[:Integer(10)]
q - 24*q^2 + 252*q^3 - 1472*q^4 + ...
>>> [p for p in primes(Integer(10)**Integer(5)) if D[p] % p == Integer(0)]
[2, 3, 5, 7, 2411]
>>> D[Integer(2411)]
4542041100095889012
>>> f = eisenstein_series_qexp(Integer(12),Integer(6)) - D[:Integer(6)]; f
691/65520 + 2073*q^2 + 176896*q^3 + 4197825*q^4 + 48823296*q^5 + O(q^6)
>>> f % Integer(691)
O(q^6)

The Victor Miller Basis#

The Victor Miller basis for \(M_k(\mathrm{SL}_2(\ZZ))\) is the reduced row echelon basis. It’s a lemma that it has all integer coefficients, and a rather nice diagonal shape.

sage: victor_miller_basis(24, 6)
[
1 + 52416000*q^3 + 39007332000*q^4 + 6609020221440*q^5 + O(q^6),
q + 195660*q^3 + 12080128*q^4 + 44656110*q^5 + O(q^6),
q^2 - 48*q^3 + 1080*q^4 - 15040*q^5 + O(q^6)
]
sage: from sage.modular.dims import dimension_modular_forms
sage: dimension_modular_forms(1,200)
17
sage: B = victor_miller_basis(200, 18) #5 seconds
sage: B
[
1 + 79288314420681734048660707200000*q^17 + O(q^18),
q + 2687602718106772837928968846869*q^17 + O(q^18),
...
q^16 + 96*q^17 + O(q^18)
]
>>> from sage.all import *
>>> victor_miller_basis(Integer(24), Integer(6))
[
1 + 52416000*q^3 + 39007332000*q^4 + 6609020221440*q^5 + O(q^6),
q + 195660*q^3 + 12080128*q^4 + 44656110*q^5 + O(q^6),
q^2 - 48*q^3 + 1080*q^4 - 15040*q^5 + O(q^6)
]
>>> from sage.modular.dims import dimension_modular_forms
>>> dimension_modular_forms(Integer(1),Integer(200))
17
>>> B = victor_miller_basis(Integer(200), Integer(18)) #5 seconds
>>> B
[
1 + 79288314420681734048660707200000*q^17 + O(q^18),
q + 2687602718106772837928968846869*q^17 + O(q^18),
...
q^16 + 96*q^17 + O(q^18)
]

Note: Craig Citro has made the above computation an order of magnitude faster in code he has not quite got into Sage yet.

“I’ll clean those up and submit them soon, since I need them for something I’m working on … I’m currently in the process of making spaces of modular forms of level one subclass the existing code, and actually take advantage of all our fast \(E_k\) and \(\Delta\) computation code, as well as cleaning things up a bit.”