Skip to content

Commit 0e830e8

Browse files
authored
Merge pull request #6958 from LMFDB/main
main->dev
2 parents bbdbfac + 8d3820b commit 0e830e8

34 files changed

Lines changed: 2888 additions & 246 deletions

lmfdb/api/api.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,8 @@ def apierror(msg, flash_extras=[], code=404, table=True):
316316
next_req = dict(request.args)
317317
next_req["_offset"] = offset
318318
url_args = next_req.copy()
319+
# Remove _format so that we don't specify that keyword twice
320+
url_args.pop("_format", None)
319321
query = url_for(".api_query", table=table, **next_req)
320322
offset += len(data)
321323
next_req["_offset"] = offset

lmfdb/characters/web_character.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1133,7 +1133,7 @@ def friends(self):
11331133

11341134
@lazy_attribute
11351135
def contents(self):
1136-
logger.warning("[DC] getting content from WebDBDirichletOrbit")
1136+
logger.info("[DC] getting content from WebDBDirichletOrbit")
11371137
if self._contents is None:
11381138
self._contents = []
11391139
self._fill_contents()

lmfdb/galois_groups/code.yaml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ prompt:
22
magma: 'magma'
33
sage: 'sage'
44
oscar: 'oscar'
5+
gap: 'gap'
56

67
logo:
78
magma: <img src = "https://i.stack.imgur.com/0468s.png" width="50px">
89
sage: <img src ="https://www.sagemath.org/pix/sage_logo_new.png" width = "50px">
910
oscar: <img src = "https://oscar-system.github.io/Oscar.jl/stable/assets/logo.png" width="50px">
11+
gap: <img src = "https://gap.math.u-bordeaux.fr/logo/Logo%20Couleurs/Logo_GAP-GP_Couleurs_L150px.png" width="50px">
1012

1113
comment:
1214
sage: |
@@ -15,6 +17,8 @@ comment:
1517
//
1618
oscar: |
1719
#
20+
gap: |
21+
#
1822
1923
not-implemented:
2024
sage: |
@@ -23,6 +27,9 @@ not-implemented:
2327
// (not yet implemented)
2428
oscar: |
2529
# (not yet implemented)
30+
gap: |
31+
# (not yet implemented)
32+
2633
2734
frontmatter:
2835
all: |
@@ -33,89 +40,105 @@ gg:
3340
magma: G := TransitiveGroup({n}, {t});
3441
sage: G = TransitiveGroup({n}, {t})
3542
oscar: G = transitive_group({n}, {t})
43+
gap: G := TransitiveGroup({n}, {t});
3644

3745
n:
3846
comment: Degree
3947
magma: t, n := TransitiveGroupIdentification(G); n;
4048
sage: G.degree()
4149
oscar: degree(G)
50+
gap: NrMovedPoints(G);
4251

4352
t:
4453
comment: Transitive number
4554
magma: t, n := TransitiveGroupIdentification(G); t;
4655
sage: G.transitive_number()
4756
oscar: transitive_group_identification(G)[2]
57+
gap: TransitiveIdentification(G);
4858

4959
primitive:
5060
comment: Determine if group is primitive
5161
magma: IsPrimitive(G);
5262
sage: G.is_primitive()
5363
oscar: is_primitive(G)
64+
gap: IsPrimitive(G);
5465

5566
even:
5667
comment: Parity
5768
magma: IsEven(G);
5869
sage: all(g.SignPerm() == 1 for g in libgap(G).GeneratorsOfGroup())
5970
oscar: is_even(G)
71+
gap: ForAll(GeneratorsOfGroup(G), g -> SignPerm(g) = 1);
6072

6173
nilpotent:
6274
comment: Nilpotency class
6375
magma: NilpotencyClass(G);
6476
sage: libgap(G).NilpotencyClassOfGroup() if G.is_nilpotent() else -1
6577
oscar: if is_nilpotent(G) nilpotency_class(G) end
78+
gap: if IsNilpotentGroup(G) then NilpotencyClassOfGroup(G); fi;
6679

