Discussion:
[GAP Forum] Question about SubdirectProduct
German Combariza
2018-07-24 03:23:43 UTC
Permalink
Dear all,

I am having problems with the function SubdirectProduct. Looks like GAP does not recognize the SubdirectProduct as a subgroup of the DirectProduct, but It does for small groups.

Example:

s4 := Group((1,2,3,4),(1,2));;
list := AllSmallGroups(48);;
n := 48;;
g := list[n];;
hom := AllHomomorphisms(list[n], s4)[53];;
gamma := SubdirectProduct(g,g,hom,hom);;
wprod := DirectProduct(g,g);;
IsSubgroup( wprod, gamma); # This is False

However:
g := Group((1,2,3),(1,2));;
k := Group((1,2));;
hom := AllHomomorphisms(g, k)[2];;
gamma := SubdirectProduct(g,g,hom,hom);;
wprod := DirectProduct(g,g);;
IsSubgroup( wprod, gamma); # This is true.

Thanks!
Piotr Jastrzębski
2018-07-24 07:37:00 UTC
Permalink
Hi,

there is some problem with function IsSubgroup when generators of
objects (eg. groups) are not expressed explicitly. In your example:

I case
gap> Display(gamma);
Group( [ f1, f2, f3, f4, f5, f6, f7, f8 ] )
gap> Display(wprod);
Group( [ f1, f2, f3, f4, f5, f6, f7, f8, f9, f10 ] )

II case
gap> Display(gamma);
Group( [ (1,2,3), (1,2)(4,5), (4,5,6) ] )
gap> Display(wprod);
Group( [ (1,2,3), (1,2), (4,5,6), (4,5) ] )


To fix it,
the function IsSubgroup should be extended with implicit generators like
f1,..., fn.

Best Regards,
Piotr




W dniu 2018-07-24 05:23, German Combariza napisał(a):
> Dear all,
>
> I am having problems with the function SubdirectProduct. Looks like
> GAP does not recognize the SubdirectProduct as a subgroup of the
> DirectProduct, but It does for small groups.
>
> Example:
>
> s4 := Group((1,2,3,4),(1,2));;
> list := AllSmallGroups(48);;
> n := 48;;
> g := list[n];;
> hom := AllHomomorphisms(list[n], s4)[53];;
> gamma := SubdirectProduct(g,g,hom,hom);;
> wprod := DirectProduct(g,g);;
> IsSubgroup( wprod, gamma); # This is False
>
> However:
> g := Group((1,2,3),(1,2));;
> k := Group((1,2));;
> hom := AllHomomorphisms(g, k)[2];;
> gamma := SubdirectProduct(g,g,hom,hom);;
> wprod := DirectProduct(g,g);;
> IsSubgroup( wprod, gamma); # This is true.
>
> Thanks!
>
>
>
>
>
>
> _______________________________________________
> Forum mailing list
> ***@gap-system.org
> https://mail.gap-system.org/mailman/listinfo/forum
Piotr Jastrzębski
2018-07-24 07:49:35 UTC
Permalink
There is also problem that in first case 'wprod' have more generators
than 'gamma'.
https://groupprops.subwiki.org/wiki/GAP:IsSubgroup
This function returns true if the second group is a subgroup of the
first.
Piotr

