Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  grpcompl.gi   Sprache: unbekannt

 
#############################################################################
##
##  This file is part of GAP, a system for computational discrete algebra.
##  This file's authors include Alexander Hulpke.
##
##  Copyright of GAP belongs to its developers, whose names are too numerous
##  to list here. Please refer to the COPYRIGHT file for details.
##
##  SPDX-License-Identifier: GPL-2.0-or-later
##
##  This file contains the operations for the computation of complements in
##  'white box groups'
##


BindGlobal("COCohomologyAction",function(oc,actgrp,auts,orbs)
  local b, mats, orb, com, stabilizer, i,coc,u;
  if not IsBound(oc.complement) then
    return [];
  fi;
  oc.zero:=Zero(LeftActingDomain(oc.oneCocycles));
  b:=BaseSteinitzVectors(BasisVectors(Basis(oc.oneCocycles)),
                         BasisVectors(Basis(oc.oneCoboundaries)));
  if Length(b.factorspace)=0 then
    u:=rec(com:=[rec(cocycle:=Zero(oc.oneCocycles),stabilizer:=actgrp)],
           bas:=b);
    if orbs then
      u.com[1].orbit:=[Zero(oc.oneCocycles)];
    fi;
    return u;
  fi;
  Info(InfoComplement,2,"fuse ",
    Characteristic(oc.zero)^Length(b.factorspace)," classes");
  if Length(auts)=0 then
    auts:=[One(actgrp)];
  fi;

  mats:=COAffineCohomologyAction(oc,oc.complementGens,auts,b);
  orb:=COAffineBlocks(actgrp,auts,mats,orbs);
  com:=[];
  for i in orb do

    coc:=i.vector*b.factorspace;
    #u:=oc.cocycleToComplement(coc);
    u:=rec(cocycle:=coc,
                #complement:=u,
                stabilizer:=i.stabilizer);
    if orbs then u.orbit:=i.orbit;fi;
    Add(com,u);
  od;
  Info(InfoComplement,1,"obtain ",Length(com)," orbits");
  return rec(com:=com,bas:=b,mats:=mats);
end);