6780
auts:
6881
comment: Order of the centralizer of G in S_n
6982
magma: Order(Centralizer(SymmetricGroup(n), G));
7083
sage: SymmetricGroup({n}).centralizer(G).order()
7184
oscar: order(centralizer(symmetric_group({n}), G)[1])
85+
gap: Order(Centralizer(SymmetricGroup({n}), G));
7286

7387
gens:
7488
comment: Generators
7589
magma: Generators(G);
7690
sage: G.gens()
7791
oscar: gens(G)
92+
gap: GeneratorsOfGroup(G);
7893

7994
ccs:
8095
comment: Conjugacy classes
8196
magma: ConjugacyClasses(G);
8297
sage: G.conjugacy_classes()
8398
oscar: conjugacy_classes(G)
99+
gap: ConjugacyClasses(G);
84100

85101
order:
86102
comment: Order
87103
magma: Order(G);
88104
sage: G.order()
89105
oscar: order(G)
106+
gap: Order(G);
90107

91108
cyclic:
92109
comment: Determine if group is cyclic
93110
magma: IsCyclic(G);
94111
sage: G.is_cyclic()
95112
oscar: is_cyclic(G)
113+
gap: IsCyclic(G);
96114

97115
abelian:
98116
comment: Determine if group is abelian
99117
magma: IsAbelian(G);
100118
sage: G.is_abelian()
101119
oscar: is_abelian(G)
120+
gap: IsAbelian(G);
102121

103122
solvable:
104123
comment: Determine if group is solvable
105124
magma: IsSolvable(G);
106125
sage: G.is_solvable()
107126
oscar: is_solvable(G)
127+
gap: IsSolvable(G);
108128

109129
id:
110130
comment: Abstract group ID
111131
magma: IdentifyGroup(G);
112132
sage: G.id()
133+
oscar: small_group_identification(G)
134+
gap: IdGroup(G);
113135

114136
char_table:
115137
comment: Character table
116138
magma: CharacterTable(G);
117139
sage: G.character_table()
118140
oscar: character_table(G)
141+
gap: CharacterTable(G);
119142

120143

121144
# specify which code snippets to test

lmfdb/galois_groups/main.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ def make_order_key(order):
143143
CheckCol("solv", "group.solvable", "Solvable"),
144144
MathCol("nilpotency", "group.nilpotent", "Nil. class", short_title="nilpotency class", default=False),
145145
MathCol("auts", "gg.field_automorphisms", r"$\#\Aut(F/K)$", short_title="field auts"),
146+
MathCol("transitivity", "gg.transitivity", "Transitivity", short_title="transitivity",default=lambda info: info.get("transitivity")),
146147
MathCol("num_conj_classes", "gg.conjugacy_classes", "Conj. classes", short_title="conjugacy classes", default=False),
147148
MultiProcessedCol("subfields", "gg.subfields", "Subfields",
148149
["subfields", "cache"],
@@ -154,7 +155,7 @@ def make_order_key(order):
154155
apply_download=lambda s, b, c: [s, b])
155156
],
156157

157-
db_cols=["bound_siblings", "abstract_label", "label", "name", "n", "order", "parity", "pretty", "siblings", "solv", "subfields", "nilpotency", "num_conj_classes", "auts"])
158+
db_cols=["bound_siblings", "abstract_label", "label", "name", "n", "order", "parity", "pretty", "siblings", "solv", "subfields", "nilpotency", "num_conj_classes", "auts", "transitivity"])
158159
#gg_columns.below_download = r"<p>Results are complete for degrees $\leq 23$.</p>"
159160

