From ecb00ad685a35f2ca5815300d4a488475d06791f Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 22 Mar 2018 17:34:29 +0100 Subject: [PATCH] Turn IsInfiniteAbelianizationGroup into a property Also add some implications for it, e.g. finite groups never have infinite abelianization; all but trivial free groups do have infinite abelianization). Finally, add some tests. --- hpcgap/lib/object.gd | 7 +-- lib/grp.gd | 7 ++- lib/grpfp.gi | 4 ++ lib/object.gd | 7 +-- .../opers/IsInfiniteAbelianizationGroup.g | 49 +++++++++++++++++++ 5 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 tst/testinstall/opers/IsInfiniteAbelianizationGroup.g diff --git a/hpcgap/lib/object.gd b/hpcgap/lib/object.gd index 50acc2c6de..bdfa486fff 100644 --- a/hpcgap/lib/object.gd +++ b/hpcgap/lib/object.gd @@ -740,7 +740,8 @@ DeclareOperation( "KnownPropertiesOfObject", [ IsObject ] ); ## "IsCompletelyRegularSemigroup", "IsCompletelySimpleSemigroup", ## "IsGroupAsSemigroup", "IsMonoidAsSemigroup", "IsOrthodoxSemigroup", ## "IsFinitelyGeneratedGroup", "IsSubsetLocallyFiniteGroup", -## "KnowsHowToDecompose", "IsNilpotentByFinite" ] +## "KnowsHowToDecompose", "IsInfiniteAbelianizationGroup", +## "IsNilpotentByFinite" ] ## gap> Size(g); ## 6 ## gap> KnownPropertiesOfObject(g); @@ -753,8 +754,8 @@ DeclareOperation( "KnownPropertiesOfObject", [ IsObject ] ); ## "IsGroupAsSemigroup", "IsMonoidAsSemigroup", "IsOrthodoxSemigroup", ## "IsFinitelyGeneratedGroup", "IsSubsetLocallyFiniteGroup", ## "KnowsHowToDecompose", "IsPerfectGroup", "IsSolvableGroup", -## "IsPolycyclicGroup", "IsNilpotentByFinite", "IsTorsionFree", -## "IsFreeAbelian" ] +## "IsPolycyclicGroup", "IsInfiniteAbelianizationGroup", +## "IsNilpotentByFinite", "IsTorsionFree", "IsFreeAbelian" ] ## gap> KnownTruePropertiesOfObject(g); ## [ "IsNonTrivial", "IsFinite", "CanEasilyCompareElements", ## "CanEasilySortElements", "IsDuplicateFree", diff --git a/lib/grp.gd b/lib/grp.gd index de6dd5cdf0..602778f3f2 100644 --- a/lib/grp.gd +++ b/lib/grp.gd @@ -857,7 +857,12 @@ DeclareAttribute( "AbelianInvariants", IsGroup ); ## ## <#/GAPDoc> ## -DeclareAttribute( "IsInfiniteAbelianizationGroup", IsGroup ); +DeclareProperty( "IsInfiniteAbelianizationGroup", IsGroup ); + +# finite groups never have infinite abelianization +InstallTrueMethod( HasIsInfiniteAbelianizationGroup, IsGroup and IsFinite ); + +#InstallTrueMethod( IsInfiniteAbelianizationGroup, IsSolvableGroup and IsTorsionFree ); ############################################################################# diff --git a/lib/grpfp.gi b/lib/grpfp.gi index 99ab5f54e8..0cd53e6ec8 100644 --- a/lib/grpfp.gi +++ b/lib/grpfp.gi @@ -907,6 +907,10 @@ function(H) end); +# a free group has infinite abelianization if and only if it is non-trivial +InstallTrueMethod( IsInfiniteAbelianizationGroup, IsFreeGroup and IsNonTrivial ); +InstallTrueMethod( HasIsInfiniteAbelianizationGroup, IsFreeGroup and IsTrivial ); + ############################################################################# ## #M IsPerfectGroup( ) diff --git a/lib/object.gd b/lib/object.gd index 6b3144b35d..6269994a98 100644 --- a/lib/object.gd +++ b/lib/object.gd @@ -714,7 +714,8 @@ DeclareOperation( "KnownPropertiesOfObject", [ IsObject ] ); ## "IsCompletelyRegularSemigroup", "IsCompletelySimpleSemigroup", ## "IsGroupAsSemigroup", "IsMonoidAsSemigroup", "IsOrthodoxSemigroup", ## "IsFinitelyGeneratedGroup", "IsSubsetLocallyFiniteGroup", -## "KnowsHowToDecompose", "IsNilpotentByFinite" ] +## "KnowsHowToDecompose", "IsInfiniteAbelianizationGroup", +## "IsNilpotentByFinite" ] ## gap> Size(g); ## 6 ## gap> KnownPropertiesOfObject(g); @@ -727,8 +728,8 @@ DeclareOperation( "KnownPropertiesOfObject", [ IsObject ] ); ## "IsGroupAsSemigroup", "IsMonoidAsSemigroup", "IsOrthodoxSemigroup", ## "IsFinitelyGeneratedGroup", "IsSubsetLocallyFiniteGroup", ## "KnowsHowToDecompose", "IsPerfectGroup", "IsSolvableGroup", -## "IsPolycyclicGroup", "IsNilpotentByFinite", "IsTorsionFree", -## "IsFreeAbelian" ] +## "IsPolycyclicGroup", "IsInfiniteAbelianizationGroup", +## "IsNilpotentByFinite", "IsTorsionFree", "IsFreeAbelian" ] ## gap> KnownTruePropertiesOfObject(g); ## [ "IsNonTrivial", "IsFinite", "CanEasilyCompareElements", ## "CanEasilySortElements", "IsDuplicateFree", diff --git a/tst/testinstall/opers/IsInfiniteAbelianizationGroup.g b/tst/testinstall/opers/IsInfiniteAbelianizationGroup.g new file mode 100644 index 0000000000..7df1421606 --- /dev/null +++ b/tst/testinstall/opers/IsInfiniteAbelianizationGroup.g @@ -0,0 +1,49 @@ +gap> START_TEST("IsInfiniteAbelianizationGroup.tst"); + +# +# Finite groups never have infinite abelianization +# +gap> G:=SymmetricGroup(3);; +gap> HasIsInfiniteAbelianizationGroup(G); +true +gap> IsInfiniteAbelianizationGroup(G); +false + +# +# Free groups have infinite abelianization if and only if they are non-trivial +# +gap> G:=FreeGroup(0);; +gap> HasIsInfiniteAbelianizationGroup(G); +true +gap> IsInfiniteAbelianizationGroup(G); +false + +# +gap> G:=FreeGroup(2);; +gap> HasIsInfiniteAbelianizationGroup(G); +true +gap> IsInfiniteAbelianizationGroup(G); +true + +# +gap> G:=TrivialSubgroup(G);; +gap> HasIsInfiniteAbelianizationGroup(G); +true +gap> IsInfiniteAbelianizationGroup(G); +false + +# +# for fp groups, more work is needed +# +gap> F:=FreeGroup(2);; +gap> H:=F/[F.1^2,F.2^2];; IsInfiniteAbelianizationGroup(H); +false +gap> H:=F/[F.1^2];; IsInfiniteAbelianizationGroup(H); +true +gap> H:=F/[F.1^2,F.2^2,Comm(F.1,F.2)];; IsInfiniteAbelianizationGroup(H); +false +gap> K:=Subgroup(H, [H.1, H.2^2]);; IsInfiniteAbelianizationGroup(K); +false + +# +gap> STOP_TEST("IsInfiniteAbelianizationGroup.tst", 1);