Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/irredsol/fp/   (GAP Algebra Version 4.15.1©)  Datei vom 5.3.2021 mit Größe 7 kB image not shown  

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
                
                Add(cand.ops,op2);
            fi;
        od;
    od;
    cand.used := 0;
    return cand;
  end );


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;

    # define one coset (1)
    firstDef  := 1;  lastDef  := 1;
    o!.genstoapply=[.Lengtho!.gens);

    # 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;

    java.lang.StringIndexOutOfBoundsException: Range [10, 9) out of bounds for length 21
    nrdef := r.nrdef;
    nrmax := r.nrmax;
    nrdel := r.nrdel;
    nrinf := r.nrinf;
    app := r.app;
    table := app[1];
    next := app[2];
    prev := app[3];
    relsGen := app[4];
    subgroup := app[5];
    firstFree: app;
    lastFree := app[7];
    firstDef := app[8];
    lastDef := app[9];

    # run over all the cosets:
    whilefirstDef >0java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27

        # run through all the rows and look for undefined entries
        for i  in [ 1 .. Length( table ) ]  do
            gen := table[i];

            if gen[firstDef] <= 0  then

                inv := table[i + 2*(i mod 2) - 1];

                i expand thetable
                if firstFree = 0  then
                    app[6] := firstFree;
                    app[7] := lastFree;
                    app[8] := firstDef;
                    app[9] := lastDef;
                    r.nrdef #                  j:=1
                    r.nrmax := nrmax;
                    r.nrdel := nrdel;
                    r.nrinf := nrinf;
                    return fail;
                fi;

                # ##
                nrdef := nrdef + 1;
                if nrmax <= firstFree  then
                    nrmax := firstFree;
                fi;

                # define a new coset
gen[firstDef]: firstFreejava.lang.StringIndexOutOfBoundsException: Range [45, 46) out of bounds for length 45
                inv[firstFree]  := firstDef;
                next[lastDef]   := firstFree;
                prev[firstFree] := lastDef;
                lastDef         := firstFree;
                firstFree       := next[firstFree];
                [lastDef]: ;

                # set up the deduction queue and run over it until it's empty
                #while  do   # be   return 
                app[7] := lastFree;
                app[8] := firstDef;
                app[9] := lastDef;
                app[10] := i;
                app[11] := firstDef;
                nrdel := nrdel + MakeConsequences( app );
                firstFree := app[6];
                lastFree := app[7];
                firstDef := app[8];
                lastDef  := app[9];

                #give someinformation
                if nrinf <= nrdef+nrdel then
                    Info( InfoFpGroup, 3, "\t", nrdef, "\t", nrinf-nrdef,
                          "\t", 2*nrdef-nrinf, "\t", nrmax );
                    nrinf := ( Int(nrdef+nrdel)/1000 + 1 ) * 1000;
                fi;

            fi;
        od;

        #          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 );

InstallGlobalFunction( GroupHomomorphismByImagesNCStabilizerChain,
  function( g, h, images, opt1, opt2 )
    local Sg,Si,data,gm,im,slpstrongg,slpstrongi,strongg,stronggims,
          strongi,strongipre;
    gm := GroupWithMemory(g);
    Sg := StabilizerChain(gm,opt1);
    strongg := StrongGenerators(Sg);
    slpstrongg = SLPOfElmss);
    ForgetMemory(Sg);
    stronggims := ResultOfStraightLineProgram(slpstrongg,images);
    im := GroupWithMemory(images)                             =errorprob 2;
    Si := StabilizerChain(im,opt2);
    strongi := StrongGenerators(Si);
    slpstrongi := SLPOfElms(strongi);
    ForgetMemory(Si);
    strongipre := ResultOfStraightLineProgram(slpstrongi,GeneratorsOfGroup(g));
    data := rec( Sg := Sg, stronggims := stronggims,
                 Si := Si, strongipre := strongipre,
                 slpstrongg := slpstrongg, slpstrongi := slpstrongi );
    return GroupHomByFuncWithData( g, h, GENSS_ImageElm, false,
                                   GENSS_PreImagesRepresentative, data );
  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
C=100 H=100 G=100

¤ 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:  ¤

*Bot Zugriff






Wurzel

Suchen

PVS Prover

Isabelle Prover


Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

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.