W dniu 2018-07-24 09:37, Piotr Jastrzębski napisał(a):
> Hi,
>
> there is some problem with function IsSubgroup when generators of
> objects (eg. groups) are not expressed explicitly. In your example:
>
> I case
> gap> Display(gamma);
> Group( [ f1, f2, f3, f4, f5, f6, f7, f8 ] )
> gap> Display(wprod);
> Group( [ f1, f2, f3, f4, f5, f6, f7, f8, f9, f10 ] )
>
> II case
> gap> Display(gamma);
> Group( [ (1,2,3), (1,2)(4,5), (4,5,6) ] )
> gap> Display(wprod);
> Group( [ (1,2,3), (1,2), (4,5,6), (4,5) ] )
>
>
> To fix it,
> the function IsSubgroup should be extended with implicit generators
> like f1,..., fn.
>
> Best Regards,
> Piotr
>
>
>
>
> W dniu 2018-07-24 05:23, German Combariza napisał(a):
>> Dear all,
>>
>> I am having problems with the function SubdirectProduct. Looks like
>> GAP does not recognize the SubdirectProduct as a subgroup of the
>> DirectProduct, but It does for small groups.
>>
>> Example:
>>
>> s4 := Group((1,2,3,4),(1,2));;
>> list := AllSmallGroups(48);;
>> n := 48;;
>> g := list[n];;
>> hom := AllHomomorphisms(list[n], s4)[53];;
>> gamma := SubdirectProduct(g,g,hom,hom);;
>> wprod := DirectProduct(g,g);;
>> IsSubgroup( wprod, gamma); # This is False
>>
>> However:
>> g := Group((1,2,3),(1,2));;
>> k := Group((1,2));;
>> hom := AllHomomorphisms(g, k)[2];;
>> gamma := SubdirectProduct(g,g,hom,hom);;
>> wprod := DirectProduct(g,g);;
>> IsSubgroup( wprod, gamma); # This is true.
>>
>> Thanks!
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> Forum mailing list
>> ***@gap-system.org
>> https://mail.gap-system.org/mailman/listinfo/forum
>
> _______________________________________________
> Forum mailing list
> ***@gap-system.org
> https://mail.gap-system.org/mailman/listinfo/forum
Hulpke,Alexander
2018-07-26 14:49:30 UTC
Permalink
Dear GAP Forum, Dear German Combariza,

I am having problems with the function SubdirectProduct. Looks like GAP does not recognize the SubdirectProduct as a subgroup of the DirectProduct, but It does for small groups.

s4 := Group((1,2,3,4),(1,2));;
list := AllSmallGroups(48);;
n := 48;;
g := list[n];;
hom := AllHomomorphisms(list[n], s4)[53];;
gamma := SubdirectProduct(g,g,hom,hom);;
wprod := DirectProduct(g,g);;
IsSubgroup( wprod, gamma); # This returns False

Let me explain what happens here and clear up the misapprehensions in prior responses.

When you construct a group product in GAP, you construct a new group (what is sometimes called an ``external direct product'' in the literature). GAP will decide internally how this product is to be represented, but in general it will be a new group that might be in a representation quite different than that of the groups one started with.

As described in the manual,
https://www.gap-system.org/Manuals/doc/ref/chap49_mj.html
the attributes stores certain homomorphisms from the factors to the product (operation `Embedding`) or from the product to the constituent factors (operation `Projection`).

When working with products on paper, there might be further homomorphisms, for example the embedding of a subdirect product in a direct product. This embedding is in fact a homomorphism, albeit one that when working on paper is not written down and assumed.
GAP will need such a homomorphism to be constructed.

An even more drastic case happens if you construct the direct product of the same two groups twice. GAP will construct two different direct products whose elements have nothing to do with each other.

Of course it is possible to construct the embedding you are interested in explicitly from the embeddings and constructions: Project from the subdirect product on both components and embed into the direct product, do so simultaneously for both factors.

gap> p1:=Projection(gamma,1);p2:=Projection(gamma,2);
[ f1, f2, f3, f4, f5, f6, f7, f8 ] -> [ f1, f2, f3, f4, f5, <identity> of ...,
<identity> of ..., <identity> of ... ]
[ f1, f2, f3, f4, f5, f6, f7, f8 ] -> [ f1*f4*f5, f2*f3^2, <identity> of ...,
<identity> of ..., <identity> of ..., f3, f4, f5 ]
gap> e1:=Embedding(wprod,1);e2:=Embedding(wprod,2);
Pcgs([ f1, f2, f3, f4, f5 ]) -> [ f1, f2, f3, f4, f5 ]
Pcgs([ f1, f2, f3, f4, f5 ]) -> [ f6, f7, f8, f9, f10 ]
gap> emb:=GroupHomomorphismByImages(gamma,wprod,GeneratorsOfGroup(gamma),
> List(GeneratorsOfGroup(gamma),x->Image(e1,Image(p1,x))*Image(e2,Image(p2,x))));
[ f1, f2, f3, f4, f5, f6, f7, f8 ] -> [ f1*f6*f9*f10, f2*f7*f8^2, f3, f4, f5, f8, f9,
f10 ]
gap> IsInjective(emb);
true
gap> Size(Image(emb));
576
gap> Index(wprod,Image(emb));
4

