Skip to content

Commit c9824a3

Browse files
committed
Improve FastNormalClosure
Extend the first argument to accept either a group <G> or generators <grpgens> of a group <G>. Document the assumption, that the group generated by <grpgens> is an overgroup of the one generated by <list>. Add a test whether the group <G> is abelian.
1 parent 8114d22 commit c9824a3

File tree

11 files changed

+30
-22
lines changed

11 files changed

+30
-22
lines changed

gap/generic/kernel.gi

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -150,20 +150,28 @@ InstallGlobalFunction( RandomSubproduct, function(a)
150150
end );
151151

152152
# Computes randomly (it might underestimate) the normal closure of <list>
153-
# under conjugation by the group generated by <grpgens>. The integer
154-
# <n> controls how many new conjugates are computed.
153+
# under conjugation by <G>. <G> can be a group containing <list> or a
154+
# list of generators of such a group. The integer <n> controls how many new
155+
# conjugates are computed.
155156
# The error probability can be determined by following Theorem 2.3.9 in
156-
# <Cite Key="Ser03"/>. According to Lemma 2.3.8, if <grpgens> has 4 or more
157-
# entries, then as long as the result does not generate the full normal closure
158-
# of <list> under <grpgens>, the probability that a conjugate is not contained
157+
# <Cite Key="Ser03"/>. According to Lemma 2.3.8, if <G> has 4 or more
158+
# generators, then as long as the result does not generate the full normal closure
159+
# of <list> under <G>, the probability that a conjugate is not contained
159160
# in the group generated by the result is >= 1/4.
160-
InstallGlobalFunction( FastNormalClosure , function( grpgens, list, n )
161-
local list2, fewGenerators, repetitions, randlist, conjugators, i, c;
161+
InstallGlobalFunction( FastNormalClosure , function( G, list, n )
162+
local list2, grpgens, fewGenerators, repetitions, randlist, conjugators, i, c;
162163
if IsEmpty(list) then
163164
return [];
164165
fi;
165166
list2 := ShallowCopy(list);
166-
if Length(grpgens) = 1 then
167+
if IsGroup(G) then
168+
grpgens := GeneratorsOfGroup(G);
169+
else
170+
grpgens := G;
171+
fi;
172+
if (IsGroup(G) and HasIsAbelian(G) and IsAbelian(G))
173+
or (IsGroup(G) and HasIsCyclic(G) and IsCyclic(G))
174+
or Length(grpgens) = 1 then
167175
return list2;
168176
fi;
169177
fewGenerators := Length(grpgens) <= 3;

gap/projective/almostsimple.gi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -683,7 +683,7 @@ RECOG.simplesocle := function(ri,g)
683683
comm3:=Comm(comm2,comm2^y);
684684
until not ri!.isone(comm3);
685685

686-
gensH:=FastNormalClosure(GeneratorsOfGroup(g),[comm3],20);
686+
gensH:=FastNormalClosure(g,[comm3],20);
687687

688688
return gensH;
689689
end;

gap/projective/classicalnatural.gi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1469,7 +1469,7 @@ RECOG.GuessProjSL2ElmOrder := function(x,f)
14691469
return o;
14701470
end;
14711471

1472-
RECOG.IsThisSL2Natural := function(gens,f)
1472+
RECOG.IsThisSL2Natural := function(ri,gens,f)
14731473
# Checks quickly whether or not this is SL(2,f).
14741474
# The answer is not guaranteed to be correct, this is Las Vegas.
14751475
local CheckElm,a,b,clos,coms,i,isabelian,j,l,notA5,p,q,S,seenqm1,seenqp1,x;
@@ -3193,7 +3193,7 @@ function(ri, g)
31933193

31943194
# First check whether we are applicable:
31953195
if d = 2 then
3196-
if not RECOG.IsThisSL2Natural(GeneratorsOfGroup(g),f) then
3196+
if not RECOG.IsThisSL2Natural(ri,GeneratorsOfGroup(g),f) then
31973197
Info(InfoRecog,2,"ClassicalNatural: Is not PSL_2.");
31983198
return fail; # FIXME: fail = TemporaryFailure here really correct?
31993199
fi;

gap/projective/d247.gi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ function(ri, G)
362362
# This is called with an element that we hope lies in a normal subgroup.
363363
local H,a,basis,collf,conjgensG,count,dim,hom,homcomp,homs,homsimg,i,
364364
kro,m,mm,mult,ngens,nngens,o,orb,pr,r,subdim,y,z;
365-
ngens := FastNormalClosure(GeneratorsOfGroup(G),[x],4);
365+
ngens := FastNormalClosure(G,[x],4);
366366
m := GModuleByMats(ngens,f);
367367
if MTX.IsIrreducible(m) then
368368
if not ispower then
@@ -440,7 +440,7 @@ function(ri, G)
440440
CheckNormalClosure := function(x)
441441
# This is called with an element that we hope lies in a normal subgroup.
442442
local m,ngens;
443-
ngens := FastNormalClosure(GeneratorsOfGroup(G),x,4);
443+
ngens := FastNormalClosure(G,x,4);
444444
m := GModuleByMats(ngens,f);
445445
if not IsIrreducible(m) then
446446
Info(InfoRecog,2,"Proto: Seem to have found something!");

gap/projective/findnormal.gi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -743,7 +743,7 @@ function(ri,G)
743743
return fail; # FIXME: fail = TemporaryFailure here really correct?
744744
fi;
745745
if not IsBound(r.Nready) or not r.Nready then
746-
r.Ngens := FastNormalClosure(GeneratorsOfGroup(G),[r.el],20);
746+
r.Ngens := FastNormalClosure(G,[r.el],20);
747747
fi;
748748
f := ri!.field;
749749
m := GModuleByMats(r.Ngens,f);

gap/projective/tensor.gi

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
##
1818
#############################################################################
1919

20-
RECOG.FindTensorKernel := function(G,onlyone)
20+
RECOG.FindTensorKernel := function(ri,G,onlyone)
2121
# Assume G respects a tensor product decomposition of its natural
2222
# module V. Try to find the kernel of the canonical map:
2323
local N,allps,c,fac,facs,i,j,kgens,newc,notused,o,pfacs,x,z;
@@ -60,7 +60,7 @@ RECOG.FindTensorKernel := function(G,onlyone)
6060
fi;
6161
od;
6262
#Print(Length(notused)," \c");
63-
N := GroupWithGenerators(FastNormalClosure(GeneratorsOfGroup(G),[c],10));
63+
N := GroupWithGenerators(FastNormalClosure(G,[c],10));
6464
if onlyone and
6565
(ForAny(GeneratorsOfGroup(N),m->IsZero(m[1,1]) or
6666
not IsOne(m*(m[1,1])^-1))) then
@@ -339,7 +339,7 @@ function(ri,G)
339339

340340
# Now assume a tensor factorization exists:
341341
#Gm := GroupWithMemory(G);???
342-
N := RECOG.FindTensorKernel(G,true);
342+
N := RECOG.FindTensorKernel(ri,G,true);
343343
Info(InfoRecog,3,
344344
"TensorDecomposable: I seem to have found a normal subgroup...");
345345
r := RECOG.FindTensorDecomposition(G,N);

misc/colva/AlmostSimple.g

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ StableDerivative := function(G)
6464
r := PseudoRandomNormalClosureElement(G,H);
6565
Add(gens,Ggens[i]^-1*r^-1*Ggens[i]*r);
6666
od;
67-
gens := FastNormalClosure(Ggens,gens,1);
67+
gens := FastNormalClosure(G,gens,1);
6868
H := GroupWithGenerators(gens);
6969
G := ShallowCopy(H);
7070
until IsProbablyPerfect(G);

misc/colva/DPleaf.g

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ SolveLeafDP := function(ri,rifac,name)
308308
econj := List([1..Size(e)],i->GroupHomomorphismByFunction(Grp(ri),Grp(ri),g->g^e[i]));
309309

310310
gens := List([1..3],i->FindPoint(Grp(ri),phi,1,I));
311-
H1 := SubgroupNC(Grp(ri),FastNormalClosure(GeneratorsOfGroup(Grp(ri)),gens,1));
311+
H1 := SubgroupNC(Grp(ri),FastNormalClosure(Grp(ri),gens,1));
312312
H1toblk := phi*projs[1];
313313
H1toblk!.Source := H1;
314314
blk := GroupWithGenerators(List(GeneratorsOfGroup(H1),x->ImageElm(H1toblk,x)));

misc/colva/NSM.g

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ LowIndexMaps := function(G,ri)
357357
kgens := List([1..15],i->PseudoRandom(G));
358358
kims := List(kgens,x->ImageElm(rho,x));
359359
kgens := List([1..15],i->kgens[i]*ImageElm(rhoinv,kims[i])^-1);
360-
kgens := FastNormalClosure(GeneratorsOfGroup(G),kgens,3);
360+
kgens := FastNormalClosure(Grp(ri),kgens,3);
361361

362362
# Compute the stabilizer of 1 in P
363363
s1gens := List(GeneratorsOfGroup(Stabiliser(P,1)),x->ImageElm(rhoinv,x));

misc/colva/SimpleRecog.g

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ RecogniseQuasiSimpleDP := function(G,H,phi,I,name)
513513

514514
# Find generators for one block
515515
gens := List([1..3],i->FindPoint(H,phi,1,I));
516-
H1 := SubgroupNC(H,FastNormalClosure(GeneratorsOfGroup(H),gens,1));
516+
H1 := SubgroupNC(H,FastNormalClosure(Grp(ri),gens,1));
517517
H1toblk := phi*projs[1];
518518
H1toblk!.Source := H1;
519519
blk := GroupWithGenerators(List(GeneratorsOfGroup(H1),x->ImageElm(H1toblk,x)));

0 commit comments

Comments
 (0)