BindGlobal( "ComplementClassesRepresentativesSolvableWBG", function(arg)
local G,N,K,s, h, q, fpi, factorpres, com, comgens, cen, ocrels, fpcgs, ncom,
      ncomgens, ncen, nlcom, nlcomgens, nlcen, ocr, generators,
      l, complement, k, v, afu, i, j, jj;

  G:=arg[1];
  N:=arg[2];
  # compute a series through N
  if IsElementaryAbelian(N) then
    s:=[N,TrivialSubgroup(N)];
  else
    s:=ChiefSeriesUnderAction(G,N);
  fi;
  if Length(arg)=2 then
    K:=fail;
  else
    K:=arg[3];
    # build a series only down to K
    h:=List(s,x->ClosureGroup(K,x));
    s:=[h[1]];
    for i in h{[2..Length(h)]} do
      if Size(i)<Size(Last(s)) then
        Add(s,i);
      fi;
    od;
  fi;

  Info(InfoComplement,1,"Series of factors:",
       List([1..Length(s)-1],i->Size(s[i])/Size(s[i+1])));

  # #T transfer probably to better group (later, AgCase)

  # construct a presentation
  h:=NaturalHomomorphismByNormalSubgroup(G,N);

  # AH still: Try to find a more simple presentation if available.

  if Source(h)=G then
    q:=ImagesSource(h);
  else
    q:=Image(h,G);
  fi;
  fpi:=IsomorphismFpGroup(q);
  Info(InfoComplement,2,"using a presentation with ",
       Length(MappingGeneratorsImages(fpi)[2])," generators");
  factorpres:=[FreeGeneratorsOfFpGroup(Range(fpi)),
               RelatorsOfFpGroup(Range(fpi)),
               List(GeneratorsOfGroup(Range(fpi)),
                    i->PreImagesRepresentative(fpi,i))];
  Assert(1,ForAll(factorpres[3],i->Image(h,PreImagesRepresentative(h,i))=i));
  # initialize
  com:=[G];
  comgens:=[List(factorpres[3],i->PreImagesRepresentative(h,i))];
  cen:=[s[1]];
  ocrels:=false;

  # step down
  for i in [2..Length(s)] do
    Info(InfoComplement,1,"Step ",i-1);
    # we know the complements after s[i-1], we want them after s[i].
    #fpcgs:=Pcgs(s[i-1]); # the factor pcgs
    #fpcgs:=fpcgs mod InducedPcgsByGenerators(fpcgs,GeneratorsOfGroup(s[i]));
    fpcgs:=ModuloPcgs(s[i-1],s[i]);

    ncom:=[];
    ncomgens:=[];
    ncen:=[];
    # loop over all complements so far
    for j in [1..Length(com)] do
      nlcom:=[];
      nlcomgens:=[];
      nlcen:=[];
      # compute complements
      ocr:=rec(group:=ClosureGroup(com[j],s[i-1]),
               generators:=comgens[j],
               modulePcgs:=fpcgs,
               factorpres:=factorpres
               );
      if ocrels<>false then
        ocr.relators:=ocrels;
        Assert(2,ForAll(ocr.relators,
                        k->Product(List([1..Length(k.generators)],
                              l->ocr.generators[k.generators[l]]^k.powers[l]))
                              in s[i-1]));
      fi;

      OCOneCocycles(ocr,true);
      ocrels:=ocr.relators;

      if IsBound(ocr.complement) then
        # special treatment for trivial case:
        if Dimension(ocr.oneCocycles)=Dimension(ocr.oneCoboundaries) then
          l:=[rec(stabilizer:=cen[j],
                  cocycle:=Zero(ocr.oneCocycles),
                  complement:=ocr.complement)];
        else
          #l:=BaseSteinitzVectors(BasisVectors(Basis(ocr.oneCocycles)),
        #                         BasisVectors(Basis(ocr.oneCoboundaries)));
#
#          v:=Enumerator(VectorSpace(LeftActingDomain(ocr.oneCocycles),
#                                    l.factorspace,Zero(ocr.oneCocycles)));
#
#          dimran:=[1..Length(v[1])];
#
#          # fuse
#          Info(InfoComplement,2,"fuse ",Length(v)," classes; working in dim ",
#           Dimension(ocr.oneCocycles),"/",Dimension(ocr.oneCoboundaries));
#
#          opfun:=function(z,g)
#            Assert(3,z in AsList(v));
#            z:=ocr.cocycleToList(z);
#            for k in [1..Length(z)] do
#              z[k]:=Inverse(ocr.complementGens[k])*(ocr.complementGens[k]*z[k])^g;
#            od;
#            Assert(2,ForAll(z,k->k in s[i-1]));
#            z:=ocr.listToCocycle(z);
#            Assert(2,z in ocr.oneCocycles);
#            # sift z
#            for k in dimran do
#              if IsBound(l.heads[k]) and l.heads[k]<0 then
#                z:=z-z[k]*l.subspace[-l.heads[k]];
#              fi;
#            od;
#            Assert(1,z in AsList(v));
#            return z;
#          end;
#
#          k:=ExternalOrbitsStabilizers(cen[j],v,opfun);

          l:=COCohomologyAction(ocr,cen[j],GeneratorsOfGroup(cen[j]),false).com;
#          if Length(l)<>Length(k) then Error("differ!");fi;
        fi;

        Info(InfoComplement,2,"splits in ",Length(l)," complements");
      else
        l:=[];
        Info(InfoComplement,2,"no complements");
      fi;

      for k in l do
        q:=k.stabilizer;
        k:=ocr.cocycleToComplement(k.cocycle);
        Assert(3,Length(GeneratorsOfGroup(k))
                  =Length(MappingGeneratorsImages(fpi)[2]));
        # correct stabilizer to obtain centralizer

        v:=Normalizer(q,ClosureGroup(s[i],k));
        afu:=function(x,g) return CanonicalRightCosetElement(s[i],x^g);end;
        for jj in GeneratorsOfGroup(k) do
          if ForAny(GeneratorsOfGroup(v),x->not Comm(x,jj) in s[i]) then
            # we are likely very close as we centralized in the higher level
            # and stabilize the cohomology. Thus a plain stabilizer
            # calculation ought to work.
            v:=Stabilizer(v,CanonicalRightCosetElement(s[i],jj),afu);
          fi;
        od;


        Add(ncen,v);
        Add(nlcom,k);
        Add(nlcomgens,GeneratorsOfGroup(k));
      od;

      ncom:=Concatenation(ncom,nlcom);
      ncomgens:=Concatenation(ncomgens,nlcomgens);
      ncen:=Concatenation(ncen,nlcen);
    od;
    com:=ncom;
    comgens:=ncomgens;
    cen:=ncen;
    Info(InfoComplement,1,Length(com)," complements in total");
  od;

  if K<>fail then
    com:=List(com,x->ClosureGroup(K,x));
  fi;
  return com;

end );

InstallMethod(ComplementClassesRepresentativesSolvableNC,"using cohomology",
  IsIdenticalObj,
  [IsGroup,IsGroup],1,
  ComplementClassesRepresentativesSolvableWBG);

[ Dauer der Verarbeitung: 0.34 Sekunden  (vorverarbeitet)  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge