Path: blob/main/scripts/hmf/import_hmf_data_fix_permuted_primes.py
1455 views
# -*- coding: utf-8 -*-12import os3import sage.repl.preparse4from sage.repl.preparse import preparse5from sage.interfaces.magma import magma67from sage.all import ZZ89from lmfdb.base import getDBConnection10print("getting connection")11C= getDBConnection()12C['admin'].authenticate('lmfdb', 'lmfdb') # read-only1314#import yaml15#pw_dict = yaml.load(open(os.path.join(os.getcwd(), os.extsep, os.extsep, os.extsep, "passwords.yaml")))16#username = pw_dict['data']['username']17#password = pw_dict['data']['password']18#C['hmfs'].authenticate(username, password)19hmf_forms = C.hmfs.forms20hmf_fields = C.hmfs.fields21fields = C.numberfields.fields2223magma.eval('nice_idealstr := function(F : Bound := 10000); idealsstr := []; ideals := IdealsUpTo(Bound, F); for I in ideals do bl, g := IsPrincipal(I); if bl then s := Sprintf("[%o, %o, %o]", Norm(I), Minimum(I), F!g); else zs := Generators(I); z := zs[#zs]; m := Minimum(I); z := F![(Integers()!c) mod m : c in Eltseq(F!z)]; assert ideal<Integers(F) | [m, z]> eq I; s := Sprintf("[%o, %o, %o]", Norm(I), m, z); end if; Append(~idealsstr, s); end for; return idealsstr; end function;')2425from lmfdb.number_fields.number_field import make_disc_key2627P = sage.rings.polynomial.polynomial_ring_constructor.PolynomialRing(sage.rings.rational_field.RationalField(), 3, ['w', 'e', 'x'])28w, e, x = P.gens()2930def import_all_data_fix_perm_primes(n, fileprefix=None, ferrors=None, test=True):31nstr = str(n)3233if fileprefix is None:34fileprefix = "/home/jvoight/Elements/ModFrmHilDatav1/Data/" + nstr35ff = open(fileprefix + "/dir.tmp", 'r')36files = ff.readlines()37files = [f[:-1] for f in files]38# subprocess.call("rm dir.tmp", shell=True)3940files = [f for f in files if f.find('_old') == -1]41for file_name in files:42print("About to import data from file %s" % file_name)43import_data_fix_perm_primes(file_name, fileprefix=fileprefix, ferrors=ferrors, test=test)444546def import_data_fix_perm_primes(hmf_filename, fileprefix=None, ferrors=None, test=True):47if fileprefix is None:48fileprefix="."49hmff = open(os.path.join(fileprefix,hmf_filename))5051if ferrors is None:52ferrors = open('/home/jvoight/lmfdb/backups/import_data.err', 'a')5354# Parse field data55v = hmff.readline()56assert v[:9] == 'COEFFS :='57coeffs = eval(v[10:].split(';')[0])58v = hmff.readline()59assert v[:4] == 'n :='60n = int(v[4:][:-2])61v = hmff.readline()62assert v[:4] == 'd :='63d = int(v[4:][:-2])6465magma.eval('F<w> := NumberField(Polynomial(' + str(coeffs) + '));')66magma.eval('ZF := Integers(F);')6768# Find the corresponding field in the database of number fields69dkey = make_disc_key(ZZ(d))[1]70sig = "%s,%s" % (n,0)71print("Finding field with signature %s and disc_key %s ..." % (sig,dkey))72fields_matching = fields.find({"disc_abs_key": dkey, "signature": sig})73cnt = fields_matching.count()74print("Found %s fields" % cnt)75assert cnt >= 176field_label = None77co = str(coeffs)[1:-1].replace(" ","")78for i in range(cnt):79nf = next(fields_matching)80print("Comparing coeffs %s with %s" % (nf['coeffs'], co))81if nf['coeffs'] == co:82field_label = nf['label']83assert field_label is not None84print("...found!")8586# Find the field in the HMF database87print("Finding field %s in HMF..." % field_label)88F_hmf = hmf_fields.find_one({"label": field_label})89assert F_hmf is not None # only proceed if field already in database90print("...found!")9192print("Computing ideals...")93ideals_str = F_hmf['ideals']94# ideals = [eval(preparse(c)) for c in ideals_str] # doesn't appear to be used95# ideals_norms = [c[0] for c in ideals] # doesn't appear to be used96magma.eval('ideals_str := [' + ''.join(F_hmf['ideals']).replace('][', '], [') + ']')97magma.eval('ideals := [ideal<ZF | {F!x : x in I}> : I in ideals_str];')9899# Add the list of primes100print("Computing primes...")101v = hmff.readline() # Skip line102v = hmff.readline()103assert v[:9] == 'PRIMES :='104primes_str = v[10:][:-2]105primes_array = [str(t) for t in eval(preparse(primes_str))]106magma.eval('primes_array := ' + primes_str)107magma.eval('primes := [ideal<ZF | {F!x : x in I}> : I in primes_array];')108magma.eval('primes_indices := [Index(ideals, pp) : pp in primes];')109try:110assert magma('&and[primes_indices[j] gt primes_indices[j-1] : j in [2..#primes_indices]]')111resort = False112except AssertionError:113print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Primes reordered!")114resort = True115magma.eval('_, sigma := Sort(primes_indices, func<x,y | x-y>);')116magma.eval('perm := [[xx : xx in x] : x in CycleDecomposition(sigma) | #x gt 1]')117# Check at least they have the same norm118magma.eval('for tau in perm do assert #{Norm(ideals[primes_indices[t]]) : t in tau} eq 1; end for;')119primes_resort = eval(magma.eval('Eltseq(sigma)'))120primes_resort = [c - 1 for c in primes_resort]121122if resort:123primes_indices = eval(magma.eval('primes_indices'))124primes_str = [ideals_str[j - 1] for j in primes_indices]125assert len(primes_array) == len(primes_str)126print("...comparing...")127for i in range(len(primes_array)):128assert magma('ideal<ZF | {F!x : x in ' + primes_array[i] + '}> eq '129+ 'ideal<ZF | {F!x : x in ' + primes_str[i] + '}>;')130131# Important also to resort the list of primes themselves!132# not just the a_pp's133primes_str = [primes_str[i] for i in primes_resort]134print("Compare primes in hmf.fields\n %s\n with NEW primes\n %s" % (F_hmf['primes'], primes_str))135if test:136print("...Didn't do anything! Just a test")137else:138F_hmf['primes'] = primes_str139hmf_fields.save(F_hmf)140print("...saved!")141142143