160161
def gg_postprocess(res, info, query):
@@ -228,6 +229,7 @@ def galois_group_search(info, query):
228229
parse_ints(info,query,'order')
229230
parse_ints(info,query,'arith_equiv')
230231
parse_ints(info,query,'nilpotency')
232+
parse_ints(info,query,'transitivity')
231233
parse_ints(info,query,'auts')
232234
parse_galgrp(info, query, qfield=['label','n'], name='Galois group', field='gal')
233235
for param in ('cyc', 'solv', 'prim'):
@@ -335,6 +337,7 @@ def render_group_webpage(args):
335337
('Cyclic', yesno(data['cyc'])),
336338
('Abelian', yesno(data['ab'])),
337339
('Solvable', yesno(data['solv'])),
340+
('Transitivity', prop_int_pretty(data['transitivity'])),
338341
('Primitive', yesno(data['prim'])),
339342
('$p$-group', yesno(pgroup)),
340343
]
@@ -353,7 +356,7 @@ def render_group_webpage(args):
353356
data['dispv'] = sparse_cyclotomic_to_mathml
354357
data['malle_a'] = wgg.malle_a
355358
downloads = []
356-
for lang in [("Magma", "magma"), ("Oscar", "oscar"), ("SageMath", "sage")]:
359+
for lang in [("Gap", "gap"), ("Magma", "magma"), ("Oscar", "oscar"), ("SageMath", "sage")]:
357360
downloads.append(('{} commands'.format(lang[0]), url_for(".gg_code_download", label=label, download_type=lang[1])))
358361
downloads.append(('Underlying data', url_for(".gg_data", label=label)))
359362
# split the label so that breadcrumbs point to a search for this object's degree
@@ -507,6 +510,12 @@ def __init__(self):
507510
knowl="gg.tnumber",
508511
example="3",
509512
example_span="3 or 4,6 or 2..5 or 4,6..8")
513+
transitivity = TextBox(
514+
name="transitivity",
515+
label="Transitivity",
516+
knowl="gg.transitivity",
517+
example="2",
518+
example_span="2 or 4,6 or 2..5 or 4,6..8")
510519
order = TextBox(
511520
name="order",
512521
label="Order",
@@ -543,9 +552,9 @@ def __init__(self):
543552
example_span="1 or 2,3 or 1..5 or 1,3..10")
544553
count = CountBox()
545554

546-
self.browse_array = [[n, parity], [t, cyc], [order, solv], [nilpotency, prim], [arith_equiv, aut], [gal], [count]]
555+
self.browse_array = [[n, parity], [t, cyc], [order, solv], [nilpotency, prim], [arith_equiv, aut], [gal], [count, transitivity]]
547556

548-
self.refine_array = [[parity, cyc, solv, prim, arith_equiv], [n, t, order, gal, nilpotency], [aut]]
557+
self.refine_array = [[parity, cyc, solv, prim, arith_equiv], [n, t, order, gal, nilpotency], [aut, transitivity]]
549558

550559
def yesone(s):
551560
return "yes" if s in ["yes", 1] else "no"

lmfdb/galois_groups/templates/gg-show-group.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ <h2>{{ KNOWL('gg.group_action_invariants', title='Group action invariants') }}</
4646
{% endif %}
4747
<tr><td>{{KNOWL('gg.parity','Parity')}}:</td><td>&nbsp;&nbsp;</td><td>{{info.parity}}</td>
4848
<td>{{ place_code('even') }}</td></tr>
49+
<tr><td>{{KNOWL('gg.transitivity', 'Transitivity')}}:</td><td>&nbsp;&nbsp;</td><td>{{info.transitivity}}</td>
4950
<tr><td>{{KNOWL('gg.primitive', 'Primitive')}}:</td><td>&nbsp;&nbsp;</td><td>{{info.yesno(info.prim)}}</td>
5051
<td>{{ place_code('primitive') }}</td></tr>
5152
<tr><td class="nowrap">{{KNOWL('gg.field_automorphisms', '$\card{\Aut(F/K)}$')}}:</td><td>&nbsp;&nbsp;</td><td>${{info.auts}}$</td>

0 commit comments

Comments
 (0)