Skip to content

Commit 23e43d4

Browse files
v1.69
1 parent 3ec2550 commit 23e43d4

File tree

11 files changed

+93
-38
lines changed

11 files changed

+93
-38
lines changed

PackageInfo.g

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ SetPackageInfo( rec(
88

99
PackageName := "HAP",
1010
Subtitle := "Homological Algebra Programming",
11-
Version := "1.68",
12-
Date := "09/07/2025",
11+
Version := "1.69",
12+
Date := "17/07/2025",
1313
License := "GPL-2.0-or-later",
1414

1515
SourceRepository := rec(

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ Please send your bug reports to graham.ellis(at)nuigalway.ie .
3232
On a Linux machine with GAP (and optionally Polymake) installed, the HAP
3333
library can be loaded as follows:
3434

35-
* First download the file hap1.68.tar.gz to the subdirectory "pkg/" of GAP. (If
35+
* First download the file hap1.69.tar.gz to the subdirectory "pkg/" of GAP. (If
3636
you don't have access to this, then create a directory "pkg" in your home
3737
directory and download the file there.)
3838

39-
* Change to directory "pkg/" and type "gunzip hap1.68.tar.gz" followed by
40-
"tar -xvf hap1.68.tar" .
39+
* Change to directory "pkg/" and type "gunzip hap1.69.tar.gz" followed by
40+
"tar -xvf hap1.69.tar" .
4141

4242
* Start GAP. (If you have created "pkg" in your home directory then start GAP
4343
with the command "gap -l 'path/homedir;' " where path/homedir is the path to
@@ -46,12 +46,12 @@ your home directory.)
4646
* In GAP type " LoadPackage("HAP"); " .
4747

4848
* Help on HAP can be found on the HAP home page (a version of which is
49-
included in directory "pkg/Hap1.68/www" of this distribution).
49+
included in directory "pkg/Hap1.69/www" of this distribution).
5050

5151
* Performance can be significantly improved by using a compiled version of the
5252
HAP library. A compiled version can be created by the following steps.
5353

54-
1. Change to the directory "pkg/Hap1.68/" .
54+
1. Change to the directory "pkg/Hap1.69/" .
5555
2. Edit the file "compile" so that: PKGDIR is equal to the path to the
5656
directory "pkg" where your GAP packages are stored; GACDIR is equal to the
5757
path to the directory where the GAP compiler "gac" is stored.
@@ -60,4 +60,4 @@ path to the directory where the GAP compiler "gac" is stored.
6060
The next time HAP is loaded a compiled version will be loaded.
6161

6262
* Should you want to return to an uncompiled version, change to the directory
63-
"pkg/Hap1.68/" and type "./uncompile".
63+
"pkg/Hap1.69/" and type "./uncompile".

date

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
09 July 2025
1+
17 July 2025

doc/Undocumented.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1449,6 +1449,8 @@
14491449
<Br/>
14501450
<C>SwanBianchiCriterion</C>&nbsp;&nbsp;&nbsp;&nbsp;<B>Examples:</B> <Br/>
14511451
<Br/>
1452+
<C>SwanBianchiCriterion_alt</C>&nbsp;&nbsp;&nbsp;&nbsp;<B>Examples:</B> <Br/>
1453+
<Br/>
14521454
<C>SylowSubgroupOfCatOneGroup</C>&nbsp;&nbsp;&nbsp;&nbsp;<B>Examples:</B> <Br/>
14531455
<Br/>
14541456
<C>SymmetricCentre</C>&nbsp;&nbsp;&nbsp;&nbsp;<B>Examples:</B> <Br/>

lib/Congruence/bianchi.gi

Lines changed: 67 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ fi;
112112

113113
#fi;
114114
od;
115-
115+
Add(U,[1,0,1]); #Added July 2025
116116
return SSortedList(U); #####
117117
end); #####
118118
##################################################
@@ -1061,9 +1061,9 @@ end); #####
10611061
###################################################
10621062
###################################################
10631063
InstallGlobalFunction(UnimodularPairsReduced_NN, #####
1064-
function(OQ,LL) #####
1064+
function(OQ,LL) #####
10651065
local L, Lines, Points, K, K3, E,EE, V, VV,
1066-
fn, fn2, v, w, h, dist, bool, C,D,DD,i,F,S,M;
1066+
fn, fn2, v, w, h, dist, bool, BOOL, C,D,DD,i,F,S,M;
10671067

10681068
#L:=QQNeighbourhoodOfUnimodularPairs(OQ,LL);
10691069
if LL=[] then return [LL,[]]; fi;
@@ -1079,6 +1079,7 @@ DD:=Filtered([1..K!.nrSimplices(2)], v-> IsQQUnimodularPair(OQ,L[K3[v][1]])
10791079
or IsQQUnimodularPair(OQ,L[K3[v][2]])
10801080
or IsQQUnimodularPair(OQ,L[K3[v][3]]) );
10811081
#Need to check that this is OK here
1082+
10821083
S:=K3{DD};
10831084
Points:=Points{DD};
10841085

@@ -1123,18 +1124,20 @@ od;
11231124

11241125
L:=L{DD};
11251126
L:=QQNeighbourhoodOfUnimodularPairs(OQ,L);
1127+
L:=SSortedList(L);
1128+
11261129

11271130
VV:=Filtered(VV,v->v[1] in DD and v[2] in DD and v[3] in DD);
11281131
M:=List(VV,v->Position(K!.simplicesLst[3],[v[1],v[2],v[3]]));
11291132
M:=Difference([1..Length(K!.Points)], M);
11301133
for i in M do
11311134
K!.Points[i]:=fail;
1132-
K!.Heights:=-infinity;
1135+
#K!.Heights:=-infinity;
11331136
od;
11341137

11351138

11361139
return [L,K]; #####
1137-
end); #####
1140+
end); #####
11381141
##################################################
11391142
##################################################
11401143

