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
+
+
+