Skip to content

isomorphism test for (non-p-)groups: speed up? #6478

Description

@ThomasBreuer

The following happens in GAP 4.16.0 and in the master branch.

We define two solvable groups of order $23^2 \cdot 48$ and ask whether they are isomorphic.

gap> G:=function()
> local g1,g2,g3,g4,g5,g6,g7,r,f,g,rws,x;
> f:=FreeGroup(IsSyllableWordsFamily,7);
> g:=GeneratorsOfGroup(f);
> g1:=g[1];
> g2:=g[2];
> g3:=g[3];
> g4:=g[4];
> g5:=g[5];
> g6:=g[6];
> g7:=g[7];
> rws:=SingleCollector(f,[ 2, 3, 2, 2, 2, 23, 23 ]);
> r:=[
> [1,g5],
> [3,g5],
> [4,g5],
> ];
> for x in r do SetPower(rws,x[1],x[2]);od;
> r:=[
> [2,1,g2],
> [3,1,g4],
> [4,1,g5],
> [6,1,g6^13*g7^18],
> [7,1,g6^21*g7^8],
> [3,2,g3*g4*g5],
> [4,2,g3],
> [6,2,g6^21*g7^11],
> [7,2,g6^2*g7^22],
> [4,3,g5],
> [6,3,g6^6*g7^18],
> [7,3,g6^10*g7^15],
> [6,4,g6^10*g7^9],
> [7,4,g6^12*g7^11],
> [6,5,g6^21],
> [7,5,g7^21],
> ];
> for x in r do SetCommutator(rws,x[1],x[2],x[3]);od;
> return GroupByRwsNC(rws);
> end;;
gap> G:=G();;
gap> H:=function()
> local g1,g2,g3,g4,g5,g6,g7,r,f,g,rws,x;
> f:=FreeGroup(IsSyllableWordsFamily,7);
> g:=GeneratorsOfGroup(f);
> g1:=g[1];
> g2:=g[2];
> g3:=g[3];
> g4:=g[4];
> g5:=g[5];
> g6:=g[6];
> g7:=g[7];
> rws:=SingleCollector(f,[ 2, 3, 2, 2, 2, 23, 23 ]);
> r:=[
> [1,g5],
> [3,g5],
> [4,g5],
> ];
> for x in r do SetPower(rws,x[1],x[2]);od;
> r:=[
> [2,1,g2],
> [3,1,g4],
> [4,1,g5],
> [6,1,g6^8*g7^5],
> [7,1,g6^2*g7^13],
> [3,2,g3*g4*g5],
> [4,2,g3],
> [6,2,g6^21*g7^11],
> [7,2,g6^2*g7^22],
> [4,3,g5],
> [6,3,g6^6*g7^18],
> [7,3,g6^10*g7^15],
> [6,4,g6^10*g7^9],
> [7,4,g6^12*g7^11],
> [6,5,g6^21],
> [7,5,g7^21],
> ];
> for x in r do SetCommutator(rws,x[1],x[2],x[3]);od;
> return GroupByRwsNC(rws);
> end;;
gap> H:=H();;
gap> IsomorphismGroups( G, H );

GAP runs for some time, growing to about 10 GB within 10 minutes.
(According to an experiment which I made yesterday, the computation will run and grow further.)

Interrupting the computation shows that IsomorphismGroups has called PatheticIsomorphism.
Looking at the code of this function, we find that another strategy (Morphium(G,H,false)) would have been chosen under different conditions, and that we can force this strategy by the global option forcetest:= "old".
For the given groups, this would help.

...
gap> G:= G();;
gap> H:= H();;
gap> IsomorphismGroups( G, H : forcetest:= "old" );
[ f1*f3*f5*f6^20*f7^8, f2*f6^8*f7^5 ] -> [ f1*f3*f6, f2 ]
gap> time;
619

Now the challenge is to find a condition that enables a good strategy for this example, without slowing down other examples.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions