def Weyl_law_N(self,T,T1=None): r""" The counting function for this space. N(T)=#{disc. ev.<=T} INPUT: - ``T`` -- double EXAMPLES:: sage: M=MaassWaveForms(MySubgroup(Gamma0(1)) sage: M.Weyl_law_N(10) 0.572841337202191 """ (c1,c2,c3,c4,c5)=self._Weyl_law_const cc1=RR(c1); cc2=RR(c2); cc3=RR(c3); cc4=RR(c4); cc5=RR(c5) #print "c1,c2,c3,c4,c5=",cc1,cc2,cc3,cc4,cc5 t=sqrt(T*T+0.25) try: lnt=ln(t) except TypeError: lnt=mpmath.ln(t) #print "t,ln(t)=",t,lnt NT=cc1*t*t-cc2*t*lnt+cc3*t+cc4*t+cc5 if(T1<>None): t=sqrt(T1*T1+0.25) NT1=cc1*(T1*T1+0.25)-cc2*t*ln(t)+cc3*t+cc4*t+cc5 return RR(abs(NT1-NT)) else: return RR(NT)
def _Weyl_law_consts(self): r""" Compute constants for the Weyl law on self._G OUTPUT: - tuple of real numbers EXAMPLES:: sage: M=MaassWaveForms(MySubgroup(Gamma0(1))) sage: M._Weyl_law_consts() (0, 2/pi, (log(pi) - log(2) + 2)/pi, 0, -2) """ import mpmath pi=mpmath.fp.pi ix=Integer(self._G.index()) nc=Integer(len(self._G.cusps())) if(self._G.is_congruence()): lvl=Integer(self._G.level()) else: lvl=0 n2=Integer(self._G.nu2()) n3=Integer(self._G.nu3()) c1=ix/Integer(12) c2=Integer(2)*nc/pi c3=nc*(Integer(2)-ln(Integer(2))+ln(pi))/pi if(lvl<>0): A=1 for q in divisors(lvl): num_prim_dc=0 DG=DirichletGroup(q) for chi in DG.list(): if(chi.is_primitive()): num_prim_dc=num_prim_dc+1 for m in divisors(lvl): if(lvl % (m*q) == 0 and m % q ==0 ): fak=(q*lvl)/gcd(m,lvl/m) A=A*Integer(fak)**num_prim_dc c4=-ln(A)/pi else: c4=Integer(0) # constant term c5=-ix/144+n2/8+n3*2/9-nc/4-1 return (c1,c2,c3,c4,c5)
def Weyl_law_Np(self,T,T1=None): r""" The derviative of the counting function for this space. N(T)=#{disc. ev.<=T} INPUT: - ``T`` -- double EXAMPLES:: sage: M=MaassWaweForms(MySubgroup(Gamma0(1)) sage: M.Weyl_law_Np(10) """ (c1,c2,c3,c4,c5)=self._Weyl_law_const cc1=RR(c1); cc2=RR(c2); cc3=RR(c3); cc4=RR(c4); cc5=RR(c5) #print "c1,c2,c3,c4,c5=",c1,c2,c3,c4,c5 NpT=2.0*cc1*T-cc2*(ln(T)+1.0)+cc3+cc4 return RR(NpT)