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