Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug in mapping from an iterated semidirect product? #2724

Closed
cdwensley opened this issue Aug 21, 2018 · 4 comments
Closed

Bug in mapping from an iterated semidirect product? #2724

cdwensley opened this issue Aug 21, 2018 · 4 comments
Labels
kind: bug: wrong result Issues describing bugs that result in mathematically or otherwise wrong results, and PRs fixing them kind: bug Issues describing general bugs, and PRs fixing them

Comments

@cdwensley
Copy link
Contributor

cdwensley commented Aug 21, 2018

I'm reluctant to claim that there is a bug in what must be long-established code. Perhaps someone can persuade me that there is an error in my example?
I have a mapping h between permutation groups which I expect to be a homomorphism, but GAP claims that it is not single valued. On repeating the whole construction in pc-groups, the corresponding mapping H is a homomorphism.
The groups involved are the quaternion group q8; 2 normal cyclic subgroups of order 4, c4a & c4b, and its normal cyclic subgroup of order 2, c2c. These groups all act on each other by conjugation.
The semidirect products formed are c4a:q8, c2c:c4b (a direct product) and G=(c2c:c4b):(c4a:q8).
Then h : G -> c4a:q8 is the mapping which fails to be single valued, but the corresponding pc-group mapping H : PCG -> C4A:Q8 is a homomorphism.
The attached example file q8.txt (GitHub objected to q8.g) is rather lengthy. The first part constructs the permutation groups; the second part the pc-groups; and the third part contains some isomorphisms between these. The mapping G -> PCG also fails to be an isomorphism.
My tentative conclusion is that there is a problem in the construction of G: I've tried to trace this but baulk at delving into the StabChain coding.

Copy and paste GAP banner (to tell us about your setup)

┌───────┐ GAP 4.9.2 of 04-Jul-2018
│ GAP │ https://www.gap-system.org
└───────┘ Architecture: x86_64-apple-darwin17.4.0-default64
Configuration: gmp 6.0.0
Loading the library and packages ...
Packages: GAPDoc 1.6.1.dev, PrimGrp 3.3.1, SmallGrp 1.3, TransGrp 2.0.2
Try '??help' for help. See also '?copyright', '?cite' and '?authors'
(Also the development version, GAP 4.8.8-5807-g786fe9e.)

q8.txt

##  expt/q8.txt  
##  part 1 : construct permutation groups and homomorphisms: 
p := (1,2,3,4)(5,8,7,6); 
q := (1,5,3,7)(2,6,4,8);
q8 := Group( p, q ); 
SetName( q8, "q8" );
a := p;  b := q;  c := p^2; 
c4a := Subgroup( q8, [a] ); 
SetName( c4a, "c4a" ); 
c4b := Subgroup( q8, [b] ); 
SetName( c4b, "c4b" ); 
c2c := Subgroup( q8, [c] ); 
SetName( c2c, "c2c" ); 
fu := GroupHomomorphismByImages( c2c, c4a, [c], [c] );
fl := GroupHomomorphismByImages( c2c, c4b, [c], [c] );
fd := GroupHomomorphismByImages( c4b, q8, [b], [b] );
fr := GroupHomomorphismByImages( c4a, q8, [a], [a] );

autc4a := AutomorphismGroup( c4a );
imq8a := List( [p,q], g -> ConjugatorAutomorphism( c4a, g ) );
actq8a := GroupHomomorphismByImages( q8, autc4a, [p,q], imq8a );
c4aq8 := SemidirectProduct( q8, actq8a, c4a ); 
SetName( c4aq8, "c4a:q8" );
prc4aq8 := Projection( c4aq8 ); 
Print( "prc4aq8: ", MappingGeneratorsImages(prc4aq8), "\n" ); 
embq8 := Embedding( c4aq8, 1 ); 
p2 := ImageElm( embq8, p );
q2 := ImageElm( embq8, q );
Print( "[p2,q2] = ", [p2,q2], "\n" );
embc4a := Embedding( c4aq8, 2 ); 
a2 := ImageElm( embc4a, a );
Print( "a2 = ", a2, "\n" ); 

