Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/lpres/gap/pargap/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 12.6.2024 mit Größe 5 kB image not shown  

Quelle  induce.gi   Sprache: unbekannt

 
Spracherkennung für: .gi vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

############################################################################
##
#W pargap/induce.gi  LPRES    René Hartung
##

############################################################################
##
#F  LPRESPar_InduceEndomorphism( <EndoImgs>, <Defs>, <Imgs>, <weights> )
##
ParInstallTOPCGlobalFunction( "LPRESPar_InduceEndomorphism", 
  function( EndoImgs, Defs, Imgs, weights )
  local F,  # free group
 fam,  # elements family of <F>
 endo,   # the endomorphism <EndoImgs> as GroupHomomorphismByImages
 H,  # the covering group
 Epi,  # the epimorphism onto the covering group <H>
 imgs,  # the images of the generators of <H> under the induced endom.
 i, # loop variable
 DoTask, SubmitTaskInput, CheckTaskResult, UpdateSharedData;# MasterSlave

  # rebuild the endomorphism from the list
  F    := FreeGroup( Length( EndoImgs ) );
  fam  := ElementsFamily( FamilyObj( F ) );
  endo := GroupHomomorphismByImagesNC( F, F, GeneratorsOfGroup( F ),
               List( EndoImgs, x -> ObjByExtRep( fam, x )));

  # the covering group
  H := PcpGroupByCollectorNC( ReadEvalFromString( "ftl" ) );

  # compute the epimorphism from the free group onto the cover
  imgs := [];
  for i in [ 1 .. Length( Imgs ) ] do 
    if IsInt( Imgs[i] ) then 
      imgs[i] := PcpElementByGenExpList( ReadEvalFromString( "ftl" ), 
                                         [ Imgs[i], 1 ] );
    else
      imgs[i] := PcpElementByGenExpList( ReadEvalFromString( "ftl" ), Imgs[i] );
    fi;
  od;
  Epi := GroupHomomorphismByImages( F, H, GeneratorsOfGroup( F ), imgs );

  # reset the images 
  imgs := [];
  
  SubmitTaskInput := TaskInputIterator( [ 1 .. Length( Defs ) ] );

  DoTask :=  function( input )
    local output, w, k, obj, msg, orders;

    orders := ReadEvalFromString( "ftl" )![ PC_EXPONENTS ];

    if IsInt( Defs[input] ) then 
      if Defs[ input ] > 0 and weights[ input ] = 1 then 
        # a generator of weight one 
        return GenExpList( Image( Epi, Image( endo, 
                                 GeneratorsOfGroup( F )[ Defs[input] ] ) ) );
      elif Defs[ input ] > 0 and weights[ input ] > 1 then 
        # tail defined by an image
        w := One( H );

        for k in [ 1, 3 .. Length( Imgs[ Defs[input] ] ) - 3 ] do
          while not IsBound( imgs[ Imgs[ Defs[input] ][k] ] ) do 
            # wait for an update
            msg := RecvMsg();
            if not MPI_Get_tag() = BROADCAST_TAG then Error(); fi;
            UpdateSharedData( msg[1], msg[2] );
          od;

          w := w * PcpElementByGenExpList( ReadEvalFromString( "ftl" ), 
                   imgs[ Imgs[ Defs[input] ][k] ] ) ^ Imgs[ Defs[input] ][k+1];
        od;
        return ( GenExpList( w ^ -1 * Image( Epi, Image( endo, 
                            GeneratorsOfGroup( F )[ Defs[input] ] ) ) ) );
      elif Defs[ input ] < 0  then 
        # tail added to a power relation

        w := One( H );
        obj := GetPower( ReadEvalFromString( "ftl" ), - Defs[ input ] );
        obj := obj{ [ 1 ..Length( obj ) - 2 ] };
        for k in [ 1, 3 .. Length( obj ) - 1 ] do
          while not IsBound( imgs[ obj[k] ] ) do
            msg := RecvMsg();
            if not MPI_Get_tag() = BROADCAST_TAG then Error(); fi;
            UpdateSharedData( msg[1], msg[2] );
          od;
          w := w * PcpElementByGenExpList( ReadEvalFromString( "ftl" ), 
                                           imgs[ obj[k] ] ) ^ obj[k+1];
        od;
        return( GenExpList( w ^ -1 * PcpElementByGenExpList( 
                ReadEvalFromString( "ftl" ), 
                imgs[ -Defs[input] ] ) ^ orders[ -Defs[input] ]));
      fi;
    elif IsList( Defs[ input ] ) then 
      # tail added to conjugacy relation
      w := One( H );
      obj := GetConjugate( ReadEvalFromString( "ftl" ), 
                           Defs[input][1], Defs[input][2] );
      obj := obj{[ 3 .. Length( obj ) - 2]};
      for k in [ 1, 3 .. Length( obj ) - 1 ] do 
        while not IsBound( imgs[ obj[k] ] ) do
          msg := RecvMsg();
          if not MPI_Get_tag() = BROADCAST_TAG then Error(); fi;
          UpdateSharedData( msg[1], msg[2] );
        od;
        w := w * PcpElementByGenExpList( ReadEvalFromString( "ftl" ), 
                                         imgs[ obj[k] ] ) ^ obj[k+1];
      od;   
      while not IsBound( imgs[ Defs[input][1] ] ) do
        msg := RecvMsg();
        if not MPI_Get_tag() = BROADCAST_TAG then Error(); fi;
        UpdateSharedData( msg[1], msg[2] );
      od;
      while not IsBound( imgs[ Defs[input][2] ] ) do
        msg := RecvMsg();
        if not MPI_Get_tag() = BROADCAST_TAG then Error(); fi;
        UpdateSharedData( msg[1], msg[2] );
      od;

      return( GenExpList( w ^ -1 * Comm( 
              PcpElementByGenExpList( ReadEvalFromString( "ftl" ), 
                                      imgs[ Defs[input][1] ] ),
              PcpElementByGenExpList( ReadEvalFromString( "ftl" ), 
                                      imgs[ Defs[input][2] ] ) ) ) );
    fi;
    return fail;
    end;

  CheckTaskResult := function( input, output )
    if output = fail then 
      Error();
      return REDO_ACTION;
    else
      return UPDATE_ACTION;
    fi;
    end;
  
  UpdateSharedData := function( input, output )
    if not IsList( output ) then Error("in update"); fi;
    imgs[ input ] := output;
    end;

  # NEVER USE AGGLOMTASK as this may fail
  MasterSlave( SubmitTaskInput, DoTask, CheckTaskResult, UpdateSharedData );

  return( GroupHomomorphismByImagesNC( H, H, GeneratorsOfGroup(H), 
          List( imgs, 
          x -> PcpElementByGenExpList( ReadEvalFromString( "ftl" ), x ) )));
  end);

[ Dauer der Verarbeitung: 0.46 Sekunden  ]