예제 #1
0
class pAutomorphicForms(Module):
    Element=pAutomorphicForm
    r"""
    The module of (quaternionic) `p`-adic automorphic forms.

    EXAMPLES:

    ::


    AUTHORS:

    - Cameron Franc (2012-02-20)
    - Marc Masdeu (2012-02-20)
    """
    def __init__(self,X,U,prec=None,t=None,R=None,overconvergent=False):
        if(R is None):
            if(not isinstance(U,Integer)):
                self._R=U.base_ring()
            else:
                if(prec is None):
                    prec=100
                self._R=Qp(X._p,prec)
        else:
            self._R=R
        #U is a CoefficientModuleSpace
        if(isinstance(U,Integer)):
            if(t is None):
                if(overconvergent):
                    t=prec-U+1
                else:
                    t=0
            self._U=OCVn(U-2,self._R,U-1+t)
        else:
            self._U=U
        self._X=X
        self._V=self._X.get_vertex_list()
        self._E=self._X.get_edge_list()
        self._prec=self._R.precision_cap()
        self._n=self._U.weight()
        Module.__init__(self,base=self._R)
        self._populate_coercion_lists_()

    def _repr_(self):
        r"""
        This returns the representation of self as a string.

        EXAMPLES:

        This example illustrates ...

        ::
        """
        s='Space of automorphic forms on '+str(self._X)+' with values in '+str(self._U)
        return s

    def _coerce_map_from_(self, S):
        r"""
        Can coerce from other HarmonicCocycles or from pAutomorphicForms
        """
        if(isinstance(S,HarmonicCocycles)):
            if(S._k-2!=self._n):
                return False
            if(S._X!=self._X):
                return False
            return True
        if(isinstance(S,pAutomorphicForms)):
            if(S._n!=self._n):
                return False
            if(S._X!=self._X):
                return False
            return True
        return False

    def _element_constructor_(self,x):
        r"""
        """
        #Code how to coherce x into the space
        #Admissible values of x?
        if isinstance(x,(HarmonicCocycleElement,pAutomorphicForm)):
            return pAutomorphicForm(self,x)

    def _an_element_(self):
        r"""
        Returns an element of the module.
        """
        return pAutomorphicForm(self,1)

    def embed_quaternion(self,g):
        r"""
        Returns the image of ``g`` under the embedding
        of the quaternion algebra into 2x2 matrices.
        """
        return self._X.embed_quaternion(g,prec = self._prec)

    def lift(self,f, verbose = True):
        r"""
        Lifts the harmonic cocycle ``f`` to an
        overconvegent automorphic form, thus computing
        all the moments.
        """
        F=self.element_class(self,f)
        F.improve(verbose = verbose)
        return F

    def _apply_Up_operator(self,f,scale=False, fix_lowdeg_terms = True):
        r"""
        Apply the Up operator to ``f``.

        EXAMPLES:

        ::
            sage: X = BTQuotient(3,11)
            sage: M = HarmonicCocycles(X,4,30)
            sage: A = pAutomorphicForms(X,4,10, overconvergent = True)
            sage: F = A.lift(M.basis()[0], verbose = False); F
            p-adic automorphic form on Space of automorphic forms on Quotient of the Bruhat T**s tree of GL_2(QQ_3) with discriminant 11 and level 1 with values in Overconvergent coefficient module of weight n=2 over the ring 3-adic Field with capped relative precision 10 and depth 10:
            e   |   c(e)
            0 | 3^2 + O(3^12) + O(3^32)*z + O(3^26)*z^2 + (2*3^2 + 3^3 + 2*3^5 + 3^7 + 3^8 + 2*3^9 + O(3^10))*z^3 + (2*3^5 + 2*3^6 + 2*3^7 + 3^9 + O(3^10))*z^4 + (3^2 + 3^3 + 2*3^4 + 2*3^5 + 2*3^6 + 3^7 + 2*3^8 + 3^9 + O(3^10))*z^5 + (3^2 + 2*3^3 + 3^4 + 2*3^6 + O(3^10))*z^6 + (2*3^3 + 3^4 + 2*3^5 + 2*3^6 + 2*3^7 + 3^8 + 3^9 + O(3^10))*z^7 + (3^2 + 3^3 + 2*3^6 + 3^7 + 3^8 + 3^9 + O(3^10))*z^8 + (2*3^2 + 2*3^3 + 2*3^5 + 2*3^7 + 3^8 + 2*3^9 + O(3^10))*z^9
            1 | 2*3^2 + 2*3^3 + 2*3^4 + 2*3^5 + 2*3^6 + 2*3^7 + 2*3^8 + 2*3^9 + 2*3^10 + 2*3^11 + O(3^12) + (3^2 + O(3^12))*z + (2*3^2 + 2*3^3 + 2*3^4 + 2*3^5 + 2*3^6 + 2*3^7 + 2*3^8 + 2*3^9 + 2*3^10 + 2*3^11 + O(3^12))*z^2 + (2*3^2 + 2*3^3 + 3^4 + 2*3^5 + 3^6 + 2*3^7 + 2*3^8 + O(3^10))*z^3 + (2*3^3 + 3^5 + 3^7 + 3^8 + O(3^10))*z^4 + (2*3^3 + 3^6 + 3^7 + 3^9 + O(3^10))*z^5 + (3^3 + 2*3^4 + 2*3^5 + 2*3^7 + 3^8 + 3^9 + O(3^10))*z^6 + (3^7 + 2*3^8 + 2*3^9 + O(3^10))*z^7 + (3^3 + 2*3^4 + 3^7 + O(3^10))*z^8 + (2*3^2 + 3^4 + 3^6 + 2*3^7 + 3^8 + 2*3^9 + O(3^10))*z^9
            2 | 3^2 + 2*3^3 + 2*3^6 + 3^7 + 2*3^8 + O(3^12) + (3 + 2*3^2 + 2*3^3 + 3^5 + 2*3^6 + 3^7 + 3^10 + O(3^11))*z + (2*3 + 2*3^2 + 3^4 + 2*3^5 + 2*3^6 + 2*3^8 + 3^10 + O(3^11))*z^2 + (2*3 + 3^2 + 2*3^7 + 3^9 + O(3^10))*z^3 + (3 + 2*3^2 + 2*3^4 + 3^5 + 2*3^6 + 2*3^7 + 2*3^8 + 2*3^9 + O(3^10))*z^4 + (3 + 3^2 + 3^4 + 2*3^9 + O(3^10))*z^5 + (3^3 + 2*3^5 + 3^6 + 3^8 + 2*3^9 + O(3^10))*z^6 + (3^5 + 2*3^7 + 3^9 + O(3^10))*z^7 + (2*3 + 3^3 + 3^4 + 2*3^6 + O(3^10))*z^8 + (2*3 + 2*3^3 + 2*3^4 + 2*3^6 + O(3^10))*z^9
            3 | 3^2 + 2*3^4 + 2*3^5 + 2*3^6 + 2*3^7 + 2*3^8 + 2*3^9 + 2*3^10 + 2*3^11 + O(3^12) + (3^3 + 2*3^4 + 2*3^8 + O(3^13))*z + (3 + 3^2 + 3^3 + 2*3^4 + 2*3^5 + 3^6 + 3^7 + 2*3^8 + 2*3^9 + 2*3^10 + O(3^11))*z^2 + (3^2 + 2*3^3 + 3^4 + 3^7 + 3^8 + 2*3^9 + O(3^10))*z^3 + (3 + 2*3^2 + 2*3^3 + 3^4 + 2*3^5 + 2*3^6 + 2*3^7 + 3^8 + O(3^10))*z^4 + (3 + 3^3 + 3^4 + 2*3^5 + 2*3^6 + 3^7 + 2*3^8 + 2*3^9 + O(3^10))*z^5 + (3 + 3^4 + 3^5 + 3^6 + 2*3^7 + O(3^10))*z^6 + (2*3 + 3^2 + 2*3^3 + 3^4 + 2*3^6 + 3^8 + 3^9 + O(3^10))*z^7 + (3 + 3^3 + 2*3^4 + 2*3^5 + 2*3^6 + 3^7 + 2*3^9 + O(3^10))*z^8 + (2*3^2 + 3^4 + 3^5 + 3^8 + 3^9 + O(3^10))*z^9

        """
        HeckeData=self._X._get_Up_data()
        if scale == False:
            factor=(self._X._p)**(self._U.weight()/2)
        else:
            factor=1
        Tf=[]
        for jj in range(2*len(self._E)):
            tmp=self._U(0)
            for d in HeckeData:
                gg=d[0] # acter
                u=d[1][jj] # edge_list[jj]
                r=self._X._p**(-(u.power))*(u.t()*gg)
                tmp+=f._F[u.label+u.parity*len(self._E)].r_act_by(r)
            tmp *= factor
            for ii in range(self._n+1):
                tmp[ii] = f._F[jj][ii]
            Tf.append(tmp)
        return pAutomorphicForm(self,Tf,quick=True)
예제 #2
0
class pAutomorphicForms(Module):
    Element = pAutomorphicFormElement
    r"""
    The module of (quaternionic) `p`-adic automorphic forms.

    EXAMPLES::

    AUTHORS:

    - Cameron Franc (2012-02-20)
    - Marc Masdeu (2012-02-20)
    """
    def __init__(self,domain,U,prec = None,t = None,R = None,overconvergent = False):
        if(R is None):
            if not isinstance(U,Integer):
                self._R = U.base_ring()
            else:
                if prec is None:
                    prec = 20
                self._R = Qp(domain._p,prec)
        else:
            self._R = R
        #U is a CoefficientModuleSpace
        if isinstance(U,Integer):
            if t is None:
                if overconvergent:
                    t = prec-U+1
                else:
                    t = 0
            self._U = OCVn(U-2,self._R,U-1+t)
        else:
            self._U = U
        self._source = domain
        self._list = self._source.get_list() # Contains also the opposite edges
        self._prec = self._R.precision_cap()
        self._n = self._U.weight()
        self._p = self._source._p
        Module.__init__(self,base = self._R)
        self._populate_coercion_lists_()

    def prime(self):
        return self._p

    def _repr_(self):
        r"""
        This returns the representation of self as a string.

        EXAMPLES::
        """
        s = 'Space of automorphic forms on '+str(self._source)+' with values in '+str(self._U)
        return s

    def _coerce_map_from_(self, S):
        r"""
        Can coerce from other HarmonicCocycles or from pAutomorphicForms
        """
        if isinstance(S,HarmonicCocycles):
            if S.weight()-2 != self._n:
                return False
            if S._source != self._source:
                return False
            return True
        if isinstance(S,pAutomorphicForms):
            if S._n != self._n:
                return False
            if S._source != self._source:
                return False
            return True
        return False

    def _element_constructor_(self,x):
        r"""
        """
        #Code how to coherce x into the space
        #Admissible values of x?
        if isinstance(x,(HarmonicCocycleElement,pAutomorphicFormElement)):
            return pAutomorphicFormElement(self,x)

    def _an_element_(self):
        r"""
        Returns an element of the module.
        """
        return pAutomorphicFormElement(self,1)

    def lift(self,f, verbose = True):
        r"""
        Lifts the harmonic cocycle ``f`` to an
        overconvegent automorphic form, thus computing
        all the moments.
        """
        F = self.element_class(self,f)
        F.improve(verbose = verbose)
        return F

    def _make_invariant(self, F):
        r"""
        EXAMPLES::
        """
        S = self._source.get_stabilizers()
        M  = [e.rep for e in self._list]
        coeff_module_class = self._U.element_class
        newF = []
        for ii in range(len(S)):
            Si = S[ii]
            x = coeff_module_class(F[ii].parent(),F[ii]._val,quick = True)
            if(any([v[2] for v in Si])):
                newFi = coeff_module_class(F[ii].parent(),0)
                s = QQ(0)
                m = M[ii]
                for v in Si:
                    s += 1
                    # self._source should has a embed method that, given stabilizers,
                    # returns 2x2 matrices that can act on the distributions.
                    newFi  +=  x.r_act_by(m.adjoint()*self._source.embed(v[0],prec = self._prec)*m)
                newF.append((1/s)*newFi)
            else:
                newF.append(x)
        return newF

    def _apply_Up_operator(self,f,scale = False):
        r"""
        Apply the Up operator to ``f``.

        EXAMPLES::

            sage: X = BTQuotient(3,11)
            sage: M = HarmonicCocycles(X,4,20)
            sage: A = pAutomorphicForms(X,4,10, overconvergent = True)
            sage: F = A.lift(M.basis()[0], verbose = False)
            sage: print F.values()
            [3^2 + O(3^12) + O(3^22)*z + O(3^16)*z^2 + (2*3^2 + O(3^10))*z^3 + (3^4 + O(3^10))*z^4 + (3^2 + 3^3 + O(3^10))*z^5 + (3^2 + 2*3^3 + 2*3^4 + O(3^10))*z^6 + (2*3^3 + O(3^10))*z^7 + (3^2 + 3^3 + 2*3^4 + 3^5 + O(3^10))*z^8 + (2*3^2 + 2*3^3 + O(3^10))*z^9, 2*3^2 + 2*3^3 + 2*3^4 + 2*3^5 + 2*3^6 + 2*3^7 + 2*3^8 + 2*3^9 + 2*3^10 + 2*3^11 + O(3^12) + (3^2 + O(3^12))*z + (2*3^2 + 2*3^3 + 2*3^4 + 2*3^5 + 2*3^6 + 2*3^7 + 2*3^8 + 2*3^9 + 2*3^10 + 2*3^11 + O(3^12))*z^2 + (2*3^2 + 3^4 + 3^6 + 3^8 + O(3^10))*z^3 + (3^4 + 2*3^5 + 2*3^6 + 3^8 + 2*3^9 + O(3^10))*z^4 + (3^3 + 2*3^4 + 2*3^7 + 3^8 + O(3^10))*z^5 + (2*3^4 + 2*3^6 + 3^7 + 3^8 + 2*3^9 + O(3^10))*z^6 + (3^3 + 2*3^4 + 2*3^5 + 2*3^6 + 3^9 + O(3^10))*z^7 + (2*3^4 + 3^7 + O(3^10))*z^8 + (2*3^2 + 3^6 + 2*3^7 + 2*3^8 + O(3^10))*z^9, 3^2 + 2*3^3 + 2*3^6 + 3^7 + 2*3^8 + O(3^12) + (3 + 2*3^2 + 2*3^3 + 3^5 + 2*3^6 + 3^7 + 3^10 + O(3^11))*z + (2*3 + 2*3^2 + 3^4 + 2*3^5 + 2*3^6 + 2*3^8 + 3^10 + O(3^11))*z^2 + (2*3 + 3^2 + 3^4 + 3^5 + 2*3^7 + 2*3^8 + O(3^10))*z^3 + (3 + 2*3^2 + 2*3^4 + 2*3^5 + 2*3^6 + 2*3^7 + O(3^10))*z^4 + (3 + 3^2 + 3^4 + 2*3^5 + 2*3^6 + 3^7 + 2*3^8 + 3^9 + O(3^10))*z^5 + (3^3 + 3^4 + 3^7 + O(3^10))*z^6 + (2*3^4 + 3^5 + 3^6 + 2*3^9 + O(3^10))*z^7 + (2*3 + 3^3 + 3^5 + 3^6 + 3^7 + 3^8 + 3^9 + O(3^10))*z^8 + (2*3 + 2*3^3 + 2*3^4 + 2*3^5 + 3^8 + 2*3^9 + O(3^10))*z^9, 3^2 + 2*3^4 + 2*3^5 + 2*3^6 + 2*3^7 + 2*3^8 + 2*3^9 + 2*3^10 + 2*3^11 + O(3^12) + (3^3 + 2*3^4 + 2*3^8 + O(3^12))*z + (3 + 3^2 + 3^3 + 2*3^4 + 2*3^5 + 3^6 + 3^7 + 2*3^8 + 2*3^9 + O(3^10))*z^2 + (3^2 + 2*3^3 + 3^4 + 3^5 + 2*3^8 + 3^9 + O(3^10))*z^3 + (3 + 2*3^2 + 2*3^3 + 3^4 + 2*3^5 + 2*3^9 + O(3^10))*z^4 + (3 + 3^3 + 2*3^4 + 2*3^5 + 2*3^7 + 3^8 + 3^9 + O(3^10))*z^5 + (3 + 3^4 + 3^5 + 2*3^6 + 3^7 + 2*3^8 + 3^9 + O(3^10))*z^6 + (2*3 + 3^2 + 2*3^3 + 2*3^5 + 3^7 + 3^8 + 3^9 + O(3^10))*z^7 + (3 + 3^3 + 2*3^4 + 2*3^5 + 3^6 + 3^7 + 3^9 + O(3^10))*z^8 + (2*3^2 + 3^4 + 2*3^5 + 2*3^6 + 3^7 + 2*3^8 + O(3^10))*z^9]
        """
        HeckeData = self._source._get_Up_data()
        if scale == False:
            factor = (self._p)**(self._n/2)
        else:
            factor = 1
        Tf = []
        for jj in range(len(self._list)):
            tmp = self._U(0)
            for d in HeckeData:
                gg = d[0] # acter
                u = d[1][jj] # edge_list[jj]
                r = self._p**(-u.power) * (u.t(2*self._prec+1)*gg)
                tmp += f._value[u.label].r_act_by(r)
            tmp  *=  factor
            for ii in range(self._n+1):
                tmp[ii] = f._value[jj][ii]
            Tf.append(tmp)
        return pAutomorphicFormElement(self,Tf,quick = True)