Skip to content

Commit c374fb6

Browse files
G-CW quotients
1 parent e2c42b5 commit c374fb6

File tree

9 files changed

+278
-5
lines changed

9 files changed

+278
-5
lines changed

lib/Congruence/GCWquotient.gi

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
2+
#####################################################################
3+
#####################################################################
4+
InstallGlobalFunction(GComplexToRegularCWComplex,
5+
function(R,N)
6+
local Y, dim, dim1, Cells,boundaries, StandardForm,
7+
Tiles, tile, pos,NeighbourGens,TileReps,
8+
w,NewLeaves,Leaves,i,e,f,n,k,g,b,x,T;
9+
#R is a contractible G-complex
10+
#S is a set of elements in G=R!.group
11+
#N is a finite index subgroup of G=R!.group
12+
13+
T:=RightTransversal(R!.group,N);
14+
15+
#######################################################
16+
dim:=0;
17+
for n in [1..Length(R)] do
18+
if R!.dimension(n)>0 then dim:=dim+1;
19+
else break; fi;
20+
od;
21+
dim1:=dim-1;
22+
#######################################################
23+
24+
########################################
25+
StandardForm:=function(n,x)
26+
local e,g,gc,stab;
27+
28+
e:=AbsInt(x[1]);
29+
g:=x[2];
30+
stab:=R!.stabilizer(n,e);
31+
gc:=g*Elements(stab);
32+
gc:=List(gc, a->T[T!.poscan(a)]);
33+
#gc:=SSortedList(gc);
34+
#gc:=gc[1];
35+
gc:=Minimum(gc);
36+
return [e,gc];
37+
end;
38+
########################################
39+
40+
41+
Tiles:=[];
42+
for k in [1..R!.dimension(dim)] do
43+
tile:=1*R!.boundary(dim,k);
44+
Apply(tile,x->[x[1],R!.elts[x[2]]]);
45+
Apply(tile,e->StandardForm(dim1,e));
46+
Add(Tiles,tile);
47+
od;
48+
49+
50+
TileReps:=List([1..Length(Tiles)],i->T);
51+
##################################################################
52+
##################################################################
53+
54+
########################################
55+
########################################
56+
57+
Cells:=List([1..dim+1],i->[]);
58+
## Cells[k+1] is a list of the k-cells present in the complex
59+
60+
for k in [1..R!.dimension(dim)] do
61+
for g in TileReps[k] do
62+
Add(Cells[dim+1],StandardForm(dim,[k,g]));
63+
od;
64+
od;
65+
Cells[dim+1]:=SSortedList(Cells[dim+1]);
66+
67+
for n in Reversed([1..dim]) do
68+
for x in Cells[n+1] do
69+
b:=1*R!.boundary(n,x[1]);
70+
Apply(b,z->[z[1],R!.elts[z[2]]]);
71+
Apply(b,y->[y[1],x[2]*y[2]]);
72+
Apply(b,y->StandardForm(n-1,y));
73+
Append(Cells[n],b);
74+
od;
75+
Cells[n]:=SSortedList(Cells[n]);
76+
od;
77+
78+
79+
boundaries:=List([1..dim+2], n->[]);
80+
boundaries[1]:=List(Cells[1],x->[1,0]);
81+
82+
for n in [1..dim] do
83+
for k in [1..Length(Cells[n+1])] do
84+
x:=Cells[n+1][k];
85+
b:=1*R!.boundary(n,x[1]);
86+
Apply(b,z->[z[1],R!.elts[z[2]]]);
87+
Apply(b,y->[y[1],x[2]*y[2]]);
88+
Apply(b,y->StandardForm(n-1,y));
89+
Apply(b,c->PositionSorted(Cells[n],c));
90+
b:=Concatenation([Length(b)],b);
91+
boundaries[n+1][k]:=b;
92+
od;
93+
od;
94+
95+
Y:=RegularCWComplex(boundaries);
96+
97+
return Y;
98+
end);
99+
#####################################################################
100+
#####################################################################
101+

