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)
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)