From 122746af58e0dde177d0d0227ee031260233b9c7 Mon Sep 17 00:00:00 2001
From: John Cremona
Date: Wed, 21 Aug 2024 07:14:55 -0400
Subject: [PATCH] edits to modlgal code & templates
---
lmfdb/modl_galois_representations/main.py | 12 ++++----
.../templates/modlgal_rep.html | 27 +++++++++++++----
.../web_modlgal.py | 29 ++++++++++++++-----
3 files changed, 49 insertions(+), 19 deletions(-)
diff --git a/lmfdb/modl_galois_representations/main.py b/lmfdb/modl_galois_representations/main.py
index 9110cccf31..830bbefdd5 100644
--- a/lmfdb/modl_galois_representations/main.py
+++ b/lmfdb/modl_galois_representations/main.py
@@ -134,7 +134,7 @@ def blankzeros(n):
modlgal_columns = SearchColumns(
[
LinkCol("label", "modlgal.label", "Label", url_for_modlgal_label),
- MathCol("base_ring_characteristic", "modlgal.base_ring_characteristic", r"$\ell$"),
+ MathCol("base_ring_characteristic", "modlgal.characteristic", r"$\ell$"),
MathCol("dimension", "modlgal.dimension", "Dim", short_title="dimension"),
ProcessedCol("conductor", "modlgal.conductor", "Conductor", web_latex_factored_integer, align="center"),
RationalCol("top_slope_rational", "modlgal.top_slope", "Top slope", lambda x: x, align="center", default=lambda info: info.get("top_slope")),
@@ -142,12 +142,12 @@ def blankzeros(n):
image_pretty, align="center", apply_download=False),
SearchCol("image_index", "modgal.image_index", "Index", short_title="image index", default=False),
SearchCol("image_order", "modgal.image_order", "Order", short_title="image order", default=False),
- CheckCol("is_surjective", "modlgal.is_surjective", "Surjective"),
+ CheckCol("is_surjective", "modlgal.surjective", "Surjective"),
CheckCol("is_absolutely_irreducible", "modlgal.is_absolutely_irreducible", "Abs irred", short_title="absolutely irreducible", default=False),
CheckCol("is_solvable", "modlgal.is_solvable", "Solvable", default=False),
LinkCol("determinant_label", "modlgal.determinant_label", "Determinant", url_for_modlgal_label, align="center", default=False),
ProcessedCol("generating_primes", "modlgal.generating_primes", "Generators", lambda ps: "$" + ",".join([str(p) for p in ps]) + "$", align="center", default=False),
- ProcessedCol("kernel_polynomial", "modlgal.kernel_polynomial", "Kernel sibling", formatfield),
+ ProcessedCol("kernel_polynomial", "modlgal.splitting_field", "Splitting field", formatfield),
ProcessedCol("projective_kernel_polynomial", "modlgal.projective_kernel_polynomial", "Projective kernel", formatfield, default=False),
],
db_cols=["label", "dimension", "base_ring_characteristic", "base_ring_order", "base_ring_is_field", "algebraic_group", "conductor", "image_label",
@@ -229,7 +229,7 @@ def __init__(self):
select_box=conductor_quantifier)
base_ring_characteristic = TextBox(
name="base_ring_characteristic",
- knowl="modlgal.base_ring_characteristic",
+ knowl="modlgal.characteristic",
label=r"Characteristic $\ell$",
example="2",
example_span="2, 3, or 5")
@@ -310,7 +310,7 @@ def __init__(self):
[top_slope, image_index, image_order]
]
- sort_knowl = "modlgal.sort_order"
+ #sort_knowl = "modlgal.sort_order"
sorts = [
("label", "label", ["dimension", "base_ring_order", "conductor", "num"]),
("conductor", "conductor", ["conductor", "dimension", "base_ring_order", "conductor", "num"]),
@@ -336,7 +336,7 @@ def __init__(self):
def short_summary(self):
modlgal_knowl = display_knowl("modlgal", title=r"mod-$\ell$ Galois representations")
return (
- fr'The database currently contains {self.nreps} {modlgal_knowl} of $\Gal_\Q$ of conductor $N\le {self.max_cond}$ and dimension $d\le {self.max_dim}$ for $\ell \le {self.max_ell}$. You can browse further statistics.
'
+ fr'The database currently contains {self.nreps} irreducible {modlgal_knowl} of $\Gal_\Q$ of conductor $N\le {self.max_cond}$ and dimension $d\le {self.max_dim}$ for $\ell \le {self.max_ell}$. You can browse further statistics.
'
)
@property
diff --git a/lmfdb/modl_galois_representations/templates/modlgal_rep.html b/lmfdb/modl_galois_representations/templates/modlgal_rep.html
index 8e27be6b91..6a738757cb 100644
--- a/lmfdb/modl_galois_representations/templates/modlgal_rep.html
+++ b/lmfdb/modl_galois_representations/templates/modlgal_rep.html
@@ -9,10 +9,14 @@ {{ KNOWL('modlgal', title='Mod-ℓ Galois representation')}}
Invariants
+ {{ KNOWL('modlgal.characteristic', 'Characteristic') }}: | ${{ rep.base_ring_characteristic }}$ |
{{ KNOWL('modlgal.dimension', 'Dimension') }}: | ${{ rep.dimension }}$ |
{{ KNOWL('modlgal.conductor', 'Conductor') }}: | {{ rep.factored_conductor }} |
{% if rep.weight and rep.weight >= 0 %}
{% endif %}
+ {% if rep.dimension > 1 %}
+ {{ KNOWL('modlgal.determinant', 'Determinant') }}: | {{ rep.determinant | safe }} |
+ {% endif %}
{% if not rep.is_surjective %}
{{ KNOWL('modlgal.codomain', 'Codomain') }}: | {{ rep.codomain }} |
{% endif %}
@@ -21,12 +25,12 @@ Invariants
{% endif %}
{% if rep.frobenius_generators %}
- {{ KNOWL('modlgal.generating_primes', 'Generators') }}: | ${{ rep.frobenius_generators }}$ |
+ {{ KNOWL('modlgal.generating_primes', 'Generating primes') }}: | ${{ rep.frobenius_primes }}$ |
{% endif %}
{{ KNOWL('modlgal.image_index', 'Image index') }}: | {{ rep.image_index }} |
{{ KNOWL('modlgal.image_order', 'Image order') }}: | {{ rep.image_order }} |
{{ KNOWL('modlgal.absolutely_irreducible', 'Absolutely irreducible') }}: | {% if rep.is_absolutely_irreducible%}yes{% else %}no{% endif %} |
- {{ KNOWL('modlgal.surjective', 'Surjective') }}: | {% if rep.is_surjective %}yes{% else %}no{% endif %} |
+ {{ KNOWL('modlgal.surjective', 'Surjective') }}: | {% if rep.image_index==1 %}yes{% else %}no{% endif %} |
{{ KNOWL('modlgal.solvable', 'Solvable') }}: | {% if rep.is_solvable %}yes{% else %}no{% endif %} |
{{ KNOWL('modlgal.top_slope', 'Top slope') }}: | {{ rep.top_slope_rational }} |
@@ -34,9 +38,9 @@ Invariants
Associated number fields
- {{ KNOWL('nf.minimal_sibling','Minimal sibling')}} of the {{ KNOWL('modlgal.splitting_field','splitting field') }} of $\rho$: | {{ rep.kernel_sibling | safe }} |
+ {{ KNOWL('modlgal.min_sib_splitting_field','Minimal sibling of the splitting field') }} of $\rho$: | {{ rep.kernel_sibling | safe }} |
{% if rep.base_ring_characteristic != 2 %}
- {{ KNOWL('nf.minimal_sibling','Minimal sibling')}} of the {{ KNOWL('modlgal.splitting_field','splitting field') }} of $\mathbb{P}\rho$: | {{ rep.projective_kernel_sibling | safe }} |
+ {{ KNOWL('modlgal.min_sib_splitting_field','Minimal sibling of the splitting field') }} of the {{ KNOWL('modlgal.projective_representation','projective representation') }} $\mathbb{P}\rho$: | {{ rep.projective_kernel_sibling | safe }} |
{% endif %}
@@ -63,19 +67,30 @@ Frobenius data
{% if rep.frobenius_matrices_pretty %}
+
+Information about $\rho(\text{Frob}_p)$ for {{ KNOWL('modlgal.frobenius_prime', 'good primes') }} $p<100$.
{% if rep.generating_primes %}
-
{{ KNOWL('modlgal.generating_primes', 'Generating primes') }} are shown in bold.
+{{ KNOWL('modlgal.generating_primes', 'Generating primes') }} are shown in bold.
{% endif %}
+
{{ KNOWL('modlgal.frobenius_prime','Prime') }} |
{{ KNOWL('modlgal.frobenius_trace','Trace') }} |
+ {{ KNOWL('modlgal.frobenius_determinant','Determinant') }} |
{{ KNOWL('modlgal.frobenius_order','Order') }} |
{{ KNOWL('modlgal.frobenius_charpoly','Char poly') }} |
{{ KNOWL('modlgal.frobenius_matrix','Matrix') }} |
{% for r in rep.frobenius_matrices_pretty %}
- ${{ r[0] }}$ | ${{ r[1] }}$ | ${{ r[2] }}$ | {{ r[3] }} | {{ r[4] }} |
+
+ ${{ r[0] }}$ |
+ ${{ r[1] }}$ |
+ ${{ r[2] }}$ |
+ ${{ r[3] }}$ |
+ {{ r[4] }} |
+ {{ r[5] }} |
+
{% endfor %}
{% else %}
diff --git a/lmfdb/modl_galois_representations/web_modlgal.py b/lmfdb/modl_galois_representations/web_modlgal.py
index 015e5c1e1b..1995ec6cd6 100644
--- a/lmfdb/modl_galois_representations/web_modlgal.py
+++ b/lmfdb/modl_galois_representations/web_modlgal.py
@@ -63,9 +63,14 @@ class WebModLGalRep(WebObj):
def properties(self):
props = [
("Label", self.label),
- ("Dimension", str(self.dimension)),
- ("Codomain", str(self.codomain)),
+ ("Characteristic", str(self.base_ring_characteristic)),
+ ("Dimension", str(self.dimension))
+ ]
+ if self.dimension>1:
+ props += [("Determinant", str(self.determinant_label))]
+ props += [
("Conductor", str(self.conductor)),
+ ("Codomain", str(self.codomain)),
("Top slope", self.top_slope_rational),
("Image index", str(self.image_index)),
("Image order", str(self.image_order)),
@@ -132,7 +137,7 @@ def codomain(self):
@lazy_attribute
def image_pretty(self):
- return image_pretty(self.image_label, self.is_surjective, self.algebraic_group, self.dimension, self.base_ring_order, self.base_ring_is_field, codomain=False)
+ return image_pretty(self.image_label, self.image_index==1, self.algebraic_group, self.dimension, self.base_ring_order, self.base_ring_is_field, codomain=False)
@lazy_attribute
def rep_pretty(self):
@@ -164,6 +169,12 @@ def frobenius_generators(self):
return None
return ",".join([r"\mathrm{Frob}_{%s}"%(p) for p in self.generating_primes])
+ @lazy_attribute
+ def frobenius_primes(self):
+ if not self.generating_primes:
+ return None
+ return ",".join([str(p) for p in self.generating_primes])
+
@lazy_attribute
def frobenius_matrices_pretty(self):
L = []
@@ -176,10 +187,10 @@ def frobenius_matrices_pretty(self):
for i in range(len(ps)):
m = Matrix(F,n,frobs[i])
M = R(frobs[i])
- if self.generating_primes and ps[i] in self.generating_primes:
- L.append([r"\mathbf{%s}"%(ps[i]),m.trace(),M.order(),web_latex(factor(m.charpoly())),web_latex(m)])
- else:
- L.append([ps[i],m.trace(),M.order(),web_latex(factor(m.charpoly())),web_latex(m)])
+ p = r"\mathbf{%s}"%(ps[i]) if self.generating_primes and ps[i] in self.generating_primes else ps[i]
+ charpoly = m.charpoly()
+ pol = web_latex(charpoly) if charpoly.is_irreducible() else web_latex(factor(charpoly))
+ L.append([p, m.trace(), m.det(), M.order(), pol, web_latex(m)])
except ValueError:
print(f"Error occurred while attempting to parse frobenius_matrices for {self.label}")
print(self.frobenius_matrices)
@@ -198,6 +209,10 @@ def dual_algebra_pretty(self):
}
return data
+ @lazy_attribute
+ def determinant(self):
+ return modlgal_link(self.determinant_label)
+
@lazy_attribute
def downloads(self):
self.downloads = [