Now the image of `emb` will be the subdirect product as a subset of the direct product,
IsSubgroup(wprod, Image(emb));

returns `true` as desired.

The weird bit is in fact that the ``automatic'' embedding works in the case of permutation groups. This is a byproduct of the methods GAP uses for permutation groups, shifting the domain of the second group to larger points, and writing it as permutations. In this particular case thus the elements of a subdirect product can be elements of the dirct product (though that might fail if the factors are not transitive). The method I described above is the only general way.



What also should be noted (and seems to be the problem behind the wrong answers given before) is that if GAP constructs a new group as words in generators (as is done in general for solvable groups) these generators will display as f1,f2,f3,..., but there is no relation between the f1 onf one group and the f1 of another group and neither is bound to the variable f1.
You need to use (e.g.)

gens:=GeneratorsOfGroup(group);
gens[3];
to get the third generator, etc.

Hope this helps,

Alexander Hulpke

-- Colorado State University, Department of Mathematics,
Weber Building, 1874 Campus Delivery, Fort Collins, CO 80523-1874, USA
email: ***@colostate.edu<mailto:***@colostate.edu>, Phone: ++1-970-4914288
http://www.math.colostate.edu/~hulpke
Ellis, Grahamj
2018-07-26 15:58:11 UTC
Permalink
Dear Forum and Alexander,

I have a related question. Does anyone know an easy way to get around the difficulty arising in the second of the following two examples? I'm looking for a general method of embedding an element w in GxG as the element (1,w) in the direct product Gx(GxG) which I'd like to work for a range of groups G..

