Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
AndrewVSutherland
GitHub Repository: AndrewVSutherland/lmfdb
Path: blob/main/scripts/modl_galois_representations/import_modl.py
1128 views
1
#!/usr/local/bin/sage -python
2
# -*- coding: utf-8 -*-
3
r""" Import mod l Galois representations
4
5
This deals with determinants and the power of the cyclotomic
6
character itself.
7
8
"""
9
10
11
import re
12
import json
13
import os
14
import sys
15
import gzip
16
17
HOME=os.path.expanduser("~")
18
sys.path.append(os.path.join(HOME, 'lmfdb'))
19
20
from lmfdb import db
21
22
reps = db.modlgal_reps
23
24
25
from sage.all import prime_range, DirichletGroup, ZZ, GF, Matrix, discrete_log, primitive_root
26
27
def get_det(ent):
28
c = ent['conductor']
29
frobs = ent['frobenius_matrices']
30
ell = ent['base_ring_characteristic']
31
plist = [z for z in prime_range(100) if not ZZ(z).divides(ell*c)]
32
n = ent['dimension']
33
F = GF(ell)
34
primroot = primitive_root(ell)
35
dets = [Matrix(F,n,z).det() for z in frobs]
36
DG=DirichletGroup(c*ell, F, zeta=primroot)
37
clistall = [z for z in DG if z.order().divides(ell-1)]
38
#clistall1 = [[z(p) for p in plist] for z in clistall]
39
clist = [z for z in clistall if [F(z(p)) for p in plist]==dets]
40
try:
41
assert len(clist)==1
42
except:
43
print(ent['label'])
44
45
mychar = clist[0].primitive_character()
46
newmod = mychar.modulus()
47
N1 = ZZ(newmod/ell**newmod.valuation(ell))
48
connum = max(mychar.conrey_number(), 1)
49
l1 = rf"{ell}.1.{N1}.{newmod}-{connum}"
50
modell = discrete_log(F(connum), F(primroot), ell-1) if ZZ(ell).divides(newmod) else 0
51
return [l1, modell]
52
53
54
def last_label(base_label, n):
55
return ".".join([str(base_label),str(n)])
56
57
## Main importing function
58
59
label_dict = {}
60
outrecs = []
61
62
for a in reps.search():
63
lab = a['label']
64
parts = lab.split('.')
65
baselabel = '.'.join(parts[0:-1])
66
if not '-' in parts[-1]:
67
num = int(parts[-1])
68
newset = label_dict.get(baselabel,set([]))
69
label_dict[baselabel] = newset.union({num})
70
71
def label_lookup(base_label):
72
global label_dict
73
n=1
74
s = label_dict.get(base_label, set([]))
75
while n in s:
76
n += 1
77
s.add(n)
78
label_dict[base_label] = s
79
return n
80
81
def do_import(ll):
82
global outrecs
83
mykeys = ['algebraic_group', 'bad_prime_list', 'base_ring_characteristic',
84
'base_ring_is_field', 'base_ring_order', 'conductor',
85
'conductor_primes', 'conductor_is_squarefree',
86
'conductor_num_primes',
87
'cyclotomic_exponent', 'determinant_label', 'dimension', 'good_prime_list',
88
'image_index', 'image_label', 'image_order', 'image_type', 'is_absolutely_irreducible',
89
'is_irreducible', 'is_solvable', 'is_surjective', 'kernel_polynomial',
90
'label', 'projective_is_surjective', 'projective_kernel_polynomial', 'projective_type',
91
'top_slope_rational', 'top_slope_real', 'generating_primes', 'frobenius_matrices',
92
'image_abstract_group', 'projective_image_abstract_group']
93
data = {}
94
for j in range(len(mykeys)):
95
data[mykeys[j]] = ll[j]
96
data['num'] = label_lookup(data['label'])
97
data['label'] = data['label']+"."+ str(data['num'])
98
data['related_objects'] = []
99
# dual_pair_of_algebras left as None
100
# convert booleans
101
for ky in ['base_ring_is_field', 'conductor_is_squarefree','is_absolutely_irreducible','is_irreducible', 'is_solvable', 'is_surjective', 'projective_is_surjective']:
102
data[ky] = (data[ky]>0)
103
# we need still to organize this better with respect to tie breaks
104
105
# rep = reps.lucky({'label': data['label']})
106
[detlabel, charpower] = get_det(data)
107
data['determinant_label'] = detlabel
108
data['cyclotomic_exponent'] = charpower
109
110
rep = None
111
112
if rep is None:
113
#print("new mod l Galois representation")
114
outrecs.append(data)
115
else:
116
print("mod l Galois representation already in the database")
117
# maybe put this back in later
118
#rep.upsert({'label': label}, data)
119
#if saving:
120
# reps.update({'label': label} , {"$set": rep}, upsert=True)
121
122
123
124
# Loop over files
125
126
for path in sys.argv[1:]:
127
print(path)
128
filename = os.path.basename(path)
129
fn = gzip.open(path) if filename[-3:] == '.gz' else open(path)
130
for line in fn.readlines():
131
line.strip()
132
if re.match(r'\S',line):
133
l = json.loads(line)
134
do_import(l)
135
136
reps.insert_many(outrecs)
137
138
139