101 | | kk = k % 12 |
102 | | if kk == 2: |
103 | | kk += 12 |
104 | | b = None |
105 | | for a in range(15): |
106 | | c = kk - 4*a |
107 | | if c % 6 == 0: |
108 | | b = c // 6 |
109 | | break |
110 | | assert not (b is None), "bug in VM basis" |
| 122 | F6 = ((-504)*eisenstein_series_qexp(6,prec,var=var)).change_ring(ZZ) |
| 123 | |
| 124 | if e == 0: |
| 125 | A = F6.parent()(1) |
| 126 | elif e == 4: |
| 127 | A = (240*eisenstein_series_qexp(4,prec,var=var)).change_ring(ZZ) |
| 128 | elif e == 6: |
| 129 | A = F6 |
| 130 | elif e == 8: |
| 131 | A = (480*eisenstein_series_qexp(8,prec,var=var)).change_ring(ZZ) |
| 132 | elif e == 10: |
| 133 | A = (-264*eisenstein_series_qexp(10,prec,var=var)).change_ring(ZZ) |
| 134 | else: # e == 14 |
| 135 | A = (-24*eisenstein_series_qexp(14,prec,var=var)).change_ring(ZZ) |
| 136 | |
| 137 | if n == 0: |
| 138 | return Sequence([A], cr=True) |
| 139 | |
| 140 | F6_squared = F6**2 |
| 141 | D = delta_qexp(prec,var=var) |
| 142 | Fprod = F6_squared |
| 143 | Dprod = D |
| 144 | R = A.parent() |
| 145 | |
| 146 | if cusp_only: |
| 147 | ls = [R(0)] + [A] * n |
| 148 | start = 1 |
| 149 | else: |
| 150 | ls = [A] * (n+1) |
| 151 | start = 0 |
| 152 | |
| 153 | for i in range(1,n+1): |
| 154 | ls[n-i] *= Fprod |
| 155 | ls[i] *= Dprod |
| 156 | |
| 157 | Fprod *= F6_squared |
| 158 | Dprod *= D |
| 159 | Dprod = Dprod.add_bigoh(prec) |
| 160 | |
| 161 | if cusp_only: |
| 162 | M = Matrix(ZZ, n, prec, [x.list() for x in ls[1:]]) |
| 163 | for i in range(n): |
| 164 | for j in range(i): |
| 165 | M.add_multiple_of_row(j,i,-M[j][i+1]) |
| 166 | else: |
| 167 | M = Matrix(ZZ, n+1, prec, [x.list() for x in ls]) |
| 168 | for i in range(1,n+1): |
| 169 | for j in range(i): |
| 170 | M.add_multiple_of_row(j,i,-M[j][i]) |
| 171 | |
| 172 | return Sequence([ R(x.list()).add_bigoh(prec) for x in M.rows() ], cr=True) |
112 | | F4 = 240*eisenstein_series_qexp(4, prec=prec) |
113 | | F6 = -504*eisenstein_series_qexp(6, prec=prec) |
114 | | if var != 'q': |
115 | | F4 = R(F4) |
116 | | F6 = R(F6) |
117 | | Delta = (F4**3 - F6**2)/R(1728,prec) |
118 | | d = dimension_cusp_forms_gamma0(1, k) |
119 | | m = Delta / (F6*F6) |
120 | | g = m * F6**(2*d + b) * F4**a |
121 | | G = [] |
122 | | for j in range(d): |
123 | | G.append(g) |
124 | | if j < d-1: |
125 | | g *= m |
126 | | |
127 | | if not cusp_only: |
128 | | G.insert(0, R(eisenstein_series_qexp(k, prec=prec))) |
129 | | |
130 | | M = MatrixSpace(QQ, len(G), prec) |
131 | | # we have to slice since precision in products can increase. |
132 | | e = [g.padded_list(prec) for g in G] |
133 | | A = M(sum(e, [])) |
134 | | # this is still provably correct -- the guess is still proven right. |
135 | | # it's just that naive guess based on coefficients is way too big. |
136 | | E = A.echelon_form(height_guess=10**(k)) |
137 | | return Sequence([R(list(v), prec) for v in E.rows()], cr=True) |
138 | | |
139 | | |
140 | | ## def delta_qexp(prec=10, var='q'): |
141 | | ## """ |
142 | | ## Return the q-expansion of Delta. |
143 | | ## """ |
144 | | ## F4 = 240*eisenstein_series_qexp(4, prec=prec) |
145 | | ## F6 = -504*eisenstein_series_qexp(6, prec=prec) |
146 | | ## R = QQ[[var]] |
147 | | ## if var != 'q': |
148 | | ## F4 = R(F4) |
149 | | ## F6 = R(F6) |
150 | | ## return (F4**3 - F6**2)/R(1728, prec) |
151 | | |
152 | | ## def eta_qexp(prec=10, var='q'): |
153 | | ## """ |
154 | | ## Return the q-expansion of the Dedekind eta functions as a power |
155 | | ## series with coefficients in ZZ. |
156 | | |
157 | | ## ALGORITHM: |
158 | | ## Compute a simple very explicit modular form whose 8th power |
159 | | ## is Delta. Then compute the 8th power using NTL polynomial |
160 | | ## arithmetic, which is VERY fast. This function |
161 | | ## computes a *million* terms of Delta in under a minute. |
162 | | |
163 | | ## EXAMPLES: |
164 | | ## sage: delta_qexp(7) |
165 | | ## q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 - 16744*q^7 + O(q^7) |
166 | | ## sage: delta_qexp(7,'z') |
167 | | ## z - 24*z^2 + 252*z^3 - 1472*z^4 + 4830*z^5 - 6048*z^6 - 16744*z^7 + O(z^7) |
168 | | ## sage: delta_qexp(-3) |
169 | | ## Traceback (most recent call last): |
170 | | ## ... |
171 | | ## ValueError: prec must be positive |
172 | | ## """ |
173 | | ## if prec <= 0: |
174 | | ## raise ValueError, "prec must be positive" |
175 | | ## v = [0] * prec |
176 | | ## stop = int((-1+math.sqrt(1+8*prec))/2.0) |
177 | | ## for n in range(stop+1): |
178 | | ## ## |
179 | | ## {{{ |
180 | | ## pari('eta(q+O(q^200))') |
181 | | ## /// |
182 | | ## 1 - q - q^2 + q^5 + q^7 - q^12 - q^15 + q^22 + q^26 - q^35 - q^40 + q^51 + q^57 - q^70 - q^77 + q^92 + q^100 - q^117 - q^126 + q^145 + q^155 - q^176 - q^187 + O(q^200) |
183 | | ## }}} |
184 | | ## {{{ |
185 | | ## sloane_find([2,5,7,12,15,22,26]) |
186 | | ## /// |
187 | | ## Searching Sloane's online database... |
188 | | ## [[1318, 'Generalized pentagonal numbers: n(3n-1)/2, n=0, +- 1, +- 2,....', [0, 1, 2, 5, 7, 12, 15, 22, 26, 35, 40, 51, 57, 70, 77, 92, 100, 117, 126, 145, 155, 176, 187, 210, 222, 247, 260, 287, 301, 330, 345, 376, 392, 425, 442, 477, 495, 532, 551, 590, 610, 651, 672, 715, 737, 782, 805, 852, 876, 925, 950, 1001, 1027, 1080, 1107, 1162, 1190, 1247, 1276, 1335]]] |
189 | | ## }}} |
190 | | |
191 | | from sage.rings.all import Integer |
192 | | |