Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Views: 2212
# Load mod 2 multiplicity data. Each line has the form "N m1 m2" where # N is an odd positive integer, and m1 and m2 equal the multiplicities of 0 and 1 # as roots of the charpoly of T_2 on S_2(Gamma_0(p), F_2).
f = open("mod2-01mults.txt", "r") l = [] d = {} for s in f: if s.isspace(): continue try: N, m0, m1 = s.split(" ") except ValueError: print s N = Integer(N); m0 = Integer(m0); m1 = Integer(m1) l.append((N, m0, m1)) d[N] = (m0, m1) f.close() cutoff = l[-1][0] + 1 print("Multiplicity data up to " + str(cutoff) + " loaded successfully.")
Multiplicity data up to 200000 loaded successfully.
# QA: the levels are the odd integers in the range [1, cutoff]. print([i[0] for i in l] == srange(1, cutoff, 2))
True
# Compute new multiplicities by accounting for degeneration maps. # QA: these multiplicities must be nonnegative. l2 = [] d2 = {} for N in srange(1, cutoff, 2): (m0, m1) = d[N] for j in N.divisors(): if j<N: s = number_of_divisors(N//j) (t0, t1) = d2[j] m0 -= s*t0; m1 -= s*t1 if m0<0 or m1<0: print N l2.append((N, m0, m1)) d2[N] = (m0, m1) print("New multiplicities computed successfully.")
New multiplicities computed successfully.
# Plots depicting nonzero multiplicities of 0, 1. l0 = []; l1 = [] i0 = 0; i1 = 0 for N in range(1, cutoff, 2): (m0, m1) = d2[N] if m0 != 0: i0 += 1 if m1 != 0: i1 += 1 if N>1000: l0.append((log(N), 2*i0/(N+1))) l1.append((log(N), 2*i1/(N+1))) show(points(l0, color='darkgreen', pointsize=2, aspect_ratio=40), points(l1, color='darkgreen', pointsize=2, aspect_ratio=50))
#cutoff = 5000 def is_eligible_conductor(N): if valuation(N, 2) > 8: return False N2 = N.odd_part() if valuation(N2, 3) > 5: return False N3 = N//3^valuation(N2,3) t = factor(N3) for i in t: if i[1] >= 3: return False return True def h(N): if is_square(N): return 1 K = QuadraticField(N) return K.class_number() def hodd(N): if is_square(N): return 1 K = QuadraticField(N) return K.class_number().odd_part() def hmodord2(N): if is_square(N): return 1 K = QuadraticField(N) G = K.class_group() I = K.prime_above(2) return (G.order() // G(I).order()).odd_part() def h2(N): if is_square(N): return 1 K = QuadraticField(N) h = K.class_number() u = K.units()[0] v = (u-1)/2 return(3*h if v.is_integral() else h)
# Test lower bound for 1-multiplicity for N == 1 (mod 8). i=j=0 for N in srange(1, cutoff, 2): (m0, m1) = d2[N] if N%8 == 1 and N.is_squarefree(): t1 = m1 - (hmodord2(N)-1 + 2*(hodd(-N) - 1) + 1) if t1 < 0: print("Negative:", N) if N.is_prime(): j += 1 if t1 == 0: i += 1 if valuation(h(-N),2) > 2 and t1 == 0: print N print("No more examples.") print("For prime levels, proportion where equality holds: " + str(1.0*i/j))
('Negative:', 1) No more examples. For prime levels, proportion where equality holds: 0.330370370370370
# Test lower bound for 0-multiplicity for N == 3 (mod 8). i=j=0 for N in srange(1, cutoff, 2): (m0, m1) = d2[N] if N%8 == 3: t0 = m0 - h(-N) if t0 < 0: print("Negative:", N) if N.is_prime(): j += 1 if t0 == 0: i += 1 print("No more examples.") print("For prime levels, proportion where equality holds: " + str(1.0*i/j))
('Negative:', 3) No more examples. For prime levels, proportion where equality holds: 0.470300333704116
# Test lower bound for 1-multiplicity for N == 3 (mod 8). i=j=0 for N in srange(1, cutoff, 2): (m0, m1) = d2[N] if N%8 == 3: t1 = m1 - (hodd(N) + hodd(-N) - 2) # t1 -= 2^(len(factor(N))-1) - 1 if not N.is_prime(): t1 -= 1 if t1 < 0: print N if N.is_squarefree() and len(factor(N)) >= 2: #N.is_prime(): j += 1 if t1 == 0: i += 1 print("No more examples.") print("For prime levels, proportion where equality holds: " + str(1.0*i/j))
27 No more examples. For prime levels, proportion where equality holds: 0.000507292327203551 27 No more examples. For prime levels, proportion where equality holds: 0.000507292327203551
# Test lower bound for 0-multiplicity for N == 5 (mod 8). i=j=0 for N in srange(1, cutoff, 2): (m0, m1) = d2[N] if N%8 == 5 and N.is_squarefree(): t0 = m0 - (h2(N) - h(N)) if t0 <0: print N if N.is_prime(): j += 1 if t0 == 0: i += 1 print("No more examples.") print("For prime levels, proportion where equality holds: " + str(1.0*i/j))
No more examples. For prime levels, proportion where equality holds: 0.774772777654622
# Test lower bound for 1-multiplicity for N == 5 (mod 8). i=j=0 for N in srange(1, cutoff, 2): (m0, m1) = d2[N] if N%8 == 5: t1 = m1 - (hodd(N)-1 + hodd(-N)-1) t1 -= 2^(len(factor(N))-1) - 1 if t1 < 0: print N if N.is_prime(): j += 1 if t1 == 0: i += 1 print("No more examples.") print("For prime levels, proportion where equality holds: " + str(1.0*i/j))
No more examples. For prime levels, proportion where equality holds: 0.480159609842607
# Test lower bound for 1-multiplicity for N == 7 (mod 8). i=j=0 for N in srange(1, cutoff, 2): (m0, m1) = d2[N] if N%8 == 7 and N.is_squarefree(): t1 = m1 - (hodd(N)-1 + 2*(hmodord2(-N) - 1)) t1 -= 2^(len(factor(N))-1) - 1 if t1 < 0: print N if N.is_prime(): j += 1 if t1 == 0: i += 1 print("No more examples.") print("For prime levels, proportion where equality holds: " + str(1.0*i/j))
No more examples. For prime levels, proportion where equality holds: 0.847953216374269