gap-packages / anupq

The ANUPQ GAP package
https://gap-packages.github.io/anupq/
Artistic License 2.0
4 stars 6 forks source link

Add a convenient function to compute an actual isomorphism between isomorphic p-groups #22

Open fingolfin opened 7 years ago

fingolfin commented 7 years ago

Right now, one can test whether two p-groups are isomorphic, but not obtain a proper isomorphism. Yet doing that is not so hard, as the xampl below illustrates.

Still, we should offer a nice function to do this, perhaps as a "method" for IsomorphismGroups (except IsomorphismGroups is not an operation, so perhaps a new function IsomorphismPGroups ?)

gap> LoadPackage("anupq", false);
true
gap>
gap> G1:=PcGroupCode(9556403270508841599070863433260379032496081212546573442518132526048398410492059282538199366514130891376584516018838185862263175961514556949107265352140179485923647166013334249976215990404614361585180498785500058844337971521291157218783355,1594323);
<pc group of size 1594323 with 13 generators>
gap>
gap> G2:=PcGroupCode(11988039149529377423309378696754293956288394781031666364622519619922950560121964737252998014372044125976295478459521707953799595514029043754425147805769728121121849582846112554279125935293754034335404366719215627371184752858002092155,1594323);
<pc group of size 1594323 with 13 generators>
gap>
gap> epi1:=EpimorphismStandardPresentation(G1);;
gap> epi2:=EpimorphismStandardPresentation(G2);;
gap> q1:=PcGroupFpGroup(Range(epi1));;
gap> q2:=PcGroupFpGroup(Range(epi2));;
gap>
gap> iso_pc := GroupHomomorphismByImages(q1, q2);
[ f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13 ] -> [ f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13 ]
gap> Assert(0, iso_pc <> fail); # verify the two groups are really isomorphic
gap>
gap> epi1_pc := epi1 * GroupHomomorphismByImages(Range(epi1), q1);;
gap> IsBijective(epi1_pc); # force GAP to verify that the map is bijective
true
gap> epi2_pc := epi2 * GroupHomomorphismByImages(Range(epi2), q2);;
gap> IsBijective(epi2_pc); # force GAP to verify that the map is bijective
true
gap>
gap> iso := epi1_pc * iso_pc * InverseGeneralMapping(epi2_pc);
[ f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13 ] -> [ f1^2*f2^2*f4^2*f5*f6^2*f7^2*f8^2*f9*f10*f11^2*f12, f2*f4^2*f6^2*f7*f9*f10*f12^2*f13^2, f3^2*f5*f6^2*f7*f9^2,
  f4*f7*f8*f9^2*f10*f11^2*f13, f5^2*f7*f8*f9^2*f10^2*f11, f6*f7*f12^2*f13, f7^2*f8^2, f8*f10^2*f11*f12*f13, f9^2*f10^2*f12*f13, f10*f11*f13^2, f11^2*f13, f12*f13, f13^2 ]
gap>