diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b7ea465 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/bin/* +Makefile diff --git a/Makefile.in b/Makefile.in index dd4ce9e..dc112a3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -9,6 +9,7 @@ default: bin/$(GAPARCH)/smallcancellation bin/$(GAPARCH)/smallcancellation: src/smallcancellation.cpp mkdir -p bin/$(GAPARCH) $(CC) -O2 -o bin/$(GAPARCH)/smallcancellation src/smallcancellation.cpp + $(CC) -Wall -o bin/$(GAPARCH)/tauexternal src/tauexternal.cpp -O3 -fopenmp clean: rm -rf bin diff --git a/PackageInfo.g b/PackageInfo.g index 7b5b271..d48beaa 100644 --- a/PackageInfo.g +++ b/PackageInfo.g @@ -13,9 +13,9 @@ PackageName := "SmallCancellation", Subtitle := "SmallCancellation/metric and nonmetric conditions", -Version := "1.0.3", +Version := "1.0.4", -Date := "04/03/2019", +Date := "24/06/2020", PackageWWWHome := Concatenation( "https://github.com/isadofschi/", LowercaseString( ~.PackageName ) ), diff --git a/README.md b/README.md index 1691e1e..f535827 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ * Website: https://github.com/isadofschi/smallcancellation * Repository: https://github.com/isadofschi/smallcancellation +* Documentation: http://mate.dm.uba.ar/~isadofschi/smallcancellation Metric and nonmetric small cancellation conditions. diff --git a/doc/SmallCancellation.bib b/doc/SmallCancellation.bib index 6379d3d..709706c 100644 --- a/doc/SmallCancellation.bib +++ b/doc/SmallCancellation.bib @@ -20,3 +20,10 @@ @article{Trie YEAR = "2019", URL = "https://en.wikipedia.org/wiki/Trie" } + +@article{BMSC20, + AUTHOR = {Blufstein, M. A. and Minian, E. G. and Sadofschi Costa, I.}, + TITLE = {Generalized small cancellation conditions, non-positive curvature and diagrammatic reducibility}, + JOURNAL = {Preprint}, + YEAR = "2020", +} diff --git a/doc/chapters.autodoc b/doc/chapters.autodoc index 34d1d48..92c55c2 100644 --- a/doc/chapters.autodoc +++ b/doc/chapters.autodoc @@ -1,12 +1,19 @@ -@Chapter Installing and Loading the SmallCancellation Package -@Section Compiling Binaries of the SmallCancellation Package -@Section Loading the SmallCancellation Package - -@Chapter Small Cancellation Theory +@Chapter Small Cancellation Theory: the classical conditions @Section Introduction @Section Pieces @Section Metric small cancellation conditions @Section Non-metric small cancellation conditions -@Section Additional functions @Section Implementation details +@Chapter More small cancellation conditions +@Section Condition Tau' + +@Chapter Additional functions +@Section Additional functions + + + +@Chapter Installing and Loading the SmallCancellation Package +@Section Compiling Binaries of the SmallCancellation Package +@Section Loading the SmallCancellation Package + diff --git a/init.g b/init.g index 392c62c..44e180e 100644 --- a/init.g +++ b/init.g @@ -11,5 +11,6 @@ ReadPackage( "smallcancellation", "lib/smallcancellation_internal.gd" ); ReadPackage( "smallcancellation", "lib/smallcancellation_external.gd" ); ReadPackage( "smallcancellation", "lib/smallcancellation.gd" ); +ReadPackage( "smallcancellation", "lib/tau.gd" ); #E init.g . . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here diff --git a/lib/smallcancellation.gd b/lib/smallcancellation.gd index 8a07a28..e3caaaf 100644 --- a/lib/smallcancellation.gd +++ b/lib/smallcancellation.gd @@ -3,11 +3,11 @@ ## smallcancellation.gd SmallCancellation Package Iván Sadofschi Costa ## -#! @Chapter Small Cancellation Theory +#! @Chapter Small Cancellation Theory: the classical conditions #! @Section Introduction -#! A standard reference for Small Cancellation Theory is Lyndon-Schupp . We review here some definitions and results.

+#! The standard reference for Small Cancellation Theory is Lyndon-Schupp . We review here some definitions and results.

#! A subset R of a free group F is called symmetrized if all elements of R are cyclically reduced and for each r in R all cyclically reduced conjugates of r and r^{-1} are also in R. If the set R is not symmetrized we may work instead with the symmetrization R^* of R (the smallest symmetrized set containing R).

@@ -31,6 +31,8 @@ #! Relators and their prefixes are stored in a data structure called trie . #! This provides an efficient way to write a word as a product of pieces using the minimum possible number of pieces. + +#! @Chapter Small Cancellation Theory: the classical conditions #! @Section Pieces DeclareGlobalFunction("WordRotations"); @@ -118,7 +120,7 @@ DeclareGlobalFunction("GroupSatisfiesT"); DeclareGlobalFunction("PresentationSatisfiesT"); - +#! @Chapter Additional functions #! @Section Additional functions #! @Arguments A diff --git a/lib/smallcancellation_external.gd b/lib/smallcancellation_external.gd index c5260ce..9c86ca1 100644 --- a/lib/smallcancellation_external.gd +++ b/lib/smallcancellation_external.gd @@ -19,4 +19,3 @@ DeclareGlobalFunction("GroupSatisfiesCPrimeExternal"); DeclareGlobalFunction("GetBoolFromOutput"); - diff --git a/lib/smallcancellation_external.gi b/lib/smallcancellation_external.gi index 559a404..ba64605 100644 --- a/lib/smallcancellation_external.gi +++ b/lib/smallcancellation_external.gi @@ -44,6 +44,8 @@ InstallGlobalFunction( CallExternalSmallCancellationProgram, function(G, order) f:=IO_File(filename_out,"r"); output:=IO_ReadLines(f); IO_Close(f); + Exec(Concatenation("rm ",filename_in)); + Exec(Concatenation("rm ",filename_out)); return output; end ); diff --git a/lib/tau.gd b/lib/tau.gd new file mode 100644 index 0000000..a7ba12f --- /dev/null +++ b/lib/tau.gd @@ -0,0 +1,27 @@ +######################################################################################## +## +## ttilde.gd SmallCancellation Package Iván Sadofschi Costa +## + +#! @Chapter More small cancellation conditions +#! @Section Condition Tau' + +#! Condition $\mathcal{T}'$ was introduced in . +#! We give here the definition in terms of van Kampen diagrams. +#! If $v$ is an interior vertex in a reduced diagram $D$, let $$d'_F(v)=\sum_{c\in v} \frac{\ell_1(c)+\ell_2(c)}{\ell_r(c)}$$ where the sum is over all corners at $v$, $\ell_r(c)$ is the length of the relator corresponding to the corner $c$ and $\ell_i(c)$ are the lenghts of the words written in the edges of the corner. +#! A presentation $P$ satisfies $\mathcal{T}'$ if $2\leq d(v)-d'_F(v)$ for every interior vertex $v$ in every reduced diagram $D$ over $P$. +#! If this inequality is strict we say that the presentation satisfies condition $\mathcal{T}'_{<}$. +#! $$ $$ +#! If $P$ is a finite presentations satisfying $\mathcal{T}'_{<}-C(3)$ then the group presented by $P$ is hyperbolic . +#! A presentation without proper powers which satisfies condition $\mathcal{T}'$ is diagrammatically reducible (DR) . +#! If $P$ satisfies $\mathcal{T'}-C'(\frac{1}{2})$ and the defining relators have the same length then $P$ satisfies a quadratic isoperimetric inequality and if in addition $P$ is finite, it has solvable conjugacy problem . + +#! @Arguments G +#! @Description Given an FpGroup G gives the minimum of $d(v)-d'_F(v)$. +#! Thus if the function returns a number greater than or equal to $2$ the group presentation satisfies $\mathcal{T}'$ and if the number is greater than $2$ it satisfies $\mathcal{T}'_{<}$. +#! This function implements the algorithm in . +#! For the moment the computation is done numerically using floating point numbers (this may be modified in a future version to do the computation exactly with rational numbers). External binaries need to be compiled. +#! @BeginExampleSession +#! @EndExampleSession +DeclareGlobalFunction("GroupSatisfiesTauPrime"); + diff --git a/lib/tau.gi b/lib/tau.gi new file mode 100644 index 0000000..c67f4ac --- /dev/null +++ b/lib/tau.gi @@ -0,0 +1,123 @@ +######################################################################################## +## +## ttilde.gi SmallCancellation Package Iván Sadofschi Costa +## + +SaveGraphToFile:=function(n,edges,filename) + # n is the number of vertices + # vertices are numbered from 1 to n + # each edge in edges is represented as a list [source, target, cost] + local m,f,e; + m:=Length(edges); + f := IO_File(filename,"w"); + IO_Write(f, n); + IO_Write(f, " "); + IO_Write(f, m); + IO_Write(f, "\n"); + for e in edges do + IO_Write(f, e[1]); IO_Write(f, " "); IO_Write(f, e[2]); IO_Write(f, " "); IO_Write(f, e[3]); IO_Write(f, "\n"); + od; + IO_Flush(f); + IO_Close(f); +end;; + +ReadFloat:=function(filename) + local file,f; + file := IO_File(filename,"r"); + f := Float(Chomp(IO_ReadLine(file))); + IO_Close(file); + return f; +end;; + + +InstallGlobalFunction(GroupSatisfiesTauPrime, function(G) + # Esta funcion da el minimo de d-dtilde para el grupo G + # el grupo cumple TTilde si devuelve >=2 + local P,R_star,vertices,T,isPiece, + d_pieces,d_relations,d_vertices, + n_pieces,n_relations,n_vertices, + p,q,r,l,i,i0,i1,j,j0,j1,j2,j0rot,k,v,s,t, + ocurrences, + trick_k,M1,n_vertices_1, + e,edges,M,INF,girth, + next, + filename_in,filename_out,tmpdir,tTildeProgram,result; + + R_star:=SymmetrizedRelationSet(G); + n_relations:= Length(R_star); + T:=TrieOfPieces(G);; + isPiece:=T[4];; + P:=PiecesOfGroup(G); + n_pieces := Length(P); + INF := 10000; + if n_pieces = 0 then # no pieces, we return INF + Print("# The presentation has no pieces.\n"); + return INF; + fi; + d_pieces:=NewDictionary(P[1],true); + for i in [1..n_pieces] do + AddDictionary(d_pieces,P[i],i); + od; + d_relations:=NewDictionary(R_star[1],true); + for j in [1..n_relations] do + AddDictionary(d_relations,R_star[j],j); + od; + ocurrences:=List([1..n_pieces], j-> []); + for j in [1..n_relations] do + r:=R_star[j]; + for t in [1..Length(r)] do + p:=Subword(r,1,t); + if isPiece(LetterRepAssocWord(p)) then + Add(ocurrences[LookupDictionary(d_pieces,p)],j); + fi; + od; + od; + edges:=[]; + for r in R_star do + l:=Length(r); + j0:=LookupDictionary(d_relations,r); + for s in [1..l] do + p:=Subword(r,1,s); + if isPiece(LetterRepAssocWord(p)) then + i0:=LookupDictionary(d_pieces,p); + for t in [1..l-s] do + q:=Subword(r,s+1,s+t); + if isPiece(LetterRepAssocWord(q)) then + i1:=LookupDictionary(d_pieces,q^-1); + j0rot:=LookupDictionary(d_relations, (p*q)^-1*r^-1*(p*q)); + for j1 in ocurrences[LookupDictionary(d_pieces,q^-1)] do + if j1<>j0rot then + Add(edges, [ + [j0,i0], + [j1,i1], + 1-((Length(p)+Length(q))/l) ]); + fi; + od; + fi; + od; + fi; + od; + od; + vertices := Set( Concatenation(List(edges, e->e[1]), List(edges,e->e[2]))); + d_vertices:=NewDictionary(vertices[1],true); + n_vertices:=Length(vertices); + for i in [1..n_vertices] do + AddDictionary(d_vertices,vertices[i],i); + od; + # por ahora no nos preocupamos por el error numerico + edges:=List(edges, e-> [ LookupDictionary(d_vertices,e[1]), LookupDictionary(d_vertices,e[2]), Float(e[3]) ] ); + + tTildeProgram := Filename(DirectoriesPackagePrograms("smallcancellation"), "tauexternal"); + + tmpdir := DirectoryTemporary();; + filename_in:=Filename( tmpdir , "tmpIn" ); + filename_out:=Filename( tmpdir , "tmpOut" ); + + SaveGraphToFile(n_vertices,edges,filename_in); + Exec(Concatenation(tTildeProgram," ", filename_in , " " , filename_out)); + result:= ReadFloat(filename_out); + Exec(Concatenation("rm ",filename_in)); + Exec(Concatenation("rm ",filename_out)); + + return result; +end ); diff --git a/read.g b/read.g index 9ad0178..7e657fb 100644 --- a/read.g +++ b/read.g @@ -11,5 +11,6 @@ ReadPackage( "smallcancellation", "lib/smallcancellation_internal.gi" ); ReadPackage( "smallcancellation", "lib/smallcancellation_external.gi" ); ReadPackage( "smallcancellation", "lib/smallcancellation.gi" ); +ReadPackage( "smallcancellation", "lib/tau.gi" ); #E read.g . . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here diff --git a/src/tauexternal.cpp b/src/tauexternal.cpp new file mode 100644 index 0000000..6a869af --- /dev/null +++ b/src/tauexternal.cpp @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include + +using namespace std; + +#define forn(i,n) for(int i =0 ; i < (int)(n);i++) +#define forall(i,c) for(typeof((c).begin()) i = (c).begin();i != (c).end();i++) + +typedef double cost; +typedef vector vi; +typedef pair edge; +typedef vector< vector > Graph; + +#define INF 10000.0 + +vector dijkstra(Graph & g, int source, int target = -1){ + vector D(g.size(),INF); + D[source] = 0; + set pq; + pq.insert(make_pair(D[source],source)); + while(!pq.empty()){ + edge p = *pq.begin(); + int u = p.second; + pq.erase(pq.begin()); + if(u == target) + return D; + forall(it,g[u]){ + cost c = it->first; + int v = it->second; + if(D[v] > D[u]+c){ + if(D[v] != INF){ + pq.erase(make_pair(D[v],v)); + } + D[v] = D[u] + c; + pq.insert(make_pair(D[v],v)); + } + } + } + return D; +} + +Graph read_graph(char* filename){ + int n,m; + FILE* F = freopen(filename,"r", stdin); + int ok = 1; + ok &= scanf("%d", &n); + Graph g(n); + ok &= scanf("%d", &m); + forn(i,m){ + int v,w; + cost c; + ok &= scanf("%d",&v); + ok &= scanf("%d",&w); + ok &= scanf("%lf",&c); + edge e = make_pair(c,w-1); + g[v-1].push_back(e); + } + fclose(F); + if(not (ok==1)) cerr << "Error reading graph"< > g1 ( k1*n ); + forn(v,n){ + forall(it,g[v]){ + edge e = *it; + cost c = e.first; + int w = e.second; + forn(i,k){ + g1[ code(v,i,k1) ].push_back( make_pair(c, code(w,i+1,k1))); + } + g1[ code(v,k,k1) ].push_back( make_pair(c, code(w,k,k1))); + } + } + return g1; +} + +cost shortest_cycle(Graph &g, int k){ + // returns the minimum cost of a cycle in g having length at least k + // (for k=1 this is the girth of g) + int n = g.size(); + Graph g1 = trick(g, k); + int k1 = k+1; + vector girths(n); + #pragma omp parallel for + forn(v,n){ + int vs = code(v,0,k1); + int vt =code(v,k,k1); + girths[v] = dijkstra(g1,vs,vt)[vt]; + } + double girth = INF; + forn(v,n) + girth = min(girth,girths[v]); + return girth; +} + +int main(int argc, char *argv[]){ + char* filename_in =argv[1]; + char* filename_out =argv[2]; + Graph g = read_graph( filename_in); + cost girth = shortest_cycle(g, 3); + FILE * F = freopen(filename_out, "w", stdout); + cout << girth << endl; + fclose(F); + return 0; +} diff --git a/tst/tests/test1.tst b/tst/tests/classical/test1.tst similarity index 100% rename from tst/tests/test1.tst rename to tst/tests/classical/test1.tst diff --git a/tst/tests/test10.tst b/tst/tests/classical/test10.tst similarity index 100% rename from tst/tests/test10.tst rename to tst/tests/classical/test10.tst diff --git a/tst/tests/test11.tst b/tst/tests/classical/test11.tst similarity index 100% rename from tst/tests/test11.tst rename to tst/tests/classical/test11.tst diff --git a/tst/tests/test12.tst b/tst/tests/classical/test12.tst similarity index 100% rename from tst/tests/test12.tst rename to tst/tests/classical/test12.tst diff --git a/tst/tests/test13.tst b/tst/tests/classical/test13.tst similarity index 100% rename from tst/tests/test13.tst rename to tst/tests/classical/test13.tst diff --git a/tst/tests/test2.tst b/tst/tests/classical/test2.tst similarity index 100% rename from tst/tests/test2.tst rename to tst/tests/classical/test2.tst diff --git a/tst/tests/test3.tst b/tst/tests/classical/test3.tst similarity index 100% rename from tst/tests/test3.tst rename to tst/tests/classical/test3.tst diff --git a/tst/tests/test4.tst b/tst/tests/classical/test4.tst similarity index 100% rename from tst/tests/test4.tst rename to tst/tests/classical/test4.tst diff --git a/tst/tests/test5.tst b/tst/tests/classical/test5.tst similarity index 100% rename from tst/tests/test5.tst rename to tst/tests/classical/test5.tst diff --git a/tst/tests/test6.tst b/tst/tests/classical/test6.tst similarity index 100% rename from tst/tests/test6.tst rename to tst/tests/classical/test6.tst diff --git a/tst/tests/test7.tst b/tst/tests/classical/test7.tst similarity index 100% rename from tst/tests/test7.tst rename to tst/tests/classical/test7.tst diff --git a/tst/tests/test8.tst b/tst/tests/classical/test8.tst similarity index 100% rename from tst/tests/test8.tst rename to tst/tests/classical/test8.tst diff --git a/tst/tests/test9.tst b/tst/tests/classical/test9.tst similarity index 100% rename from tst/tests/test9.tst rename to tst/tests/classical/test9.tst diff --git a/tst/tests/tau/test1.tst b/tst/tests/tau/test1.tst new file mode 100644 index 0000000..e8c6536 --- /dev/null +++ b/tst/tests/tau/test1.tst @@ -0,0 +1,10 @@ +# Example 1 +# Artin group, triangle with sides (8,6,infty) +gap> F:=FreeGroup("x","y","z"); + +gap> x:=F.1;;y:=F.2;;z:=F.3;; +gap> R:=[(x*y)^4*(y*x)^-4, (x*z)^3*(z*x)^-3];; +gap> G:=F/R;; +gap> GroupSatisfiesTauPrime(G); +2. + diff --git a/tst/tests/tau/test10.tst b/tst/tests/tau/test10.tst new file mode 100644 index 0000000..a2c8e28 --- /dev/null +++ b/tst/tests/tau/test10.tst @@ -0,0 +1,18 @@ +# Example 10 +# A relator from the presentation C in "Groups With Two Generators Having Unsolvable Word Problem and Presentations of Mihailova Subgroups" +# by Wang, Li, Yang and Lin +# Comm. Algebra, 2016 + +# This presentation has too many pieces! +gap> F:=FreeGroup("u","t");; +gap> u:=F.1;;t:=F.2;; +gap> R:=[ +> # rel 1 +> ( (t^-2*u^-7*t*u*t^-1*u^7*t^2*u^-7*t^-1*u^-1*t*u^7)^10*t^-2*u^-1*t*u*t^-1*u*t^2*u^-1*t^-1*u^-1*t*u )* ( t^-2*u^-1*t*u*t^-1*u*t^2*u^-1*t^-1*u^-1*t*u*t^-2*u^-7*t*u*t^-1*u^7*t^2*u^-7*t^-1*u^-1*t*u^7 )^-1 +> ];; +gap> G := F/R;; +gap> Length(PiecesOfGroup(G)); # too many pieces to say something +24178 +gap> G:=SimplifiedFpGroup(G); # Similar to presentations C and C' + + diff --git a/tst/tests/tau/test11.tst b/tst/tests/tau/test11.tst new file mode 100644 index 0000000..9974cc0 --- /dev/null +++ b/tst/tests/tau/test11.tst @@ -0,0 +1,82 @@ +# Example 11 +# We consider some groups defined in +# "Isoperimetric inequalities and the homology of groups" +# by Baumslag, Miller and Short +# Invent. Math. (1993) + +gap> group_Gc:=function(c) +> local gens,F,rels,i,j,t; +> gens := List([1..c], x-> Concatenation("a_",String(x))); +> Add(gens,"t"); +> F:=FreeGroup(gens); +> rels := []; +> gens := GeneratorsOfGroup(F); +> t:=gens[c+1]; +> for i in [1..c] do +> for j in [i+1..c] do +> Add(rels, Comm(gens[i],gens[j])); +> od; +> od; +> for i in [1..c-1] do +> Add(rels, t^-1*gens[i]*t*(gens[i]*gens[i+1])^-1); +> od; +> Add(rels, Comm(t,gens[c])); +> return F/rels; +> end;; +gap> +gap> group_M_c_d:=function(c,d) +> # The group in Lemma 11 of [BMS93] +> local gens, gens_c,gens_d,F,rels,i,j,t,s; +> gens_c := List([1..c], x-> Concatenation("a_",String(x))); +> gens_d := List([1..d], x-> Concatenation("b_",String(x))); +> gens:=Concatenation(gens_c,gens_d,["t"],["s"]); +> F:=FreeGroup(gens); +> rels := []; +> gens:=GeneratorsOfGroup(F); +> gens_c := gens{[1..c]}; +> gens_d := gens{[c+2..c+d+1]}; +> t:=gens[c+1]; +> s:=gens[c+d+2]; +> # parte Gc +> for i in [1..c] do +> for j in [i+1..c] do +> Add(rels, Comm(gens_c[i],gens_c[j])); +> od; +> od; +> for i in [1..c-1] do +> Add(rels, t^-1*gens_c[i]*t*(gens_c[i]*gens_c[i+1])^-1); +> od; +> Add(rels, Comm(t,gens_c[c])); +> +> # parte Gd +> for i in [1..d] do +> for j in [i+1..d] do +> Add(rels, Comm(gens_d[i],gens_d[j])); +> od; +> od; +> for i in [1..d-1] do +> Add(rels, s^-1*gens_d[i]*s*(gens_d[i]*gens_d[i+1])^-1); +> od; +> Add(rels, Comm(s,gens_d[d])); +> # rels M +> Add(rels, Comm(gens_c[c],gens_d[d])); +> return F/rels; +> end;; +gap> ## M_cd has dehn n^{c+d} +gap> G:=group_M_c_d(3,4); # dehn n^7 + +gap> GroupSatisfiesTauPrime(G); +1.15 +gap> G:=group_M_c_d(4,4); # dehn n^8 + +gap> GroupSatisfiesTauPrime(G); +1.15 +gap> # Example immediately after Corollary 22 +gap> # the group has Dehn 2^n +gap> F:=FreeGroup("b","s","t"); + +gap> b:=F.1;; s:=F.2;; t:=F.3;; +gap> G:=F/[s^-1*b*s*b^-2, t^-1*b*t*b^-1]; + +gap> GroupSatisfiesTauPrime(G); +1.6 diff --git a/tst/tests/tau/test12.tst b/tst/tests/tau/test12.tst new file mode 100644 index 0000000..52a764f --- /dev/null +++ b/tst/tests/tau/test12.tst @@ -0,0 +1,60 @@ +#Example 12 +# In page 26 of +# "Isoperimetric inequalities and the homology of groups" +# by Baumslag, Miller and Short +# Invent. Math. (1993) +# it is proved that for a Baumslag-Solitar group B(p,q) with |p| \neq |q| the Dehn function is exponential. +# Thus we expect that GroupSatisfiesTauPrime is less than 2 for these groups. + +gap> BS := function(p,q) +> local a,t; +> F:=FreeGroup("a","t"); +> a:=F.1;t:=F.2; +> return F/[t*a^p*t^-1*a^-q]; +> end;; +gap> GroupSatisfiesTauPrime(BS(2,2)); +2. +gap> GroupSatisfiesTauPrime(BS(3,3)); +2. +gap> GroupSatisfiesTauPrime(BS(2,5)); +1.66667 +gap> GroupSatisfiesTauPrime(BS(2,3)); +1.85714 +gap> GroupSatisfiesTauPrime(BS(3,4)); +1.88889 +gap> GroupSatisfiesTauPrime(BS(10,11)); +1.95652 +gap> GroupSatisfiesTauPrime(BS(11,12)); +1.96 +gap> GroupSatisfiesTauPrime(BS(12,13)); +1.96296 +gap> GroupSatisfiesTauPrime(BS(13,14)); +1.96552 +gap> GroupSatisfiesTauPrime(BS(14,15)); +1.96774 +gap> GroupSatisfiesTauPrime(BS(15,16)); +1.9697 +gap> GroupSatisfiesTauPrime(BS(16,17)); +1.97143 +gap> GroupSatisfiesTauPrime(BS(17,18)); +1.97297 +gap> GroupSatisfiesTauPrime(BS(18,19)); +1.97436 +gap> GroupSatisfiesTauPrime(BS(19,20)); +1.97561 +gap> GroupSatisfiesTauPrime(BS(20,21)); +1.97674 +gap> GroupSatisfiesTauPrime(BS(21,22)); +1.97778 +gap> GroupSatisfiesTauPrime(BS(22,23)); +1.97872 +gap> GroupSatisfiesTauPrime(BS(23,24)); +1.97959 +gap> GroupSatisfiesTauPrime(BS(24,25)); +1.98039 +gap> GroupSatisfiesTauPrime(BS(25,26)); +1.98113 +gap> GroupSatisfiesTauPrime(BS(26,27)); +1.98182 +gap> GroupSatisfiesTauPrime(BS(27,28)); +1.98246 diff --git a/tst/tests/tau/test13.tst b/tst/tests/tau/test13.tst new file mode 100644 index 0000000..aebbc06 --- /dev/null +++ b/tst/tests/tau/test13.tst @@ -0,0 +1,160 @@ +gap> F:=FreeGroup(80);; + +gap> f1:=F.1;;f2:=F.2;;f3:=F.3;;f4:=F.4;;f5:=F.5;;f6:=F.6;;f7:=F.7;;f8:=F.8;;f9:=F.9;;f10:=F.10;; +> f11:=F.11;;f12:=F.12;;f13:=F.13;;f14:=F.14;;f15:=F.15;;f16:=F.16;;f17:=F.17;;f18:=F.18;;f19:=F.19;;f20:=F.20;; +> f21:=F.21;;f22:=F.22;;f23:=F.23;;f24:=F.24;;f25:=F.25;;f26:=F.26;;f27:=F.27;;f28:=F.28;;f29:=F.29;;f30:=F.30;; +> f31:=F.31;;f32:=F.32;;f33:=F.33;;f34:=F.34;;f35:=F.35;;f36:=F.36;;f37:=F.37;;f38:=F.38;;f39:=F.39;;f40:=F.40;; +> f41:=F.41;;f42:=F.42;;f43:=F.43;;f44:=F.44;;f45:=F.45;;f46:=F.46;;f47:=F.47;;f48:=F.48;;f49:=F.49;;f50:=F.50;; +> f51:=F.51;;f52:=F.52;;f53:=F.53;;f54:=F.54;;f55:=F.55;;f56:=F.56;;f57:=F.57;;f58:=F.58;;f59:=F.59;;f60:=F.60;; +> f61:=F.61;;f62:=F.62;;f63:=F.63;;f64:=F.64;;f65:=F.65;;f66:=F.66;;f67:=F.67;;f68:=F.68;;f69:=F.69;;f70:=F.70;; +> f71:=F.71;;f72:=F.72;;f73:=F.73;;f74:=F.74;;f75:=F.75;;f76:=F.76;;f77:=F.77;;f78:=F.78;;f79:=F.79;;f80:=F.80;; + + +gap> G:=F/[f42^-1*f63*f18^-1*f22*f2^-1*f12*f63^-1*f25*f76^-1, f44^-1*f40*f19^-1*f21*f4^-1*f9*f40^-1*f24*f77^-1, +> f39^-1*f65*f17^-1*f20*f6^-1*f16*f65^-1*f26*f75^-1, f52^-1*f68*f13^-1*f19*f9^-1*f12*f68^-1*f33*f78^-1, +> f57^-1*f70*f15^-1*f18*f12^-1*f16*f70^-1*f34*f79^-1, f55^-1*f69*f10^-1*f17*f16^-1*f9*f69^-1*f35*f60^-1, +> f59^-1*f47*f22^-1*f15*f16^-1*f2*f47^-1*f28*f80^-1, f62^-1*f51*f21^-1*f13*f12^-1*f4*f51^-1*f30*f58^-1, +> f61^-1*f49*f20^-1*f10*f9^-1*f6*f49^-1*f32*f54^-1, f46^-1*f53*f5^-1*f7*f6^-1*f4*f53^-1*f36*f41^-1, +> f48^-1*f72*f3^-1*f5*f4^-1*f2*f72^-1*f38*f45^-1, f50^-1*f56*f7^-1*f3*f2^-1*f6*f56^-1*f37*f43^-1, +> f11^-1*f16*f66^-1*f77*f24^-1*f65*f16^-1*f4*f21^-1, f14^-1*f9*f67^-1*f76*f25^-1*f40*f9^-1*f2*f22^-1, +> f8^-1*f12*f64^-1*f75*f26^-1*f63*f12^-1*f6*f20^-1, f14^-1*f4*f71^-1*f80*f28^-1*f53*f4^-1*f16*f15^-1, +> f11^-1*f6*f74^-1*f58*f30^-1*f56*f6^-1*f12*f13^-1, f8^-1*f2*f73^-1*f54*f32^-1*f72*f2^-1*f9*f10^-1, +> f11^-1*f2*f73^-1*f78*f33^-1*f47*f2^-1*f9*f19^-1, f14^-1*f6*f74^-1*f79*f34^-1*f49*f6^-1*f12*f18^-1, +> f8^-1*f4*f71^-1*f60*f35^-1*f51*f4^-1*f16*f17^-1, f1^-1*f12*f64^-1*f41*f36^-1*f68*f12^-1*f6*f7^-1, +> f1^-1*f9*f67^-1*f43*f37^-1*f69*f9^-1*f2*f3^-1, f1^-1*f16*f66^-1*f45*f38^-1*f70*f16^-1*f4*f5^-1, +> f59^-1*f33*f43^-1*f67*f40^-1*f65*f33^-1*f68*f60^-1, f62^-1*f35*f45^-1*f66*f65^-1*f63*f35^-1*f69*f79^-1, +> f61^-1*f34*f41^-1*f64*f63^-1*f40*f34^-1*f70*f78^-1, f44^-1*f25*f54^-1*f73*f47^-1*f53*f25^-1*f63*f45^-1, +> f42^-1*f26*f58^-1*f74*f49^-1*f72*f26^-1*f65*f43^-1, f39^-1*f24*f80^-1*f71*f51^-1*f56*f24^-1*f40*f41^-1, +> f57^-1*f38*f60^-1*f71*f53^-1*f68*f38^-1*f72*f58^-1, f52^-1*f36*f79^-1*f74*f56^-1*f69*f36^-1*f53*f54^-1, +> f55^-1*f37*f78^-1*f73*f72^-1*f70*f37^-1*f56*f80^-1, f50^-1*f30*f75^-1*f64*f68^-1*f47*f30^-1*f51*f76^-1, +> f46^-1*f28*f77^-1*f66*f70^-1*f49*f28^-1*f47*f75^-1, f48^-1*f32*f76^-1*f67*f69^-1*f51*f32^-1*f49*f77^-1, +> f52^-1*f28*f77^-1*f45*f63^-1*f24*f28^-1*f47*f73^-1, f57^-1*f32*f76^-1*f43*f65^-1*f25*f32^-1*f49*f74^-1, +> f55^-1*f30*f75^-1*f41*f40^-1*f26*f30^-1*f51*f71^-1, f42^-1*f24*f80^-1*f60*f68^-1*f28*f24^-1*f40*f67^-1, +> f44^-1*f26*f58^-1*f79*f69^-1*f30*f26^-1*f65*f66^-1, f39^-1*f25*f54^-1*f78*f70^-1*f32*f25^-1*f63*f64^-1, +> f62^-1*f37*f78^-1*f54*f53^-1*f33*f37^-1*f56*f74^-1, f59^-1*f36*f79^-1*f58*f72^-1*f34*f36^-1*f53*f71^-1, +> f61^-1*f38*f60^-1*f80*f56^-1*f35*f38^-1*f72*f73^-1, f48^-1*f34*f41^-1*f75*f47^-1*f36*f34^-1*f70*f66^-1, +> f46^-1*f33*f43^-1*f76*f51^-1*f37*f33^-1*f68*f64^-1, f50^-1*f35*f45^-1*f77*f49^-1*f38*f35^-1*f69*f67^-1, +> f27^-1*f53*f5^-1*f3*f26^-1*f25*f53^-1*f36*f10^-1, f29^-1*f56*f7^-1*f5*f25^-1*f24*f56^-1*f37*f15^-1, +> f31^-1*f72*f3^-1*f7*f24^-1*f26*f72^-1*f38*f13^-1, f23^-1*f65*f17^-1*f10*f36^-1*f33*f65^-1*f26*f3^-1, +> f23^-1*f40*f19^-1*f13*f38^-1*f34*f40^-1*f24*f7^-1, f23^-1*f63*f18^-1*f15*f37^-1*f35*f63^-1*f25*f5^-1, +> f31^-1*f49*f20^-1*f17*f33^-1*f28*f49^-1*f32*f21^-1, f27^-1*f47*f22^-1*f18*f35^-1*f30*f47^-1*f28*f20^-1, +> f29^-1*f51*f21^-1*f19*f34^-1*f32*f51^-1*f30*f22^-1, f29^-1*f69*f10^-1*f20*f28^-1*f36*f69^-1*f35*f18^-1, +> f27^-1*f68*f13^-1*f21*f32^-1*f38*f68^-1*f33*f17^-1, f31^-1*f70*f15^-1*f22*f30^-1*f37*f70^-1*f34*f19^-1];; +gap> GroupSatisfiesTauPrime(G); +2.11111 +gap> GroupSatisfiesC(G,6); +false + + +gap> G:=F/[f52*f73*f58^-1*f57^-1*f32*f4^-1*f11*f21*f53^-1, f55*f71*f54^-1*f52^-1*f28*f6^-1*f8*f20*f56^-1, +> f57*f74*f80^-1*f55^-1*f30*f2^-1*f14*f22*f72^-1, f42*f67*f79^-1*f62^-1*f37*f16^-1*f14*f15*f65^-1, +> f39*f64*f60^-1*f59^-1*f36*f9^-1*f8*f10*f40^-1, f44*f66*f78^-1*f61^-1*f38*f12^-1*f11*f13*f63^-1, +> f48*f66*f43^-1*f42^-1*f24*f6^-1*f1*f7*f49^-1, f46*f64*f45^-1*f44^-1*f26*f2^-1*f1*f3*f47^-1, +> f50*f67*f41^-1*f39^-1*f25*f4^-1*f1*f5*f51^-1, f62*f74*f77^-1*f48^-1*f34*f9^-1*f11*f19*f69^-1, +> f59*f71*f76^-1*f50^-1*f35*f12^-1*f14*f18*f68^-1, +> f61*f73*f75^-1*f46^-1*f33*f16^-1*f8*f17*f70^-1, f59*f80*f74^-1*f62^-1*f51*f25^-1*f42*f76*f53^-1, +> f61*f54*f71^-1*f59^-1*f47*f26^-1*f39*f75*f72^-1, f62*f58*f73^-1*f61^-1*f49*f24^-1*f44*f77*f56^-1, +> f44*f77*f74^-1*f57^-1*f70*f33^-1*f52*f78*f65^-1, f39*f75*f73^-1*f52^-1*f68*f35^-1*f55*f60*f63^-1, +> f42*f76*f71^-1*f55^-1*f69*f34^-1*f57*f79*f40^-1, f50*f43*f66^-1*f44^-1*f40*f36^-1*f46*f41*f69^-1, +> f46*f41*f67^-1*f42^-1*f63*f38^-1*f48*f45*f68^-1, f48*f45*f64^-1*f39^-1*f65*f37^-1*f50*f43*f70^-1, +> f57*f79*f67^-1*f50^-1*f56*f28^-1*f59*f80*f49^-1, f52*f78*f66^-1*f48^-1*f72*f30^-1*f62*f58*f47^-1, +> f55*f60*f64^-1*f46^-1*f53*f32^-1*f61*f54*f51^-1, f11*f19*f79^-1*f57^-1*f38*f63^-1*f44*f45*f12^-1, +> f8*f17*f78^-1*f52^-1*f36*f40^-1*f39*f41*f9^-1, f14*f18*f60^-1*f55^-1*f37*f65^-1*f42*f43*f16^-1, +> f14*f22*f58^-1*f62^-1*f35*f68^-1*f59*f60*f12^-1, f8*f20*f80^-1*f59^-1*f33*f70^-1*f61*f78*f16^-1, +> f11*f21*f54^-1*f61^-1*f34*f69^-1*f62*f79*f9^-1, f1*f5*f76^-1*f42^-1*f26*f47^-1*f46*f75*f2^-1, +> f1*f7*f77^-1*f44^-1*f25*f51^-1*f50*f76*f4^-1, f1*f3*f75^-1*f39^-1*f24*f49^-1*f48*f77*f6^-1, +> f11*f13*f45^-1*f48^-1*f32*f53^-1*f52*f54*f4^-1, f14*f15*f43^-1*f50^-1*f30*f72^-1*f57*f58*f2^-1, +> f8*f10*f41^-1*f46^-1*f28*f56^-1*f55*f80*f6^-1, f29*f18*f13^-1*f11^-1*f2*f26^-1*f23*f3*f30^-1, +> f27*f17*f15^-1*f14^-1*f6*f24^-1*f23*f7*f28^-1, f31*f19*f10^-1*f8^-1*f4*f25^-1*f23*f5*f32^-1, +> f31*f13*f18^-1*f14^-1*f9*f36^-1*f27*f10*f34^-1, f27*f10*f19^-1*f11^-1*f16*f37^-1*f29*f15*f33^-1, +> f29*f15*f17^-1*f8^-1*f12*f38^-1*f31*f13*f35^-1, f23*f5*f21^-1*f11^-1*f6*f28^-1*f27*f20*f24^-1, +> f23*f3*f22^-1*f14^-1*f4*f32^-1*f31*f21*f25^-1, f23*f7*f20^-1*f8^-1*f2*f30^-1*f29*f22*f26^-1, +> f29*f22*f3^-1*f1^-1*f16*f33^-1*f27*f17*f37^-1, f31*f21*f5^-1*f1^-1*f12*f35^-1*f29*f18*f38^-1, +> f27*f20*f7^-1*f1^-1*f9*f34^-1*f31*f19*f36^-1, f57*f58*f22^-1*f29^-1*f69*f40^-1*f42*f67*f34^-1, +> f52*f54*f21^-1*f31^-1*f70*f65^-1*f44*f66*f33^-1, f55*f80*f20^-1*f27^-1*f68*f63^-1*f39*f64*f35^-1, +> f62*f79*f19^-1*f31^-1*f72*f47^-1*f52*f73*f30^-1, f59*f60*f18^-1*f29^-1*f56*f49^-1*f57*f74*f28^-1, +> f61*f78*f17^-1*f27^-1*f53*f51^-1*f55*f71*f32^-1, f42*f43*f15^-1*f29^-1*f51*f53^-1*f59*f71*f25^-1, +> f44*f45*f13^-1*f31^-1*f49*f56^-1*f62*f74*f24^-1, f39*f41*f10^-1*f27^-1*f47*f72^-1*f61*f73*f26^-1, +> f48*f77*f7^-1*f23^-1*f63*f68^-1*f46*f64*f38^-1, f50*f76*f5^-1*f23^-1*f65*f70^-1*f48*f66*f37^-1, +> f46*f75*f3^-1*f23^-1*f40*f69^-1*f50*f67*f36^-1 ];; +gap> GroupSatisfiesTauPrime(G); +2.44444 +gap> GroupSatisfiesC(G,6); +false +gap> GroupSatisfiesC(G,4); +true + + + +gap> G:=F/[f13^-1*f31^-1*f34*f36^-1*f47*f72^-1*f70*f15^-1*f18, +> f10^-1*f27^-1*f33*f37^-1*f51*f53^-1*f68*f13^-1*f19, +> f15^-1*f29^-1*f35*f38^-1*f49*f56^-1*f69*f10^-1*f17, +> f18^-1*f29^-1*f30*f26^-1*f40*f69^-1*f51*f21^-1*f13, +> f17^-1*f27^-1*f28*f24^-1*f63*f68^-1*f47*f22^-1*f15, +> f19^-1*f31^-1*f32*f25^-1*f65*f70^-1*f49*f20^-1*f10, +> f3^-1*f23^-1*f25*f32^-1*f70*f65^-1*f63*f18^-1*f22, +> f5^-1*f23^-1*f24*f28^-1*f68*f63^-1*f40*f19^-1*f21, +> f7^-1*f23^-1*f26*f30^-1*f69*f40^-1*f65*f17^-1*f20, +> f21^-1*f31^-1*f38*f35^-1*f56*f49^-1*f72*f3^-1*f5, +> f22^-1*f29^-1*f37*f33^-1*f53*f51^-1*f56*f7^-1*f3, +> f20^-1*f27^-1*f36*f34^-1*f72*f47^-1*f53*f5^-1*f7, +> f43^-1*f50^-1*f69*f36^-1*f28*f56^-1*f35*f45^-1*f66, +> f41^-1*f46^-1*f68*f38^-1*f32*f53^-1*f33*f43^-1*f67, +> f45^-1*f48^-1*f70*f37^-1*f30*f72^-1*f34*f41^-1*f64, +> f54^-1*f61^-1*f72*f26^-1*f24*f49^-1*f38*f60^-1*f71, +> f80^-1*f59^-1*f53*f25^-1*f26*f47^-1*f36*f79^-1*f74, +> f58^-1*f62^-1*f56*f24^-1*f25*f51^-1*f37*f78^-1*f73, +> f75^-1*f39^-1*f63*f35^-1*f37*f65^-1*f25*f54^-1*f73, +> f77^-1*f44^-1*f65*f33^-1*f36*f40^-1*f26*f58^-1*f74, +> f76^-1*f42^-1*f40*f34^-1*f38*f63^-1*f24*f80^-1*f71, +> f60^-1*f55^-1*f51*f32^-1*f34*f69^-1*f30*f75^-1*f64, +> f79^-1*f57^-1*f49*f28^-1*f33*f70^-1*f32*f76^-1*f67, +> f78^-1*f52^-1*f47*f30^-1*f35*f68^-1*f28*f77^-1*f66, +> f66^-1*f48^-1*f49*f6^-1*f9*f34^-1*f32*f76^-1*f43, +> f64^-1*f46^-1*f47*f2^-1*f16*f33^-1*f28*f77^-1*f45, +> f67^-1*f50^-1*f51*f4^-1*f12*f35^-1*f30*f75^-1*f41, +> f71^-1*f55^-1*f56*f6^-1*f2*f30^-1*f37*f78^-1*f54, +> f73^-1*f52^-1*f53*f4^-1*f6*f28^-1*f36*f79^-1*f58, +> f74^-1*f57^-1*f72*f2^-1*f4*f32^-1*f38*f60^-1*f80, +> f64^-1*f39^-1*f40*f9^-1*f4*f25^-1*f24*f80^-1*f60, +> f67^-1*f42^-1*f65*f16^-1*f6*f24^-1*f26*f58^-1*f79, +> f66^-1*f44^-1*f63*f12^-1*f2*f26^-1*f25*f54^-1*f78, +> f73^-1*f61^-1*f70*f16^-1*f12*f38^-1*f34*f41^-1*f75, +> f74^-1*f62^-1*f69*f9^-1*f16*f37^-1*f35*f45^-1*f77, +> f71^-1*f59^-1*f68*f12^-1*f9*f36^-1*f33*f43^-1*f76, +> f7^-1*f1^-1*f4*f51^-1*f35*f12^-1*f16*f66^-1*f77, +> f5^-1*f1^-1*f2*f47^-1*f33*f16^-1*f9*f67^-1*f76, +> f3^-1*f1^-1*f6*f49^-1*f34*f9^-1*f12*f64^-1*f75, +> f20^-1*f8^-1*f16*f70^-1*f38*f12^-1*f4*f71^-1*f80, +> f22^-1*f14^-1*f12*f68^-1*f36*f9^-1*f6*f74^-1*f58, +> f21^-1*f11^-1*f9*f69^-1*f37*f16^-1*f2*f73^-1*f54, +> f17^-1*f8^-1*f9*f40^-1*f25*f4^-1*f2*f73^-1*f78, +> f19^-1*f11^-1*f12*f63^-1*f26*f2^-1*f6*f74^-1*f79, +> f18^-1*f14^-1*f16*f65^-1*f24*f6^-1*f4*f71^-1*f60, +> f10^-1*f8^-1*f6*f56^-1*f30*f2^-1*f12*f64^-1*f41, +> f15^-1*f14^-1*f2*f72^-1*f32*f4^-1*f9*f67^-1*f43, +> f13^-1*f11^-1*f4*f53^-1*f28*f6^-1*f16*f66^-1*f45, +> f76^-1*f50^-1*f37*f70^-1*f72*f30^-1*f56*f7^-1*f5, +> f77^-1*f48^-1*f38*f68^-1*f53*f32^-1*f72*f3^-1*f7, +> f75^-1*f46^-1*f36*f69^-1*f56*f28^-1*f53*f5^-1*f3, +> f78^-1*f61^-1*f32*f51^-1*f69*f34^-1*f49*f20^-1*f17, +> f79^-1*f62^-1*f30*f47^-1*f68*f35^-1*f51*f21^-1*f19, +> f60^-1*f59^-1*f28*f49^-1*f70*f33^-1*f47*f22^-1*f18, +> f80^-1*f55^-1*f35*f63^-1*f65*f37^-1*f69*f10^-1*f20, +> f58^-1*f57^-1*f34*f40^-1*f63*f38^-1*f70*f15^-1*f22, +> f54^-1*f52^-1*f33*f65^-1*f40*f36^-1*f68*f13^-1*f21, +> f41^-1*f39^-1*f26*f72^-1*f49*f24^-1*f65*f17^-1*f10, +> f45^-1*f44^-1*f24*f56^-1*f51*f25^-1*f40*f19^-1*f13, +> f43^-1*f42^-1*f25*f53^-1*f47*f26^-1*f63*f18^-1*f15]; + +gap> GroupSatisfiesTauPrime(G); +2.11111 +gap> GroupSatisfiesC(G,6); +false +gap> GroupSatisfiesC(G,4); +true +gap> GroupSatisfiesT(G,4); +false +gap> GroupSatisfiesCPrime(G,1/6); +false + diff --git a/tst/tests/tau/test14.tst b/tst/tests/tau/test14.tst new file mode 100644 index 0000000..95632b1 --- /dev/null +++ b/tst/tests/tau/test14.tst @@ -0,0 +1,42 @@ +# Example 17 +# Some cyclic presentations + +gap> F:=FreeGroup(7);; +gap> f1:=F.1;;f2:=F.2;;f3:=F.3;;f4:=F.4;;f5:=F.5;;f6:=F.6;;f7:=F.7;; +gap> G:=F/[f4*f3^-1*f2*f4^-1*f3*f2^-1*f5^-1, f5*f4^-1*f3*f5^-1*f4*f3^-1*f6^-1, f6*f5^-1*f4*f6^-1*f5*f4^-1*f7^-1, +> f7*f6^-1*f5*f7^-1*f6*f5^-1*f1^-1, f1*f7^-1*f6*f1^-1*f7*f6^-1*f2^-1, f2*f1^-1*f7*f2^-1*f1*f7^-1*f3^-1, f3*f2^-1*f1*f3^-1*f2*f1^-1*f4^-1];; +gap> GroupSatisfiesTauPrime(G); +2. +gap> GroupSatisfiesC(G,3); +true +gap> GroupSatisfiesCPrime(G,1/2); +true +gap> GroupSatisfiesT(G,4); +false +gap> GroupSatisfiesC(G,6); +false + +gap> F:=FreeGroup(5);; +gap> f1:=F.1;;f2:=F.2;;f3:=F.3;;f4:=F.4;;f5:=F.5;; +gap> G:=F/[ f3^-1*f5*f2*f1*f5^-1*f1^-1*f2^-2*f5, f4^-1*f1*f3*f2*f1^-1*f2^-1*f3^-2*f1, +> f5^-1*f2*f4*f3*f2^-1*f3^-1*f4^-2*f2, f1^-1*f3*f5*f4*f3^-1*f4^-1*f5^-2*f3, f2^-1*f4*f1*f5*f4^-1*f5^-1*f1^-2*f4 ];; +gap> GroupSatisfiesTauPrime(G); +2.11111 + +gap> G:=F/[f5^-1*f3^-1*f5*f1*f3^2*f4*f3^-1*f4^-1, f1^-1*f4^-1*f1*f2*f4^2*f5*f4^-1*f5^-1, +> f2^-1*f5^-1*f2*f3*f5^2*f1*f5^-1*f1^-1, f3^-1*f1^-1*f3*f4*f1^2*f2*f1^-1*f2^-1, +> f4^-1*f2^-1*f4*f5*f2^2*f3*f2^-1*f3^-1];; +gap> GroupSatisfiesTauPrime(G); +2.33333 + +gap> G:=F/[ f4^-1*f1^-1*f5^-1*(f4*f1)^2, f5^-1*f2^-1*f1^-1*(f5*f2)^2, +> f1^-1*f3^-1*f2^-1*(f1*f3)^2, f2^-1*f4^-1*f3^-1*(f2*f4)^2, +> f3^-1*f5^-1*f4^-1*(f3*f5)^2 ];; +gap> GroupSatisfiesTauPrime(G); +2.14286 +gap> GroupSatisfiesC(G,6); +false +gap> GroupSatisfiesT(G,4); +false + + diff --git a/tst/tests/tau/test15.tst b/tst/tests/tau/test15.tst new file mode 100644 index 0000000..c4781f8 --- /dev/null +++ b/tst/tests/tau/test15.tst @@ -0,0 +1,19 @@ +# Example 15 +gap> F:=FreeGroup("a","b");; +gap> a:=F.1;; b:=F.2;; + +gap> G:=F/[a^3*b^4*a^3*(b^4*a^3*b^4)^-1];; +gap> GroupSatisfiesTauPrime(G); +1.90476 + +gap> G:=F/[ a^3*b^4*a^3*b^4*(b^4*a^3*b^4*a^3)^-1];; +gap> GroupSatisfiesTauPrime(G); +2. +gap> GroupSatisfiesT(G,4); +false +gap> GroupSatisfiesC(G,6); +false + +gap> G:=F/[ (a^3*b^4*a^3*b^4*a^3)* (b^4*a^3*b^4*a^3*b^4)^-1 ];; +gap> GroupSatisfiesTauPrime(G); +1.94286 diff --git a/tst/tests/tau/test2.tst b/tst/tests/tau/test2.tst new file mode 100644 index 0000000..e9afd5d --- /dev/null +++ b/tst/tests/tau/test2.tst @@ -0,0 +1,10 @@ +# Example 2 +# Artin group, triangle with sides (2,3,2) +gap> F:=FreeGroup("x","y","z"); + +gap> x:=F.1;;y:=F.2;;z:=F.3;; +gap> R:=[x*y*x^-1*y^-1, x*z*x*z^-1*x^-1*z^-1, y*z*y^-1*z^-1];; +gap> G:=F/R;; +gap> GroupSatisfiesTauPrime(G); +1.66667 + diff --git a/tst/tests/tau/test3.tst b/tst/tests/tau/test3.tst new file mode 100644 index 0000000..5b142d5 --- /dev/null +++ b/tst/tests/tau/test3.tst @@ -0,0 +1,10 @@ +# Example 3 +# Artin group, triangle with sides (5,3,2) +gap> F:=FreeGroup("x","y","z"); + +gap> x:=F.1;;y:=F.2;;z:=F.3;; +gap> R:=[x*y*x*y*x*y^-1*x^-1*y^-1*x^-1*y^-1, x*z*x*z^-1*x^-1*z^-1, y*z*y^-1*z^-1];; +gap> G:=F/R;; +gap> GroupSatisfiesTauPrime(G); +1.96667 + diff --git a/tst/tests/tau/test4.tst b/tst/tests/tau/test4.tst new file mode 100644 index 0000000..0a2096f --- /dev/null +++ b/tst/tests/tau/test4.tst @@ -0,0 +1,10 @@ +# Example 4 +# Artin group, triangle with sides (5,3,3) +gap> F:=FreeGroup("x","y","z"); + +gap> x:=F.1;;y:=F.2;;z:=F.3;; +gap> R:=[x*y*x*y*x*y^-1*x^-1*y^-1*x^-1*y^-1, x*z*x*z^-1*x^-1*z^-1, y*z*y*z^-1*y^-1*z^-1];; +gap> G:=F/R;; +gap> GroupSatisfiesTauPrime(G); +2. + diff --git a/tst/tests/tau/test5.tst b/tst/tests/tau/test5.tst new file mode 100644 index 0000000..c8bf125 --- /dev/null +++ b/tst/tests/tau/test5.tst @@ -0,0 +1,10 @@ +# Example 5 +# Artin group, triangle with sides (3,3,3) +gap> F:=FreeGroup("x","y","z"); + +gap> x:=F.1;;y:=F.2;;z:=F.3;; +gap> R:=[x*y*x*y^-1*x^-1*y^-1, x*z*x*z^-1*x^-1*z^-1, y*z*y*z^-1*y^-1*z^-1];; +gap> G:=F/R;; +gap> GroupSatisfiesTauPrime(G); +2. + diff --git a/tst/tests/tau/test6.tst b/tst/tests/tau/test6.tst new file mode 100644 index 0000000..c93ee6d --- /dev/null +++ b/tst/tests/tau/test6.tst @@ -0,0 +1,11 @@ +# Example 6 +# Artin group, triangle with sides (7,6,5) +gap> F:=FreeGroup("x","y","z"); + +gap> x:=F.1;;y:=F.2;;z:=F.3;; +gap> R:=[(x*y*x*y*x*y*x)*(y*x*y*x*y*x*y)^-1,(x*z*x*z*x*z)*(z*x*z*x*z*x)^-1, (y*z*y*z*y)*(z*y*z*y*z)^-1 ];; +gap> G:=F/R;; +gap> GroupSatisfiesTauPrime(G); +2. + + diff --git a/tst/tests/tau/test7.tst b/tst/tests/tau/test7.tst new file mode 100644 index 0000000..0384e62 --- /dev/null +++ b/tst/tests/tau/test7.tst @@ -0,0 +1,21 @@ +# Example 7 +# returns 7/3 +gap> F:=FreeGroup("f46", "f48", "f50", "f59", "f61", "f62");; +gap> g:= GeneratorsOfGroup(F);; +gap> f46:=g[1];; f48:=g[2];; f50:=g[3];; f59:=g[4];; f61:=g[5];; f62:=g[6];; +gap> R:=[ f59^-1*f62^-1*f50*f46^-1*f62*f48*f59*f62*f46^-1*f61^-1*f62^-1*f48^-1*f61*f59*f50*f61*f46*f50^-1*f61^-1*f48*f50^-1, +> f48*f46^-1*f59*f48*f50^-1*f59^-1*f48^-1*f62^-1*f59^-1*f46*f61*f59*f50*f61^-1*f62^-1*f46^-1*f61^-1*f50*f48^-1*f61*f62, +> f46^-1*f61^-1*f62^-1*f46*f48^-1*f59^-1*f46*f62^-1*f50*f46^-1*f48*f50^-1*f59^-1*f61^-1*f50^-1*f62*f61*f50*f48^-1*f61*f59, +> f46*f50^-1*f62*f46*f48^-1*f62^-1*f46^-1*f61^-1*f62^-1*f50*f59*f62*f48*f59^-1*f61^-1*f50^-1*f59^-1*f48*f46^-1*f59*f61, +> f48^-1*f62^-1*f59^-1*f48*f50^-1*f61^-1*f48*f59^-1*f46*f48^-1*f50*f46^-1*f61^-1*f62^-1*f46^-1*f59*f62*f46*f50^-1*f62*f61, +> f50^-1*f59^-1*f61^-1*f50*f46^-1*f62^-1*f50*f61^-1*f48*f50^-1*f46*f48^-1*f62^-1*f59^-1*f48^-1*f61*f59*f48*f46^-1*f59*f62 ];; +gap> G := F/R;; +gap> GroupSatisfiesTauPrime(G); +2.33333 +gap> GroupSatisfiesC(G,6); +true +gap> GroupSatisfiesT(G,7); +false +gap> GroupSatisfiesT(G,4); +false + diff --git a/tst/tests/tau/test8.tst b/tst/tests/tau/test8.tst new file mode 100644 index 0000000..b9ca9e4 --- /dev/null +++ b/tst/tests/tau/test8.tst @@ -0,0 +1,49 @@ +# Example 8. +# The presentation A in "Groups With Two Generators Having Unsolvable Word Problem and Presentations of Mihailova Subgroups" +# by Wang, Li, Yang and Lin +# Comm. Algebra, 2016 + +# As expected the number is less than 2 + +gap> F:=FreeGroup(10);; +gap> c1:=F.1;;c2:=F.2;;c3:=F.3;;c4:=F.4;;c5:=F.5;;c6:=F.6;;c7:=F.7;;c8:=F.8;;c9:=F.9;;c10:=F.10;; +gap> R:=[ +> +> c1^-1*c7^10*c1*c7^-1, +> c2^-1*c7^10*c2*c7^-1, +> c3^-1*c7^10*c3*c7^-1, +> c4^-1*c7^10*c4*c7^-1, +> c5^-1*c7^10*c5*c7^-1, +> +> c1^-1*c8*c1*c8^-10, +> c2^-1*c8*c2*c8^-10, +> c3^-1*c8*c3*c8^-10, +> c4^-1*c8*c4*c8^-10, +> c5^-1*c8*c5*c8^-10, +> +> c9^-1*c1*c9*c1^-1, +> c9^-1*c2*c9*c2^-1, +> c9^-1*c3*c9*c3^-1, +> c9^-1*c4*c9*c4^-1, +> c9^-1*c5*c9*c5^-1, +> +> c10^-1*c7*c10*c7^-1, +> c10^-1*c8*c10*c8^-1, +> c6^-1*c1^-3*c10*c1^3*c6*(c1^-3*c10*c1^3)^-1, +> +> (c9^-1*c7*c1*c3*c8*c9)*(c7*c3*c1*c8)^-1, +> (c9^-1*c7^2*c1*c4*c8^2*c9)*(c7^2*c4*c1*c8^2)^-1, +> (c9^1*c7^3*c2*c3*c8^3*c9)*(c7^3*c3*c2*c8^3)^-1, +> +> (c9^-1*c7^4*c2*c4*c8^4*c9)*(c7^4*c4*c2*c8^4)^-1, +> (c9^-1*c7^5*c3*c5*c8^5*c9)*(c7^5*c5*c3*c1*c8^5)^-1, +> (c9^-1*c7^6*c4*c5*c8^6*c9)*(c7^6*c5*c4*c2*c8^6)^-1, +> +> (c9^-1*c7^7*c3*c4*c3*c8^7*c9)*(c7^7*c3*c4*c3*c5*c8^7)^-1, +> (c9^-1*c7^8*c3*c1^3*c8^8*c9)*(c7^8*c1^3*c8^8)^-1, +> (c9^-1*c7^9*c4*c1^3*c8^9*c9)*(c7^9*c1^3*c8^9)^-1 +> ];; +gap> G := F/R;; +gap> GroupSatisfiesTauPrime(G); +0.615385 + diff --git a/tst/tests/tau/test9.tst b/tst/tests/tau/test9.tst new file mode 100644 index 0000000..6ac7532 --- /dev/null +++ b/tst/tests/tau/test9.tst @@ -0,0 +1,64 @@ +# Example 9 +# The presentation B in "Groups With Two Generators Having Unsolvable Word Problem and Presentations of Mihailova Subgroups" +# by Wang, Li, Yang and Lin +# Comm. Algebra, 2016 + +# As expected the number is less than 2 (note that Presentation A is a subpresentation of Presentation B) + +gap> F:=FreeGroup("c1","c2","c3","c4","c5","c6","c7","c8","c9","c10","u","v","t");; +gap> c1:=F.1;;c2:=F.2;;c3:=F.3;;c4:=F.4;;c5:=F.5;;c6:=F.6;;c7:=F.7;;c8:=F.8;;c9:=F.9;;c10:=F.10;;u:=F.11;;v:=F.12;;t:=F.13;; +gap> R:=[ +> # +> v*(t^-1*u*t)^-1, +> (t^-1*v^-1*u*v*t)*(c1*u^-1*v*u)^-1, +> (t^-1*v^-2*u*v^2*t)*(c2*u^-2*v*u^2)^-1, +> (t^-1*v^-3*u*v^3*t)*(c3*u^-3*v*u^3)^-1, +> (t^-1*v^-4*u*v^4*t)*(c4*u^-4*v*u^4)^-1, +> (t^-1*v^-5*u*v^5*t)*(c5*u^-5*v*u^5)^-1, +> (t^-1*v^-6*u*v^6*t)*(c6*u^-6*v*u^6)^-1, +> (t^-1*v^-7*u*v^7*t)*(c7*u^-7*v*u^7)^-1, +> (t^-1*v^-8*u*v^8*t)*(c8*u^-8*v*u^8)^-1, +> (t^-1*v^-9*u*v^9*t)*(c9*u^-9*v*u^9)^-1, +> (t^-1*v^-10*u*v^10*t)*(c10*u^-10*v*u^10)^-1, +> ## Relaciones de la presentacion A +> #renglon1 +> c1^-1*c7^10*c1*c7^-1, +> c2^-1*c7^10*c2*c7^-1, +> c3^-1*c7^10*c3*c7^-1, +> c4^-1*c7^10*c4*c7^-1, +> c5^-1*c7^10*c5*c7^-1, +> #renglon2 +> c1^-1*c8*c1*c8^-10, +> c2^-1*c8*c2*c8^-10, +> c3^-1*c8*c3*c8^-10, +> c4^-1*c8*c4*c8^-10, +> c5^-1*c8*c5*c8^-10, +> #renglon3 +> c9^-1*c1*c9*c1^-1, +> c9^-1*c2*c9*c2^-1, +> c9^-1*c3*c9*c3^-1, +> c9^-1*c4*c9*c4^-1, +> c9^-1*c5*c9*c5^-1, +> #renglon4 +> c10^-1*c7*c10*c7^-1, +> c10^-1*c8*c10*c8^-1, +> c6^-1*c1^-3*c10*c1^3*c6*(c1^-3*c10*c1^3)^-1, +> #renglon5 +> (c9^-1*c7*c1*c3*c8*c9)*(c7*c3*c1*c8)^-1, +> (c9^-1*c7^2*c1*c4*c8^2*c9)*(c7^2*c4*c1*c8^2)^-1, +> (c9^1*c7^3*c2*c3*c8^3*c9)*(c7^3*c3*c2*c8^3)^-1, +> #renglon6 +> (c9^-1*c7^4*c2*c4*c8^4*c9)*(c7^4*c4*c2*c8^4)^-1, +> (c9^-1*c7^5*c3*c5*c8^5*c9)*(c7^5*c5*c3*c1*c8^5)^-1, +> (c9^-1*c7^6*c4*c5*c8^6*c9)*(c7^6*c5*c4*c2*c8^6)^-1, +> #renglon7 +> (c9^-1*c7^7*c3*c4*c3*c8^7*c9)*(c7^7*c3*c4*c3*c5*c8^7)^-1, +> (c9^-1*c7^8*c3*c1^3*c8^8*c9)*(c7^8*c1^3*c8^8)^-1, +> (c9^-1*c7^9*c4*c1^3*c8^9*c9)*(c7^9*c1^3*c8^9)^-1 +> ];; +gap> G := F/R;; +gap> GroupSatisfiesTauPrime(G); +0.615385 + + +