You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Utilities and extensions of various Magma intrinsics plus intrinsics for efficiently working with Conrey characters and their Galois orbits, integrated with Magma's built-in support for Dirichlet characters, an intrinsics for working more efficiently with subgroups of GL(2,Z/NZ).
3
3
4
-
You can create the Dirichlet character with Conrey label `13.3` in the Galois orbit with LMFDB label `13.c` using either `chi:=DirichletCharacter("13.2");` or `chi:=DirichletCharacter(`13.c`);` and you can recover these labels using `ConreyLabel(chi)` or `CharacterOrbitLabel(chi)`.
4
+
You can create the Dirichlet character with Conrey label `13.3` in the Galois orbit with LMFDB label `13.c` using either `chi:=DirichletCharacter("13.2");` or `chi:=DirichletCharacter("13.c");` and you can recover these labels using `ConreyLabel(chi);` or `CharacterOrbitLabel(chi);`.
5
5
6
-
To use this package add `AttachSpec("somewhere/magma.spec")` to your Magma startup script.
6
+
To use this package add `AttachSpec("somewhere/magma.spec");` to your Magma startup script.
{ The list of Galois orbit representatives of the full Dirichlet group of modulus N with minimal codomains sorted by order and trace vectors.
293
293
If the optional boolean argument RepTable is set then a table mapping Dirichlet characters to indexes in this list is returned as the second return value. }
294
294
require N gt 0: "Modulus N must be a positive integer";
295
-
if OrderBound eq 1 then chi1:=DirichletGroup(N)!1; if RepTable then T:=AssociativeArray(Parent(chi1)); T[chi1]:=1; return [chi1],T; else return [chi1]; end if; end if;
296
-
if not RepTable and OrderBound eq 0 and IsCyclic(N) then return [* DirichletCharacter(s):s in ConreyCharacterOrbitReps(N) *]; end if;
297
-
// The call to MinimalBaseRingCharacter can be very slow when N is large (this makes no sense it should be easy) */
298
-
G := [* MinimalBaseRingCharacter(chi): chi in GaloisConjugacyRepresentatives(FullDirichletGroup(N)) *];
295
+
if OrderBound eq 1 then
296
+
chi1:=DirichletGroup(N)!1;
297
+
if RepTable then
298
+
T:=AssociativeArray(Parent(chi1));
299
+
T[chi1]:=1;
300
+
return [chi1],T;
301
+
else
302
+
return [chi1];
303
+
end if;
304
+
end if;
305
+
if not RepTable and OrderBound eq 0 then
306
+
return [* DirichletCharacter(s) : s in ConreyCharacterOrbitReps(N) *];
307
+
end if;
308
+
G := [* DirichletCharacter(s) : s in ConreyCharacterOrbitReps(N) *];
299
309
X := [i:i in [1..#G]];
300
310
X := Sort(X,func<i,j|CompareCharacters(G[i],G[j])>);
301
311
G := OrderBound eq 0 select [* G[i] : i in X *] else [* G[i] : i in X | Order(G[i]) le OrderBound *];
302
312
if not RepTable then return G; end if;
303
313
H := Elements(FullDirichletGroup(N));
304
314
A := AssociativeArray();
305
-
for i:=1 to #G do v:=[OrderOfRootOfUnity(a,Order(G[i])):a in ValuesOnUnitGenerators(G[i])]; if IsDefined(A,v) then Append(~A[v],i); else A[v]:=[i]; end if; end for;
315
+
for i:=1 to #G do
316
+
v:=[OrderOfRootOfUnity(a,Order(G[i])):a in ValuesOnUnitGenerators(G[i])];
317
+
if IsDefined(A,v) then
318
+
Append(~A[v],i);
319
+
else
320
+
A[v]:=[i];
321
+
end if;
322
+
end for;
306
323
if OrderBound gt 0 then H := [chi : chi in H | Order(chi) le OrderBound]; end if;
{ Given a modulus N, a positive integer n, a list of integers u giving standard generates for (Z/NZ)*, and a suitable list of integers v, returns the Dirichlet character with values in Q(zeta_n) mapping u[i] to zeta_n^v[i]. }
{ Given a modulus N, a positive integer n, a list of integers u giving standard generates for (Z/NZ)*, and a suitable list of integers v, returns the Dirichlet character with values in Q(zeta_n) mapping u[i] to zeta_n^v[i]. If the optional parameter zeta is given, then it is assumed to be a root of unity of order r with r a multiple of n and zeta^(r/n) is used instead of zeta_n.}
{ Given a modulus N, a positive integer n, a list of integers u giving standard generates for (Z/NZ)*, and a suitable list of integers v, returns the Dirichlet character with values in R mapping u[i] to zeta^(r/n*v[i]). If agrument zeta is assumed to be a root of unity of order r in R. And r should be a multiple of n.}
1147
+
require N gt 0: "Modulus N must a positive integer";
1148
+
if N lt 3 then assert #v eq 0; return DirichletGroup(N, R, zeta^r, 1)!1; end if;
1149
+
n := LCM([Denominator(e):e in v]);
1150
+
assert (r mod n) eq 0;
1151
+
zeta := zeta^(r div n);
1152
+
if n eq 1 then return DirichletGroup(N, R, zeta, n)!1; end if;
1153
+
if n eq 2 then return DirichletCharacterFromValuesOnUnitGenerators(DirichletGroup(N, R, zeta, n),[(-1)^(Integers()!(n*e)) : e in v]); end if;
1154
+
return DirichletCharacterFromValuesOnUnitGenerators(DirichletGroup(N,R, zeta, n),[R|zeta^(Integers()!(n*e)) : e in v]);
{ A list of the Dirichlet characters psi in the ambient group of chi for which psi^2 = chi (note that only psi in the ambient group of chi will be returned). }
0 commit comments