autc2c := AutomorphismGroup( c2c );
imc4b := List( [b], g -> ConjugatorAutomorphism( c2c, g ) );
actc4b := GroupHomomorphismByImages( c4b, autc2c, [b], imc4b );
c2c4b := SemidirectProduct( c4b, actc4b, c2c ); 
SetName( c2c4b, "c2c:c4b" ); 
prc2c4b := Projection( c2c4b ); 
Print( "prc2c4b: ", MappingGeneratorsImages(prc2c4b), "\n" ); 
embc4b := Embedding( c2c4b, 1 ); 
b2 := ImageElm( embc4b, b );
Print( "b2 = ", b2, "\n" ); 
embc2c := Embedding( c2c4b, 2 );
c2 := ImageElm( embc2c, c );
Print( "c2 = ", c2, "\n" ); 

## boundary map is the inclusion of c2c4b in c4aq8 
isc2c := ImagesSource( embc2c );
imbdy := [0,0]; 
imbdy[1] := ImageElm( embc4a, ImageElm( fu, c ) ); 
imbdy[2] := ImageElm( embq8, ImageElm( fd, b ) ); 
bdy := GroupHomomorphismByImages( c2c4b, c4aq8, [c2,b2], imbdy ); 
Print( "bdy = ", MappingGeneratorsImages(bdy), "\n" ); 

## action of c4aq8 on c2c4b 
autc2c4b := AutomorphismGroup( c2c4b ); 
imact := [0,0,0]; 
ima := [0,0]; 
ima[1] := ImageElm( embc2c, c^a ); 
ima[2] := b2 * ImageElm( embc2c, Comm(b,a) ); 
imact[1] := GroupHomomorphismByImages( c2c4b, c2c4b, [c2,b2], ima ); 
ima[1] := ImageElm( embc2c, c^p ); 
ima[2] := ImageElm( embc4b, b^p ); 
imact[2] := GroupHomomorphismByImages( c2c4b, c2c4b, [c2,b2], ima ); 
ima[1] := ImageElm( embc2c, c^q ); 
ima[2] := ImageElm( embc4b, b^q ); 
imact[3] := GroupHomomorphismByImages( c2c4b, c2c4b, [c2,b2], ima ); 
if not ForAll( imact, f -> IsBijective(f) ) then 
    Error( "imact homs not all bijective" ); 
fi;
act := GroupHomomorphismByImages( c4aq8, autc2c4b, [a2,p2,q2], imact ); 

G := SemidirectProduct( c4aq8, act, c2c4b ); 
SetName( G, "G" ); 
prG := Projection( G ); 
Print( "prG: ", MappingGeneratorsImages(prG), "\n" ); 
embc4aq8 := Embedding( G, 1 ); 
a3 := ImageElm( embc4aq8, a2 ); 
p3 := ImageElm( embc4aq8, p2 ); 
q3 := ImageElm( embc4aq8, q2 ); 
embc2c4b := Embedding( G, 2 ); 
c3 := ImageElm( embc2c4b, c2 ); 
b3 := ImageElm( embc2c4b, b2 ); 
genG := [ c3, b3, a3, p3, q3 ]; 
Print( "genG = ", genG, "\n" ); 

## cat1-embedding 
e := embc4aq8; 
## tail map 
id := One( c4aq8 ); 
imt := [ id, id, a2, p2, q2 ]; 
t := GroupHomomorphismByImages( G, c4aq8, genG, imt ); 
Print( "t*e*t = t ? ", t*e*t = t, "\n" ); 
## head map 
imh := Concatenation( imbdy, [a2,p2,q2] ); 
Print( "imh = ", imh, "\n" );
## h := GroupHomomorphismByImages( G, c4aq8, genG, imh ); 
h := GroupGeneralMappingByImages( G, c4aq8, genG, imh ); 
ok := IsSingleValued( h ); 
Print( "h is single valued? ", ok, "\n\n" ); 

