def get_magma_qexpansions(filename, i1, prec, base_ring, magma=None): if magma is None: from sage.interfaces.magma import Magma magma = Magma() magma.set('prec',prec) magma.load("get_qexpansions.m") if i1 is None: for line in filename: print line magma.eval(line) magma.eval("f := g") # In case text is reversed f = 'f' eps_data_f = 'eps_on_gens' else: magma.load(filename) f = 'eigenforms_list[%s][1]'%i1 eps_data_f = 'eigenforms_list[%s][2]'%i1 qexpm = magma.extend_qexpansion(f, eps_data_f, prec) F0 = [0] * qexpm.Valuation().sage() + [o.sage() for o in qexpm.ElementToSequence()] K = F0[-1].parent() a = K.gen() phi = find_embeddings(K,base_ring)[0] F = [phi(o) for o in F0] eps_f = magma.get_character(f, eps_data_f).ValueList().sage() eps_f_full = magma.get_character_full(f, eps_data_f).ValueList().sage() N = len(eps_f) Geps = DirichletGroup(N, base_ring = K) eps_f = Geps([eps_f[i - 1] for i in Geps.unit_gens()]) Geps_full = DirichletGroup(N) psi = eps_f_full[0].parent().embeddings(Geps_full.base_ring())[0] eps_f_full = Geps_full([psi(eps_f_full[i - 1]) for i in Geps_full.unit_gens()]) if a == 1: sigma = lambda x:x else: try: sigma = next((s for s in K.automorphisms() if s(a)*a == 1)) except StopIteration: raise NotImplementedError G = [phi(sigma(o)) for o in F0] eps_g = eps_f**-1 eps_g_full = eps_f_full**-1 F = ModFormqExp(F, base_ring, weight=1, level = N, character = eps_f, character_full = eps_f_full) G = ModFormqExp(G, base_ring, weight=1, level = N, character = eps_g, character_full = eps_g_full) return F, G
def Lpvalue(f,g,h,p,prec,N = None,modformsring = False, weightbound = False, eps = None, orthogonal_form = None, data_idx=None, magma_args = None,force_computation=False, algorithm='threestage', derivative_order=1, lauders_advice = False, use_magma = True, magma = None, num_coeffs_qexpansion = 20000, max_primes=5, outfile = None): if magma_args is None: magma_args = {} if algorithm not in ['twostage','threestage']: raise ValueError('Algorithm should be one of "twostage" (default) or "threestage"') if magma is None: from sage.interfaces.magma import Magma magma = Magma(**magma_args) if hasattr(g,'j_invariant'): elliptic_curve = g g = g.modular_form() else: elliptic_curve = None data = None if h is None: if hasattr(f, 'modulus'): # Assume we need to create f and h from Dirichlet character kronecker_character = f f, _, h = define_qexpansions_from_dirichlet_character(p, prec, kronecker_character, num_coeffs_qexpansion, magma) else: kronecker_character = None # Assume that f contains a list of lines of text to initialize both f and h data = f f, h = get_magma_qexpansions(data, data_idx, max(prec,200), Qp(p,prec), magma=magma) eps = f.character_full() ll,mm = g.weight(),h.weight() t = 0 # Assume t = 0 here kk = ll + mm - 2 * (1 + t) # Is this correct? p = ZZ(p) if N is None: N = lcm([ZZ(f.level()),ZZ(g.level()),ZZ(h.level())]) nu = N.valuation(p) N = N.prime_to_m_part(p) else: N = ZZ(N) nu = N.valuation(p) if outfile is None: outfile = "output_iterated_integral_%s_%s_%s_%s.txt"%(p,g.level(), h.level(), prec) print("Writing output to file %s"%outfile) fwrite("######### STARTING COMPUTATION OF Lp ###########", outfile) if elliptic_curve is not None: fwrite("E = EllipticCurve(%s)"%list(elliptic_curve.ainvs()), outfile) fwrite(" cond(E) = %s"%elliptic_curve.conductor(), outfile) if kronecker_character is not None: fwrite("kronecker_character = %s"%kronecker_character, outfile) fwrite(" conductor = %s"%kronecker_character.conductor(), outfile) if data is not None: fwrite("Data for weight-1 forms:", outfile) for line in data: fwrite(line, outfile) fwrite("Tame level N = %s, prime p = %s, nu = %s"%(N,p,nu), outfile) fwrite("precision = %s"%prec, outfile) fwrite("------ parameters --------------------", outfile) fwrite("modformsring = %s"%modformsring, outfile) fwrite("weightbound = %s"%weightbound, outfile) fwrite("eps = %s"%eps, outfile) fwrite("orthogonal_form = %s"%orthogonal_form, outfile) fwrite("magma_args = %s"%magma_args, outfile) fwrite("force_computation = %s"%force_computation, outfile) fwrite("algorithm = %s"%algorithm, outfile) fwrite("derivative_order = %s"%derivative_order, outfile) fwrite("lauders_advice = %s"%lauders_advice, outfile) fwrite("use_magma = %s"%use_magma, outfile) fwrite("num_coeffs_qexpansion = %s"%num_coeffs_qexpansion, outfile) fwrite("##########################################", outfile) prec = ZZ(prec) fwrite("Step 1: Compute the Up matrix", outfile) if algorithm == "twostage": computation_name = '%s_%s_%s_%s_%s_%s_%s'%(p,N,nu,kk,prec,'triv' if eps is None else 'char',algorithm) else: computation_name = '%s_%s_%s_%s_%s_%s'%(p,N,nu,kk,prec,'triv' if eps is None else 'char') if use_magma: tmp_filename = '/tmp/magma_mtx_%s.tmp'%computation_name import os.path from sage.misc.persist import db, db_save try: if force_computation: raise IOError V = db('Lpvalue_Apow_ordbasis_eimat_%s'%computation_name) ord_basis, eimat, zetapm, elldash, mdash = V[:5] Apow_data = V[5:] except IOError: if force_computation or not os.path.exists(tmp_filename): if eps is not None: eps_magma = sage_character_to_magma(eps,N,magma=magma) magma.load("overconvergent_alan.m") # Am, zetapm, eimatm, elldash, mdash = magma.UpOperatorData(p, eps_magma, kk, prec,WeightBound=weightbound,nvals=5) Am, zetapm, eimatm, elldash, mdash = magma.HigherLevelUpGj(p, kk, prec, weightbound, eps_magma,'"B"',nvals=5) else: # Am, zetapm, eimatm, elldash, mdash = magma.UpOperatorData(p, N, kk, prec,WeightBound=weightbound,nvals=5) magma.load("overconvergent_alan.m") Am, zetapm, eimatm, elldash, mdash = magma.HigherLevelUpGj(p, kk, prec, weightbound, N,'"B"',nvals=5) fwrite(" ..Converting to Sage...", outfile) Amodulus = Am[1,1].Parent().Modulus().sage() Aprec = Amodulus.valuation(p) Arows = Am.NumberOfRows().sage() Acols = Am.NumberOfColumns().sage() Emodulus = eimatm[1,1].Parent().Modulus().sage() Eprec = Emodulus.valuation(p) Erows = eimatm.NumberOfRows().sage() Ecols = eimatm.NumberOfColumns().sage() magma.load("get_qexpansions.m") magma.eval('F := Open("%s", "w");'%tmp_filename) magma.eval('fprintf F, "%s, %s, %s, %s \\n"'%(p,Aprec,Arows,Acols)) # parameters magma.eval('save_matrix(%s, F)'%(Am.name())) # for i in range(1,Arows+1): # magma.eval('fprintf F, "%%o\\n", %s[%s]'%(Am.name(),i)) magma.eval('fprintf F, "%s, %s, %s, %s \\n"'%(p,Eprec,Erows,Ecols)) # parameters magma.eval('save_matrix(%s, F)'%(eimatm.name())) # for i in range(1,Erows+1): # magma.eval('fprintf F, "%%o\\n", %s[%s]'%(eimatm.name(),i)) magma.eval('fprintf F, "%s\\n"'%zetapm) magma.eval('fprintf F, "%s\\n"'%elldash) magma.eval('fprintf F, "%s\\n"'%mdash) magma.eval('delete F;') magma.quit() # Read A and eimat from file from sage.structure.sage_object import load from sage.misc.sage_eval import sage_eval with open(tmp_filename,'r') as fmagma: A = read_matrix_from_file(fmagma) eimat = read_matrix_from_file(fmagma) zetapm= sage_eval(fmagma.readline()) elldash = sage_eval(fmagma.readline()) mdash = sage_eval(fmagma.readline()) fwrite("Step 3b: Apply Up^(r-1) to H", outfile) if algorithm == 'twostage': V0 = list(find_Apow_and_ord_two_stage(A, eimat, p, prec)) else: V0 = list(find_Apow_and_ord_three_stage(A,eimat,p,prec)) ord_basis = V0[0] Apow_data = V0[1:] V = [ord_basis] V.extend([eimat, zetapm, elldash, mdash]) V.extend(Apow_data) db_save(V,'Lpvalue_Apow_ordbasis_eimat_%s'%computation_name) from posix import remove remove(tmp_filename) else: A, eimat, elldash, mdash = UpOperator(p,N,kk,prec, modformsring = False, weightbound = 6) fwrite("Step 2: p-depletion, Coleman primitive, and multiply", outfile) fwrite(".. Need %s coefficients of the q-expansion..."%(p**(nu+1) * elldash), outfile) if data is not None: f, h = get_magma_qexpansions(data, data_idx, (p**(nu+1) * elldash) + 200, Qp(p,prec), magma=magma) H = depletion_coleman_multiply(g, h, p, p**(nu+1) * elldash, t=0) fwrite("Step 3a: Compute ordinary projection", outfile) if len(Apow_data) == 1: Hord = compute_ordinary_projection_two_stage(H, Apow_data, eimat, elldash,p) else: Hord = compute_ordinary_projection_three_stage(H, [ord_basis] + Apow_data, eimat, elldash,p,nu) fwrite('Changing Hord to ring %s'%g[1].parent(), outfile) Hord = Hord.change_ring(h[1].parent()) print [Hord[i] for i in range(30)] fwrite("Step 4: Project onto f-component", outfile) while True: try: ell, piHord, epstwist = project_onto_eigenspace(f, ord_basis, Hord, kk, N * p, p = p, derivative_order=derivative_order, max_primes=max_primes) break except RuntimeError: derivative_order += 1 verbose("Increasing experimental derivative order to %s"%derivative_order) except ValueError: verbose("Experimental derivative order (%s) seems too high"%derivative_order) fwrite("Experimental derivative_order = %s"%derivative_order, outfile) fwrite("Seems too high...", outfile) fwrite("######################################", outfile) assert 0 n = 1 while f[n] == 0: n = next_prime(n) if lauders_advice == True or orthogonal_form is None: Lpa = piHord[n] / (f[n] * epstwist(n)) fwrite("Experimental derivative_order = %s"%derivative_order, outfile) fwrite("Checking Lauder's coincidence... (following should be a bunch of 'large' valuations)", outfile) fwrite(str([(i,(Lpa * f[i] * epstwist(i) - piHord[i]).valuation(p)) for i in prime_range(50)]), outfile) fwrite("Done", outfile) else: gplus, gminus = f, orthogonal_form l1 = 2 while N*p*ell % l1 == 0 or gplus[l1] == 0: l1 = next_prime(l1) proj_mat = matrix([[gplus[l1],gplus[p]],[gminus[l1],gminus[p]]]) Lpalist = (matrix([piHord[l1],piHord[p]]) * proj_mat**-1).list() Lpa = Lpalist[0] if Lpa.valuation() > prec / 2: # this is quite arbitrary! Lpa = Lpalist[1] Lpa = Lpa / f[n] fwrite("ell = %s"%ell, outfile) fwrite("######### FINISHED COMPUTATION ###########", outfile) fwrite("Lp = %s"%Lpa, outfile) fwrite("##########################################", outfile) return Lpa, ell