Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/recog/gap/generic/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 22.0.2025 mit Größe 4 kB image not shown  

Quelle  KnownNilpotent.gi   Sprache: unbekannt

 
#############################################################################
##
##  This file is part of recog, a package for the GAP computer algebra system
##  which provides a collection of methods for the constructive recognition
##  of groups.
##
##  This files's authors include Max Neunhöffer, Ákos Seress, Max Horn.
##
##  Copyright of recog belongs to its developers whose names are too numerous
##  to list here. Please refer to the COPYRIGHT file for details.
##
##  SPDX-License-Identifier: GPL-3.0-or-later
##
#############################################################################

RECOG.DecomposeNilpotent := function(data,el)
  # Assume to have data.primesfactor, data.primeskernel which are
  # disjoint sets of primes such that the order of el is a product of
  # prime powers using only primes from these two sets. The order of
  # el is computed with the function data.orderfunc.
  local a,b,f,fac,ker,o,p,r;
  o := data.orderfunc(el);
  if o = 1 then
      return [el,el,0,0];
  fi;
  f := Factors(o);
  fac := [];
  ker := [];
  for p in f do
      if p in data.primesfactor then
          Add(fac,p);
      elif p in data.primeskernel then
          Add(ker,p);
      else
          return fail;
      fi;
  od;
  a := Product(fac);
  b := Product(ker);
  # Now a and b are coprime
  r := Gcdex(a,b);
  if r.gcd <> 1 then
      ErrorNoReturn("<data> corrupt, Product(<data.primesfactor>) and ",
                    "Product(<data.primeskernel>) are not coprime");
  fi;
  # now r.coeff1 * a + r.coeff2 * b = 1
  # that is, el = el^(r.coeff1 * a) * el^(r.coeff2 * b)
  # and el^(r.coeff1*a) has order not divisible by a prime in primesfactor
  # and el^(r.coeff2*b) has order not divisible by a prime in primeskernel
  # and the two commute,
  # that is we have found the components in the direct sum decomposition
  return [el^(r.coeff1*a),el^(r.coeff2*b),r.coeff1*a,r.coeff2*b];
end;

RECOG.HomForNilpotent := function(data,el)
  local decomp;
  decomp := RECOG.DecomposeNilpotent(data,el);
  if decomp = fail then
      return fail;
  else
      return decomp[2];
  fi;
end;

RECOG.CalcNiceGensKnownNilpotent := function(ri,origgens)
  local kernelgens;
  kernelgens := List([1..Length(ri!.decompositionExponents)],
                     i -> origgens[i]^ri!.decompositionExponents[i]);
  return Concatenation(CalcNiceGens(ImageRecogNode(ri), origgens),
                       CalcNiceGens(KernelRecogNode(ri), kernelgens));
end;

#! @BeginChunk KnownNilpotent
#! Hint to this method if you know G to be nilpotent or call it directly
#! if you find out so. Note that it will return NeverApplicable if G is a
#! p-group for some prime p. Make sure that the !.projective component is set
#! correctly such that we can set the right Order method.
#! @EndChunk
BindRecogMethod(FindHomMethodsGeneric, "KnownNilpotent",
"method for nilpotent groups which are not p-groups",
function(ri,G)
  local H,cut,data,gens,decompositionData,gensfac,gensker,gensm,hom,ords,primes;
  gens := GeneratorsOfGroup(G);
  gensm := GeneratorsWithMemory(gens);
  if IsBound(ri!.primes) then    # this is a message from ourselves from above!
      primes := ri!.primes;
  else
      ords := List(gens,OrderFunc(ri));
      primes := Union(List(ords,o->Set(Factors(o))));
      RemoveSet(primes,1);    # in case there were identities!
  fi;
  if Length(primes) < 2 then
      return NeverApplicable;   # not our beer
  fi;
  cut := QuoInt(Length(primes),2);
  data := rec( primesfactor := primes{[1..cut]},
               primeskernel := primes{[cut+1..Length(primes)]},
               orderfunc := OrderFunc(ri) );
  decompositionData := List(gensm, x-> RECOG.DecomposeNilpotent(data,x));
  gensfac := List(decompositionData,x -> StripMemory(x[2]));
  gensker := List(decompositionData,x -> x[1]);
  ri!.decompositionExponents := List(decompositionData, x -> x[3]);
  H := GroupWithGenerators(gensfac);
  hom := GroupHomByFuncWithData(G,H,RECOG.HomForNilpotent,data);
  SetHomom(ri,hom);
  InitialDataForImageRecogNode(ri).primes := primes{[1..cut]};
  InitialDataForKernelRecogNode(ri).primes := primes{[cut+1..Length(primes)]};
  AddMethod(InitialDataForImageRecogNode(ri).hints, FindHomMethodsGeneric.KnownNilpotent, 4000);
  AddMethod(InitialDataForKernelRecogNode(ri).hints, FindHomMethodsGeneric.KnownNilpotent, 4000);
  Append(gensN(ri),gensker);
  findgensNmeth(ri).method := FindKernelDoNothing;  # kernel already known
  ri!.leavegensNuntouched := true;
  Setcalcnicegens(ri,RECOG.CalcNiceGensKnownNilpotent);
  return Success;
end);

[ Dauer der Verarbeitung: 0.20 Sekunden  (vorverarbeitet)  ]