gap> G:=SymmetricGroup(3);;
gap> D:=DirectProduct(G,G);;
gap> gensD:=GeneratorsOfGroup(D);;
gap> DD:=DirectProduct(G,D);;
gap> DhomDD:=Embedding(DD,2);;
gap> x:=gensD[1]*gensD[2];
(2,3)
gap> y:=Image(DhomDD,x);
(5,6)
gap>
gap>
gap> G:=SpaceGroup(4,122);;
gap> D:=DirectProduct(G,G);;
gap> gensD:=GeneratorsOfGroup(D);;
gap> DD:=DirectProduct(G,D);;
gap> DhomDD:=Embedding(DD,2);;
gap> x:=gensD[1]*gensD[2];
[ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, -1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, -1, 0, 0, 0, 0, 0, 0 ],
[ 0, -1/2, 1/2, -1/2, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ]
gap> y:=Image(DhomDD,x);
Error, no method found! For debugging hints type ?Recovery from NoMethodFound
Error, no 3rd choice method found for `Enumerator' on 1 arguments called from
Enumerator( D ) at /usr/local/lib/gap4r8/lib/domain.gi:247 called from
elm in Source( map ) at /usr/local/lib/gap4r8/lib/mapping.gi:190 called from
<function "Image">( <arguments> )
called from read-eval loop at line 275 of *stdin*
you can 'quit;' to quit to outer loop, or
you can 'return;' to continue
brk>


Thanks,

Graham


School of Mathematics, Statistics & Applied Mathematics
National University of Ireland, Galway
http://hamilton.nuigalway.ie
tel: 091 493011
________________________________________
From: Hulpke,Alexander [***@colostate.edu]
Sent: Thursday, July 26, 2018 3:49 PM
To: German Combariza
Cc: ***@gap-system.org
Subject: Re: [GAP Forum] Question about SubdirectProduct

Dear GAP Forum, Dear German Combariza,

I am having problems with the function SubdirectProduct. Looks like GAP does not recognize the SubdirectProduct as a subgroup of the DirectProduct, but It does for small groups.

s4 := Group((1,2,3,4),(1,2));;
list := AllSmallGroups(48);;
n := 48;;
g := list[n];;
hom := AllHomomorphisms(list[n], s4)[53];;
gamma := SubdirectProduct(g,g,hom,hom);;
wprod := DirectProduct(g,g);;
IsSubgroup( wprod, gamma); # This returns False

Let me explain what happens here and clear up the misapprehensions in prior responses.

When you construct a group product in GAP, you construct a new group (what is sometimes called an ``external direct product'' in the literature). GAP will decide internally how this product is to be represented, but in general it will be a new group that might be in a representation quite different than that of the groups one started with.

As described in the manual,
https://www.gap-system.org/Manuals/doc/ref/chap49_mj.html
the attributes stores certain homomorphisms from the factors to the product (operation `Embedding`) or from the product to the constituent factors (operation `Projection`).

When working with products on paper, there might be further homomorphisms, for example the embedding of a subdirect product in a direct product. This embedding is in fact a homomorphism, albeit one that when working on paper is not written down and assumed.
GAP will need such a homomorphism to be constructed.

An even more drastic case happens if you construct the direct product of the same two groups twice. GAP will construct two different direct products whose elements have nothing to do with each other.

Of course it is possible to construct the embedding you are interested in explicitly from the embeddings and constructions: Project from the subdirect product on both components and embed into the direct product, do so simultaneously for both factors.

gap> p1:=Projection(gamma,1);p2:=Projection(gamma,2);
[ f1, f2, f3, f4, f5, f6, f7, f8 ] -> [ f1, f2, f3, f4, f5, <identity> of ...,
<identity> of ..., <identity> of ... ]
[ f1, f2, f3, f4, f5, f6, f7, f8 ] -> [ f1*f4*f5, f2*f3^2, <identity> of ...,
<identity> of ..., <identity> of ..., f3, f4, f5 ]
gap> e1:=Embedding(wprod,1);e2:=Embedding(wprod,2);
Pcgs([ f1, f2, f3, f4, f5 ]) -> [ f1, f2, f3, f4, f5 ]
Pcgs([ f1, f2, f3, f4, f5 ]) -> [ f6, f7, f8, f9, f10 ]
gap> emb:=GroupHomomorphismByImages(gamma,wprod,GeneratorsOfGroup(gamma),
> List(GeneratorsOfGroup(gamma),x->Image(e1,Image(p1,x))*Image(e2,Image(p2,x))));
[ f1, f2, f3, f4, f5, f6, f7, f8 ] -> [ f1*f6*f9*f10, f2*f7*f8^2, f3, f4, f5, f8, f9,
f10 ]
gap> IsInjective(emb);
true
gap> Size(Image(emb));
576
gap> Index(wprod,Image(emb));
4

Now the image of `emb` will be the subdirect product as a subset of the direct product,
IsSubgroup(wprod, Image(emb));

returns `true` as desired.

The weird bit is in fact that the ``automatic'' embedding works in the case of permutation groups. This is a byproduct of the methods GAP uses for permutation groups, shifting the domain of the second group to larger points, and writing it as permutations. In this particular case thus the elements of a subdirect product can be elements of the dirct product (though that might fail if the factors are not transitive). The method I described above is the only general way.



What also should be noted (and seems to be the problem behind the wrong answers given before) is that if GAP constructs a new group as words in generators (as is done in general for solvable groups) these generators will display as f1,f2,f3,..., but there is no relation between the f1 onf one group and the f1 of another group and neither is bound to the variable f1.
You need to use (e.g.)

gens:=GeneratorsOfGroup(group);
gens[3];
to get the third generator, etc.

Hope this helps,

Alexander Hulpke

-- Colorado State University, Department of Mathematics,
Weber Building, 1874 Campus Delivery, Fort Collins, CO 80523-1874, USA
email: ***@colostate.edu<mailto:***@colostate.edu>, Phone: ++1-970-4914288
http://www.math.colostate.edu/~hulpke
Ellis, Grahamj
2018-07-26 16:56:26 UTC
Permalink
Perfect. Thanks for the speedy reply and easy solution.

All the best,

Graham




________________________________________
From: Hulpke,Alexander [***@colostate.edu]
Sent: Thursday, July 26, 2018 5:45 PM
To: Ellis, Grahamj; ***@gap-system.org
Subject: Re: [GAP Forum] Question about SubdirectProduct

Dear Forum, Dear Graham,

The problem you run into is the conjunction of forced tests to ensure that input is correct, and the fact that D (as an infinite matrix group) does not seem to have a membership test for arbitrary integral matrices implemented. (G probably has, but that is not carried through with the standard direct product construction.)

This is a problem that arises more generakky for larger matrix groups, and for which we do not have a universally satisfactory solution. (Other systems e.g. get around this issue by forcefully casting matrices or parmutations into a particular group and then take this as assured membership. With permutation groups we were able to avoid any such casting, for matrix groups the problem is still open.

By far the easiest way around the problem thus is to not use `Image` (which does extensive tests on the input to establish that the second argument is indeed a matrix in the group, and not a list of objects to be mapped, etc.), but `ImagesRepresentative`, which is more trusting of user input:

ImagesRepresentative(DhomDD,x);

works (at least on my computer). I have done similarly in other code for matrix groups, e.g. in the matgrp package.

Hope this helps,

Alexander

On Jul 26, 2018, at 9:58 AM, Ellis, Grahamj <***@nuigalway.ie<mailto:***@nuigalway.ie>> wrote:

Dear Forum and Alexander,

I have a related question. Does anyone know an easy way to get around the difficulty arising in the second of the following two examples? I'm looking for a general method of embedding an element w in GxG as the element (1,w) in the direct product Gx(GxG) which I'd like to work for a range of groups G..

gap> G:=SymmetricGroup(3);;
gap> D:=DirectProduct(G,G);;
gap> gensD:=GeneratorsOfGroup(D);;
gap> DD:=DirectProduct(G,D);;
gap> DhomDD:=Embedding(DD,2);;
gap> x:=gensD[1]*gensD[2];
(2,3)
gap> y:=Image(DhomDD,x);
(5,6)
gap>
gap>
gap> G:=SpaceGroup(4,122);;
gap> D:=DirectProduct(G,G);;
gap> gensD:=GeneratorsOfGroup(D);;
gap> DD:=DirectProduct(G,D);;
gap> DhomDD:=Embedding(DD,2);;
gap> x:=gensD[1]*gensD[2];
[ [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, -1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, -1, 0, 0, 0, 0, 0, 0 ],
[ 0, -1/2, 1/2, -1/2, 1, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] ]
gap> y:=Image(DhomDD,x);
Error, no method found! For debugging hints type ?Recovery from NoMethodFound
Error, no 3rd choice method found for `Enumerator' on 1 arguments called from
Enumerator( D ) at /usr/local/lib/gap4r8/lib/domain.gi:247 called from
elm in Source( map ) at /usr/local/lib/gap4r8/lib/mapping.gi:190 called from
<function "Image">( <arguments> )
called from read-eval loop at line 275 of *stdin*
you can 'quit;' to quit to outer loop, or
you can 'return;' to continue
brk>


