r""" Testing L-series for Siegel modular forms Usage: 1) copy the correct file to gram_data.wtXX.sage 2) init_forms(k,prec) - init generators and spaces of Siegel modular forms for weight k with precision (number of coefficients) prec 3) set_data() - sets the correct gram matrix to gram_data 4) getXD() - Sets the l-series FD_FG """ #attachd/ 'siegel_modular_form.sage' attach 'siegel_test_fns.sage' Weight=26 PREC=701 load 'gd/gram_data.26.sage' NMAX=10 # = number of L-series we want to check below for linear independence do_print=True # False #m = Morp([A,B,C,D]) #R.=PolynomialRing (ZZ) def get_fns26(gd,nmax): print "Compute functions for weight 26!" ## Interesting forms try: F1=Ups26_1=SiegelModularForm("Ups26_1.sobj") F2=Ups26_2=SiegelModularForm("Ups26_2.sobj") except IOError: # Ups_I: Rational Field F1=-973/4438886400*A^4*C + 251/887777280*A*B^2*C - 1/11381760*A^2*B*D + B*C^2 - 28413/32110*A*C*D # Ups_II: Rational Field F2=11/6903360*A^4*C - 31/13806720*A*B^2*C + 1/4602240*A^2*B*D + B*C^2 + 27954/3995*A*C*D f=open("Ups26_1.sobj","w") F1.pickle(f) f.close() f=open("Ups26_2.sobj","w") F2.pickle(f) f.close() # Test that the Upsilon's are Hecke print F1,F2 print "F1 is Hecke=",test_hecke_form(F1,2) print "F2 is Hecke=",test_hecke_form(F2,2) ## Maass forms K.= NumberField( x^3 - 126769776*x^2 + 4594492182343680*x - 51244463801761372569600) try: M=SiegelModularForm("M26.sobj") except IOError: # Maass: NumberField in a M=(-1210213/76524914737346712698880000*a^2 + 2621424848891/1594269057028056514560000*a - 1151601343145993/34597852800088032000)*A^4*C + (4747/401755802371070241669120*a^2 - 41493602327/33479650197589186805760*a + 729919612514831/29062196352073946880)*A*B^2*C + (157/47092255222982592430080*a^2 - 553783327/1635147750798006681600*a + 40688420009/5914162871809920)*A^2*B*D + B*C^2 + (-277877/14761750528037560320*a^2 + 567162698689/307536469334115840*a - 4894554588148553/133479370370710)*A*C*D f=open("M26.sobj","w") M.pickle(f) f.close() M1 = deepcopy(M) M2 = deepcopy(M) M3 = deepcopy(M) s1, s2, s3 = K.embeddings(RF) c1, c2, c3 = M1.coeffs(), M2.coeffs(),M3.coeffs() for f in c1: c1[f] = s1(M[f]) c2[f] = s2(M[f]) c3[f] = s3(M[f]) # Test that the M's are Hecke print M1,M2,M3 print "M1 is Hecke=",test_hecke_form(M1,2) print "M2 is Hecke=",test_hecke_form(M2,2) print "M3 is Hecke=",test_hecke_form(M3,2) ### Eisenstein series: Rational Field try: E=SiegelModularForm("Eisen26.sobj") except IOError: # E: Rational Field E=217825170306075045213490111/175115938885406662127531537203200000*A^5*B + 1049521275111088854210452353/1251063290585122275571510808087101440*A^2*B^3 - 8233791312459490154420659/91206218169482636524756008960*A^4*C - 36533044502239208037421/630042954460241897046011904*A*B^2*C - 1421309310883605348442171/11400777271185329565594501120*A^2*B*D + B*C^2 + 143857072160393843636/30142872952923769233*A*C*D f=open("Eisen26.sobj","w") E.pickle(f) f.close() print E print "Eisen26 is Hecke=",test_hecke_form(E,2) ### Klingen series: Rational Field try: KL=SiegelModularForm("KEisen26.sobj") except IOError: KL=-6379829291/15571964273098752000*A^5*B + 6379829291/15571964273098752000*A^2*B^3 + 5321372903/125160463872000*A^4*C - 79599083/1877406958080*A*B^2*C - 1247906041/62580231936000*A^2*B*D + B*C^2 + 14116116/15089755*A*C*D f=open("KEisen26.sobj","w") KL.pickle(f) f.close() print KL print "KL26 is Hecke=",test_hecke_form(KL,2) ## Define the L-series # Interesting Spinor L-functions X_F1=X_(F1,gd,nmax) X_F2=X_(F2,gd,nmax) # For testing that the Gram matrices are ok R_F1M1 = R_( F1,M1, gd,nmax) # Should be equal to X_F1 R_F2M2 = R_( F2,M2, gd,nmax) # Should be equal to X_F1 # Interesting convolution series R_F1F1=R_(F1, F1, gd,nmax) R_F1F2=R_(F1, F2, gd,nmax) #R_F2F1=R_(F2, F1, gd) R_F2F2=R_(F2, F2, gd) # Maass Spinor L-functions X_M1 = X_(M1, gd,nmax) # Spinor L-fn of M1 X_M2 = X_(M2, gd,nmax) # Spinor L-fn of M2 X_M3 = X_(M3, gd,nmax) # Spinor L-fn of M3 X_E = X_(E,gd,nmax) X_KL = X_(KL,gd,nmax) D_F1F1=D_(F1, F1, gd,Weight) D_F1F2=D_(F1, F2, gd,Weight) D_F2F2=D_(F2, F2, gd,Weight) FL=[F1,F2] # The completed convolution-type L-series: only for printing DL=[D_F1F1,D_F1F2,D_F2F2] # Incomplete Spinor L-functions and conv. L-series: for testing gram matrices TL=[X_F1,X_F2,R_F1M1,R_F2M2] # Incomplete L-series: for checking linear independence BL=[X_M1,X_M2,X_M3,X_E,X_KL,R_F1F1,R_F1F2,R_F2F2] return [DL,TL,BL,FL] # End def # If we have not already got the functions we get them try: [D_F1F1,D_F1F2,D_F2F2]=DL [X_F1,X_F2,R_F1M1,R_F2M2]=TL [X_M1,X_M2,X_M3,X_E,X_KL,R_F1F1,R_F1F2,R_F2F2]=BL [F1,F2]=FL except: [DL,TL,BL,FL]=get_fns26(GRAM_DATA,NMAX) [D_F1F1,D_F1F2,D_F2F2]=DL [X_F1,X_F2,R_F1M1,R_F2M2]=TL [X_M1,X_M2,X_M3,X_E,X_KL,R_F1F1,R_F1F2,R_F2F2]=BL [F1,F2]=FL if(do_print): print "######### L-series for weight = %s ###########" % (Weight) # number of digits to print utd=50 print "######### D_F1F1 ###########" print_Lcoeff(D_F1F1,utd) print "######### D_F1F2 ###########" print_Lcoeff(D_F1F2,utd) print "######### D_F2F2 ###########" print_Lcoeff(D_F2F2,utd) ## Testing (experimentally) the error in the gram matrix. ## By comparing the spinor L-function of Fj with the convolution L-series D_{FjMj} if(do_print): print "\n" print "Comparison: R_F1M1 <---> X_F1" print_cmp_rel_er(R_F1M1,X_F1) print "Comparison:R_F2M2 <---> X_F2" print_cmp_rel_er(R_F2M2,X_F2) me1=get_cmp_rel_er(R_F1M1,X_F1,NMAX) me2=get_cmp_rel_er(R_F2M2,X_F2,NMAX) maxerr=max(me1,me2) #print "Maxerror=",mppr(maxerr) print "Maxerror(difference)=",mppr(maxerr) eps1=max(MAXERR.values()) #eps1=mpmath.mpf(1E-49) n1=L2_norm(F1,GRAM_DATA,NMAX) n2=L2_norm(F2,GRAM_DATA,NMAX) print "max_norm=",mppr(max(n1,n2)) print "dps=",mpmath.mp.dps norm=max(n1,n2)**2 eps2=norm*eps1 print "eps1=",mppr(eps1) print "eps2=",mppr(eps2) print "Testing all:::::" if(BL.count(X_F1)==0): BL.append(X_F1); BL.append(X_F2) T=check_total_indep(BL,eps2) print T[0],mppr(T[1]) ## The true ep2 eps2=proper_eps2([F1,F2],[R_F1F1,R_F2F2],GRAM_DATA,NMAX,eps1) print "True eps2=",mppr(eps2) T=check_total_indep(BL,eps2) print T[0],mppr(T[1])