# Computing the class-preserving automorphism group of finite $p$-groups

Let $$G$$ be a finite non-abelian $$p$$-group, where $$p$$ is a prime. An automorphism $$\alpha$$ of $$G$$ is called a class-preserving if for each $$x\in G$$, there exists an element $$g_x\in G$$ such that $$\alpha(x)=g_x^{-1}xg_x$$. An automorphism $$\alpha$$ of $$G$$ is called a $$2$$nd class-preserving if for each $$x\in G$$, there exists an element $$g_x\in G'=[G,G]$$ such that $$\alpha(x)=g_x^{-1}xg_x$$. Let $$\mathrm{Aut_c}(G)$$ and $$\mathrm{Aut_c^2}(G)$$ respectively denote the group of all class-preserving and $$2$$nd class-preserving automorphisms of $$G$$.

I have made a GAP program to find the structure of $$\mathrm{Aut_c}(G)$$ but I failed to make a GAP program to find the structure of $$\mathrm{Aut_c^2}(G)$$. The GAP program to find the structure of $$\mathrm{Aut_c}(G)$$ is following:

ClassPreservingAuts:= function(G)
local A,I,cc,gens,auts,a,ok,i,hom;
A:=AutomorphismGroup(G);
I:=InnerAutomorphismsAutomorphismGroup(A);
hom:=NaturalHomomorphismByNormalSubgroup(A,I);
cc:=ConjugacyClasses(G);
gens:=[];
auts:=Group([One(A)]);

# check for class preserving
for a in Elements(A) do
ok:=true;
# run through classes
i:=0;
while i<Length(cc) and ok=true do
i:=i+1;
if not (Representative(cc[i])^a in cc[i]) then
ok:=false;
fi;
od;
# a is class preserving
if ok=true and not (a in auts) then
auts:= Group(gens);
#inng:=Image(hom(x));
#gens:=GeneratorsOfGroup(inng);
fi;
od;
return auts;
return auts/I;
return Size(auts)/Size(I);
end;


My question is the following:

Can anybody help me to make a GAP program to find the structure of $$\mathrm{Aut_c^2}(G)$$?

• What exactly do you mean by "find the structure"? I will be useful if you will edit the question and include the GAP code that you wrote for that. Please indent all code by four spaces to display it like code and not like plain text. – Alexander Konovalov Jan 17 at 9:35
• Thanks for updating the question. It will still be useful to show what have you tried in GAP to get $\mathrm{Aut_c}(G)$. – Alexander Konovalov Jan 18 at 10:48
• P.S. If you cross-post a question elsewhere, it's a good practice to put a cross-reference to the other place where the question has been asked. First of all, it is respectful to other people's time since it helps to avoid duplicated efforts. Second, you may indicate that they may reply to your question by email or answer on this site, dependently on the way they prefer. – Alexander Konovalov Jan 18 at 20:46
• Where does your attempt fail? Can you be more detailed than”i cannot write a function”? What have you tried and what problem do you run into? – ahulpke Jan 19 at 17:45
• Thanks, showing the code really helps. I have helped you to display it properly in the question - as I have asked you above, you need to indent it by four spaces, then it is displayed properly. Entering latex for # is not helping, since the code is not runnable after that. Also, a good practice is to indent bodies of loops and "if" statements, to make the code more readable. Finally, return is executed only once, so the 2nd and 3rd return statements are never called. – Alexander Konovalov Jan 25 at 10:35

if not (Representative(cc[i])^a in cc[i]) then


that will eliminate elements as not lying in the subgroup you want. We could phrase this alternatively (this is in fact what the in test does) as

if RepresentativeAction(G,Representative(cc[i])^a,Representative(cc[i])=fail then


that is we are testing whether there is an element in G that will conjugate the class representative in the same way as the automorphism a does.

This is now easily generalized. Add

Gd:=DerivedSubgroup(G);


at the start and change the test to

if RepresentativeAction(Gd,Representative(cc[i])^a,Representative(cc[i])=fail then


Finally -- it is not clear from your code whether you want to factor out the inner automorphisms -- you would factor out not all inner automorphisms, but only those induced by $$G'$$.