##  part 2 : construct isomorphic pc-groups and homomorphisms 
Q8 := SmallGroup( 8, 4 ); 
SetName( Q8, "Q8" );
P := Q8.1;
Q := Q8.2;
if not ( ( Order(P) = 4 ) and ( Order(Q) = 4) ) then Error( "orders" ); fi; 
A := P;  B := Q;  C := P^2;
C4A := Subgroup( Q8, [A] ); 
SetName( C4A, "C4A" ); 
C4B := Subgroup( Q8, [B] ); 
SetName( C4B, "C4B" ); 
C2C := Subgroup( Q8, [A^2] ); 
SetName( C2C, "C2C" ); 
FU := GroupHomomorphismByImages( C2C, C4A, [C], [C] );
FL := GroupHomomorphismByImages( C2C, C4B, [C], [C] );
FD := GroupHomomorphismByImages( C4B, Q8, [B], [B] );
FR := GroupHomomorphismByImages( C4A, Q8, [A], [A] );

autC4A := AutomorphismGroup( C4A );
imQ8a := List( [P,Q], g -> ConjugatorAutomorphism( C4A, g ) );
actQ8a := GroupHomomorphismByImages( Q8, autC4A, [P,Q], imQ8a );
C4AQ8 := SemidirectProduct( Q8, actQ8a, C4A ); 
SetName( C4AQ8, "C4A:Q8" );
prC4AQ8 := Projection( C4AQ8 ); 
Print( "prC4AQ8: ", MappingGeneratorsImages(prC4AQ8), "\n" ); 
embQ8 := Embedding( C4AQ8, 1 ); 
P2 := ImageElm( embQ8, P );
Q2 := ImageElm( embQ8, Q );
Print( "[P2,Q2] = ", [P2,Q2], "\n" );
embC4A := Embedding( C4AQ8, 2 ); 
A2 := ImageElm( embC4A, A );
Print( "A2 = ", A2, "\n" ); 

autC2C := AutomorphismGroup( C2C );
imC4B := List( [B], g -> ConjugatorAutomorphism( C2C, g ) );
actC4B := GroupHomomorphismByImages( C4B, autC2C, [B], imC4B );
C2C4B := SemidirectProduct( C4B, actC4B, C2C ); 
SetName( C2C4B, "C2C:C4B" ); 
prC2C4B := Projection( C2C4B ); 
Print( "prC2C4B: ", MappingGeneratorsImages(prC2C4B), "\n" ); 
embC4B := Embedding( C2C4B, 1 ); 
B2 := ImageElm( embC4B, B );
Print( "B2 = ", B2, "\n" ); 
embC2C := Embedding( C2C4B, 2 );
C2 := ImageElm( embC2C, C );
Print( "C2 = ", C2, "\n" ); 

## boundary map is the inclusion of C2C4B in C4AQ8 
isC2C := ImagesSource( embC2C );
imBdy := [0,0]; 
imBdy[1] := ImageElm( embC4A, ImageElm( FU, C ) ); 
imBdy[2] := ImageElm( embQ8, ImageElm( FD, B ) ); 
Bdy := GroupHomomorphismByImages( C2C4B, C4AQ8, [C2,B2], imBdy ); 
Print( "Bdy = ", MappingGeneratorsImages(Bdy), "\n" ); 

## action of C4AQ8 on C2C4B 
autC2C4B := AutomorphismGroup( C2C4B ); 
imAct := [0,0,0]; 
imA := [0,0]; 
imA[1] := ImageElm( embC2C, C^A ); 
imA[2] := B2 * ImageElm( embC2C, Comm(B,A) ); 
imAct[1] := GroupHomomorphismByImages( C2C4B, C2C4B, [C2,B2], imA ); 
imA[1] := ImageElm( embC2C, C^P ); 
imA[2] := ImageElm( embC4B, B^P ); 
imAct[2] := GroupHomomorphismByImages( C2C4B, C2C4B, [C2,B2], imA ); 
imA[1] := ImageElm( embC2C, C^Q ); 
imA[2] := ImageElm( embC4B, B^Q ); 
imAct[3] := GroupHomomorphismByImages( C2C4B, C2C4B, [C2,B2], imA ); 
if not ForAll( imAct, f -> IsBijective(f) ) then 
    Error( "imAct homs not all bijective" ); 
fi;
Act := GroupHomomorphismByImages( C4AQ8, autC2C4B, [A2,P2,Q2], imAct ); 

PCG := SemidirectProduct( C4AQ8, Act, C2C4B ); 
SetName( PCG, "PCG" ); 
prPCG := Projection( PCG ); 
Print( "prPCG: ", MappingGeneratorsImages(prPCG), "\n" ); 
embC4AQ8 := Embedding( PCG, 1 ); 
A3 := ImageElm( embC4AQ8, A2 ); 
P3 := ImageElm( embC4AQ8, P2 ); 
Q3 := ImageElm( embC4AQ8, Q2 ); 
embC2C4B := Embedding( PCG, 2 ); 
C3 := ImageElm( embC2C4B, C2 ); 
B3 := ImageElm( embC2C4B, B2 ); 
genPCG := [ C3, B3, A3, P3, Q3 ]; 
Print( "genPCG = ", genPCG, "\n" ); 

## cat1-embedding 
pce := embC4AQ8; 
## tail map 
Id := One( C4AQ8 ); 
imT := [ Id, Id, A2, P2, Q2 ]; 
T := GroupHomomorphismByImages( PCG, C4AQ8, genPCG, imT ); 
Print( "T*pce*T = T ? ", T*pce*T = T, "\n" ); 

## head map 
imH := Concatenation( imBdy, [A2,P2,Q2] ); 
Print( "imH = ", imH, "\n" );
## H := GroupHomomorphismByImages( PCG, C4AQ8, genPCG, imH ); 
H := GroupGeneralMappingByImages( PCG, C4AQ8, genPCG, imH ); 
OK := IsSingleValued( H ); 
Print( "H is single valued? ", OK, "\n" ); 
Print( "H is a group hom? ", IsGroupHomomorphism( H ), "\n" );

##  part 3 : check that isomorphisms commute with embeddings 
Print( "\nisomorphisms from a perm group to a pc-group:\n" ); 
isoq8 := GroupHomomorphismByImages( q8, Q8, [p,q], [P,Q] ); 
ok := IsBijective( isoq8 ); 
Print( "      q8 -> Q8? ", ok, "\n" ); 
isoc4aq8 := GroupHomomorphismByImages( c4aq8, C4AQ8, [a2,p2,q2], [A2,P2,Q2] ); 
ok := IsBijective( isoc4aq8 ); 
Print( "c4aq8 -> C4AQ8? ", ok, "\n" ); 
isoc2c4b := GroupHomomorphismByImages( c2c4b, C2C4B, [c2,b2], [C2,B2] ); 
ok := IsBijective( isoc2c4b ); 
Print( "c2c4b -> C2C4B? ", ok, "\n" ); 
## isoG := GroupHomomorphismByImages( G, PCG, [c3,b3,a3,p3,q3], [C3,B3,A3,P3,Q3] ); 
isoG := GroupGeneralMappingByImages( G, PCG, [c3,b3,a3,p3,q3], [C3,B3,A3,P3,Q3] ); 
ok := IsBijective( isoG ); 
Print( "      G -> PCG? ", ok, "\n" ); 
ok := IsSingleValued( isoG ); 
Print( "G -> PCG single valued? ", ok, "\n" ); 

Print( "\ncomposites of isomorphisms and embeddings:\n" ); 
ok := isoq8 * embQ8 = embq8 * isoc4aq8; 
Print( "     isoq8 * embQ8 = embq8 * isoc4aq8? ", ok, "\n" ); 
ok := prc4aq8 * isoq8 = isoc4aq8 * prC4AQ8;
Print( " prc4aq8 * isoq8 = isoc4aq8 * prC4AQ8? ", ok, "\n" );
ok := isoc4aq8 * embC4AQ8 = embc4aq8 * isoG; 
Print( "isoc4aq8 * embC4AQ8 = embc4aq8 * isoG? ", ok, "\n" ); 
@cdwensley cdwensley added the kind: bug: wrong result Issues describing bugs that result in mathematically or otherwise wrong results, and PRs fixing them label Aug 21, 2018
hulpke added a commit to hulpke/gap that referenced this issue Aug 23, 2018
Also add first cheap cycle structure test to be conjugator automorphism.

