# Load invertibility mod 2 data. Each line has the form "p r1 r2" where# p is a prime, r1 is True or False according to whether the matrix of T_2# acting on S_2(Gamma_0(p), F_2) is invertible, and r2 similarly for T_2+1.
f=open("mod2ranks-500000.txt","r")l=[]d={}forsinf:ifs.isspace():continuep,r1,r2=s.split(" ")p=Integer(p);r1=eval(r1);r2=eval(r2)l.append((p,r1,r2))d[p]=(r1,r2)f.close()print("Invertibility data loaded successfully.")
Invertibility data loaded successfully.
# Check that each prime appears exactly once.print([i[0]foriinl]==prime_range(3,500000))
True
# Test some correlations.for(p,r1,r2)inl:ifp%8==3andr1:print("a",p)ifp%8!=7andr2:print("b",p)
# Data for p == 1 mod 8, e == 0; p == 5 mod 8, e == 0; p == 7 mod 8, e == 0; p == 7 mod 8, e == 1print1.0*j1/i1,1.0*j2/i2,1.0*j3/i3,1.0*j4/i4show(points(l1,color='darkgreen',pointsize=2,aspect_ratio=90),points(l2,color='darkgreen',pointsize=2,aspect_ratio=50),points(l3,color='darkgreen',pointsize=2,aspect_ratio=70),points(l4,color='darkgreen',pointsize=2,aspect_ratio=20))
# Compute proportion of kernel computations which can be avoided by prescreening using invertibility mod 2.i=j=0for(p,r1,r2)inl:j+=5ifr1:i+=3ifr2:i+=2print1.0*i/j