Thanks,

Graham


School of Mathematics, Statistics & Applied Mathematics
National University of Ireland, Galway
http://hamilton.nuigalway.ie<http://hamilton.nuigalway.ie/>
tel: 091 493011
________________________________________
From: Hulpke,Alexander [***@colostate.edu<mailto:***@colostate.edu>]
Sent: Thursday, July 26, 2018 3:49 PM
To: German Combariza
Cc: ***@gap-system.org<mailto:***@gap-system.org>
Subject: Re: [GAP Forum] Question about SubdirectProduct

Dear GAP Forum, Dear German Combariza,

I am having problems with the function SubdirectProduct. Looks like GAP does not recognize the SubdirectProduct as a subgroup of the DirectProduct, but It does for small groups.

s4 := Group((1,2,3,4),(1,2));;
list := AllSmallGroups(48);;
n := 48;;
g := list[n];;
hom := AllHomomorphisms(list[n], s4)[53];;
gamma := SubdirectProduct(g,g,hom,hom);;
wprod := DirectProduct(g,g);;
IsSubgroup( wprod, gamma); # This returns False

Let me explain what happens here and clear up the misapprehensions in prior responses.

When you construct a group product in GAP, you construct a new group (what is sometimes called an ``external direct product'' in the literature). GAP will decide internally how this product is to be represented, but in general it will be a new group that might be in a representation quite different than that of the groups one started with.