This fixes gap-system#2724
@hulpke
Copy link
Contributor

hulpke commented Aug 23, 2018

Yes, it is a bug (in testing whether permutation automorphisms are Sn-induced, which is newer). I will put in a fix.

hulpke added a commit to hulpke/gap that referenced this issue Aug 23, 2018
Also add first cheap cycle structure test to be conjugator automorphism.

This fixes gap-system#2724
hulpke added a commit to hulpke/gap that referenced this issue Aug 23, 2018
Also add first cheap cycle structure test to be conjugator automorphism.

This fixes gap-system#2724
@cdwensley
Copy link
Contributor Author

Thanks - this fix works for me.
(There seems to be one too many ')' in the new line 2117.)

hulpke added a commit to hulpke/gap that referenced this issue Aug 23, 2018
Also add first cheap cycle structure test to be conjugator automorphism.

This fixes gap-system#2724
hulpke added a commit to hulpke/gap that referenced this issue Aug 23, 2018
Also add first cheap cycle structure test to be conjugator automorphism.

This fixes gap-system#2724
hulpke added a commit to hulpke/gap that referenced this issue Aug 23, 2018
Also add first cheap cycle structure test to be conjugator automorphism.

This fixes gap-system#2724
hulpke added a commit to hulpke/gap that referenced this issue Aug 23, 2018
Also add first cheap cycle structure test to be conjugator automorphism.

This fixes gap-system#2724
@cdwensley
Copy link
Contributor Author

@hulpke Perhaps you can give me some advice on GAP development procedure? You have provided a fix for this issue, but how is it to be installed? (The current situation in xmod-dev is that an edited copy of IsConjugatorAutomorphism is Reread (from read.g) - just a temporary dodge.). I presume that you have other changes to ghomperm.gi as part of more extensive development and so the fix is waiting for some larger PR. (Or is already part of some larger PR of which I am unaware.) Since I would prefer the fix dealt with a.s.a.p. I could make a new PR myself, just containing this commit and making it clear that you were the author, but I would only do the if you approved.

hulpke added a commit to hulpke/gap that referenced this issue Aug 31, 2018
Also add first cheap cycle structure test to be conjugator automorphism.

This fixes gap-system#2724
@hulpke
Copy link
Contributor

hulpke commented Aug 31, 2018

@cdwensley
I am probably not the right person to describe the development process as it has been changing and I am (to formulate it neutrally) not aware of all the requirements that have been imposed over the last year or so.

I had submitted the fix as a PR for the master branch (#2733) already last week (see the discussion for this PR).

hulpke added a commit to hulpke/gap that referenced this issue Aug 31, 2018
Also add first cheap cycle structure test to be conjugator automorphism.

This fixes gap-system#2724
hulpke added a commit to hulpke/gap that referenced this issue Aug 31, 2018
Also add first cheap cycle structure test to be conjugator automorphism.

This fixes gap-system#2724
hulpke added a commit to hulpke/gap that referenced this issue Sep 3, 2018
Also add first cheap cycle structure test to be conjugator automorphism.

This fixes gap-system#2724
hulpke added a commit to hulpke/gap that referenced this issue Sep 6, 2018
Also add first cheap cycle structure test to be conjugator automorphism.

This fixes gap-system#2724
@fingolfin fingolfin added the kind: bug Issues describing general bugs, and PRs fixing them label Mar 21, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kind: bug: wrong result Issues describing bugs that result in mathematically or otherwise wrong results, and PRs fixing them kind: bug Issues describing general bugs, and PRs fixing them
Projects
None yet
Development

No branches or pull requests

3 participants