def test_pullback(self):
     S = CuspFormsDegree2(24, prec=5)
     l = 2
     tpls = S.linearly_indep_tuples()
     A1 = tpl_to_half_int_mat((1, 1, 1))
     pull_back_dct = {t: epsilon_tilde_l_k_degree2(
         l + 2, S.wt, A1, tpl_to_half_int_mat(t)) for t in tpls}
     pull_back_vec = S._to_vector(pull_back_dct)
     f = S._to_form(pull_back_vec)
     for t in PrecisionDeg2(3):
         self.assertEqual(
             f[t], epsilon_tilde_l_k_degree2(l + 2, S.wt, A1, tpl_to_half_int_mat(t)))
def algebraic_part_of_standard_l(f, l, space_of_cuspforms, verbose=False):
    r'''f: (vector valued) cuspidal eigenform of degree 2 of weight det^k Sym(j).
    l: positive even integer such that 2 le l < k - 2.
    space_of_cuspforms: space of cusp form that f belongs to.
    Return the algebriac part of the standard L of f at l
    cf. Katsurada, Takemori Congruence primes of the Kim-Ramakrishnan-Shahidi lift. Theorem 4.1.
    '''
    k = f.wt
    j = f.sym_wt
    t0 = f._none_zero_tpl()
    D = tpl_to_half_int_mat(t0)
    if not (l % 2 == 0 and 2 <= l < k - 2):
        raise ValueError
    u3_val, u4_val, f_t0_pol_val = _u3_u4_nonzero(f, t0)
    pull_back_vec = _pullback_vector(
        l + ZZ(2), D, u3_val, u4_val, space_of_cuspforms, verbose=verbose)
    T2 = space_of_cuspforms.hecke_matrix(2)
    d = space_of_cuspforms.dimension()
    vecs = [(T2 ** i) * pull_back_vec for i in range(d)]
    ei = [sum(f[t0] * a for f, a in zip(space_of_cuspforms.basis(), v))
          for v in vecs]
    if j > 0:
        ei = [a._to_pol() for a in ei]
    chply = T2.charpoly()
    nume = first_elt_of_kern_of_vandermonde(chply, f.hecke_eigenvalue(2), ei)
    denom = f[t0] * f_t0_pol_val
    if j > 0:
        denom = denom._to_pol()
    return f.base_ring(nume / denom)
예제 #3
0
def _pullback_vector(l, D, u3, u4, space_of_cuspforms, verbose=False):
    '''Return a vector corresponding to pullback of Eisenstein series.
    '''
    k = space_of_cuspforms.wt
    j = space_of_cuspforms.sym_wt
    tpls = space_of_cuspforms.linearly_indep_tuples()
    u1, u2 = _U_ring.gens()
    if j > 0:
        pull_back_fc_dct = {t: fc_of_pullback_of_diff_eisen(
            l, k, j, tpl_to_half_int_mat(t), D, u3, u4, verbose=verbose) for t
            in set(t for t, i in tpls)}
        pull_back_dct = {(t, i): pull_back_fc_dct[t][u1 ** (j - i) * u2 ** i]
                         for t, i in tpls}
    else:
        pull_back_dct = {t: fc_of_pullback_of_diff_eisen(
            l, k, j, tpl_to_half_int_mat(t), D, u3, u4,
            verbose=verbose) for t in tpls}
        pull_back_dct = {k: v.constant_coefficient()
                         for k, v in pull_back_dct.iteritems()}
    return space_of_cuspforms._to_vector(pull_back_dct)