lib/Congruence/bianchiComplex.gi

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ end;
339339
InstallGlobalFunction(BianchiGcomplex,
340340
function(d)
341341
local R,P,OQ,Y,Dimension,Stabilizer,action,STABS,stb,rot,rotREC,Boundary,
342-
rep,ELTS,adjust,xx,I,
342+
rep,ELTS,adjust,xx,I,H,
343343
G,K,S,T,i,V,n,B,BB,k,BoundaryRec,TMP, EquivSpheres, gens,omega,x,y,M,a;
344344

345345
if not IsInt(d) then
@@ -392,7 +392,7 @@ G:=HAP_BianchiRepresentativesAction(Y,n,i,i);
392392
od;
393393
Add(GENS,-One(GENS[1]));
394394
###################################
395-
STABS[1][i]:= Group(GENS); STABS[1][i]!.Order:=infinity; STABS[1][i]!.Size:=infinity;
395+
STABS[1][i]:= Group(GENS); STABS[1][i]!.Order:=infinity; STABS[1][i]!.Size:=infinity; SetIsFinite(STABS[1][i],false); IsBianchiAbelianGroup(STABS[1][i]);
396396
return infinity; fi;
397397
G:=HAP_BianchiRepresentativesAction(Y,n,i,i);
398398

@@ -710,13 +710,22 @@ G!.tree:=true;
710710
SetGeneratorsOfGroup(G,gens);
711711
SetSize(G,infinity);
712712
SetOrder(G,infinity);
713+
714+
H:=RingOfIntegers(QuadraticNumberField(d));;
715+
H:=QuadraticIdeal(H,1);;
716+
H:=HAP_CongruenceSubgroupGamma0(H);;
717+
H!.tree:=true;;
718+
H:=GroupHomomorphismByFunction(G,H,QuadraticNumberToCyclotomic);
719+
720+
713721
R:= Objectify(HapNonFreeResolution,
714722
rec(
715723
dimension:=Dimension,
716724
boundary:=Boundary,
717725
homotopy:=fail,
718726
elts:=ELTS,
719727
group:=G,
728+
isomorphismToGroupCyclotomicMats:=H,
720729
stabilizer:=Stabilizer,
721730
action:=action,
722731
ring:=Y!.ring,

lib/Congruence/quadArithmetic.gi

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,39 @@ end);
1414
#####################################################################
1515
#####################################################################
1616

17+
#####################################################################
18+
#####################################################################
19+
InstallMethod(QuadraticNumberToCyclotomic,
20+
"converts a quadratic number to a cyclotomic",
21+
[IsHapQuadraticNumber],
22+
function( x )
23+
return x!.rational + Sqrt(x!.bianchiInteger)*x!.irrational;
24+
end);
25+
#####################################################################
26+
#####################################################################
27+
28+
#####################################################################
29+
#####################################################################
30+
InstallOtherMethod(QuadraticNumberToCyclotomic,
31+
"converts a List of quadratic numbers to a List of cyclotomics",
32+
[IsList],
33+
function( L )
34+
return List(L,QuadraticNumberToCyclotomic);;
35+
end);
36+
#####################################################################
37+
#####################################################################
38+
39+
#####################################################################
40+
#####################################################################
41+
InstallOtherMethod(QuadraticNumberToCyclotomic,
42+
"converts a Matrix of quadratic numbers to a Matrix of cyclotomics",
43+
[IsMatrix],
44+
function( M )
45+
return List(M,QuadraticNumberToCyclotomic);;
46+
end);
47+
#####################################################################
48+
#####################################################################
49+
1750
#####################################################################
1851
#####################################################################
1952
InstallGlobalFunction (QuadraticNumberConjugate,
@@ -161,6 +194,7 @@ local M, gens, G, g, x, gx, bool, i, j;
161194
if IsBound(GG!.MultiplicationTable) then return GG!.MultiplicationTable; fi;
162195

163196
gens:=GeneratorsOfGroup(GG);
197+
if Length(gens)=0 then gens:=[One(GG)]; fi;
164198
G:=[gens[1]^0];
165199
bool:=true;
166200

lib/Congruence/quadraticIntegers.gd

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ DeclareGlobalFunction( "QuadraticNumber" );
1717
DeclareGlobalFunction( "IsHapQuadraticInteger" );
1818
DeclareGlobalFunction("BianchiGcomplex");
1919
DeclareGlobalFunction("HAP_InverseOpFunction");
20+
DeclareGlobalFunction("GComplexToRegularCWComplex");
21+
DeclareGlobalFunction("ResolutionIsomorphismGroup");
2022

2123
#####################################################################
2224
#####################################################################
@@ -219,4 +221,4 @@ Display3DUnimodularPairs(Y!.ring,Y!.unimodularPairsSingletons,lst);
219221
#####################################################################
220222

221223

222-
224+
DeclareOperation("QuadraticNumberToCyclotomic",[IsHapQuadraticNumber]);

lib/Congruence/quadraticIntegers.gi

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,16 @@ return [[one,zero],[zero,one]];
516516
end);
517517
#####################################################################
518518

519+
######################################################################
520+
InstallOtherMethod( OneMutable,
521+
"one mutable in 2x2 matrix group",
522+
[ IsHap2x2matrix],
523+
100000000,
524+
function(M)
525+
return 1*One(M);
526+
end);
527+
#####################################################################
528+
519529
#####################################################################
520530
InstallOtherMethod( InverseMutable,
521531
"inverse in 2x2 matrix group",
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
2+
##############################################################
3+
##############################################################
4+
InstallGlobalFunction(ResolutionIsomorphismGroup,
5+
function(arg)
6+
local K,hom,fn,G,HH, STAB, ROT, n, k, ln, x,g;
7+
#Inputs a (possibly non-free) resolution K for G and isomorphism hom:G->H.
8+
#Destructively converts K to a resolution for H.
9+
10+
K:=arg[1]; hom:=arg[2];
11+
12+
if Length(arg)=2 then
13+
fn:=function(x) return ImageElm(hom,x); end;
14+
HH:=Range(hom);
15+
else
16+
fn:=hom;
17+
HH:=arg[3];
18+
fi;
19+
20+
##################################
21+
22+
23+
if IsHapResolution(K) then
24+
K!.group:=Range(hom);
25+
if IsMutable(K!.elts) then
26+
Apply(K!.elts,fn);
27+
else
28+
K!.elts:=List(K!.elts,fn);
29+
fi;
30+
return true;
31+
fi;
32+
33+
34+
#################################
35+
36+
#################################
37+
K!.group:=HH;
38+
39+
ln:=0; #The dimension of the complex
40+
for n in [1..100] do
41+
if K!.dimension(n)=0 then break; fi;
42+
ln:=ln+1;
43+
od;
44+
45+
STAB:=[];
46+
ROT:=[];
47+
for n in [0..ln] do
48+
STAB[n+1]:=[];
49+
ROT[n+1]:=[];
50+
for k in [1..K!.dimension(n)] do
51+
if n>0 then
52+
x:=Elements(K!.stabilizer(n,k));
53+
for g in x do
54+
if not g in K!.elts then Add(K!.elts,g); fi;
55+
od;
56+
x:=Filtered(x,g->K!.action(n,k,Position(K!.elts,g))=1);
57+
x:=List(x,fn);
58+
x:=Group(x);
59+
Add(ROT[n+1],x);
60+
fi;
61+
x:=GeneratorsOfGroup(K!.stabilizer(n,k));
62+
x:=List(x,fn);
63+
x:=Group(x);
64+
Add(STAB[n+1],x);
65+
od;
66+
od;
67+
68+
##############################
69+
K!.stabilizer:=function(n,k);
70+
return STAB[n+1][k];
71+
end;
72+
##############################
73+
74+
if IsMutable(K!.elts) then
75+
Apply(K!.elts,fn);
76+
else
77+
K!.elts:=List(K!.elts,fn);
78+
fi;
79+
80+
81+
##############################
82+
K!.action:=function ( n, k, g )
83+
local id, r, u, ans, abk, H;
84+
if n = 0 then
85+
return 1;
86+
fi;
87+
abk := AbsInt( k );
88+
H := K!.stabilizer( n, abk );
89+
if Order( H ) = infinity then
90+
return 1;
91+
fi;
92+
id := CanonicalRightCosetElement( H, Identity( H ) );
93+
r := CanonicalRightCosetElement( H, K!.elts[g] ^ -1 );
94+
r := id ^ -1 * r;
95+
u := r * K!.elts[g];
96+
if u in ROT[n+1][abk] then
97+
ans := 1;
98+
else
99+
ans := -1;
100+
fi;
101+
return ans;
102+
end;
103+
104+
##############################
105+
106+
107+
return true;
108+
#################################
109+
110+
111+
end);
112+
##############################################################
113+
##############################################################
114+

lib/Congruence/sl2o.gi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,8 @@ else
435435
local p;
436436
p:=x[2]*one;
437437
if IsZero(p[2]) then return zero; fi;
438-
p:=p*(p[2]^-1); return Position(Psorted,[p[1]![1],p[2]![1]]);
438+
p:=p*(p[2]^-1);
439+
return PositionSorted(Psorted,[p[1]![1],p[2]![1]]);
439440
end;
440441
##########################################
441442
fi;

lib/Functors/various.gi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ local x, h;
480480

481481
if IsFinite(U) or IsBound(U!.gname)
482482
then return CanonicalRightCosetElement(U,g); fi;
483-
483+
#IsHap2x2matrix(g); IsBianchiAbelianGroup(U);
484484
if g in U then return One(U); fi;
485485

486486
if not IsBound(U!.ccelts) then U!.ccelts:=[]; fi;

read.g

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,8 @@ ReadPackageHap( "lib/Congruence/bianchiComplex.gi");
233233
ReadPackageHap( "lib/Congruence/resAbelianBianchiSubgroup.gi");
234234
ReadPackageHap( "lib/Congruence/qnf_nc.gi");
235235
ReadPackageHap( "lib/Congruence/notused.gi");
236+
ReadPackageHap( "lib/Congruence/resIsomorphicGroup.gi");
237+
ReadPackageHap( "lib/Congruence/GCWquotient.gi");
236238

237239
##################### ORRU #####################################
238240
ReadPackageHap( "lib/Orru/initOrru.gi");

0 commit comments

Comments
 (0)