Path: blob/main/scripts/modl_galois_representations/import_modl.py
1128 views
#!/usr/local/bin/sage -python1# -*- coding: utf-8 -*-2r""" Import mod l Galois representations34This deals with determinants and the power of the cyclotomic5character itself.67"""8910import re11import json12import os13import sys14import gzip1516HOME=os.path.expanduser("~")17sys.path.append(os.path.join(HOME, 'lmfdb'))1819from lmfdb import db2021reps = db.modlgal_reps222324from sage.all import prime_range, DirichletGroup, ZZ, GF, Matrix, discrete_log, primitive_root2526def get_det(ent):27c = ent['conductor']28frobs = ent['frobenius_matrices']29ell = ent['base_ring_characteristic']30plist = [z for z in prime_range(100) if not ZZ(z).divides(ell*c)]31n = ent['dimension']32F = GF(ell)33primroot = primitive_root(ell)34dets = [Matrix(F,n,z).det() for z in frobs]35DG=DirichletGroup(c*ell, F, zeta=primroot)36clistall = [z for z in DG if z.order().divides(ell-1)]37#clistall1 = [[z(p) for p in plist] for z in clistall]38clist = [z for z in clistall if [F(z(p)) for p in plist]==dets]39try:40assert len(clist)==141except:42print(ent['label'])4344mychar = clist[0].primitive_character()45newmod = mychar.modulus()46N1 = ZZ(newmod/ell**newmod.valuation(ell))47connum = max(mychar.conrey_number(), 1)48l1 = rf"{ell}.1.{N1}.{newmod}-{connum}"49modell = discrete_log(F(connum), F(primroot), ell-1) if ZZ(ell).divides(newmod) else 050return [l1, modell]515253def last_label(base_label, n):54return ".".join([str(base_label),str(n)])5556## Main importing function5758label_dict = {}59outrecs = []6061for a in reps.search():62lab = a['label']63parts = lab.split('.')64baselabel = '.'.join(parts[0:-1])65if not '-' in parts[-1]:66num = int(parts[-1])67newset = label_dict.get(baselabel,set([]))68label_dict[baselabel] = newset.union({num})6970def label_lookup(base_label):71global label_dict72n=173s = label_dict.get(base_label, set([]))74while n in s:75n += 176s.add(n)77label_dict[base_label] = s78return n7980def do_import(ll):81global outrecs82mykeys = ['algebraic_group', 'bad_prime_list', 'base_ring_characteristic',83'base_ring_is_field', 'base_ring_order', 'conductor',84'conductor_primes', 'conductor_is_squarefree',85'conductor_num_primes',86'cyclotomic_exponent', 'determinant_label', 'dimension', 'good_prime_list',87'image_index', 'image_label', 'image_order', 'image_type', 'is_absolutely_irreducible',88'is_irreducible', 'is_solvable', 'is_surjective', 'kernel_polynomial',89'label', 'projective_is_surjective', 'projective_kernel_polynomial', 'projective_type',90'top_slope_rational', 'top_slope_real', 'generating_primes', 'frobenius_matrices',91'image_abstract_group', 'projective_image_abstract_group']92data = {}93for j in range(len(mykeys)):94data[mykeys[j]] = ll[j]95data['num'] = label_lookup(data['label'])96data['label'] = data['label']+"."+ str(data['num'])97data['related_objects'] = []98# dual_pair_of_algebras left as None99# convert booleans100for ky in ['base_ring_is_field', 'conductor_is_squarefree','is_absolutely_irreducible','is_irreducible', 'is_solvable', 'is_surjective', 'projective_is_surjective']:101data[ky] = (data[ky]>0)102# we need still to organize this better with respect to tie breaks103104# rep = reps.lucky({'label': data['label']})105[detlabel, charpower] = get_det(data)106data['determinant_label'] = detlabel107data['cyclotomic_exponent'] = charpower108109rep = None110111if rep is None:112#print("new mod l Galois representation")113outrecs.append(data)114else:115print("mod l Galois representation already in the database")116# maybe put this back in later117#rep.upsert({'label': label}, data)118#if saving:119# reps.update({'label': label} , {"$set": rep}, upsert=True)120121122123# Loop over files124125for path in sys.argv[1:]:126print(path)127filename = os.path.basename(path)128fn = gzip.open(path) if filename[-3:] == '.gz' else open(path)129for line in fn.readlines():130line.strip()131if re.match(r'\S',line):132l = json.loads(line)133do_import(l)134135reps.insert_many(outrecs)136137138139