@@ -1172,20 +1175,27 @@ ABI:=AbsInt(BI);
11721175
###############################
11731176

11741177
HAPRECORD:=[
1175-
[ 1, 1 ],[ 2, 1 ],[ 3, 1 ],[ 5, 20 ],[ 6, 24 ],[ 7, 1 ],[ 10, 40 ],[ 11, 1 ],[ 13, 52 ],[ 14, 56 ],[ 15, 15 ],[ 17, 68 ],[ 19, 4 ],[ 21, 84 ],[ 22, 88 ],[ 23, 18 ],[ 26, 104 ],[ 29, 169 ],[ 30, 121 ],[ 31, 16 ],[ 33, 132 ],[ 34, 9 ],[ 35, 35 ],[ 37, 25 ],[ 38, 4 ],[ 39, 39 ],[ 41, 25 ],[ 42, 25 ],[ 43, 9 ],[ 46, 25 ],[ 47, 24 ],[ 51, 51 ],[ 53, 25 ],[ 55, 56 ],[ 57, 49 ],[ 59, 27 ],[ 67, 16 ],[ 71, 48 ],[ 79, 40 ],[ 83, 33 ],[ 87, 87 ],[ 91, 91 ],[ 95, 95 ],[ 103, 56 ],[ 107, 36 ],[ 111, 111 ],[ 115, 115 ],[ 119, 25 ],[ 123, 123 ],[ 127, 64 ],[ 131, 45 ],[ 139, 55 ],[ 143, 9 ],[ 151, 80 ],[ 155, 155 ],[ 163, 53 ],[167,384],
1176-
[ 179, 155]
1178+
[ 1, 1 ],[ 2, 1 ],[ 3, 1 ],[ 5, 20 ],[ 6, 24 ],[ 7, 1 ],[ 10, 40 ],[ 11, 1 ],[ 13, 52 ],[ 14, 56 ],[ 15, 15 ],[ 17, 68 ],[ 19, 5 ],[ 21, 84 ],[ 22, 88 ],[ 23, 18 ],[ 26, 121 ],[ 29, 169 ],[ 30, 169 ],[ 31, 20 ],[ 33, 528 ],[ 34, 225 ],[ 35, 35 ],[ 37, 289 ],[ 38, 4 ],[ 39, 39 ],[ 41, 361 ],[ 42, 672 ],[ 43, 9 ],
1179+
#[ 46, 25 ],
1180+
[ 47, 36 ],[ 51, 51 ],
1181+
#[ 53, 25 ],
1182+
[ 55, 56 ],
1183+
#[ 57, 49 ],
1184+
[ 59, 36 ],[ 67, 23 ],[ 71, 64 ],[ 79, 64 ],[ 83, 36 ],[ 87, 87 ],[ 91, 91 ],[ 95, 95 ],[ 103, 64 ],[ 107, 64 ],[ 111, 111 ],[ 115, 115 ],
1185+
#[ 119, 25 ],
1186+
[ 123, 123 ],[ 127, 121 ],[ 131, 100 ],[ 139, 100 ],[ 143, 576 ],[ 151, 110 ],[ 155, 155 ],[159,240],[ 163, 53 ],[167,384],[ 179, 144], [199,196]
11771187
];;
11781188
#HAPRECORD contains some precomuted [d,r] for which Swan's
11791189
#criterion is satisfied for the given norm r.
11801190
#HAPRECORD:=[]; #Uncomment this line to calculate HAPRECORD entries from
1181-
#scratch. The value [179,155] was only partialy checked (up
1182-
#to norm r=5000).
1191+
#scratch.
11831192

