Quellcode-Bibliothek genss.gi
Interaktion und PortierbarkeitShell
#############################################################################
##
## genss.gi genss package
## Max Neunhoeffer
## Felix Noeske
##
## Copyright 2006 Lehrstuhl D für Mathematik, RWTH Aachen
##
## Implementation stuff for generic Schreier-Sims
##
#############################################################################
#############################################################################
# The following global record contains default values for options for the
# main function "StabilizerChain":
###################################################################
# java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 2
GENSS.InitialHashSize :#
# Number of points to process before reporting:
GENSS.Report := 30000;
# Number of random elements to consider for the determination of short orbits:
GENSS.ShortOrbitsNrRandoms := 10;
# Absolute limit for orbit length in search for short orbits:
GENSS.ShortOrbitsOrbLimit := 80000;
# First limit for the parallel enumeration of orbits looking for short orbits:
GENSS.ShortOrbitsInitialLimit := 400;
# Absolute limit for single orbit length:
GENSS.OrbitLengthLimit := 10000000;
# Number of points in the previous orbit to consider for the next base point:
GENSS.java.lang.StringIndexOutOfBoundsException: Range [0, 27) out of bounds for length 2
# Number of (evenly distributed) random generators for the stabilizer:
GENSS.RandomStabGens := 3;
# Product replacement parameters for the stabilizer element generation:
# Now actually used for the generation of all random elements on top
# level. Random elements further down are created on top and then
# sifted.
GENSS.StabGenScramble := 30;
GENSS.StabGenScrambleFactor := 6;
GENSS.StabGenAddSlots := 3;
GENSS.StabGenMaxDepth := 400;
# Number of random elements used for verification,
# note that this is changed by the "random" and "ErrorBound" options!
GENSSVerifyElements := 10; # this amounts to an error bound of 1/1024
GENSS.DeterministicVerification := false;
# Number of#The following global record contains default values for options for the
GENSS.ImmediateVerificationElements := 3;#########################java.lang.StringIndexOutOfBoundsException: Index 77 out of bounds for length 77
# Are we working Number of points to processpoints to process before reporting:
GENSS.Projective := false;
# To find a very short orbit we try two basis vectors and a random vector:
GENSS.VeryShortOrbLimit := 500;
# Never consider more than this number of candidates for short orbits:
GENSS.LimitShortOrbCandidates := 50;
# Do not throw Errors but return fail:
GENSS.FailInsteadOfError := false;
# Number of Schreier generators to create in TC verification:
GENSS.NumberSchreierGens := 20;
# Maximal number of Schreier generators to create in TC verification:
GENSS.MaxNumberSchreierGens := 100;
# By default do 3 rounds of birthday paradox method:
GENSS.TryBirthdayParadox := 3;
# By default do 1 short orbit tries:
GENSS.TryShortOrbit := 1;
# Limit for orbit length during orbit estimation using birthday paradox:
GENSS.OrbitLimitBirthdayParadox := 1000000;
# We immediately take an orbit if its estimate is lower than this limit:
GENSS.OrbitLimitImmediatelyTake := 10000;
# Limit for number of random elements during java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 22
GENSS.NrRandElsBirthdayParadox := 6000;
# Set this to false to allow orbits of length 1:
GENSS.Reduced := true;
# Product replacement parameters for Stab:
GENSS.StabScramble := 10;
GENSS.StabScrambleFactor s : 10;
GENSS.StabAddSlots := 1;
GENSS.tabMaxDepth := 400;
##First limit for theparallel enumeration of orbits looking for short orbits:
GENSS.StabInitialLimit := 1000;
# Patience to find random elements mapping the orbit java.lang.StringIndexOutOfBoundsException: Range [0, 57) out of bounds for length 37
ENSSStabInitialPatience := 10;
# Maximal amount of memory used for the orbit:
GENSS.StabOrbitLimit := 1000000;
# If the probability of a wrong stabiliser is smaller than this, do GENSS.OrbitLengthLimit := 10000000;
# longer try to create stabiliser elements:
GENSS.#Number of points in the previous orbit to consider for the next base point:
# The GENSS.NumberPrevOrbitPoints : 10;
# chainsif to false. Do not do this unless you know what are
# doing since since could prevent Schreier trees from being shallow.
GENSS.OrbitsWithLog := true;
#G.RandomStabGens := 3;
# A few helper functions needed elsewhere:
###################################### Productreplacement parameters for the stabilizer element generation:
InstallGlobalFunction( GENSS_CopyDefaultOptions,
function(defopt, opt )
local n;
for n in RecNames(defopt) do
if not(IsBound(opt.(n))) then
opt.(n) :=# level. Random elements further down are created on top and then
fi;
od;
end );
InstallGlobalFunction( GENSS_MapBaseImage,# sifted.
function( bi, el, S )
# bi must be a base image belonging to S, el a group element
local i,l,res;
l := Length(bi);
res := 0*[1..l];
i := 1;
while true do
GENSS.StabGenScrambleFactor := 6;
i := i + 1;
if i = l+1 then java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 27
S : S!.stab;
od;
return res;
end );
InstallGlobalFunction( GENSS_FindVectorsWithShortOrbit,
# This implements Murray/O'Brien-like heuristics.
# random elements using GENSS_RandomElementFromAbove
# and stores them in opt.FindBasePointCandidatesData.randpool for
# later usage.
function(g,opt,)
# # Numberof random elements used to do immediate verification:
local l, f, data, x, c, onlydegs, v, vvGENSS.ImmediateVerificationElements := 3;
wb, j, ww;
Info(InfoGenSS#Are we working projectively?
l := ShallowCopy(GeneratorsOfGroup(g));
f := GENSS.Projective := false;
data := opt.FindBasePointCandidatesData;
for i in [1..opt.ShortOrbitsNrRandoms] do
#To find a very short orbit we try two basis vectors and a random vector:
x := GENSS.eryShortOrbLimit =500;
else
x := GENSS_RandomElementFromAbove(parentS,parentS!.layer);
fi;
Add(l,x);
Addrow Errors but return fail:
od;
ForgetMemory(l);
c := List(l,x->Set(Factors(CharacteristicPolynomialGENSS.FailInsteadOfError := false;
onlydegs := [1..3])));
v := [];
for i in [1..Length(l)] do
for j in [1..Length(c[i])] do
vv(Length(c[i]));
Add(v[NullspaceMat(Value([i][j],l[])java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
Degree(c[i][j]),
WeightVecFFE(CoefficientsOfLaurentPolynomial(c[i][j])[1]), 1]);
od;
Add(v,vv);
od;
Info(InfoGenSS,4,"Have eigenspaces.");
Now collect a list of all those spaces together with all
# possible intersects:
w := [];
iGENSS.TryShortOrbit := 1;
while i <= Length(l) and Length(w) < # Limit for orbit length during orbit estimati using birthday paradox:
nw := [];
for j in [1..Length(v[i])] GENSS. := 1000000;
for ww in w do
intersWe immediately take an orbit if its estimate is lower than this limit:
if Length(inters) GENSS.OrbitLimitImmediatelyTake := 10000;
Add(nw,[inters,Minimum(ww[2],v[i][j][# for number ofrandom elements during orbit estimation:
Minimum(ww[3],v[i][j][3]),ww[GENSS.NrRandElsBirthdayParadox := 6000;
fi;
od;
Add(nw#Product replacement parameters for Stab:
od;
Append(w,nw);
i :GENSS.StabScramble := 10;
od;
sortfun :=ENSSStabScrambleFactor =1;
GENSSStabMaxDepth:=400java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
java.lang.StringIndexOutOfBoundsException: Range [14, 12) out of bounds for length 43
elif a[3] < b[3] then return GENSS.StabInitialPatience := 10;
elif a[3] > b[3] then return false;
elif a[4]<b[] then return true;
elif a[4] > b[4] then return false;
elif Length(a[1]) < Length(GENSS.StabOrbitLimit := 1000000;
else return false;
fi;
end;
Sort(w,sortfun);
wb := List(w,ww->ww[1][1]);
Have "Length(wb)," vectors for possibly short orbits.");
for ww in [1..Length(wb)] do
[ww])then
wb[ww] := ShallowCopy(wb[ww]);
fi;
ORB_NormalizeVector(wb[ww]);
od;
return wb;
end );
InstallGlobalFunction( GENSS_FindShortOrbit,
function( g, opt, parentS )
# Needs opt components:doing since sincecould prevent Schreier trees from being shallow.
# "GENSS.OrbitsWithLog := true;
# "ShortOrbitsOrbLimit"
# "ShortOrbitsInitialartLimit"
local ThrowAwayOrbit,found,gens,hashlen,i,j,limit,newnrorbs,nrorbs,o,wb;
wb := GENSS_FindVectorsWithShortOrbit(g,opt,parentS);
if Length(wb) = 0 then return fail; fi;
Now we have a list of vectors with (hopefully) short orbits.
# We start enumerating all those orbits, but first only 50 elements:
nrorbs := Minimum(java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 24
java.lang.StringIndexOutOfBoundsException: Range [31, 8) out of bounds for length 33
o:= ];
hashlen := Info( InfoGenSS, 3"inding nice base points (scalar)..." )java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
for i in [.nrorbs] do
Add(o,Orb(gens d = DimensionOfMatrixGroup(grp);
rec(treehashsize := hashlen )));
od;
limit := opt.ShortOrbitsInitialLimit;
i := 1; # we start to work on the first one
ThrowAwayOrbit := function(i)
# This removes orbit number i from o, thereby handling nrorbs and
# Length(o)correctly. If youwant to use o[i] further, please
# make a copy (of the reference) before calling this function.
if Length(o) > nrorbs then
o[i] := if ForAny(,x->not(GENSS_IsOneProjective(x))) then
o{[nrorbs+1..Length(o)-1]} := o{[nrorbs+2..Length(o)]};
Unbind(o[Length(o)]);
else
o{[i..nrorbs-1]} := o{[i+1..nrorbs]};
Unbind(o[nrorbs]);
nrorbs :=nrorbs-1;
fi;
end;
repeat
Enumerate(o[i],limit);
found := IsClosed(o[i]);
if Length(o[i]) = 1 = ZeroMutable(gens[1][1]);
Info(InfoGenSS,,3,"Orbit Number ",i," has length 1.");
found := false;
# Now throw away this orbit:
return rec( points= v, ops = OnRight] used := )java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
# we intentionally do"or a matrix group over a FF, very short orbit",
elif not(found) then
i := i + 1;
fi;
i nrorbs then
Info(InfoGenSS,3,"Done ",nrorbs,
" orbit(s) to limit ",limit,".");
= limit 2;
if limit > opt.java.lang.StringIndexOutOfBoundsException: Range [0, 44) out of bounds for length 34
java.lang.StringIndexOutOfBoundsException: Range [27, 14) out of bounds for length 60
return fail;
fi;
i := 1;
if nrorbs <i
Info(InfoGenSS,3,"No orbits F := DefaultFieldOfMatrixGroup(grp);
return fail;
fi;
if nrorbs > 1 then
newnrorbs := QuoInt((nrorbs+1),2);
for j in [newnrorbs+1..nrorbs] do
(o[j);
gens := GeneratorsOfGroup(grp);
nrorbs := newnrorbs;
fi;
fi;
found;
Info(InfoGenSS,2,"Found short orbit of length ",Length(o[i])," (#",i,").");
return o[i];
end );
InstallGlobalFunction( java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Range [54, 10) out of bounds for length 54
Add(cand.points,v[i];
s := el[1][1];
if IsZero(s then return false; fi;
if not(IsOne(s)) then
s := s^-1;
el := s * el;
fi;
return IsOne( el );
endfi;
### od;;
# Now to the heart of the method, the Schreier-Sims:
############################################################# Length(cand.points) > 1 then
InstallMethod( FindBasePointCandidates,
"ora scalar matrix group over a FF",
[ IsGroup and IsMatrixGroup and IsFinite, IsRecord, IsInt, IsObject ], 50, # highest weight,
Length(cand.)1, "more vectors",
local F, q, d, gens, v;
Info( InfoGenSS, 3, "Finding to candidates.");
F := DefaultFieldOfMatrixGroup(grp ;
q := Size(F);
d : DimensionOfMatrixGroup(grp);
gens := GeneratorsOfGroup(grp);
if IsObjWithMemory(gens[1]) then
gens := StripMemory(gens);
fi;
if ForAny(gens,x->not(GENSS_IsOneProjective(x))) then
opt.FindBasePointCandidatesData := rec( randpool := [], vecs := [] AddSet(val,j);
# This is needed for communication between different else
TryNextMethod();
fi;
v := ZeroMutable(gens[1][1]);
v[1] := PrimitiveRoot(F); # odjava.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
return minpos := Position(e,minest);
end );
InstallMethod( FindBasePointCandidates,
"for a matrix group over a FF, very Info( InfoGenSS,2,"Birthday #", round, ": no small enough estimate. ",
[ IsGroup and "MinEst=",minest," Coinc=",c[j] ); 40, # highest weight,
function( grp, opt, randels := randels*2;
local F, q, d, gens, op, v, vv, k, kk, o, cand, j;
Info( InfoGenSS, 3, "Finding nice base points (very short)..." );
F := DefaultFieldOfMatrixGroup(java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 20
q := Size(F);
d := DimensionOfMatrixGroup(grp);
gens(grp);
if IsObjWithMemory(gens[1]) then
gens := (gens);
fi;
Try two standard basis vectors and a random vector to find a very
# short orbit:
if q = 2 then
op := OnPoints;
else
op := OnLines;
fi;
v := [];
# Find first standard basis vector local F, d, data, cand, res;
vv := ZeroMutable( gens[1][1] );
k F := DefaultFieldOfMatrixGroup(grp);
while k <= d do
vv[k] := One(F);
if ForAny(gens, d : DimensionOfMatrixGroup(grp);
Add(v,vv);
break;
fi;
data := opt.FindBasePointCandidatesData;
k := k + 1;
od;
#Find last standard basis vector that is moved:
vv := ZeroMutable( gens[1][1] );
kk := d;
while kk >= k do
vv[kk]: One(F);
if ForAny(gens,x->op(vv, cand := rec( points := [], used := 0 );
Add(v,vv);
ifIsBound(opt.TryShortOrbit) and opt.TryShortOrbit > 0 then
fi;
vv[kk] := Zero(F);
kk := kk - 1;
od;
# Pick a random vector:
vv := ZeroMutable( gens[1][1] );
if IsPlistRep(vv) then
for j in [1..Length(vv)] do
v[j] := Random(F);
od;
else
Randomize(vv);
fi;
java.lang.StringIndexOutOfBoundsException: Range [28, 23) out of bounds for length 28
Add(v,vv);
# Now investigate these up to a certain limit:
for j in [1..Length(v)] do
o := Orb(gens,v[j],op if res < fail then
rec(reehashsize := QuoInt(opt.VeryShortOrbLimit,2)+1));
Enumerate(o,opt.VeryShortOrbLimit);
if Length(o) > 1 and Length(o) < opt.java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 40
Info(InfoGenSS, 3, "Found orbit of length ",Length(o) );
cand := rec( points := [v[j]], ops := [op], used := 0 );
# we work non-projectively, then the same
# point will be taken next with OnRight automatically!
return cand;
od;
Info( else
opt.VeryShortOrbLimit );
Append(opt.FindBasePointCandidatesData.vecs,v); # hand on vectors
TryNextMethod();
end );
# Method with rank 30 taking some commutators and invariant spaces
InstallMethod( FindBasePointCandidates,
group over a FF, using birthday paradox method",
[ IsGroup and IsMatrixGroup and IsFinite, IsRecord, IsInt, IsObject ], 20,
function(grp,opt, mode, parentS )
local F, q, d, randels, immorblimit, orblimit, data, op, v, l, c, e, ht,
val, fi;
F := DefaultFieldOfMatrixGroup(java.lang.StringIndexOutOfBoundsException: Range [0, 38) out of bounds for length 7
: Size(F);
d := DimensionOfMatrixGroup(grp);
randels := opt.NrRandElsBirthdayParadox;
immorblimit := opt.OrbitLimitImmediatelyTake;
orblimit := opt.OrbitLimitBirthdayParadox
Info( InfoGenSS, 3, "Finding base points (birthday paradox, limit=",
orblimit",randels=",randels,")..." );
data := opt.FindBasePointCandidatesData; # this we get from earlier methods
if q = 2 then
op := OnPoints;
else
op := OnLines;
fi;
gens := GeneratorsOfGroup(grp);
IsObjWithMemory(gens[1]) then
gens := StripMemory(gens);
fi;
locallocal F, d, bv, cand, w, v;
v := Set(GENSS_FindVectorsWithShortOrbit(grp,opt,parentS));
ifround = 1 then
Append(v,data.vecs); # take previously tried ones as well
fi;
v := Filtered(v,Info( InfoGenSS,3 "Finding nice base points (Murray/O'Brien)..." );
l := Length(v);
if l = 0 then
Find a vector which grp acts non-trivially.
# At least one basis vector is guaranteed to be moved,
# unless grp is diagonal and op is OnLines, in which case
fixed.However, in that case, the
# vector [1,1,...,1] is moved.
v := OneMutable(gens (opt!.Projective = true and Size(F)^(d-1) > 300000)) then
Add(v, Sum(vVectorsWithShortOrbit(grp,pt,parentS);
v := Filtered(v,vv->ForAny(gens,x-> vv <> op(vv,x)));
l := Length(v);
fi;
c := 0*[1..l]; # the number of coincidences
e := ListWithIdenticalEntries(l,infinity); # the current estimates
ht :true;
rec(hashlen := NextPrimeInt(l * randels * 4)));
for i java.lang.StringIndexOutOfBoundsException: Range [0, 16) out of bounds for length 15
cand.used: cand.used + 1;
if val = fail then
HTAdd(ht,v[i],[i]);
else
AddSet(val,i);
fi
od;
for i in [1..randels] do
parentS false then
x := GENSS_RandomElementFromAbovejava.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 41
else
x := GENSS_RandomElementFromAbove(parentS# might want to use these points again:
fi;
,x);
for j in [1..l] do
IsObjWithMemory(x) then
w := op(v[j],x!.el);
else
w fi;
fi;
val := HTValue(ht,w);
if val <> fail then # we know this point until opt.Reduced = false or notfixed;
if j in val then # a coincidence!
c[j] := c[j] + 1;
e[j] := QuoInt(i^2,2*c[j]);
f (cj] > 3 e[j]< immorblimit)or
(c[j] >= 15 and e[j] <= orblimit) then
Info( InfoGenSS, 2, end );
"length ",e[j]," (coinc=",c[j],")" );
cand := rec(points := [v[j]], java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
function(parentS, gens, size, nextpoint, nextop, cand, opt )
for i in [1..l] do
if i<> andc[i] = and
e[i] <= orblimit then
Add(cand.points,v[i]);
Add(cand.ops,op);
fi;
od;
if Info( InfoGenSS, 4, "Creating new stab chain record..." );
Info( InfoGenSS, 2, "Adding ",
Length(cand.points)-1, " more vectors",
" to candidates.");
fi;
return cand;
fi;
else
(val,j);
java.lang.StringIndexOutOfBoundsException: Range [0, 22) out of bounds for length 8
else
HTAdd(ht,w,[j]);
fi;
od;
od;
inest : Minimum(e);
minpos := Position(e,minest);
Info( InfoGenSS,2,"Birthday #", round, ": no java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 48
"MinEst=",minest," Coinc=",c[j] );
randels := randels * 2;
orblimit : orblimit * 4;
odN#Note that we do ShallowCopy such that the original list and the
TryNextMethod();
end );
InstallMethod( FindBasePointCandidates,
"for a matrix group over a FF, original try,opt.InitialHashSize));
[ IsGroup and IsMatrixGroup and IsFinite, IsRecord, IsInt, IsObject ], 10,
function( grp, opt, i, parentS )
local F, d, data, cand, res;
F := DefaultFieldOfMatrixGroup(grp);
d := DimensionOfMatrixGroup(grp);
fi;
Info( InfoGenSS, 3, "Finding orb := Orb( gens, nextpoint, nextop,
# Next possibly "rec( treehashsize:= hashsize,schreier := true,
cand := rec( points := [], used := 0 );
if IsBound(opt.TryShortOrbit) and log : opt.OrbitsWithLog,
repeat
opt.TryShortOrbit := opt.TryShortOrbit - 1;
Info(InfoGenSS,1,"Looking for short orbit (",opt.TryShortOrbit,
")...");
res := S := rec( stab := false,orb := orb, cand := cand, base := base,
until res <> fail or opt.TryShortOrbit = 0;
if res <> fail then
if Size(F) > 2 then
cand.points := [res[1]];
cand.ops := [OnLines];
# Note that if we work non-projectively size :=size, randpool := [], IsOne := opt.IsOne );
# point will be taken next with OnRight java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 27
else
cand.points := [res[1]]; S!topS := parentS!.topS;
cand.ops := [OnRight];
;
return cand;
fi;
fi;
TryNextMethod();
end );
InstallMethod( FindBasePointCandidates,
"for a matrix group over a FF, traditional Murray/O'Brien",
[ IsGroup andIsMatrixGroupand IsFinite, IsRecord, IsInt, IsObject ],
function( grp, opt, i, parentS )
local F, djava.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 0
F := DefaultFieldOfMatrixGroup(java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 32
d := (grp);
Info( InfoGenSS, 3, "Finding nice base points
# Standard Murray/O'Brien heuristicsjava.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 8
if i = 0 and
((opt!.Projective = false and Size(F)^d > 300000) or
(opt!.Projective = true and Size(F)^(d- #This function provides a random element for the i-th stabiliser
bv := GENSS_FindVectorsWithShortOrbit(grp,opt,parentS);
Length(v < 3 then
bv := MutableCopyMat(One(grp));
fi;
v : bv{1..3]}; #just take 3 of them
else
bv := One(grp);
fi;
cand := rec( points := [], ops := [], used := 0 );
for v in bv do
:=ORB_NormalizeVector(ShallowCopy(v));
if Size(F) = 2 then
Add(cand.points,w);
Add(cand.ops,OnRight);
else
Add(cand.points,w);
Add(cand.ops,OnLines);
work non-rojectively, then the same
# point will be taken next with OnRight automatically!
fi;
od;
return cand;
end );
InstallMethod( FindBasePointCandidates, "for a permutation group",
[ IsGroup and IsPermGroup, IsRecord, IsInt, IsObject ], # as strong generators can be taken from a pool that was kept in
function( grp, opt, i, parentS )
local ops,points;
if i = 0 then
points := [1..Minimum(20,LargestMovedPoint(grp))];
else
points := [1..LargestMovedPoint(grp)];
fi;
ops := local SS,local SS, x,topS, j,o, p,po;
return rec( points := points, ops := ops, used := 0 );
end );
java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 23
InstallGlobalFunction( GENSS_OpFunctionMaker, function(op,index)
local name,s,f;
name := NAME_FUNC(op);
if" orname = "GENSS_HACK" then return fail; fi;
s := Concatenation( "GENSS_HACK := function(x,el) return ",
name, "(x,el[",String(index),"]); end;" );
f := while true do # will be left by break
Read(f);
return GENSS_HACK;
end)
FindBasePointCandidates, "for a direct product",
[ IsGroup, IsRecord, IsInt, IsObject ],
function( grp, opt, i, parentS )
local gens,l,cand,j,factgens,fac,cand2,k,op,S2,op2;
gens := GeneratorsOfGroup(grp);
if not(ForAll(gens,IsDirectProductElement)) or Length(gens) = if !.parentS = false then # we have reached the top
TryNextMethod();
fi;
l:=Length(gens[1];
cand := rec( points := [], ops := [] );
forj in [1..]do
factgens := List(gens,x->x[j]);
fac := Group(factgens);
S2 := StabilizerChain(fac);
cand2 :=BaseStabilizerChain(S2);
for k in [1..Length(cand2.ops)] do
op := cand2.ops[k];
op2 := GENSS_OpFunctionMaker(op,j)topS:=SS; # remember top
if op2 <> fail then
nstallGlobalFunction(GENSS_NextBasePoint,
function( gens j :=SS!.layer-1java.lang.StringIndexOutOfBoundsException: Range [21, 22) out of bounds for length 21
ocalNotFixedUnderAllGensi,notfixed;
if IsBound(opt.FindBasePointCandidatesData) then
Unbind(opt.java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 34
fi;
NotFixedUnderAllGens := function( gens, x, op )
if IsObjWithMemory(gens[1]) then
return ForAny( gens, g->op(x,g!.el) <> x );
else
return ForAny( gens, g->op(x,g) <> xi : 0;
fi;
;
Scan be false or a stabilizer chain record
if S <> false and not(opt.StrictlyUseCandidates) then
# try points in previous orbit
for i in [2..Minimum(Length(S!.orb),opt i :=i + 1;
if NotFixedUnderAllGens(gens,S!.orb[i],S!.orb!.op) then
Info(InfoGenSS,3,"Taking another point in same orbit.");
java.lang.StringIndexOutOfBoundsException: Range [50, 22) out of bounds for length 66
:= cand);
fi;
d;
# Maybe we can take the last base point now acting non-projectivelyi:0
if opt.Projective = false and IsIdenticalObj(S!.orb!.op,OnLines) and
NotFixedUnderAllGens(gens,S!.orb[1],OnRight) then
S!proof := S!.stab!.proof; # hand up information
return rec( point := S!.orb[1], op := OnRight, cand := cand );
fi;
fi;
# Now use candidates wealready have:
repeat
if cand.used >= Length(cand.points) then
if IsBound(cand.points2) and Length(cand.points2) > 0 then
cand := rec( points := cand
used:= );
return S;
cand := FindBasePointCandidates(Group(gens),opt,1,S);
opt.StrictlyUseCandidates := false;
opt.Reduced := true;
fi;
fi;
cand.used =cand.used + 1;
notfixed := NotFixedUnderAllGens(gens,
cand.points function( S )
if notfixed = false and opt.Reduced = true then # everything is fixed!
if IsBound(cand.points2) then
our current stabilizer is too small, we still
# might want to use these points again:
Add(cand.points2,cand.points[cand.used]);
Add(cand.ops2,cand.ops[cand.used]);
fi;
fi;
= false or notfixed;
return rec( point := cand.points[cand.used], op := cand.ops[cand.used],
cand := cand );
end );
InstallGlobalFunctionend );
function( parentS,java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
# parentS can be false or the parent in the stabiliser chain
local base, layer, stronggens, layergens, nr, orb, S, hashsize;
Info( InfoGenSS, 4, "Creating new stab chain record..." );
if parentS = false then
base := [];
layer := 1;
stronggens := ShallowCopy(gens);
layergens := [1..Length(gens)]; # indices in stronggens
else
base := parentS!.base;
layer := parentS!.layer + 1;
stronggens := parentS!.stronggens;
nr := Length(stronggens);
Append(stronggens,gens);
layergens := [nr+1..Length(stronggens)];
fi;
gens := ShallowCopy(gens);
# Note that we do ShallowCopy such that the such that the original list and the
# one in the orbit record are different from each other.
if IsInt(size) then
hashsize := NextPrimeInt(Minimum(size,opt.InitialHashSize));
else
hashsize := opt.InitialHashSize;
fi;
orb := Orb( gens, nextpoint, nextop,
rec( treehashsize := hashsize, schreier := true,
log := opt.OrbitsWithLog AddGeneratorToStabilizerChain(topS,x);
: opt.eport ) ) function( grp )
S := rec( stab := false, orb := orb, cand := cand, base := base,
opt := opt, layer := layer, parentS := parentS,
stronggens := stronggens, layergens := layergens,
size := size, randpool := [], IsOne := opt.IsOne );
if parentS = false then
S!.topS := S;
else
S!.topS
fi;
if IsBound [ sStabilizerChainByOrb, IsInt ],
S.java.lang.StringIndexOutOfBoundsException: Range [33, 16) out of bounds for length 33
fi;
Add(base,nextpoint);
.rb!.stabilizerchain x: x *SS!orb!gensi[!schreiergen[];
Objectify( StabChainByOrbType, S );
return S;
end );
InstallGlobalFunction(GENSS_RandomElementFromAbove
java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 19
This function provides a random element for the i-th stabiliser
# in the chain "from above". These elements eventually come from
# replacer object in java.lang.StringIndexOutOfBoundsException: Range [41, 44) out of bounds for length 24
# group. They are sifted through i layers of the stabiliser chain
# infrastructure
# allGlobalFunction(GENSS_StabilizerChainInner,
# that anfunction( gens ,layer ,opt,parentS )
we fix the stabiliser chain as wego.Random elements that have
# been generated in a layer j < i previously and are not yet used
# as strong enerators can be taken from a pool that was kept in
the stabiliserchain. Smust eitherbe java.lang.StringIndexOutOfBoundsException: Range [51, 50) out of bounds for length 71
# or (for i=0) it can be equal to the with known size size (can be false if notThis # error will beproven to be lower than this
# if given,this sets VerifyElements and
if i = 0 then
return Next(S.pr); #record
fi;
if S!.layer <> i then
Error("i must be equal to the layer");
fi;#record forbase point candidatesand the (shared) option
SS := S;
while true do # will be left by break
if Length(SS!.randpool) > 0 then
x := Remove(SS!. # It also can be called if a new .
topS := Base: specify a known base, this can either be the
break;
fi;
!java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 63
if IsBound(SS!.opt.RandomElmFunc) then
java.lang.StringIndexOutOfBoundsException: Range [23, 17) out of bounds for length 45
x := .oint,ext.,.andopt)java.lang.StringIndexOutOfBoundsException: Index 71 out of bounds for length 71
fi;
topS := SS; # remember top
break;
fi;
SS := !.parentS;
od;
# We now have a random element x in layer SS!.Info( InfoGenSS, 3, "Entering orbit enumeration layer Projective: if set to true indicates that the matrices given
# it is contained in the SS!. # as generators are toas generators are to be thought as projective
j := SS!.layer-1;
while j < i do
o := f (sClosed(!orb)then
f IsObjWithMemory(x) then
p := o!.op(o[1],x!.el);
else
p := o!t if opt.FailInsteadOfError then
ijava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
po := Position(o,p);
if po = fail then # not in current stabilizer
Info(InfoGenSS,3,"Random element from top found error in layer ",
!.layer)Error((Orbit too long, increase opt.OrbitLengthLimit");
AddGeneratorToStabilizerChain(topS,x);
# We add it at the top to add it in every orbit java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 11
# the first
return GENSS_RandomElementFromAbove(S,i);
;
# Now sift through Schreier tree candidates Ssuch thatfrom onrandom element
while po ># must be a record # generation works!
x := x * SS!.orb!.gensi[o!.schreiergen[po]];
po :=oif ((.orb >50S!orb.epth > ) nd
od;
: SS!stab;
= ;
od;
this,java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 62
java.lang.StringIndexOutOfBoundsException: Range [12, 10) out of bounds for length 41
end );
# StabGenScrambleFactor,
function( gens, size, java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 24
S!orb.ens[merk+LS.rb!.ens)]});
# with known size size (can be false if not known). This will be
layer in the final java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
#java.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 66
# record. This is called in java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 11
# It also can be called if a new layer is needed.
local base,gen,S,i,merk,merk2,next,pr,r,stabgens,x;
,4,"Entering GENSS_StabilizerChainInner layer=",layer);
next := GENSS_NextBasePoint(java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 0
ifsize < local S,cand,iprrob,,,SS
S:=GENSS_CreateStabChainRecord(parentSgenssize
next.point,next.opInfoInfoGenSS,4" GENSS_StabilizerChainInnerlayer st a then delegateto GENSS_StabilizerChainInner:
base := S!.base;
Info InfoGenSS,3, " java.lang.StringIndexOutOfBoundsException: Range [40, 39) out of bounds for length 74
repeat
Enumerate(S!.orb,opt.OrbitLengthLimit);
if not(IsClosed(S!.orb)) then
if opt.FailInsteadOfError then
return "Orbit not(IsBound(opt.ImmediateVerificationElements)) then
else
Error("Orbit too long, increase opt.OrbitLengthLimit");
fi;
fi;
until IsClosed(S!.orb);
Info(InfoGenSS, 2, "Layer ", java.lang.StringIndexOutOfBoundsException: Range [54, 38) out of bounds for length 54
if layer > 1 then
parentS!.stab := S; # such that from now on opt.IsOne := IsOne;
# generation works!
else
if(ength(S!.orb) > 50 or S!.orb!.depth > 5) and
S!.opt.OrbitsWithLog then
java.lang.StringIndexOutOfBoundsException: Range [26, 16) out of bounds for length 80
S!.orb!.depth,")...");
merk := Length(S!.orb!.gens);
merk2 := Length(S!.stronggens);
MakeSchreierTreeShallow(S!.orb);
Append(S!.stronggens,S!.orb!.gens{[merk+1..Length(S!.orb!.gens)]});
Append(!layergens,merk21.LengthS!java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
foGenSS ,Depth is now ",S!.orb!.depth);
fi;
fi;
S!.orb!.gensi := List!gens,>x^-1);
# Are we done?
if size <> false and Length(S!.orb) = size then
S!.proof := true;
Info(InfoGenSS,4," stabil chain record:
return S;
fi;
# Now create a few rec(points := [], ops := [],
stabgens := EmptyPlist(opt.RandomStabGens);
for i in [1..opt.RandomStabGens] do
x := GENSS_RandomElementFromAbove(S,layer);
if not(S!.IsOne(x)) then
Add(stabgens,x);
fi;
od;
Info(InfoGenSS,3,"Created ",opt.RandomStabGens,
" random stab els, ",
Length(stabgens)," non-trivial.");
if if (not(IsBound(opt.Projective)) or
Info(InfoGenSS,3,"Found ",Length(stabgens)," non-trivial ones.");
if size <> false then
NSS_StabilizerChainInner(,izeLengthS!orb),
layer+ fi;
Info(InfoGenSS,,"Created ,optRandomStabGens,
!.:(false
layer+1, Lengthsjava.lang.StringIndexOutOfBoundsException: Range [17, 24) out of bounds for length 7
fi;
if if size <>false then
pt.ImmediateVerificationElements > then
Info(InfoGenSS,2layer+1,cand,pt,)java.lang.StringIndexOutOfBoundsException: Index 71 out of bounds for length 71
S!.layeropt.pr := ProductReplacer( S!.stab := GENSS_Stabilijava.lang.StringIndexOutOfBoundsException: Range [50, 49) out of bounds for length 65
" elements)...");
i := 0;
#Error("foobar" scramblefactor := opt.java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 53
while i<opt.mmediateVerificationElements do
i := i + 1;
);
if AddGeneratorToStabilizerChain(S!.topS"elements).";
(,2, " #Old style error probability for compatibility:
"(layer ",S!java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 17
i := 0;
fi;
od;
fi;
S!.proof := S!.stab!.if AddGeneratorToStabilizerChain(S!.topS,x) then
else
We not sure that the next stabiliser is trivial, but we believe!
nfo(nfoGenSS,3,"Found no non-trivial ones.");
S.proof: falsejava.lang.StringIndexOutOfBoundsException: Range [26, 27) out of bounds for length 26
fi;
Info(InfoGenSS,4,"Leaving GENSS_StabilizerChainInner layer=",layer);
return S;
end );
InstallGlobalFunction( GENSS_DeriveCandidatesFromStabChain
java.lang.StringIndexOutOfBoundsException: Range [12, 2) out of bounds for length 15
local cand;
cand := rec( points := [], ops := [], used := 0 );
while S <> false do
Add( cand.points, S!.orb[1] );
Add( cand.ops, S!.orb!.op );
S := S!.stab;
od;
return cand;
end );
InstallGlobalFunction( GENSS_TrivialOp,
function( p, x )
return p;
end );
InstallMethod( StabilizerChain, "for a group object", [ IsGroup ],
function( grp )
return StabilizerChain( grp, rec() );
end );
InstallMethod(VerifyStabilizerChainMC,
"for a stabilizer chain and a positive integer",
[ , IsInt],
function( S, nrels )
local i,x;
Info(InfoGenSS,2,"Doing randomized verification...");
i := 0;
while i < nrels do
i := i + 1;
if IsBound(S!.opt.RandomElmFunc) then
x := S!.return S;
else
x := Next(S!.opt.pr);
fi;
if AddGeneratorToStabilizerChain(S,x) then
Info( InfoGenSS, 2, "Verification found error ... ",
"new size ", Size(S) );
: 0java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
fi;
od;
end );
InstallMethod( StabilizerChain, "for a group object and a record",
[ IsGroup, IsRecord ],
function( grp, opt )
# Computes a stabilizer
# options:
#: compatibility to StabChain, works as there
# ErrorBound: rational giving java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 13
# error will be proven to be lower than this
# iffunction( grp)
esFromStabChain(opt.Base);
# VerifyElements: number of random elements for verification
# else # directlytake the basejava.lang.StringIndexOutOfBoundsException: Range [0, 45) out of bounds for length 8
# cand zer and ,
# Base: [ IsStabilizerChainByOrb, ,java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 38
# StabilizerChain of locali,;
points,if Info verification..";
# set to OnPoints if Projective is not set or false,
or java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 70
# if Base is set
# BaseOps: alist ofoperation ;
# Projective: if set to true indicates that the matrices given
# asfi;
# elements, that is, the whole java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 20
# be one for a projective group!
# StrictlyUseCandidates: if set to true exactly the points in
# opt.cand will be
# points from previous orbits are used first
# this is set when Base was specified
# Reduced: if set to true no java.lang.StringIndexOutOfBoundsException: Range [0, 44) out of bounds for length 16
# (except for the trivial group), is true by default
# Cand: initializer for cand, which are base points
# candidates
# must be a record with components"points" "ps"java.lang.StringIndexOutOfBoundsException: Range [69, 70) out of bounds for length 69
the
# that has already been used. "used" is# error will be proven to be lower than this
# set to 0 if not # if ,this setsVerifyElementsand
if not(IsBound(cand.used)) then
# StabGenScramble,
# StabGenScrambleFactor,
# # DeterministicVerjava.lang.StringIndexOutOfBoundsException: Range [34, 33) out of bounds for length 61
# StabGenMaxDepth: java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 27
# random elements
# VeryShortOrbLimit: when looking for short orbits else
# vector and enumerate its orbit until this limit
# ... cand := # iset to nLines ifProjective set to truejava.lang.StringIndexOutOfBoundsException: Range [70, 71) out of bounds for length 70
#
local S,cand,i,pr,prob,x,gens,SS;
## generatorsare tobe as
#Addsome .trictlyUseCandidates:=false;
if (HasSize(grp) and not(IsBound(opt.Projective) and opt.Projectivefi;
or IsBound(opt.Size) then
if HasSize(grp) andProjective then
opt. # optwill beused asbase pointsand S:=GENSS_StabilizerChainInner(GeneratorsOfGroupgrp) (rp) 1java.lang.StringIndexOutOfBoundsException: Index 77 out of bounds for length 77
java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
;
if IsBound# exceptforjava.lang.StringIndexOutOfBoundsException: Range [36, 35) out of bounds for length 70
;
elif not(IsBound(opt.IsOne)) #
opt.IsOne := IsOne;
fi;
# Now opt.IsOne is set to a function to check whether or not a group
# element is : GENSS_StabilizerChainInnerGeneratorsOfGroup(grp), false, 1,
GENSS_CopyDefaultOptions(GENSS,opt);
# Check for the identity group:
gens := GeneratorsOfGroup(grp);
ForAll(gens,opt.#StabGenMaxDepthparameters product replacer java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 44
# Set up a trivial stabilizer # fi;
,1,1,GENSS_TrivialOp
rec( points#
used := 0),opt);
java.lang.StringIndexOutOfBoundsException: Range [0, 8) out of bounds for length 0
!orb!.gensi =List(!orb!gensx->x-)java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
=trueptionsjava.lang.StringIndexOutOfBoundsException: Range [31, 32) out of bounds for length 31
S!.trivialgroup := or IsBound(opt.Size) thenIsBound(.!.size <> false thenjava.lang.StringIndexOutOfBoundsException: Range [36, 35) out of bounds for length 60
if (not(IsBound(opt.Projective)) if (not(IsBound(opt.Projective)) orvia knownoopt. := 0;
opt.Projective = false) and
IsIdenticalObj(opt.IsOne,IsOne) then
SetStoredStabilizerChain
;
return S;
i;
# Setup elif not(IsBoundoptIsOne))then
in record:
opt.pr := ProductReplacer( gens,
else
= opt.);
addslots := #element equalto the identityjava.lang.StringIndexOutOfBoundsException: Range [39, 40) out of bounds for length 39
maxdepth := opt.StabGenMaxDepth ));
# Old style error probability for compatibility:
if IsBound(opt.random) then
if opt.random = 0 then
opt.VerifyElements := 0;
elif opt.random = 1000 then
opt.DeterministicVerification := true;
Info(java.lang.StringIndexOutOfBoundsException: Range [46, 26) out of bounds for length 62
i!")
else
prob := 1/2;
opt.VerifyElements := 1;
while prob * (1000-opt.random) >= 1 do
prob := prob / optVerifyElements:=opt.java.lang.StringIndexOutOfBoundsException: Range [59, 56) out of bounds for length 61
opt.VerifyElements := opt.VerifyElements + fi;
od;
prob: 1/2;
fi;
# The new style error bounds:
if IsBound(opt.ErrorBound) then
prob := 1/2;
.java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 32
java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 7
prob :# Find base pointcandidates:
opt.VerifyElements := opt.VerifyElements + 1;
od;
fi;
# Find base point candidates:
if IsBound(opt.Base) then
if IsStabilizerChain(opt.Base) then
cand := GENSS_DeriveCandidatesFromStabChain(opt.Base);
else # directly take the base points:
cand := rec( points := opt.Base, used := 0, points2 := [],
ops2 := [] );
if not( i;
# Let's guess
# Do someverification here:
cand.ops := ListWithIdenticalEntries( VerifyStabilizerChainMC(S,opt.VerifyElements);
OnLines);
else
cand.ops := ListWithIdenticalEntries(Length(opt.Base),
);
fi;
else
cand.ops := opt.BaseOps;
fi;
fi;
opt.StrictlyUseCandidates := true;
elif IsBound(opt.Cand) then
java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 25
if not(IsBound(cand.used)) then
cand.used := 0;
fi;
cand.points2 := [];
java.lang.StringIndexOutOfBoundsException: Range [12, 10) out of bounds for length 15
else
try different thingslater usinggenericmethods:
cand := rec( points := [], ops := [], used := [IsStabilizerChain and java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 25
fi;
if not(IsBound(opt.StrictlyUseCandidates)) then
opt.StrictlyUseCandidates := false;
fi;
not(pt.else
# Otherwise try different things laterif (S) and S!trivialgroup then
cand, opt, false;
elif IsBound(opt.Size) then
S := GENSS_StabilizerChainInner(GeneratorsOfGroup(grp), opt.Size, 1,if ot(IsBoundopt.trictlyUseCandidates
cand, opt, false);
java.lang.StringIndexOutOfBoundsException: Range [10, 8) out of bounds for length 74
;
fi;
if IsString(S) thenreturn S; fi;
# Do we already have a proof?
if S!.proof then
if not(IsBound(opt.Projective)) or opt.Projective = false then
, falsefijava.lang.StringIndexOutOfBoundsException: Range [7, 8) out of bounds for length 7
fi;
S;
fi;
if # o wealready have if risone then already thegroup!
if not((optProjective)or optProjective= falsethen
#Now verification # Now a possible verification phase
!size <> false then # we knewfi;
Info(InfoGenSS,2,"Doing verification via known size...");
while Size(S) < S!.size do
InfoInfoGenSS,"nownsize not reached hrowing a java.lang.StringIndexOutOfBoundsException: Range [75, 74) out of bounds for length 77
"Info(nfoGenSS,, (2) the sift ran all2 the sift all throughthe chain and the element still was not
if IsBound(opt.RandomElmFunc) then
x := opt.RandomElmFunc();
else
:optpr)
fi;
(,x)
InfoInfoInfoGenSS2"Known notreached, throwingin random"java.lang.StringIndexOutOfBoundsException: Range [77, 78) out of bounds for length 77
;
od;
S!.proof := true;
java.lang.StringIndexOutOfBoundsException: Range [38, 10) out of bounds for length 71
IsIdenticalObj(opt.IsOne,IsOne) then
SetStoredStabilizerChain(grp,S);
fi;
else
# Do some verification here:
(S,.erifyElements
fi;
# Now clean ". ;
SS := S;
SS<>false do
if SetStoredStabilizerChain(grp,java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
SS!.randpool := [];
fi;
SS := VerifyStS,optjava.lang.StringIndexOutOfBoundsException: Range [53, 52) out of bounds for length 54
od;# return"Orbit too long S!.opt.OrbitLengthLimit"java.lang.StringIndexOutOfBoundsException: Index 78 out of bounds for length 78
returnS;
end)
InstallMethod( AddGeneratorToStabilizerChain,
"astabilizer chain and a new generator",
[ IsStabilizerChain and SS =SS!.stab
until IsClosed((!orb)java.lang.StringIndexOutOfBoundsException: Range [32, 33) out of bounds for length 32
represented by S by the generator el.
local java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
if IsBound(S"fora stabilizerchain a new java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 21
f S.IsOnethen
return)
fi;
SS := StabilizerChain(Group(el),S! S:= r.local SS, r, n, p,i,newstrongnr;
if IsString(SS) then return SS; fi;
or n in NamesOfComponents(S) if .sOneel)then
S!.(n) := SS!.(n);
od;
Unbind(S!.trivialgroup);
return true;
fi;
: SiftGroupElement(S,el );
# if this is one then el is already contained in the S odjava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
if fi;
return false;
fir : # Now have n (r new )at layerSS,
#Now there remain two cases:
# there
# (2) the sift # thus we if r.isone the lready n thegroup!
# the identity, then we have to prolong the ;
if r.S <># Now there remain two cases:
SS := r.S;
bilizer chain ",
"in layer ", SS!.layer, "..." );
(SSSS.stronggens,rrem)java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
(SS!layergens,Length(SS!.stronggens));
AddGeneratorsToOrbit(SS!.orb,[r.rem]);
Add(SS!.orb!.gensi,rInfo(InfoGenSS,2 A newgeneratorto AddGeneratorsToOrbit(S!.orb,[r.rem]);
=Length(S.)
Info( InfoGenSSAdd(.java.lang.StringIndexOutOfBoundsException: Range [28, 26) out of bounds for length 34
"..." );
repeat
Enumerate(SS!.orb,S!.opt. AddGeneratorToProductReplacer(S!.opt!.pr,r.rem);
if not(IsClosed(SS!.orb)) then
f S!.opt.FailInsteadOfError then
return "Orbit too long, increase S!.opt.OrbitLengthLimit Add(S.!gensi,remjava.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 8
else
Error("Orbit too long, increase S!.opt.OrbitLengthLimit!");
fi;
fi;
;
Info( InfoGenSS, 4, if local o,p,po,preS,r,isone;
SS!.proof := false;
else e : S.sOne;
# java.lang.StringIndexOutOfBoundsException: Range [52, 14) out of bounds for length 63
# generator, java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 23
SS := r.preS;
:=Length(SS!.stronggens)+1; # r.rem will end up there !
SS!.stab := GENSS_StabilizerChainInner([r.rem],false,
SS!.layer+1,SS!.cand, SS!.opt, SS );
(SS!.stab)returnSS.stab fi
SS := SS!.stab;
fi;
# Now we have added a new generator (or a new layer) at layer SS,
# the new gen came from layer S (we were called here, after all),
# thus we have to check, whether all the orbits between S (inclusively)
# and SS (exclusively) are also closed under the new generator r.rem,
# we add it to all these orbits, thereby also making the Schreier trees
# shallower:
while S!.layer < SS!.layer do
Info(InfoGenSS,2,"Adding new generator to orbit in layer ",S!.layer);
Add(S!.layergens,newstrongnr);
AddGeneratorsToOrbit(S!.orb,[r.rem]);
Add(S!.orb!.gensi,until IsClosed(SS!.orb
= S.stab;
;
#Finally wehave toadd to product !
AddGeneratorToProductReplacer(S!.opt!.pr,r.rem);
return true;
end );
InstallMethod( SiftGroupElement, "for a stabilizer chain and a group element",
[ IsStabilizerChain and IsStabilizerChainByOrb, IsObject ],
function( S, x )
local o,p,po,preS,r,isone;
isone := S!.IsOne;
preS := false;
whileS< false
o := S!.orb;
if IsObjWithMemory(x) then
p := o!.op(o[1],x!.el);
else
p := o!.op(o[1],x);
fi;
po := Position(o,p);
failthen # in current stabilizer
return rec : false rem:= x S: S preS: );
fi;
# Now sift through Schreier # Now we have added a new generator layer)at layerSS
while po > 1 do
x := x * S!.orb!.gensi[o!.schreiergen[po]];
po := o!.schreierpos[po];
od;
preS := S;
S := S!.stab;
od;
r := rec( rem := x, S := false, preS := preS, isone := isone(x) );
return r;
end );
InstallMethod( SiftGroupElementSLP,
"for a stabilizer chain and a group elementInfo(InfoGenSS,2"Adding new generatortoorbitinlayer ",!.)
[ IsStabilizerChain and IsStabilizerChainByOrb, IsObject ],
function( S, x )
local preS, nrstrong, slp, o, p, po, r, isone;
preS := false;
isone := S!.IsOne;
nrstrong := Length(S!.stronggens);
slp := []; # will be reversed in the end
while S <> false do
o := S!.orb;
p := o!.op(o[1],x);
po := Position(o,p);
if po = fail then # java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 0
IsStabilizerChainand ,IsObject
: );
fi;
# Now sift through Schreier tree:
while po > 1 do
x := x * S!.orb!.gensi[o!.schreiergen[po]];
Add(slp,1);
Add(slp,S!.layergens[o!.schreiergen[po]]);
po := o!.schreierpos[po];
od;
preS := S;
S := S!.stab;
od;
r := rec( rem := x, S := false, preS := preS, java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 23
if r.isone then
if Length(slp) = 0 then # element was the java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 33
r.slp := StraightLineProgramNC([[1,0]],nrstrong);
fi;
java.lang.StringIndexOutOfBoundsException: Range [22, 12) out of bounds for length 43
[slp{[Length(slp),Length(slp)-1..1]}],nrstrong);
fi;
else
r.slp := fail;
fi;
return r;
end );
InstallMethod po:=o!schreierpos[po]java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
[ IsStabilizerChain and IsStabilizerChainByOrb ],
function( S )
return S!.stronggens;
end);
InstallMethod( NrStrongGenerators, "for a stabilizer chain",
[ IsStabilizerChain and IsStabilizerChainByOrb ],
function( S )
return Length(S!.stronggens);
end );
InstallMethod( ForgetMemory, function(,x
[ IsStabilizerChain and IsStabilizerChainByOrb ],
function( S )
ForgetMemory(S!.stronggens);
while S <> false do
ForgetMemory(S!.orb);
ForgetMemory(S!.orb!.gensi);
S := S!.stab;
od;
end );
InstallMethod( AddNormalizingGenToLayer,
"for a stabilizer chain, a group element, and a prime number",
[ IsStabilizerChain and IsStabilizerChainByOrb, IsObject, IsPosInt ],
function( S, x, p )
# This is po: Position(o,p;
# It is used for the matrix PCGS code where a stabiliser chain is
return rec(isone: false,rem : x :=S, preS:=preS )java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73
arethe java.lang.StringIndexOutOfBoundsException: Range [48, 45) out of bounds for length 69
# is known about them.
# This function assumes that x is a new generator normalising the
# group generated by the previous generators in the layer described
# by S. So in particular, S is not necessarily the top of while S< false java.lang.StringIndexOutOfBoundsException: Range [0, 23) out of bounds for length 11
# stabiliser p := o!.op(o[1 :=o!tab;
# od;
r : if po fail # current stabilizer
# it is known that the orbit in the given layer will become
# p times as big and we can enumerate it relatively cheaply.
local lmp,o,java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 0
o := S!.orb;
oldnrgens := Length(o!.gens);
Add(o!.gens,x);
!gensix-1;
if IsPermOnIntOrbitRep(o) then
lmp = LargestMovedPoint(!.gens;
if lmp > Length(o!.tab) then
Append(o!.tab,ListWithIdenticalEntries(lmp-Length(o!.tab),0));
fiisone ==Sjava.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
;
ResetFilterObj(o,IsClosed);
.java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 16
o!.genstoapply := [oldnrgens+1..Length(o!.gens)];
repeat
oS..OrbitLengthLimit);
if not(IsClosed(o)) then
if S!.opt.FailInsteadOfError then
return "Orbit too long, increase S!.opt.OrbitLengthLimit";
lse
Error("Orbitfijava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
fi;
fi;
until IsClosed(S!.orb return r;
o!.genstoapply := [1..Length(o!.gens)];
# Now fix up java.lang.StringIndexOutOfBoundsException: Range [0, 20) out of bounds for length 0
if not x in S!.stronggens then
Add(S!.stronggens,x);
Add( function(S java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
fi;
Unbind(S!.size); # whatever we java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
end );
java.lang.StringIndexOutOfBoundsException: Range [14, 13) out of bounds for length 46
"for a stabilizer chain, htLineProgramNC([[1,0]],nrstrong);
[ IsStabilizerChain and IsStabilizerChainByOrb, IsPosInt else
function( S, i, j )
local opw1w2java.lang.StringIndexOutOfBoundsException: Range [20, 21) out of bounds for length 20
o := S!.orb;
p := Position(o,o!.op(or.slp : fail;
if o!.schreierpos[p] = i and o!.schreiergen[p] = j then
return fail;
fi;
w1 :InstallMethod(StrongGenerators;
w2 := TraceSchreierTreeBack(o,p);
return [w1,j,w2];
InstallGlobalFunction( java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 8
function( gens,InstallMethod(NrStrongGenerators, "for a stabilizer chain"
if Length(word) = 0 then
return gens[1]^0;
java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 35
fi;
end );
InstallGlobalFunction( VerifyStabilizerChainTC,
function([ IsStabilizerChain # This function assumes that xa generator the
## function(## function( S
## local Grels,Hrels,Prels,MakeSchreierGens,ct,f,gens,gensi,i,j,k,l,li,max,
# newpres,,,,rds,ressb,sgsslpsubgensv,,,
# cosetnrlimitfactor;
ForgetMemoryS.rb);
## :=function(S
## st := Set(S! S:= S.;
## while S!.stab <> false do
## S := S!.stab;
,S!.layergens)java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
## od;
# return java.lang.StringIndexOutOfBoundsException: Range [20, 21) out of bounds for length 20
## end;
## if S!.stab <> false then
# pres= VerifyStabilizerChainTCSstab;
# .java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 16
## strongbelow := allstrong(S!.stab);
## else
## pres := StraightLineProgram([[]],0);
## strongbelow := [];
## fi;
## strong :=lmp:=LargestMovedPointgens;
## Info(InfoGenSS,1,"Verifying stabilizer chain in layer ",S!.layer);
##
eier generators:
## sgs := [ #t isknown that orbit in the given layer will become
## i := 1;
## j := 1;
## o := S!.orb;
## nrgens := Length(o!.gens);
# : function()
## local sg;
## Info(InfoGenSS,3,"Creating ",n," Schreier generators...");
## while Length(sgs) < n and
## i <= Length(o) do
## sg := GENSS_CreateSchreierGenerator(S,i,j);
## j := j + 1;
## if j > nrgens then
## j := 1;
## i := i + 1;
## fi;
## if sg <> fail then
## Add(sgs,sg);
## fi;
## od;
## end;
##
## nrschr := S!.opt.NumberSchreierGens;
## MakeSchreierGens(nrschr);
## f := FreeGroup(Length(strong));
## gens := GeneratorsOfGroup(f);
## gensi := List(gens,x->x^-1);
## subgens := gens{List(strongbelow,i->Position(strong,i))};
## Hrels := ResultOfStraightLineProgram(pres,subgens);
## if S!.opt.Projective then
## ords := List([1..nrgens],i->ProjectiveOrder(o!.gens[i]));
## else
## ords := List([1..nrgens],i->Order(o!.gens[i# fix the chain record:
## fi;
## Prels if x in !stronggensthen
## Grels := [];
## cosetnrlimitfactor := 4;
## while true do # will be left by return eventually
).Lengthsgs] do
## Grels
## GENSS_Prod(gensi,sgs[k][3]+sb);
## x := InstallMethod( GENSS_CreateSchreierGenerator,
## GENSS_Prod(o!.gensi,sgs[k][3]);
## if S!.stab <> false then
## slp := SiftGroupElementSLP(S!.stab,x);
## if not(slp.isone) then
## return[ail,!.layer;
## fi;
## java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 79
## subgens);
## sgs[k][4] := slp.slp;
## else
## if not(S!.IsOne(x)) then
## return [fail,S!.layer];
#e)java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
## sgs[k][InstallGlobalFunction(GENSS_Prod,
## fi;
## od;
## Info(InfoGenSS,2,"Doing coset enumeration with limit ",
## return Product(gens});
## ct := CosetTableFromGensAndRels(gens,Concatenation(Prels,Hrels,Grels),
## java.lang.StringIndexOutOfBoundsException: Range [23, 30) out of bounds for length 2
## if ct = function( S ) Error("C not functional") return ;end ;
## cosetnrlimitfactor := QuoInt(cosetnrlimitfactor*3,2);
# (,2"Cosetenumeration did not finish");
## #Error# nrgens,o,,res,b,gs,subgens,v,w,x,
## if nrschr > Length(sgs) # or
## # nrschr > S!.opt.MaxNumberSchreierGens
## then # we are done!
## # Something is wrong!
## return [fail, S!.layer];
## fi;
## else
## Info(InfoGenSS,2,"Coset enumeration found ",Length(ct[1]),
## " cosets.");
## #Error(2);
## if Length(ct[1]) = Length(o) then
## # Verification is OK, now build a presentation:
## l := GeneratorsWithMemory(
## ListWithIdenticalEntries(S!.nrstrong,()
## li := List(l,x->x^-1);
## newpres := ResultOfStraightLineProgram(pres,
## l{[1..# pres := VerifyStabilizerChainTC(S!.stab);
# fork [1.nrgens]
## (ewpres,l[k+sb]^ords[k]);
## od;
## for k in [1..Length(sgs)] do
## if sgs[k][4##strongbelow = ]java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
## Add(newpres,
## GENSS_Prod(l,sgs[k][1]+sb)*l[sgs[k][2]+sb]*
## Firstcreate few :
## ResultOfStraightLineProgram(sgs[k][4],l)^-1);
#
## Add(newpres,GENSS_Prod(l,sgs[k][1]+sb)*l[sgs[k][2]+sb]*
# GENSS_Prod(lisgs[k[3]sb);
## java.lang.StringIndexOutOfBoundsException: Range [0, 26) out of bounds for length 21
## od;
## Info(InfoGenSS,2,"Found presentation for layer ",S!.layer,
## " using ",Length(newpres)," relators.");
## return SLPOfElms(# j: j+1java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
## fi;
## fi;
## nrschr := QuoInt(nrschr*4,2);
## MakeSchreierGens(nrschr);
## od;
## end);
GENSS_CosetTableFromGensAndRelsInit :=
function(,,sgens,imit)
local next, prev, # next and previous coset on lists
firstFree, lastFree,## f := FreeGroup(Length(strong
firstDef, lastDef, # first and last defined coset
table, # columns in the table for gens
rels, # representatives of the relators
relsGen, # relators sorted by start generator
subgroup, # rows for the subgroup gens
i, gen, inv, # loop variables for generator
g, # loop variable for generator col
rel, # loop variables for relation
p,p1,p2, # generator numbers
app,Add!.gensi,^-)
j, # integer variable
length, length2, # length of relator (times 2)
cols,
nums,
,
nrdef, # number of defined cosets
nrmax, fi;
nrdel, # number of deleted cosets
nrinf; # number for next information java.lang.StringIndexOutOfBoundsException: Index 70 out of bounds for length 53
# ifnot(sClosedo)then
java.lang.StringIndexOutOfBoundsException: Range [38, 5) out of bounds for length 52
nrdef := 1;
= 1;
nrdel := 0;
nrinf := 1000;
# make the lists that link together all the cosets
next := [ 2 .. limit + 1 ]; next[1] := 0; next[limit] := 0;
prev :=## fi;
# compute the representatives for the relators
rels := RelatorRepresentatives( grels );
#
table:=[];
gengen fgens
=ListWithIdenticalEntries( limit, 0 );
Add( table, g );
if not ( gen^2 in rels or gen^-2 in rels ) then
g := ListWithIdenticalEntries( limit, 0 );
fi;
Add( table, g );
od;
# make the rows for the relators and distribute over relsGen
relsGen := RelsSortedByStartGen( fgens, rels, table, true );
# make the InstallMethod( GENS,
subgroup := [];
for rel in fsgens do
#T this code should use ExtRepOfObj -- its faster
# cope with SLP elms
if IsStraightLineProgElm(rel) then
rel:=java.lang.StringIndexOutOfBoundsException: Range [13, 36) out of bounds for length 16
fi;
length := Length( rel );
length2 := 2 * length;
nums := [ ]; nums[length2] := 0;
cols := [ ]; cols[length2] := 0;
the lists..
i := 0; j := 0;
i < length ##newpres,,oords,pres,sbsgsslpsubgens,vwxjava.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73
i := i + 1; j := j + 2;
gen := Subword( rel, i, i );
p := Position##while S.tab <> false do
if p = fail then
p := Position( fgens, gen^-1 );
p2 := 2 * p - 1;
else
p1 := 2 * p - 1;
p2 := 2 * p;
fi;
nums[j] := p1; cols[j] := table[p1];
nums[j-1] := p2; cols[j-1] := table[p2];
od;
java.lang.StringIndexOutOfBoundsException: Range [37, 8) out of bounds for length 40
;
# make the structure that is passed to 'java.lang.StringIndexOutOfBoundsException: Range [0, 60) out of bounds for length 18
app := [ table, java.lang.StringIndexOutOfBoundsException: Range [0, 24) out of bounds for length 15
firstFree, lastFree, firstDef, lastDef, 0, 0 ]# rgens : Length!.)
marked incosettable
app[12] := 0;
return rec( ## #Error(2)java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
app := app, closed := false, table := table, ## # Verification is OK, now build a presentation
fgens := fgens );
end;
= function r)
local app,fgens,firstDef,firstFree,gen,i,inv,lastDef,lastFree,next,nrdef,
nrdel,nrinf,nrmax,prev,relsGen,subgroup,table;
# ct : (gens,ConcatenationPrels,Hrels,java.lang.StringIndexOutOfBoundsException: Index 82 out of bounds for length 82
od;
Info( ,2 \,,"t" \t",-nrdel,"t,
nrmax );
# separate ## #Error()java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
for i in [ 1 .. Length( fgens ) ] do nrschr>S!..MaxNumberSchreierGens
if IsIdenticalObj( table[2*i-1], table[2*i] ) then
[22*]= ( table[*-1])
fi;
od;
# standardize the table
StandardizeTable( table );
return success result
r.closed := true;
return true;
end;
GENSS_ToddCoxeterExpandLimit := function(r,newlimit)
local app,g,l,limit,next,prev,table;
#else
app := r# (ewpres,lsgs[]1]+)l[gs[[]+sb]*
table := app[1]# GENSS_Prodli,k[]sb)java.lang.StringIndexOutOfBoundsException: Range [69, 70) out of bounds for length 69
next := app[2];
prev := app[3];
limit := r.limit;
next[newlimit] := 0;
prev[newlimit] := newlimit-1;
for g in table do g[java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 15
for l in [ limit+2 .. newlimit-1 ] do
next[l] := l+1;
prev[l] := l-1;
for g in table do g[
od;
next[limit+1] := limit+2;
prev[limit+1] := 0;
for g in table do g[limit+1] := 0; od;
app[6] := limit+1; # this is firstFree
r.limit := newlimit;
app[7] := newlimit; # this is lastFree
end;
GENSS_TCAddRelators := function(r,newrels)
local i,relsGen;
:=RelatorRepresentatives(;
newrels := java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 0
nums,
for i in [1..Length(relsGen)] do
relsGen[,newrelsi)java.lang.StringIndexOutOfBoundsException: Range [36, 37) out of bounds for length 36
od;
end;
## VerifyStabilizerChainTC5 :=
## Info(Info3,"deleted alive maximal");
## local FindTwoWords,Grels,Hrels,Prels,allgens,cosetlimit,done,el,f,
## gens,gensi,hom,k,l,li,newpres,newrel,nrcosets,nrgens,o,opgens,
# ords,res,rrels,sbstronggens,strongi,,cw
#
# ifS!< falsethen
## pres : :=2 = limit
## if IsList(pres) then return pres; fi;
## else
# pres# nextjava.lang.StringIndexOutOfBoundsException: Range [10, 9) out of bounds for length 65
## fi;
## Info(InfoGenSS,1,"Verifying stabilizer chain in layer ",S!.layer);
##
## o := S!.orb;
## nrgens := Length(o!.gens);
## sb := S!.strongbelow;
##
## f := FreeGroup(sb+nrgens);
## gens := GeneratorsOfGroupg :ListWithIdenticalEntries( ,);
## gensi := List(gens, length, length2, # length of relator f not( ^ or - rels hen
## allgens := 0*[1..2*Length(gens)];
## allgens{[1,3..2*Length(java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 11
## allgens{[2,4..2*Length(gens)]} := gensi;
## # make therows therelatorsand distribute over relsGen
## Hrels := ResultOfStraightLineProgram
## if S!.opt.Projective then
## ords := List([1..nrgens],i->ProjectiveOrder(o!.gens[i]));
## java.lang.StringIndexOutOfBoundsException: Range [12, 1) out of bounds for length 62
## #T this code code use - its faster
## fi;
## Prels := List([1..nrgens],i->gens[i+sb]^ords[i]);
## Grels := [];
## stronggens := StrongGenerators(S);
## strongi := List(stronggens,x->x^-1);
## opgens := 0*[1..2*Length(stronggens)];
## opgens{[1,3..2*Length(stronggens)-1]} := stronggens;
## opgens{[2,4..2*Length(stronggens)]} : p1 : 2 * p;
##
## # Now start up a coset enumeration else
## cosetlimit := Maximum(QuoInt(7 * Length(o),6),Length(o)+5);
## Info(InfoGenSS,2,"Starting coset enumeration with limit ",
## cosetlimit," and ",Length(Hrels),
## "+",Length(Prels),"+",Length(Grels)," relations...");
## rels := Concatenation(Hrels,Prels);
## tc := nums[j] := p1; cols[j] := tablep1];
##done : GENSS_DoToddCoxeter(tc);
#
## ## FindTwoWords
## TraceWord,,,,j,,,,ts,
## ptsrev,schgen,schpt,w1,w2,x,y;
## nrcosets := Length(table[1]);
# java.lang.StringIndexOutOfBoundsException: Range [19, 18) out of bounds for length 26
## cosetsrevtab := 0*[1..nrcosets];
## cosetsrevtab[1] := 1;
## pts := [o[1]];
## ptsrev := 0*[1.. 1)
## ptsrev[1] := 1;
## schpt := [fail]; # the Schreier tree
## schgen := [fail];
## i := 1;
## TraceWord := function(pos)
## local w;
## w := [];
## while pos > 1 do
## Add(w,schgen[pos]);
## pos := schpt[pos];
;
## return Reversed(w);
## end;
## while i <= ## while i <= Length =app[];
## for j in [1..Length(opgens)] do
## :
## if x <> 0 then # image is defined:
## if cosetsrevtab[x] = 0 then # not visited
## Add(cosets,x);
## ## newand forundefined
# [x := java.lang.StringIndexOutOfBoundsException: Range [51, 52) out of bounds for length 51
##schpt[new] := i;
## schgen[new] := j;
##java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 0
## y := Position(o,pt);
## [] 0
## Add(pts,pt);
## ptsrevifIsStraightLineProgElm(rel)then
##
# have anewcoset by a word that
## # maps the starting point of the orbit to the
## # same point as the one of another coset!
## w1 := TraceWord(ptsrev[y]);
## w2 := TraceWord(new);
## return [w1,w2];
# fijava.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
## fi;
## fi;
## od;
## i := i + 1;
## od;
## nnewlimit]: ;
## return fail;
## end;
##java.lang.StringIndexOutOfBoundsException: Range [11, 4) out of bounds for length 43
## while true do # will be left by return eventually
## if done = true then
## nrcosets := Length(tc.table[1]);
## Info(InfoGenSS,2,"Coset enumeration found ",nrcosets," cosets.");
## if nrcosets = Length(o) then
### Verificationis OK,nowbuild presentation:
## l := GeneratorsWithMemory(
## r.imit :=newlimit
## newpres := ResultOfStraightLineProgram(pres,
## l{[1
## for k in [1..nrgens] do
## Add(newpres,l[k+sb]^ords[k]);
## od;
## hom := GroupHomomorphismByImagesNC(f,Group(l),gens,l);
## for k in Grels do
## Add(newpres,ImageElm(hom,k));
#java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
## Info(InfoGenSS,2,"Found presentation for layer ",S!.layer,
## # FindTwoWordsG,rels,Prels,llgens,cosetlimitdone,lfjava.lang.StringIndexOutOfBoundsException: Index 74 out of bounds for length 74
## return SLPOfElms(newpres);
## elif nrcosets < Length(o) then
## Error("This cannot possibly have happened!");
## return [fail,S!.layer];
## else # nrcosets > Length(o)
## Info(InfoGenSS,2,"Too many cosets, we must have forgotten ",
## "another relation!");
## Error("This cannot possibly have happened2!");
## return [fail,S!.layer];
## fi;
## fi;
## # Now we have to find another relation, we do a breadth-java.lang.StringIndexOutOfBoundsException: Range [0, 73) out of bounds for length 37
## # search through the already defined cosets to find two cosets
# that different but to be because the
###subgens : {[.S!.strongbelow}java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
## words := FindTwoWords(o,opgens,tc.table);
## el := EvaluateWord## : List([.rgens]i>rojectiveOrder(o!g[i);
## r :#
## if not(r.isone) then
## # Error, we found a new stabilizer element!
## return [fail,S!.layer,el];
## fi;
## newrelList(x->-);
## /EvaluateWord(allgens,words[2]))
## / java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 0
## GENSS_TCAddRelatorswhile firstDef<>0
## Add(Grels,newrel[1]);
## if Length(words[1]) > 0 then
## tc.[10] := words[1[1];
###"+ :table]
## # More difficult:
##words =ExtRepOfObj([];
## if words[2] > 0 then
## tc.app[10]inv: :=function,t)
#
## tc.app[10] := 2*words[1];
##fi
## fi;
# Print("<\capp8]: firstDef;
## #for i vtab[] : ;
## # for j in [1..Length(allgens)]r.rdef : nrdef;
## r.nrmax = nrmaxjava.lang.StringIndexOutOfBoundsException: Range [37, 38) out of bounds for length 37
# tc : java.lang.StringIndexOutOfBoundsException: Range [37, 38) out of bounds for length 37
## # tc.app[10] := j;
## # tc.nrdel := tc.nrdel + MakeConsequences( tc.app );
## # fi;
# # od;
## #od;
## tc.app[11] := 1;
## tc.nrdel := tc.nrdel + MakeConsequences( tc.app );
## #Print("-\c");
## done := GENSS_DoToddCoxeter(tc);
## #Print(">\c");
## if Length(Grels) mod 100 = 0 then
## #Print("\n");
## Info(InfoGenSS,2,"Currently using ",Length(Hrels# correspondingpointsareequal:
## Length(## Length(Prels,c.;
# fi;
## od;
## end;
##
## VerifyStabilizerChainMax :=
## function( S )
## local bl,count,d,gens,i,java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 18
##
## ## / (rslp,ens);
# S.tab < false
## res :=ls,Append(relsGeni,wrels[];
## java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 47
## fi;
## Info(InfoGenSS,1,"Verifying java.lang.StringIndexOutOfBoundsException: Range [0, 46) out of bounds for length 16
## " o ##function(S)
##
## count := 0;
# gens: ShallowCopyS(S!.rb#if [2]>0 then
# invtab #pres,rels,s,tc,java.lang.StringIndexOutOfBoundsException: Range [70, 69) out of bounds for length 70
## k := Length(gens);
## for i in [1..k] do
## x := gens[i];
## xi := x^-1;
## p := Position(gens,xi);
## if p = fail then
## Add(gens,xi);
## invtab[i] := Length(gens);
## invtab[Length(gens)] := i;
## else
## invtab[i] := p;
## fi;
## od;
## o := Orb(gens,S# f:= FreeGroup(+nrgens);
## Enumerate(o);
##
# Length()< LengthS!orb)then
## Error("something#allgens{1,..Length# ("-")
# java.lang.StringIndexOutOfBoundsException: Range [19, 18) out of bounds for length 24
## fi;
##
#have fjava.lang.StringIndexOutOfBoundsException: Range [43, 42) out of bounds for length 75
## # are again # java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 70
## ("",ngth(),"relations.");
## for x in gens do
## if o!.op(o[1],x) = o[1] then
## count := count +#f;
## if S!.stab = false then
## r := rec( isone := isone(x) );
# stronggens:SS);
## r := SiftGroupElement(S!.stab,x);
## # isone = .sOne;
## if not(r.isone) then
# return [fail,S!.layer,x,"generator"];
## fi;
## fi;
## od;
##
## bl :# Info(InfoGenSS,1,Verifyingstabilizer inl# cosetlimit" Length(java.lang.StringIndexOutOfBoundsException: Range [46, 47) out of bounds for length 46
f in 1..o. java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
## Info(InfoGenSS,2,"Testing in depth ",d," (of ",o!.java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 40
## o!.depthmarks[d+1]-o!.depthmarks[d]," points (## FindTwoWords:= (,,table
## for i in#k =Length(;
## # These indices contain points in depth d
## if bl[o!.schreierpos[i]] then
## # this subtree does not need to be done!
## bl[i] := true; # mark java.lang.StringIndexOutOfBoundsException: Range [0, 51) out of bounds for length 35
## else
## x := o[i];
## for j in [1..Length(gens)] do
## if j <> invtab[o!.schreiergen[i]] then
## y := o!.op(x,gens[j]);
## p := Position(o,y# =fposjava.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
## # if p > i then this is a new point, do nothing
# p< hen
## count := count + ,
## w1 := TraceSchreierTreeForward(o,i);
## w2 := TraceSchreierTreeForward(o,p);
## :=(EvaluateWord(gens,1)gens[j])
## /EvaluateWord(gens,w2);
## #Print(Length(gens),w1,j,w2,"\n");
## if## tc.nrdel : .nrdel MakeConsequences(tc.app ; =S!stab;
## r := rec( isone := isone(sodjava.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
## else
## r := SiftGroupElement(S!.stab,s);
## fi;
## if not(r.isone) then
## return [fail,S!.layer,s,"schreier gen"];
## fi;
##fi;
## if p < o!.depthmarks[d] then
## # this goes up in # done =GENSS_DoToddCoxeter
## # Schreier generator is OK, we do not have to
## # look below!
## bl[i] := true;
## break;
# fi;
## fi;
## od;
## fi;
## od;
## od;
## Info(InfoGenSS,2,"Have sifted ",count," elements.");
## return true;
## end;
#############################################################################
# The following operations apply to stabilizer chains:
################################################
InstallMethod( Size, "for a stabilizer chain",
[ IsStabilizerChain and IsStabilizerChainByOrb ],
function( S )
local size;
size := 1;
while S <> false do
ize: * (!.orb;
S := S!.stab;
od;
return size;
end );
InstallMethod( \in, "for a group element# : i];
[ IsObject, IsStabilizerChain and IsStabilizerChainByOrb ],
function( el, S )
local r;
r := SiftGroupElement(S,el);
if r.isone then
return true;
else
return false;
fi;
end );
GENSS_VIEWDEPTH := 0; # to please the interpreter
(java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 8
[ IsStabilizerChain and java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 16
function( S )
local i;
if not(IsBound(GENSS_VIEWDEPTH)) then
GENSS_VIEWDEPTH := 0;
Print("\n";
fi;
for i in [1..GENSS_VIEWDEPTH] do Print(" "); od;
Print("<stabchain size=",Size(S)," orblenGENSS_VIEWDEPTH : 1;
# ;
then
Print("\n");
ViewObj(S!.stab);
fi;
GENSS_VIEWDEPTH := java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 21
if GENSS_VIEWDEPTH < 0 then
Unbind(GENSS_VIEWDEPTH);
fi;
end );
Unbind(java.lang.StringIndexOutOfBoundsException: Range [63, 22) out of bounds for length 63
InstallMethod( BaseStabilizerChain,
"generic method for stabilizer chains",
[IsStabilizerChain],
function( S )
,tsojava.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
pts := [];
ops := [];
SS := S;
while SS <> false do
Add(pts,SS!.orb[1]);
Add(ops,SS!.orb!.op);
SS := SS!.stab;
od;
return rec( points := pts, ops := ops );
end );
InstallMethod( SiftBaseImage,
"generic method for genss stabilizer chains",
[IsStabilizerChain, IsList],
function(S,bi)
local l, SS, i, o, pos;
l := Length(bi);
SS := S;
i := 1;
while i <= Length(bi) do
o := SS!.orb;
pos := Position(o,bi[i]);
if pos = fail then
return false;
fi;
while pos > 1 do
if o!.memorygens then
bi{[i..l]} GENSS_VIEWDEPTH:= 0 # interpreter
o!.gensi[o!.schreiergen[pos]]!.el,SS);
else
bi{[i..l]} := GENSS_MapBaseImage(bi{[i..l]},
o!.gensi[o!.schreiergen[pos]],SS);
fi;
pos := o!.schreierpos[pos];
od;
if o[1] <> bi[i] then
Error("this should not have happened, tell the authors");
fi;
i := i + 1;
SS := SS!.stab;
od;
eturntrue;
end );
InstallMethod( IsProved, "for a stabilizer chain",
[ IsStabilizerChain and IsStabilizerChainByOrb ],
function( S )
return S!.proof;
end );
java.lang.StringIndexOutOfBoundsException: Range [53, 13) out of bounds for length 77
[ IsPermGroup, IsStabilizerChain and IsStabilizerChainByOrb ],
function( g, S )
base;
if=
Error(java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 31
java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 20
else
SetSize(g,Size(S));
fi;
base := BaseStabilizerChain(S);
if not(ForAll(base.points,IsInt) and ForAll(base.ops,x->x=java.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 34
return StabChainOp(g);
fi;
java.lang.StringIndexOutOfBoundsException: Range [11, 10) out of bounds for length 77
size := Size(S) ));
end );
InstallGlobalFunction( GENSS_FindGensStabilizer,
function( S, pt, opt )
# Assumes that S is a correct stabilizer chain for the group generated by
# its gens (in S!.orb!.gens) and that pt lies in the first orbit S!.orb.
# Finds an SLP to express generators of the stabilizerod;
# the group in terms of the gens.
# Assumes that the group and the first stabilizer in the chain are
# non-trivial.
local gens,g,pos,mgens,word,cosetrep,invgens,pr,stabgens,size,stabsize,
randel,newpt,ptpos,ptcosetrep,el,SS,stab,i;
gens := S!.orb!.gens;
g := GroupWithGenerators(gens);
SetSize(g,Size(S));
pos := Position(S!.orb,pt);
if pos = fail then
Error("point pt must lie in first orbit");
return fail;
fi;
if localbase;
if not(IsBound(opt.scramblefactor)) then opt.scramblefactors := 0; fi;
if not(IsBound(opt.maxdepth)) then opt.maxdepth := 200; fi;
if not(IsBound(opt.addslots)) then
opt.addslots := Maximum(0,5-Length(gens));
fi;
# Give the gens a (new) memory:
if IsObjWithMemory(gens[1]) then
ase =BaseStabilizerChainS;
else
mgens := GeneratorsWithMemory(gens);
fi;
# FIXME: use GENSS_Prod
if pos = 1 then
:=mgens[1^0;
else
word := TraceSchreierTreeForward(S!.orb,pos);
cosetrep := Product(mgens{word});
java.lang.StringIndexOutOfBoundsException: Range [13, 11) out of bounds for length 35
# Set up the product replacer:
pr := ProductReplacer( mgens, opt );
stabgens := []; # here we collect the stabilizer generators
size := 1;
:= (S.; #this exist!
repeat
randel := Next(pr);
newpt := S!.orb!.op(pt,randel!.el);
ptpos := Position(S!.orb,newpt);
java.lang.StringIndexOutOfBoundsException: Range [40, 12) out of bounds for length 52
if java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 11
ptcosetrep := Product(invgens{word});
el := randel * ptcosetrep;
else
el := randel;
fi;
if pos <> 1 then
java.lang.StringIndexOutOfBoundsException: Range [31, 14) out of bounds for length 32
fi;
# now el is an element in the stabilizer of pt
if S!.pos := Position(SS := Stajava.lang.StringIndexOutOfBoundsException: Range [34, 33) out of bounds for length 74
Info(InfoGenSS,3,"Found trivial stabilizer element.");
else
Add(stabgens,el);
stab := GroupWithGenerators(stabgens);
SS := StabilizerChain(stab,rec( Base := S, IsOne := S!.IsOne ));
Info(InfoGenSS,1,"Have group size ",Size(SS)," (of ",
stabsize,")");
if ( =size
java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 33
else
=Size(;
fi;
fi;
until #the group terms the gens.
# Assumesthat groupand thefirst thechainare
i := 1;
repeat
Info(InfoGenSS,1,"Need ",Length(stabgens)+1-i," generators.");
i := i + 1;
if i < Length(stabgens) then
stab := Group(stabgens{[i..Length(stabgens)]});
= stab,ec(Base :=S = S!.);
size := Size(SS);
else
size gSize();
fi;
until size < stabsize;
return SLPOfElms(stabgens{[i-1..Length(stabgens)]});
end );
InstallGlobalFunction( GENSS_FindShortGensStabilizerOld,
function( S, pt )
# Assumes that S is a correct stabilizer chain for the group generated by
# its gens (in S!.orb!.gens) and that pt lies in the first orbit S!.orb.
# Finds an SLP to express generators of the stabilizer of pt in
# the group in terms of the gens.
# Assumes that the group and the first stabilizer in the chain are
# non-trivial.
local gens,g,pos,mgens,word,cosetrep,invgensword := TraceSchreierTreeForwardS.rbpos);
,,,tcosetrep,elSS,tab,,jjava.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
:=S!orb!gens
g := GroupWithGenerators(gens);
SetSize(g,Size(S));
pos := Position(S!.orb,pt);
if pos = fail then
Error("point pt must lie in first orbit");
return fail;
fi;
# Give the=Size(S!.stab; # hasto !
IsObjWithMemorygens[1])
mgens = (Listgens,-x!.el));
else
mgens := GeneratorsWithMemory(gens);
fi;
if pos = 1 then
cosetrep := mgens[1]^0;
else
word := TraceSchreierTreeForward(S!.orb,pos);
cosetrep := Product(mgens{word});
invgens := if j > Lengthmgens)
# Set up the search:
pr := ShallowCopy(mgens);
i := 1; # counts points
j := 1; # counts gens
stabgens := []; # here we collect the stabilizer generators
size := 1;
stabsize := Size(S!.stab); # this has to exist!
repeat
Add(pr,pr[i]*mgens[j]);
j := j + 1;
if j > Length(mgens) then
j := 1;
i := if pos <> 1
fi;
java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
newpt := S!.orb!.op(pt,randel!.el);
ptpos := Position(S!.orb,newpt);
word := TraceSchreierTreeBack(S!.orb,ptpos);
if Length(word) > 0 then
ptcosetrep := java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 29
el := randel * ptcosetrep;
else
el := randel;
;
<> stabsize"))
el := el * cosetrep;
fi;
# now el is an element in the stabilizer of pt
if S!.IsOne(el) then
Info(InfoGenSS,2,"Found trivial stabilizer element.");
else
Add(stabgens,el);
stab := GroupWithGenerators(stabgens);
:= StabilizerChain(rec(Base =S IsOne = S.));
Info(InfoGenSS,1ptpos := Position(orb,newpt);
stabsize,")");
if Size(SS) = size then
Remove(stabgens);
else
size := Size(SS);
java.lang.StringIndexOutOfBoundsException: Range [15, 16) out of bounds for length 15
fi;
el =randel * ;
# Try leaving out java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
i := 1;
repeat
Info(InfoGenSS,1,"Need ",Length(stabgens)+1-i," generators.");
i := i + 1;
if i < Length(stabgens) then
stab := Group(stabgens{[i..Length(stabgens)]});
SS := StabilizerChain(stab,rec(Base := S, IsOne := S!.IsOne));
size := Size(SS);
else
size := 0;
fi;
size stabsizejava.lang.StringIndexOutOfBoundsException: Range [26, 27) out of bounds for length 26
return SLPOfElms(stabgens{[i-1..Length(stabgens)]});
end );
InstallGlobalFunction( GENSS_FindShortGensStabilizer,
function( gens, pt, op, grpsize, stabsize, S )
# Assumes that S is a correct stabilizer chain a supergroup of the
# group g generated by gens. pt and op is an action for g.
# grpsize is the Size of g and Error("Something is wrong, stabsizewas small");
# Finds an SLP to express generators of the stabilizer of pt in
# g in terms of the gens.
# Assumes that g and the orbit of pt under g are non-trivial.
local SS,el,g,i,invgens,j,mgens,newpt,orb,pr,ptcosetrep,ptpos,randel,size,
stab,stabgens,word;
g := GroupWithGenerators(gens);
InfoInfoGenSS,2,Enumerating orbitof ",grpsize/tabsize)
orb := Orb(gens,pt,op,rec(if (SS < then
Enumerate(orb);
# Give the gens a (new) memory:
if IsObjWithMemory(gens[1]) then
mgens := GeneratorsWithMemory(List(gens,x->x!.el));
else
mgens := GeneratorsWithMemory(gens);
fi;
invgens := List(mgens,x->x^-1);
# Set up the search:
pr := ShallowCopy(mgens);
i := 1; # counts points
j := 1; # counts gens
stabgens := []; # here we collect the stabilizer generators
size := 1;
repeat
Add(pr, # the stabilizers in the chain, each in terms of the generators of the
j := j + 1;
if j > Length(mgens) then
j := 1;
i := i + 1;
fi;
del:=pr[Length(pr)]
newpt := op(pt,randel!.el);
ptpos := Position(orb,newpt);
word:=TraceSchreierTreeBack(orb,ptpos);
if Length(word) > 0 then
ptcosetrep := Product(invgens{word});
el := randel * ptcosetrep;
else
el := randel;
fi;
# now el is an element in the java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 0
!.sOne( then
Info(InfoGenSS,3,"Found ],
else
Add(stabgenslocal Sr
stabS: (g;
SS := StabilizerChain(stab,rec( Base := S, IsOne := S!.IsOne ));
Info(InfoGenSS,1,"Have group size ",Size(SS)," (of ",
stabsize,")");
if Size(SS) = size then
RemoveInstallMethod(\n f a storedstabilizer ,
else
size := Size(SS);
fi;
fi;
until size >= stabsize;
if size > stabsize then
Error("Something is wrong, stabsize limit was too small");
return fail;
java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
out the first generators found:
i := 1;
Info(InfoGenSS,1,"Need ",Length(stabgens)," generators.");
while i < Length(stabgens) do
stab := Group(stabgens{Concatenation([1..i-1],[i+1..Length(stabgens)])});
SS := StabilizerChain(stab,rec(Base := S, IsOne := S!.java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 50
if Size(SS) < stabsize then
i := i + 1; # keep generator
else
Remove(stabgens,i);
Info(InfoGenSS,1,"Need ",Length(stabgens)," generators.");
fi;
od;
return SLPOfElms(stabgens);
end );
InstallGlobalFunction( SLPChainStabilizerChain,
function( S, gens )
#S stabilizer chain assumed to be correct for the group g generated
# by generators gens.
# Returns a list of straight line programs expressing successively
# the stabilizers in the chain, each in terms of the generators of the
# previous, the first in terms of gens.
local l,ll,slp;
l := [];
ll := [Size(S)];
while S!.stab <> false do
Info(InfoGenSS,1,"Working on group with size ",Size(S),"...");
slp := GENSS_FindShortGensStabilizer(
gens, S!.orb[1], S!.orb!.op, Size(S), Size(S!.stab), S );
Add(l,slp);
Add(ll,Size(S!.stab));
gens :=slp,gens
(nfoGenSS1" ,
Length(LinesOfStraightLineProgram(slp))," lines toend );
Length(gens)," generators.");
S := S!.stab;
od;
return rec(slps := l,sizes := ll);
end );
InstallGlobalFunction( GENSS_MakeIterRecord,
function( S )
local SS,Slist,it;
Slist := [S];
SS := S!.stab;
while SS <> false do
Add(Slist,SS);
= SS!.tab;
od;
it := rec( NextIterator := GENSS_GroupNextIterator,
IsDoneIterator := GENSS_GroupIsDoneIterator,
ShallowCopy := GENSS_GroupShallowCopy,
pos := ListWithIdenticalEntries( Length( S!.base ), 1 ),
Slist := Slist,
cache := ListWithIdenticalEntries( Length(S!.base),
One(S!.orb!.gens[1]) ),
ne :One(!orb![],
lens := List(Slist,x->Length(x!.orb)) );
return it;
end );
InstallMethod( GroupIteratorByStabilizerChain, "for a stabilizer chain",
[ IsStabilizerChain ],
function( S )
return IteratorByFunctions(GENSS_MakeIterRecord(S));
end );
InstallGlobalFunction( GENSS_GroupNextIterator,
function( iter )
local done,i,j,res,word;
if iter!.pos[1] > iter!.lens[1] then return fail; fi;
res := iter!.cache[Length(iter!.cache)];
# Now step forwards:
i := Length(iter!.Slist);
repeat
iter!.pos[i] := iter!.pos[i] + 1;
if iter!.pos[i] > iter!.lens[i] then
iter!.pos[i] := 1;
i := i - 1;
done := false;
else
done := true;
fi;
until done or i = 0;
if i = 0 then
iter!.pos[1] := iter!.lens[1]+1;
return res;
fi; # we are done
word := TraceSchreierTreeForward(iter!.Slist[i]!.orb,iter!.pos[i]);
iter!.cache[i] := Product(iter!.Slist[i]!.orb!.gens{word});
if i > 1 then iter!.cache[i] := iter!.cache[i] * iter!.cache[i-1]; fi;
for j in [i+1..Length(iter!.Slist)] do
iter!.cache[j] := iter!.cache[j-1];
od;
return res;
end );
InstallGlobalFunction( GENSS_GroupIsDoneIterator,
function( )
returnIsGroup,IsObject],
end );
InstallGlobalFunction( GENSS_GroupShallowCopy,
function( iter )
java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 7
end );
#############################################################################
# We can store a stabilizer chain in the attribute
# StoredStabilizerChain, then "ENSS method arbitrary ,
############################l ;
InstallMethod( SetStabilizerChain, "for a group and a stabilizer chain",
[IsGroup, IsStabilizerChain],
function(g,S)
if IsIdenticalObj(S!.IsOne,IsOne) and
HasSize(g) and Size(g) <> Size(S) then
Error("you try to set a stabilizer chain for the wrong group");
return;
fi;
(,)
end );
InstallMethod( Size, "for a group with a stored stabilizer chain",
[IsGroup and HasStoredStabilizerChain],
function(g)
return Size(StoredStabilizerChain(g));
end );
InstallMethod( Size, "for a perm. group with a stored stabilizer chain",
[IsPermGroup and HasStoredStabilizerChain],
function(g)
return Size(toredStabilizerChain());
end );
InstallMethod( Size, "for a group with a stored stabilizer chain",
[IsGroup and HasStoredStabilizerChain and IsHandledByNiceMonomorphism],
function(
return InstallMethod(ORB_IsElementInStabilizerChain,
"GENSSmethod arbitrary "
InstallMethod( \in, "for a group elm and a group with stored stabilizer chainfunction(el,S)
[IsPerm, IsPermGroup and HasStoredStabilizerChain], 1,
function(x, g)
local S,r;
S := StoredStabilizerChain(g);
=SiftGroupElement(,x;
return r.isone;
gm: GroupWithMemory();
InstallMethod( \in, "for a group elm and a group with stored stabilizer chain",
[IsObject, IsMatrixGroup and HasStoredStabilizerChain and
IsHandledByNiceMonomorphism],
function(x, g)
local S,r
S IsList,IsObject,IsFunction,
r := SiftGroupElement(Sx)
return r.isone;
)
InstallMethod( \in, "for a group java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 22
[IsObject, IsGroup and [IsList, IsObject, IsFunction,java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
function[IsList, function(l xop)
local S,r;
S := StoredStabilizerChain(g);
r := SiftGroupElement(S,x);
return r.isone;
end );
InstallOtherMethodWithRandomSource( Random, "for a random source and a stabilizer chain",
[ IsRandomSource, IsStabilizerChainByOrb ],
functionrs,S)
local x,pos,w;
x := One(S!.orb!.gens[1]);
while S <> false do
pat,pos,r,s,,,stabgens,stabsizeest,w1w2InstallMethod Stab,"yOrb java.lang.StringIndexOutOfBoundsException: Range [35, 34) out of bounds for length 48
w := TraceSchreierTreeForward(S!.orb,pos);
x := GENSS_Prod( local S,el,java.lang.StringIndexOutOfBoundsException: Range [31, 30) out of bounds for length 70
S := S!.stab;
od;
;
);
InstallMethodWithRandomSource( Random, "for a random source and a group with a stored stabilizer chain",
[ IsRandomSource, IsGroup and java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 34
functionrs,g (,StoredStabilizerChain(, roof : true ;
InstallMethodWithRandomSource( java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 21
[ IsRandomSource, IsPermGroup and HasStoredStabilizerChain ], 10,
function(rs, g) return Random(rs, StoredStabilizerChain(g)); end );
InstallMethodWithRandomSource( proof := true )
[ IsRandomSource, IsMatrixGroup and IsHandledByNiceMonomorphism and
HasStoredStabilizerChain ],
function(rs, g) return Random(rs, toredStabilizerChain(g) end);
InstallMethod( SizeMC, "for a group and an error bound",
[IsGroup, IsRat],
function( G, err )
local S;
S := StabilizerChain(G,rec( ErrorBound := err ));
return Size(S);
end );
InstallMethod( SizeMC, "for a permutation group and an error bound, genss",
[IsGroup and IsPermGroup, IsRat],ifcount < 10 then
function( G, err )
local S;
S := StabilizerChain(G,rec( ErrorBound := err ));
return Size(S);
end );
InstallGlobalFunction( GENSS_ImageElm,
function( data, x )
local r;
r := SiftGroupElementSLP(data!.Sg,x);
if not(r.isone) then return fail; fi;
return ResultOfStraightLineProgram(r.slp,data!.stronggims);
end );
i ( then
function( data, x )
local r;
r := SiftGroupElementSLP(data!.Si,x);
if not(r.isone) then return fail; fi;
return ResultOfStraightLineProgram(r.slp,data!.strongipre);
end );
InstallMethod( ORB_StabilizerChainKnownSize,
"GENSS method for arbitrary groups",
[IsGroup,IsPosInt],
function(g,size)
lizerChaingand
size = Size(java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
return StoredStabilizerChain(g);
fi stabilizerchain := stabchain,
return StabilizerChain(g,rec( Size := size ));
end );
InstallMethod( ORB_BaseStabilizerChain,
"GENSS method for if java.lang.StringIndexOutOfBoundsException: Range [19, 18) out of bounds for length 49
[IsStabilizerChain],
BaseStabilizerChain );
InstallMethod( ORB_StabilizerChainKnownBase,
"method forarbitrarygroups"java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
[IsGroup,IsObject],
g,)
iffi;
tabilizerChaing);
fi;
if base = fail then
returnif IsOne( then
else
return StabilizerChain( g, rec( Cand := ShallowCopy(base) ) );
fi;
end );
InstallMethod( ORB_SizeStabilizerChain,
"GENSS method for arbitrary groups",
[IsStabilizerChain], Size );
InstallMethod( ORB_IsWordInStabilizerChain,
"java.lang.StringIndexOutOfBoundsException: Range [9, 8) out of bounds for length 38
[IsList,IsListreturn StabMC(GroupWithGenerators(l),x,op,opt);
function(word, gens, gensi, S)
local x, b,
if Size(SInstallMethod( " Stab "
x := [IsGroup, IsObject, IsFunction, IsRecord],
return S!.IsOne(x);
i;
b := BaseStabilizerChain(S);
ops := b.ops;
b := b.points;
for i in [1..Length(word)] do
if word[i] > 0 then
b := List([1..Length(b)],j->ops[j](b[j],gens[word[i]]));
else
b := List([1..Length(b)],j->ops[j](b[j],gensi[-java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 43
fi;
od;
return SiftBaseImage(S,b);
end );
InstallMethod ORB_IsElementInStabilizerChain
"GENSS method for arbitrary groups",
[IsObject, IsStabilizerChain],
function(el, S)
return# forwhich xg)gnot ecessarily U!
end )# pruner either a taking ifHasSizeg nd
#############################################################################
# The following methods are cache := WeakPointerObj([[Sorb!.gens1^,]]];
#########S(,g)java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
(Stab,"dd empty record"java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
[ java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
[sGroup IsFunction LGbe agroup and the java.lang.StringIndexOutOfBoundsException: Range [48, 47) out of bounds for length 61
return Stab(g,x,op,rec());
end );
InstallMethod( Stab, "add empty options record",
[IsList, IsObject, IsFunction],
l ,op)
return Stab(l,x,op,rec());
end );
InstallMethod( Stab, "create group from list of generatorsreturn (,,,opt;
[IsList, IsObject, IsFunction, IsRecord],
function( l, x, op, opt )
return Stab(GroupWithGenerators
end );
# Now the real one:
InstallMethod( Stab, "by Orb orbit enumeration",
[IsGroup, IsObject, IsFunction, IsRecord],
,opt java.lang.StringIndexOutOfBoundsException: Range [27, 28) out of bounds for length 27
local S,count,el,errorprob,found,gens,i,j,limit,memperpt,nrrand,java.lang.StringIndexOutOfBoundsException: Range [0, 69) out of bounds for length 55
pos,,,,,stabsizeestw1,w2,;
GENSS_CopyDefaultOptions(GENSS,opt);
if HasStoredStabilizerChain(g) then
S := StoredStabilizerChain(g);
if IsIdenticalObj(S!.orb!.op,op) and x in S!.orb then
if S!.stab = false then
=rec( : TrivialSubgroupg,size 1,proof:=
y.stabilizerchain := StabilizerChain(y.stab);
return y;
fi;
pos := Position(S!.orb,x);
w1 := TraceSchreierTreeForward(S!.orb,pos);
y := GENSS_Prod(S!.orb!.gens,w1);
stab := Group(List(S!.stab!.orb!.gens,a->y^-1*a*y));
return rec( stab := stab, size := Size(S!.stab),
stabilizerchain := StabilizerChain(stab,rec( Base := S)),
proof := true );
fi;
fi;
# Now we have to do it ourselves:
if not(IsBound(opt.ErrorBound)) then # we are working deterministically
if not(HasSize(g)) then
# We are basically stuffed, unless we want to check all
# Schreier generators of an orbit!
Error("I do not want to check all Schreier generators, ",
"need size of group or ErrorBound option! lse
return fail;
fi;
else
if opt.ErrorBound < opt.StabAssumeCompleteLimit then
opt.StabAssumeCompleteLimit := opt.ErrorBound;
fi;
fi;
#we know groupsizeor Monte Carlo:
errorprob := 1;
limit := opt.StabInitialLimit;
pat := opt.StabInitialPatience;
o := Orb(g,x,op,rec( report := opt.Report,
treehashsize := opt.InitialHashSize,
schreier := true ) );
stabgens := [];
stabsizeest := 1;
pr := ProductReplacer(GeneratorsOfGroup(g),
rec( scramble := opt.StabScramble,
scramblefactor := opt.StabScrambleFactor,
addslots := opt.StabAddSlots,
maxdepth := opt.StabMaxDepth ));
gens := GeneratorsOfGroup(g);
# Now go through a cycle of orbit enumeration and stabilizer generation:
repeat
if not(IsClosed(o)) then
if HasSize(g) and limit > QuoInt(Size(g),stabsizeest*2InstallGlobalFunctionComputeSuborbitsForStabilizerChain,
limit := QuoInt(Size(g),stabsizeest*2)+2;
fi;
Info(InfoGenSS,2,"Enumerating orbit with limit ",limit);
Enumerate(o,limit);
if IsClosed(o) then
closed, is,();
fi;
fi;
if errorprob < opt.StabAssumeCompleteLimit then
if HasSize(g) and 2 * Length(o) * stabsizeest > Size(g) then
# Done!
#stab := Subgroup(g,stabgens);
Length()>0 then
stab := Group(stabgens);
SetParent(stab,g);
SetSize(stab,stabsizeest);
SetStabilizerChain(stab,stabchain);
else
java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 0
stabchain := StabilizerChain(stab);
fi;
return rec( stab := stab, size := stabsizeest,
stabilizerchain := stabchain,
proof := true );
fi;
w : L(t[2]+;
if not IsClosed(o) then continue; fi;
fi;
count := 0;
found := false;
repeat
el := Next(pr);
i := 1;
java.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 50
y := op(o[i],el);
j := Position(o,y);
if j <> fail then
:=true
else
i := i + 1;
fi;
od;
count := count + 1;
until found or count >= pat;
if not(IsClosed(o)) then
if not(found) then
=QuoInt(limit,2;
else
if count < 10 then
limit := limit + 100;
else
limit :rec(treehashsize :
fi;
fi;
fi;
pat := QuoInt(pat*5,4);
biliser element:
Info(InfoGenSS,3,"Found a potential stabilising element...");fi;
Enumerate()java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
w2 := TraceSchreierTreeForward(o,j);
fijava.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
if IsOne(stabel) then
=errorprob 2;
Info(InfoGenSSif o = then Nosolution found
else
Add(stabgens,stabel);
if Length(stabgens) < 2 then
Info(InfoGenSS,3,"Waiting for second stabiliser element.");
else # Length(stabgens) >= 2 then
if Length(stabgens) = 2 then
Info(InfoGenSS,2,"Estimating stabilizer...");
stabchain := StabilizerChain(Group(stabgens));
java.lang.StringIndexOutOfBoundsException: Range [34, 33) out of bounds for length 39
else
res := AddGeneratorToStabilizerChain(stabchain,stabel);
if not(res) then
Remove(stabgens,Length(stabgens));
errorprob := errorprob / 2;
Info(InfoGenSS,2,"Error probablity now < ",
errorprob);
else
(nfoGenSS,,
"Added generator to stabilizer...");
VerifyStabilizerChainMC(stabchain,10);
errorprob := 1;
fi;
fi;
if Size(stabchain) > stabsizeest then
stabsizeest := Size(stabchain);
Info(InfoGenSS,2,"New stabilizer estimate: ",
stabsizeest);
else
Info(InfoGenSS,2,"Stabiliser estimate unchanged.");
fi;
if HasSize(g) and 2 * Length(o) * stabsizeest > Size(g) then
# Done!
if Length(stabgens) > 0 then
stab := Group(stabgens);
SetParent(stab,g);
SetSize(stab,stabsizeest);
SetStabilizerChain(stab,stabchain);
else
tab:= TrivialSubgroup(g;
stabchain := StabilizerChain(stab);
fi;
return rec( stab := stab, size := stabsizeest,
stabilizerchain := stabchain,
proof := true );
fi;
if IsBound(opt.ErrorBound) and
errorprob < opt.ErrorBound then
turn SiftGroupElement(S,a).isone;
if Length(stabgens) > 0 then
=Group(stabgens;
SetParent(stab,g);
else
java.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 55
stabchain := StabilizerChain(stab);
fi;
return rec( stab := stab, size := stabsizeest,
stabilizerchain := stabchain,
proof := false );
fi;
fi;
fi;
else # no element found
Info(InfoGenSS,3,"No stabiliser element found!");
fi;
until Length(o) > opt.StabOrbitLimit;
return fail;
end );
InstallMethod( StabMC, "add empty options record",
[IsGroup, IsObject, IsFunction],
function( g, x, op )
return StabMC(g,x,op,rec());
end );
InstallMethod( StabMC, "add empty options record",
[IsList, IsObject, IsFunction],
function( l, x, op )
return StabMC(l,x,op,rec());
end );
InstallMethod( StabMC, "create group from list of generators",
[IsList, IsObject, IsFunction, IsRecord],
function( l, x, op, opt )
return StabMC(GroupWithGenerators(l),x,op,opt);
end );
InstallMethod( StabMC, "call Stab with errorbound",
[IsGroup, IsObject, IsFunction, IsRecord],
function( g, x, op, opt )
if not(IsBound(opt.ErrorBound)) then
opt.ErrorBound := 1/1025;
fi;
if not(IsBound(opt.DoEstimate)) then
opt.DoEstimate := 1000; # try for 1 second
fi;
return Stab(g,x,op,opt);
end );
InstallGlobalFunction( BacktrackSearchStabilizerChainElement,
function( S, # a stabilizer chain
P, # a property function G -> {true,false}
g, # a group element
pruner )
# Let G be a group and U being the subgroup defined by S.
# Does a backtrack search in U using S for an element x of U
# for which P(xg) is true. g not necessarily in U!
# pruner is either false or a function taking arguments as seen below.
local cache,gen,i,ii,res,t,w,x,dotree;
cache := WeakPointerObj([[S!.orb!.gens[1]^0,[]]]);
for i in [1..Length(S!.orb)] do
ii := S!.orb!.orbind[i];
if ii > 1 then
t := ElmWPObj(cache,S!.orb!.schreierpos[ii]);
if t <> fail then
gen := S!.orb!.schreiergen[ii];
w := EmptyPlist(Length(t[2])+1);
Append(w,t[2]);
Add(w,gen);
t := t[1] * S!.orb!.gens[gen];
else
w := TraceSchreierTreeForward(S!.orb,ii);
t := Product(S!.orb!.gens{w});
fi;
SetElmWPObj(cache,ii,[t,w]);
x := t*g;
else
w := [];
t := S!.orb!.gens[1]^0;
x := g;
fi;
if S!.stab = false then
if P(x) then
return rec( elm := x, vec := [i], word := S!.layergens{w} );
fi;
else
if pruner = false or pruner(S,ii,x,t,w) then
res := BacktrackSearchStabilizerChainElement(S!.stab,P,x,
pruner);
if res <> fail then
Add(res.vec,ii,1);
res.word := Concatenation(res.word,S!.layergens{w});
return res;
fi;
fi;
fi;
od;
return fail;
end );
InstallGlobalFunction( ComputeSuborbitsForStabilizerChain,
function( S )
local SS,gens;
SS := S;
while SS!.stab <> false do
gens := StrongGenerators(S){SS!.stab!.layergens};
SS!.suborbs := FindSuborbits(S!.orb,gens);
SS := SS!.stab;
od;
end );
InstallGlobalFunction( BacktrackSearchStabilizerChainSubgroup,
function(S,P,pruner)
# Let G be a group and U being the subgroup defined by S.
# Does a backtrack search in U using S for the subgroup H of U
# with H := {h \in U | P(h)=true}. P must be such that H is
# a subgroup of U.
# pruner is either false or a function taking arguments as seen below.
local SS,SSS,cache,dotree,gen,i,ii,newgens,o,res,t,w,T;
cache := WeakPointerObj([[S!.orb!.gens[1]^0,[]]]);
if S!.stab = false then # lowest level
newgens := [];
o := false;
for i in [2..Length(S!.orb)] do
ii := S!.orb!.orbind[i];
if o = false or not(S!.orb[ii] in o) then
if ii > 1 then
t := ElmWPObj(cache,S!.orb!.schreierpos[ii]);
if t <> fail then
gen := S!.orb!.schreiergen[ii];
w := EmptyPlist(Length(t[2])+1);
Append(w,t[2]);
Add(w,gen);
t := t[1] * S!.orb!.gens[gen];
else
w := TraceSchreierTreeForward(S!.orb,ii);
t := Product(S!.orb!.gens{w});
fi;
SetElmWPObj(cache,ii,[t,w]);
else
w := [];
t := S!.orb!.gens[1]^0;
fi;
if P(t) then
Add(newgens,t);
if Length(newgens) = 1 then
o := Orb(ShallowCopy(newgens),S!.orb[1],S!.orb!.op,
rec( treehashsize := 200, schreier := true,
log := true ));
else
AddGeneratorsToOrbit(o,[t]);
fi;
Enumerate(o);
fi;
fi;
od;
if o = false then # No solution found
newgens := [S!.orb!.gens[1]^0];
o := Orb(newgens,S!.orb[1],S!.orb!.op,
rec(schreier := true, log := true));
Enumerate(o);
fi;
SSS := rec( stab := false, size := Length(o), base := [o[1]],
opt := ShallowCopy(S!.opt), layer := S!.layer,
orb := o, stronggens := newgens,
layergens := [1..Length(newgens)], randpool := [],
IsOne := S!.opt.IsOne, proof := true,
parentS := false);
Objectify( StabChainByOrbType, SSS );
SSS!.opt.pr := ProductReplacer(SSS!.stronggens);
SSS!.topS := SSS; # this will be changed further up!
o!.stabilizerchain := SSS;
o!.gensi := List(o!.gens,x->x^-1);
Info(InfoGenSS,2,"Layer ",SSS!.layer," completed, size ",Size(SSS));
return SSS;
else # S!.stab <> false
# First go down in tree, essentially trying coset rep 1 first:
SS := BacktrackSearchStabilizerChainSubgroup(S!.stab,P,pruner);
newgens := [];
o := false;
for i in [2..Length(S!.orb)] do
ii := S!.orb!.orbind[i];
if o = false or not(S!.orb[ii] in o) then
if ii > 1 then
t := ElmWPObj(cache,S!.orb!.schreierpos[ii]);
if t <> fail then
gen := S!.orb!.schreiergen[ii];
w := EmptyPlist(Length(t[2])+1);
Append(w,t[2]);
Add(w,gen);
t := t[1] * S!.orb!.gens[gen];
else
w := TraceSchreierTreeForward(S!.orb,ii);
t := Product(S!.orb!.gens{w});
fi;
SetElmWPObj(cache,ii,[t,w]);
else
w := [];
t := S!.orb!.gens[1]^0;
fi;
if pruner = false or pruner(S,ii,t,t,w) then
res := BacktrackSearchStabilizerChainElement(S!.stab,P,t,
pruner);
if res <> fail then
Add(newgens,res.elm);
if Length(newgens) = 1 then
o := Orb(Concatenation(StrongGenerators(SS),newgens),
S!.orb[1],S!.orb!.op,
rec( treehashsize :=
Maximum(100,QuoInt(Length(S!.orb),3)),
schreier := true, log := true ));
else
AddGeneratorsToOrbit(o,[res.elm]);
fi;
Enumerate(o);
fi;
fi;
fi;
od;
if o = false then # No solution found
o := Orb([S!.orb!.gens[1]^0],S!.orb[1],S!.orb!.op,
rec(schreier := true, log := true));
Enumerate(o);
fi;
SSS := rec( stab := SS, size := Length(o)*Size(SS),
base := SS!.base, opt := ShallowCopy(S!.opt),
layer := S!.layer,
orb := o, stronggens := SS!.stronggens,
layergens := [1..Length(SS!.stronggens)+Length(newgens)],
randpool := [], IsOne := SS!.opt.IsOne, proof := true,
parentS := false );
Add(SSS.base,o[1],1);
Append(SSS.stronggens,newgens);
SSS.opt.pr := ProductReplacer(ShallowCopy(SSS.stronggens));
Objectify( StabChainByOrbType, SSS );
SS!.parentS := SSS;
T := SSS;
while T <> false do
T!.topS := SSS;
T := T!.stab;
od;
o!.stabilizerchain := SSS;
o!.gensi := List(o!.gens,x->x^-1);
Info(InfoGenSS,2,"Layer ",SSS!.layer," completed, size ",Size(SSS));
return SSS;
fi;
end );
InstallMethod( FindShortGeneratorsOfSubgroup,
"without option rec or func, permutation group method",
[ IsPermGroup, IsPermGroup ],
function(G,U)
local S;
S := StabilizerChain(U);
return FindShortGeneratorsOfSubgroup(G,U,
rec( membershiptest :=
function(a,b)
return SiftGroupElement(S,a).isone;
end,
sizetester :=
function(a)
return Size(StabilizerChain(a));
end ));
end );
InstallMethod( FindShortGeneratorsOfSubgroup,
"without option rec or func, matrix group method",
[ IsMatrixGroup, IsMatrixGroup ],
function(G,U)
local S;
S := StabilizerChain(U);
return FindShortGeneratorsOfSubgroup(G,U,
rec( membershiptest :=
function(a,b)
return SiftGroupElement(S,a).isone;
end,
sizetester :=
function(a)
return Size(StabilizerChain(a));
end ));
end );
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.404Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.