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

+ {% if rep.weight and rep.weight >= 0 %} {% endif %} + {% if rep.dimension > 1 %} + + {% endif %} {% if not rep.is_surjective %} {% endif %} @@ -21,12 +25,12 @@

Invariants

{% endif %} {% if rep.frobenius_generators %} - + {% endif %} - +
{{ KNOWL('modlgal.characteristic', 'Characteristic') }}:${{ rep.base_ring_characteristic }}$
{{ KNOWL('modlgal.dimension', 'Dimension') }}:${{ rep.dimension }}$
{{ KNOWL('modlgal.conductor', 'Conductor') }}:{{ rep.factored_conductor }}
{{ KNOWL('modlgal.determinant', 'Determinant') }}:{{ rep.determinant | safe }}
{{ KNOWL('modlgal.codomain', 'Codomain') }}:{{ rep.codomain }}
{{ KNOWL('modlgal.generating_primes', 'Generators') }}:${{ rep.frobenius_generators }}$
{{ KNOWL('modlgal.generating_primes', 'Generating primes') }}:${{ rep.frobenius_primes }}$
{{ 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

- + {% if rep.base_ring_characteristic != 2 %} - + {% endif %}
{{ 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 }}
{{ 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 }}
@@ -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 %} +

+ {% for r in rep.frobenius_matrices_pretty %} - + + + + + + + + {% endfor %}
{{ 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') }}
${{ r[0] }}$${{ r[1] }}$${{ r[2] }}${{ r[3] }}{{ r[4] }}
${{ r[0] }}$${{ r[1] }}$${{ r[2] }}$${{ r[3] }}${{ r[4] }}{{ r[5] }}
{% 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 = [