Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/ferret/lib/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 11.8.2025 mit Größe 6 kB image not shown  

Quelle  overloadmethods.gi   Sprache: unbekannt

 
#############################################################################
##
##
#W  overloadmethods.gd    ferret Package                  Chris Jefferson
##
##  Replace built in GAP methods.
##
#Y  Copyright (C) 2014     University of St. Andrews, North Haugh,
#Y                          St. Andrews, Fife KY16 9SS, Scotland
##

_FERRET_ENABLE_OVERLOADS := true;

InstallGlobalFunction(EnableFerretOverloads, function(b)
    # This method is longer than it looks like it needs to be
    # in case b is not a Boolean
    if b then
        _FERRET_ENABLE_OVERLOADS := true;
    else
        _FERRET_ENABLE_OVERLOADS := false;
    fi;
end);

InstallGlobalFunction(FerretOverloadsEnabled, function()
    return _FERRET_ENABLE_OVERLOADS;
end);

_YAPB_fastIsNaturalOrSymmetricGroup := function(G)
    return  ( HasIsNaturalSymmetricGroup(G) and IsNaturalSymmetricGroup(G) ) or
       ( HasIsNaturalAlternatingGroup(G) and IsNaturalAlternatingGroup(G) );
end;

# Based on PermGroupStabilizerOp in oprtperm.gi.

PermGroupStabilizerFerretOp := function(arg)
    local   K,          # stabilizer <K>, result
            S,  base,
     G,d,gens,acts,act,dom;

 # get arguments, ignoring a given domain
 G:=arg[1];
 K:=Length(arg);
 act:=arg[K];
 acts:=arg[K-1];
 gens:=arg[K-2];
 d:=arg[K-3];

    # If we are not currently trying ferret, exit straight away!
    if not(_FERRET_ENABLE_OVERLOADS) then
      return CallFuncList(PermGroupStabilizerOp, arg);
    fi;
    Info(InfoFerretOverloads, 2, "Considering ferret for Stabilizer: ", arg);
    if gens <> acts  then
        Info(InfoFerretOverloads, 2, "Rejected: generators and actions are different");
        #TODO: Check whether  acts is permutations and one could work in the
        #permutation image (even if G is not permgroups)
        TryNextMethod();
    fi;

    # These are easy and GAP has special methods to do them
    if _YAPB_fastIsNaturalOrSymmetricGroup(G) and act = OnSets and ForAll( d, IsInt )
            then
        Info(InfoFerretOverloads, 2, "Rejected: Sets in the natural symmetric group");
        TryNextMethod();
    fi;

    # First of all, lets dump some easy cases we don't want to handle
    if act = OnPoints or act = OnPairs or act = OnTuples then
        Info(InfoFerretOverloads, 2, "Rejected: acting on points, pairs or tuples");
        return CallFuncList(PermGroupStabilizerOp, arg);
    fi;

    # action on sets of points, use a backtrack
    if act = OnSets  and ForAll( d, IsInt )  then
      if Length(d)=1 then
        K:=Stabilizer(G,d[1]);
      else
        Info(InfoFerretOverloads, 1, "Using ferret for Stabilizer(.., OnSets)");
        K:=Solve([ConInGroup(G), ConStabilize(d, OnSets)]);
      fi;

    # action on sets of pairwise disjoint sets
    elif act = OnSetsDisjointSets
      and IsList(d) and ForAll(d,i->ForAll(i,IsInt)) then
        Info(InfoFerretOverloads, 1, "Using ferret for Stabilizer(.., OnSetsDisjointSets)");
        K := Solve([ConInGroup(G), ConStabilize(d, OnSetsDisjointSets)]);
    # action on sets of sets
    elif act = OnSetsSets
      and IsList(d) and ForAll(d,i->ForAll(i,IsInt)) then
        Info(InfoFerretOverloads, 1, "Using ferret");
        K := Solve([ConInGroup(G), ConStabilize(d, OnSetsSets)]);
    # action on tuples of sets
    elif act = OnTuplesSets
      and IsList(d) and ForAll(d,i->ForAll(i,IsInt)) then
        Info(InfoFerretOverloads, 1, "Using ferret for Stabilizer(.., OnTuplesSets)");
        K := Solve([ConInGroup(G), List(d, x -> ConStabilize(x, OnSets))]);
    # action on sets of tuples
    elif act = OnSetsTuples
      and IsList(d) and ForAll(d,i->ForAll(i,IsInt)) then
        Info(InfoFerretOverloads, 1, "Using ferret for Stabilizer(.., OnSetsTuples)");
        K := Solve([ConInGroup(G), ConStabilize(d, OnSetsTuples)]);
    # action on tuples of tuples
    elif act = OnTuplesTuples
      and IsList(d) and ForAll(d,i->ForAll(i,IsInt)) then
        return Stabilizer(G, Flat(d), OnTuples);
    # other action
    else
        TryNextMethod();
    fi;

    # return the stabilizer
    return K;
end;

## These overloads are taken from oprtperm.gi, allowing us to hook in before the original
## permutation backtrack code

InstallOtherMethod( StabilizerOp, "permutation group with generators list",
       true,
        [ IsPermGroup, IsObject,
          IsList,
          IsList,
          IsFunction ],
  # the objects might be a group element: rank up
  {} -> RankFilter(IsMultiplicativeElementWithInverse)
  # and we are better even if the group is solvable
  +RankFilter(IsSolvableGroup) + 1,
  PermGroupStabilizerFerretOp);

InstallOtherMethod( StabilizerOp, "permutation group with domain",true,
        [ IsPermGroup, IsObject,
   IsObject,
          IsList,
          IsList,
          IsFunction ],
  # the objects might be a group element: rank up
  {} -> RankFilter(IsMultiplicativeElementWithInverse)
  # and we are better even if the group is solvable
  +RankFilter(IsSolvableGroup) + 1,
  PermGroupStabilizerFerretOp);



# This function replaces Intersection2 for perm groups
  InstallMethod( Intersection2, "perm groups (from Ferret Package)", IsIdenticalObj,
    [ IsPermGroup, IsPermGroup ], 1,
  function( G, H )
  local   Omega,  P,  rbase,  L,mg,mh,i;

      if not(_FERRET_ENABLE_OVERLOADS) then
        TryNextMethod();
      fi;
      Info(InfoFerretOverloads, 2, "Using ferret for Intersection2");

      if IsIdenticalObj( G, H )  then
        return G;
      fi;

        # These are easy and GAP has special methods to do them
      if _YAPB_fastIsNaturalOrSymmetricGroup(G) and _YAPB_fastIsNaturalOrSymmetricGroup(H) then
        TryNextMethod();
      fi;

      # Tighten bounds if possible
      mg := LargestMovedPoint(G);
      mh := LargestMovedPoint(H);

      if mg <> mh then
        if mg < mh then
          H := Stabilizer(H, [mg+1..mh], OnTuples);
        else
          G := Stabilizer(G, [mh+1..mg], OnTuples);
        fi;
      fi;

      # Handle some trivial cases
      if IsSubset(G,H) then
        return H;
      elif IsSubset(H,G) then
        return G;
      fi;

      return Solve([ConInGroup(G), ConInGroup(H)]);
  end );

[ Dauer der Verarbeitung: 0.36 Sekunden  (vorverarbeitet)  ]