As described in the manual,
https://www.gap-system.org/Manuals/doc/ref/chap49_mj.html
the attributes stores certain homomorphisms from the factors to the product (operation `Embedding`) or from the product to the constituent factors (operation `Projection`).

When working with products on paper, there might be further homomorphisms, for example the embedding of a subdirect product in a direct product. This embedding is in fact a homomorphism, albeit one that when working on paper is not written down and assumed.
GAP will need such a homomorphism to be constructed.

An even more drastic case happens if you construct the direct product of the same two groups twice. GAP will construct two different direct products whose elements have nothing to do with each other.

Of course it is possible to construct the embedding you are interested in explicitly from the embeddings and constructions: Project from the subdirect product on both components and embed into the direct product, do so simultaneously for both factors.

gap> p1:=Projection(gamma,1);p2:=Projection(gamma,2);
[ f1, f2, f3, f4, f5, f6, f7, f8 ] -> [ f1, f2, f3, f4, f5, <identity> of ...,
<identity> of ..., <identity> of ... ]
[ f1, f2, f3, f4, f5, f6, f7, f8 ] -> [ f1*f4*f5, f2*f3^2, <identity> of ...,
<identity> of ..., <identity> of ..., f3, f4, f5 ]
gap> e1:=Embedding(wprod,1);e2:=Embedding(wprod,2);
Pcgs([ f1, f2, f3, f4, f5 ]) -> [ f1, f2, f3, f4, f5 ]
Pcgs([ f1, f2, f3, f4, f5 ]) -> [ f6, f7, f8, f9, f10 ]
gap> emb:=GroupHomomorphismByImages(gamma,wprod,GeneratorsOfGroup(gamma),
List(GeneratorsOfGroup(gamma),x->Image(e1,Image(p1,x))*Image(e2,Image(p2,x))));
[ f1, f2, f3, f4, f5, f6, f7, f8 ] -> [ f1*f6*f9*f10, f2*f7*f8^2, f3, f4, f5, f8, f9,
f10 ]
gap> IsInjective(emb);
true
gap> Size(Image(emb));
576
gap> Index(wprod,Image(emb));
4

Now the image of `emb` will be the subdirect product as a subset of the direct product,
IsSubgroup(wprod, Image(emb));

returns `true` as desired.

The weird bit is in fact that the ``automatic'' embedding works in the case of permutation groups. This is a byproduct of the methods GAP uses for permutation groups, shifting the domain of the second group to larger points, and writing it as permutations. In this particular case thus the elements of a subdirect product can be elements of the dirct product (though that might fail if the factors are not transitive). The method I described above is the only general way.



What also should be noted (and seems to be the problem behind the wrong answers given before) is that if GAP constructs a new group as words in generators (as is done in general for solvable groups) these generators will display as f1,f2,f3,..., but there is no relation between the f1 onf one group and the f1 of another group and neither is bound to the variable f1.
You need to use (e.g.)

gens:=GeneratorsOfGroup(group);
gens[3];
to get the third generator, etc.

Hope this helps,

Alexander Hulpke

-- Colorado State University, Department of Mathematics,
Weber Building, 1874 Campus Delivery, Fort Collins, CO 80523-1874, USA
email: ***@colostate.edu<mailto:***@colostate.edu><mailto:***@colostate.edu>, Phone: ++1-970-4914288
http://www.math.colostate.edu/~hulpke
Loading...