11841193
if Length(arg)=2 then pos:=arg[2];
11851194
else
11861195

11871196
pos:=Position(List(HAPRECORD,x->x[1]),ABI);
11881197
if pos =fail or pos=0 then pos:=infinity;
1198+
Print("Try \n P:=BianchiPolyhedron(OQ,N);\nfor some guessed positive integer value of N and then try\n SwanBianchiCriterion(P);\nto test if the value of N was large enough. If the test returns false then you'll need to try a larger value of N.\n\nA successful value of N can be stored as a pair [d,N] in the list HAPRECORD which can be edited manually in the file hap/lib/Congruence/bianchi.gi .\n\n");
11891199
else pos:=HAPRECORD[pos][2]; fi;
11901200

11911201
fi;
@@ -1198,7 +1208,7 @@ bool:=true;
11981208
L:=[];
11991209

12001210
while bool do
1201-
N:=N+1;
1211+
N:=N+1;
12021212
if Length(arg)>1 then
12031213
#Print("Adding hemispheres of squared radius ",1/NRMS[N],"\n");
12041214
fi;
@@ -1221,7 +1231,7 @@ L:=K[1]; K:=K[2];
12211231
###########CHECK SWAN'S CONDITION REALLY IS MET
12221232
if pos=infinity then
12231233
A:=BianchiPolyhedron(OQ!.bianchiInteger,L);
1224-
A:=SwanBianchiCriterion(A);
1234+
A:=SwanBianchiCriterion_alt(A);
12251235
if not Length(A)=0 then
12261236
return CoverOfUnimodularPairs(OQ,N+1,true);
12271237
fi;
@@ -1248,14 +1258,45 @@ if not Homology(Y,0)=[0] then return false; fi;
12481258
if not Homology(Y,1)=[] then return false; fi;
12491259
return true;
12501260
end);
1261+
##################################################
1262+
###############################################
1263+
12511264
##################################################
12521265
##################################################
1266+
InstallGlobalFunction(SwanBianchiCriterion,
1267+
function(P)
1268+
local mr, mv, R, L,LL, i, u, Points;
12531269

1270+
mr:=P!.minRadius;
1271+
mv:=P!.minVertexHeight;
1272+
if IsInt(1/mv) then R:=1/mv;
1273+
else R:= 1+Int(1/mv);
1274+
fi;
1275+
1276+
L:=UnimodularPairs(P!.ring,R);;
1277+
LL:=UnimodularPairs(P!.ring,mr);;
1278+
L:=Difference(L,LL);;
1279+
L:=Filtered(L,x->IsQQUnimodularPair(P!.ring,x));;
1280+
L:=Filtered(L,x->not HAP_IsRedundantUnimodularPair(P!.ring,P!.unimodularPairs,x));
1281+
1282+
Points:=Filtered([1..Length(P!.points)],i->P!.visibleHeights[i]>0);
1283+
1284+
for u in L do
1285+
for i in Points do
1286+
if P!.visibleHeights[i] < HAP_HeightOfPointOnSphere(P!.ring,P!.points[i],u) then return false; fi;
1287+
od;
1288+
od;
12541289

1290+
return true;
12551291

1292+
end);
12561293
##################################################
12571294
##################################################
1258-
InstallGlobalFunction(SwanBianchiCriterion,
1295+
1296+
1297+
##################################################
1298+
##################################################
1299+
InstallGlobalFunction(SwanBianchiCriterion_alt,
12591300
function(arg)
12601301
local PP,P,F,A,K,C,CC,D,H, nrmL, L, S, S1, v,b,x,i,h,s1,s2,t1,t2;
12611302

@@ -1340,7 +1381,7 @@ end);
13401381
#####################################################
13411382
InstallGlobalFunction(BianchiPolyhedron,
13421383
function(arg)
1343-
local d,K, P,C, OQ, F, H, L,M,i,x,N;
1384+
local d,K, P,C, OQ, F, H, L,M,i,x,N,s;
13441385

13451386
d:=arg[1];
13461387
if d>=0 then
@@ -1402,8 +1443,20 @@ P!.cusps:=C;
14021443

14031444

14041445

1405-
1446+
L:=K[2]!.unimodularPairs;
14061447
H:=P!.heights;
1448+
############
1449+
for i in [1..Length(H)] do
1450+
if H[i]>0 then
1451+
for s in L do
1452+
if HAP_HeightOfPointOnSphere(OQ,K[2]!.Points[i],s)!.rational>H[i] then
1453+
H[i]:=-infinity;
1454+
fi;
1455+
od;
1456+
fi;
1457+
od;
1458+
############
1459+
P!.visibleHeights:=1*H;
14071460
H:=Filtered(H,x->x>0);
14081461
if Length(H)>0 then
14091462
H:=Minimum(H);

lib/Congruence/cong.gi

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ InstallMethod(RightTransversal,
55
"right transversal for finite index subgroups of SL(2,Integers)",
66
[IsMatrixGroup,IsMatrixGroup],
77
function(H,HH);
8-
if not ( IsHapSL2ZSubgroup(H)) then TryNextMethod(); fi;
9-
#Print("HAP_RightTransversalSL2ZSubgroups\n");
10-
if IndexInSL2Z(H)=1 then
8+
if not ( IsHapSL2ZSubgroup(H) or IsHapSL2ZSubgroup(HH)) then TryNextMethod(); fi;
9+
if H=SL(2,Integers) then
1110
return HAP_RightTransversalSL2ZSubgroups(H,HH);
1211
else
1312
return HAP_RightTransversalSL2ZSubgroups_alt(H,HH);

lib/Congruence/quadraticIntegers.gd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ DeclareGlobalFunction("UnimodularIntersectingLine");
113113
DeclareGlobalFunction("NeighbourhoodOfUnimodularPairs");
114114
DeclareGlobalFunction("HAP_VertexHeights");
115115
DeclareGlobalFunction("SwanBianchiCriterion");
116+
DeclareGlobalFunction("SwanBianchiCriterion_alt");
116117
DeclareGlobalFunction("QQNeighbourhoodOfUnimodularPairs");
117118
DeclareGlobalFunction("QNeighbourhoodOfUnimodularPairs");
118119
DeclareGlobalFunction("IsQUnimodularPair");

version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.68
1+
1.69

www/SideLinks/About/aboutGraphsOfGroups.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@
184184
hyperbolic space. </small></big><big><small>A <span
185185
style="font-style: italic;">Fuchsian group</span> is a discrete
186186
subgroup of PSL(2,<span style="font-family: helvetica,arial,sans-serif;">R</span>)
187-
and as such acts on the hyperbolic plane. A "fundamental domain" for a co-finite
187+
and as such acts on the hyperbolic plane. A "fundamental domain" for a co-finite volume
188188
Kleinian or Fuchsian group G gives rise to a tessellation of hyperbolic
189189
3- or 2-space. Let X denote the 1-skeleton of this tessellation. Then G
190190
acts on (possibly a subdivision of) X in such a way that no edge is inverted. The quotient graph
@@ -206,7 +206,7 @@
206206
<tr>
207207
<td
208208
style="vertical-align: top; background-color: rgb(204, 255, 255);">Let
209-
G be a co-finite Fuchsian group. Let Y be the graph of groups arising
209+
G be a co-finite area Fuchsian group. Let Y be the graph of groups arising
210210
from G and a fundamental domain. Let P be the fundamental group of Y.
211211
Then the "obvious" quotient homomorphism P&#8594;G induces an isomorphism<br>
212212
<div style="text-align: center;"><br>

www/download/downloadContent.html

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,23 @@ <h3>Download Instructions</h3>
1919
</p>
2020
<ul>
2121
<li>First download the file <a
22-
href="https://github.com/gap-packages/hap/releases/download/v1.68/hap-1.68.tar.gz">hap1.68.tar.gz</a>
22+
href="https://github.com/gap-packages/hap/releases/download/v1.69/hap-1.69.tar.gz">hap1.69.tar.gz</a>
2323
which contains the most recent development version of HAP to the
2424
subdirectory
2525
"pkg/" of GAP. If you don't have access to this subdirectory,
2626
then create a directory "pkg" in your home directory and download the
2727
file there. (If you'd prefer to download the most
2828
recent development version of HAP then download the file&nbsp; <a
29-
href="https://github.com/gap-packages/hap/releases/download/v1.47/hap-1.47.tar.gz">hap1.68-dev.tar.gz</a>
29+
href="https://github.com/gap-packages/hap/releases/download/v1.47/hap-1.47.tar.gz">hap1.69-dev.tar.gz</a>
3030
instead.)<br>
3131
</li>
3232
</ul>
3333
<ul>
3434
<li>Change to directory "pkg/" and type "gunzip
35-
hap1.68.tar.gz"
35+
hap1.69.tar.gz"
3636
followed
3737
by "tar
38-
-xvf hap1.68.tar" .</li>
38+
-xvf hap1.69.tar" .</li>
3939
</ul>
4040
<ul>
4141
<li>Start GAP. (If you have created "pkg" in your home
@@ -51,7 +51,7 @@ <h3>Download Instructions</h3>
5151
<li>Help on HAP can be found on the <a
5252
href="https://gap-packages.github.io/hap/" target="index">HAP
5353
home page</a> (a version of which is included in directory
54-
"pkg/Hap1.68/www" of the distribution).</li>
54+
"pkg/Hap1.69/www" of the distribution).</li>
5555
</ul>
5656
<ul>
5757
<li>A few of HAP's (optional) functions rely on Polymake
@@ -67,7 +67,7 @@ <h3>Download Instructions</h3>
6767
<li>Performance can be improved by using a compiled
6868
version of the HAP library. The following steps will produce a compiled
6969
version. <br>
70-
(1) Change to the directory "pkg/Hap1.68/" .<br>
70+
(1) Change to the directory "pkg/Hap1.69/" .<br>
7171
(2) Edit the file "compile" so that: PKGDIR is equal to the path to the<br>
7272
directory "pkg" where your GAP packages are stored; GACDIR is equal to
7373
the<br>
@@ -78,7 +78,7 @@ <h3>Download Instructions</h3>
7878
<ul>
7979
<li>Should you want to return to an uncompiled version, change
8080
to the directory<br>
81-
"pkg/Hap1.68/" and type "./uncompile".</li>
81+
"pkg/Hap1.69/" and type "./uncompile".</li>
8282
</ul>
8383
</div>
8484
</body>

0 commit comments

Comments
 (0)