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

Quelle  expmulnr.gi   Sprache: unbekannt

 
################################################################################
##
#W  expmulnrnr.gi             Near-ring Library                   J"urgen Ecker
##

##  13.01.00:  N!.multiplication ersetzt, PM

#############################################################################
##
#M  ExplicitMultiplicationNearRingElementFamilies       Initializing method
##

InstallMethod(
 ExplicitMultiplicationNearRingElementFamilies,
 true,
 [IsGroup],
 0,
  f -> [] );

#############################################################################
##
#F  StoreExpMultFam(<fun>,<group>,<fam>)  store fam as Exp.Mul.Fam. for fun
##                                       over group
##

StoreExpMultFam := function(fun,group,fam)
local emf;
  emf:=ExplicitMultiplicationNearRingElementFamilies(group);
  if not ForAny(emf,i->i[1]=fun) then
    Add(emf,[fun,fam]);
  fi;
end;

#############################################################################
##
#M  ExplicitMultiplicationNearRingElementFamily      generic method
##

InstallMethod(
 ExplicitMultiplicationNearRingElementFamily,
 "generic",
 true,
 [IsGroup,IsFunction],
 0,
  function(group,fun)
  local fam,i;
    fam := ExplicitMultiplicationNearRingElementFamilies(Parent(group));
    i := PositionProperty(fam,i->i[1]=fun);
    if i<>fail then
 return fam[i][2];
    fi;

    fam := NewFamily( "ExplicitMultiplicationNearRingElementFamily(...)",
   IsExplicitMultiplicationNearRingElement,
           IsObject,
   IsExplicitMultiplicationNearRingElementFamily );

  # The default kind
  fam!.defaultKind := NewType( fam,
   IsExplicitMultiplicationNearRingElementDefaultRep);

  # Important trivia
  fam!.multiplication := fun;
  fam!.group := group;

#  set one and zero
#  SetZero(fam,ObjByExtRep(fam,Zero(f)));;

  StoreExpMultFam(fun,group,fam);

  return fam;
end);

#############################################################################  
##
##  IsNearRingMultiplication( <G>, <mul> [, <what>] ). .test if <mul> is a 
##                                       nearring multiplication on <G>
##
##  This function tests if a specified multiplication function <mul> is a 
##  nearring multiplication on the group <G>.
##
##  <what> is an optional list of properties that the user knows to be true.
##  Properties in this are then not checked to speed up the construction
##  process. Possible properties are "closed", "ass" and "ldistr"
##  If no third argument is given all properties are checked.

IsNearRingMultiplication := function( arg )
  local G, mul, elms,
 test_closed, test_assoc, test_ldistr;

  if Length(arg) = 2 then
 test_closed := true;
 test_assoc  := true;
 test_ldistr := true;
 G := arg[1];
 mul := arg[2];
  elif Length(arg) = 3 then
 test_closed := not ("closed" in arg[3]);
 test_assoc  := not ("ass"    in arg[3]);
 test_ldistr := not ("ldistr" in arg[3]);
 G := arg[1];
 mul := arg[2];
  else
 Error("Usage: IsNearRingMultiplication( <G>, <mul> [,{''closed''|''ass''|''ldistr''}] )"  );
  fi;

  if not ( IsGroup( G ) and IsFunction( mul ) ) then
 Error("Usage: IsNearRingMultiplication( <G>, <mul> [,{''closed''|''ass''|''ldistr''}] )"  );
  fi;

  elms := Enumerator( G );
  
  if test_closed then
  # check if mul is G x G -> G
     Info( InfoNearRing, 1, "checking closedness");
     if not ForAll( elms, n1 -> ForAll( elms, n2 -> mul( n1, n2 ) in G ) )
 then
  Info( InfoWarning, 1,
        "group is not closed underspecified multiplication" );
  return false;
     fi;
  fi;

  if test_assoc then  
  # check if mul is ASSOCIATIVE
     Info( InfoNearRing, 1, "checking associativity"); 
     if not ForAll( elms, n1 -> ForAll( elms, n2 -> ForAll( elms, n3 ->
  mul( n1, mul( n2, n3 ) ) = mul( mul( n1, n2 ), n3 ) ) ) ) 
 then
  Info( InfoWarning, 1,
        "specified multiplication is not associative" );
  return false;
     fi;
  fi;

  if test_ldistr then
  # check if mul is LEFT DISTRIBUTIVE 
  # (note that the addition is denoted by '*' )
     Info( InfoNearRing, 1, "checking left distributivity");
     if not ForAll( elms, n1 -> ForAll( elms, n2 -> ForAll( elms, n3 ->
  mul( n1, n2 * n3 ) =  mul( n1, n2 ) * mul( n1, n3 )  ) ) )
 then
  Info( InfoWarning, 1,
        "specified multiplication is not left distributive");
      return false;
     fi;
  fi;

  # passed all tests
  return true;
end;

#############################################################################
##
#M  ExplicitMultiplicationNearRing  Constructor
##

InstallMethod(
 ExplicitMultiplicationNearRing,
 "generic",
 true,
 [IsGroup,IsFunction],
 0,
  function ( group , mult )
    if not IsNearRingMultiplication(group,mult) then
 Error("<mult> is not a valid multiplication");
    fi;
    return ExplicitMultiplicationNearRingNC( group, mult );
  end );

#############################################################################
##
#F  ExplicitMultiplicationNearRingNC  For EMNRs
##      multiplication is not tested

InstallGlobalFunction(
 ExplicitMultiplicationNearRingNC,
  function ( group , mult )
  local fam,N;
    fam := ExplicitMultiplicationNearRingElementFamily(group,mult);

    N := Objectify(
  NewType(CollectionsFamily(fam),
  IsExplicitMultiplicationNearRing and
   IsExplicitMultiplicationNearRingDefaultRep),
  rec() );

    SetNRMultiplication( N, mult );

    N!.elementsInfo := fam;

    SetGroupReduct( N, group );

    if HasSymbols( group ) then
 SetSymbols( N, Symbols( group ) );
    fi;
   
    return N;
end );

#############################################################################
##
#M  NearRingMultiplicationByOperationTable
##
##

InstallMethod(
 NearRingMultiplicationByOperationTable,
        "default",
 true,
 [IsGroup, IsMatrix, IsList],
 0,
  function( G, OT, elms )

  local p, p_inv, mul,
 x, y;

    p := PermList( List( elms, x -> Position( AsSSortedList( G ), x ) ) );
    p_inv := p^-1;    

    mul := function( x, y ) 
  
      return AsSSortedList( G )[  
  ( OT [Position( AsSSortedList( G ), x )^p]
    [Position( AsSSortedList( G ), y )^p] )
           ^p_inv ]; 
    end;

  return mul;
end );

 
#############################################################################
##
#M  ViewObj    For EMNRs

InstallMethod(
 ViewObj,
 "EMNearRings",
 true,
 [IsExplicitMultiplicationNearRingDefaultRep],
 0,
  function ( N )
    Print("ExplicitMultiplicationNearRing ( ");
    View( GroupReduct(N) );
    Print( " , multiplication )");
  end );

InstallMethod(
 PrintObj,
 "EMNearRings",
 true,
 [IsExplicitMultiplicationNearRingDefaultRep],
 0,
  function ( N )
    Print("ExplicitMultiplicationNearRing ( ");
    View( GroupReduct(N) );
    Print( " , multiplication )");
  end );

#############################################################################
##
#M  ExtRepOfObj    EMNR element -> group element

InstallMethod(
 ExtRepOfObj,
 "EMNRDefaultRep->GroupElm",
 true,
 [IsExplicitMultiplicationNearRingElement and
  IsExplicitMultiplicationNearRingElementDefaultRep],
 0,
  function ( emnrelm )
    return emnrelm![1];
  end );

#############################################################################
##
#M  NearRingElementByGroupRep   Group element -> EMNRDefaultRep

InstallMethod(
 NearRingElementByGroupRep,
 "EMNRDefaultRep",
 true,
 [IsExplicitMultiplicationNearRingElementFamily,
  IsMultiplicativeElementWithInverse],
 0,
  function ( fam , grpelm )
  local obj;
    obj := [grpelm];
    Objectify(fam!.defaultKind,obj);
    return obj;
  end );

#############################################################################
##
#M  GroupElementRepOfNearRingElement   EMNRDefaultRep -> Group Element

InstallMethod(
 GroupElementRepOfNearRingElement,
 "EMNRDefaultRep",
 true,
 [IsExplicitMultiplicationNearRingElement],
 0,
  function ( elm )
    return elm![1];
  end );

#############################################################################
##
#M  ViewObj    For EMNR elements

InstallMethod(
 ViewObj,
 "EMNRDefaultRep",
 true,
 [IsExplicitMultiplicationNearRingElementDefaultRep],
 0,
  function ( elm )
    Print("(",elm![1],")");
  end );

InstallMethod(
 PrintObj,
 "EMNRDefaultRep",
 true,
 [IsExplicitMultiplicationNearRingElementDefaultRep],
 0,
  function ( elm )
    Print("(",elm![1],")");
  end );

#############################################################################
##
#M  \=     For EMNR elements

InstallMethod(
 \=,
 "EMNRElementDefaultRep",
 IsIdenticalObj,
 [IsExplicitMultiplicationNearRingElementDefaultRep,
  IsExplicitMultiplicationNearRingElementDefaultRep],
 0,
  function ( a , b )
    return a![1] = b![1];
  end );

#############################################################################
##
#M  \<     For EMNR elements

InstallMethod(
 \<,
 "EMNRElementDefaultRep",
 IsIdenticalObj,
 [IsExplicitMultiplicationNearRingElementDefaultRep,
  IsExplicitMultiplicationNearRingElementDefaultRep],
 0,
  function ( a , b )
    return a![1] < b![1];
  end );

#############################################################################
##
#M  \+    For EMNR elements

InstallOtherMethod(
 \+,
 "EMNRElementsDefaultRep",
 IsIdenticalObj,
 [IsExplicitMultiplicationNearRingElementDefaultRep,
  IsExplicitMultiplicationNearRingElementDefaultRep],
 0,
  function ( a , b )
  local fam;
    fam := FamilyObj(a);
    return NearRingElementByGroupRep( fam, a![1]*b![1] );
  end );

#############################################################################
##
#M  AdditiveInverse    For EMNR elements

InstallOtherMethod(
 AdditiveInverse,
 "EMNRElementDefaultRep",
 true,
 [IsExplicitMultiplicationNearRingElementDefaultRep],
 0,
  function ( a )
    return NearRingElementByGroupRep( FamilyObj(a), a![1]^(-1) );
  end );

#############################################################################
##
#M  Zero    For EMNR elements

InstallOtherMethod(
 ZeroMutable,
 "EMNRElementDefaultRep",
 true,
 [IsExplicitMultiplicationNearRingElementDefaultRep],
 0,
  function ( a )
    return NearRingElementByGroupRep( FamilyObj(a), One(a![1]) );
  end );


#############################################################################
##
#M  \*     For EMNR elements

InstallMethod(
 \*,
 "EMNRElementDefaultRep",
 IsIdenticalObj,
 [IsExplicitMultiplicationNearRingElementDefaultRep,
  IsExplicitMultiplicationNearRingElementDefaultRep],
 0,
  function ( a , b )
  local fam;
    fam := FamilyObj(a);
    return NearRingElementByGroupRep( 
  fam, fam!.multiplication(a![1],b![1]) );
  end );

##############################################################################
##
#M  AsTransformationNearRing( < N > )  for ExplicitMultiplicationNRs
##

InstallMethod(
 AsTransformationNearRing,
 "for ExpMulNRs",
 true,
 [IsExplicitMultiplicationNearRing],
 0,
  function( N )
  local nc2,   # (N,+) + C_2, the group the tfms act on
 C2,   # C_2
 f,   # how it acts
 listOfGenerators, # additive generators of the TrfmNR 
 NR,   # the TransformationNearRing
        cat,   # category of group reduct
 mul;

  if IsPermGroup( GroupReduct(N) ) then
    cat := IsPermGroup;
  else
    cat := IsPcGroup;
  fi;
  C2    := CyclicGroup( cat, 2 );
  nc2 := DirectProduct( GroupReduct(N), C2   );
  if HasName( GroupReduct(N) ) then
    SetName( nc2, Concatenation( Name( GroupReduct(N) )," x C_2" ) );
  fi;

  f := function( n, gamma )
    local projNgamma, prod;
      projNgamma := Image( Projection(nc2,1), gamma );    
      if Image( Projection(nc2,2), gamma ) = Identity(C2) then
        prod := NRMultiplication(N)( projNgamma, n );
      else
        prod := n;
      fi;
      return Image( Embedding(nc2,1), prod );
  end;

  listOfGenerators := List( 
 GeneratorsOfGroup( GroupReduct(N) ),
  gen -> MappingByFunction( nc2, nc2, x -> f( gen, x ) ) );

  NR := TransformationNearRingByAdditiveGenerators( nc2,
          listOfGenerators );

  return NR;

  end ); 

#############################################################################
##
#M  Size   For nearrings with known additive group

InstallMethod(
 Size,
 "nearring with known add group",
 true,
 [IsTransformationNearRing],
 0,
  function ( nr )
    return Size(GroupReduct(nr));
  end );

InstallMethod(
 Size,
 "nearring with known add group",
 true,
 [IsExplicitMultiplicationNearRing],
 0,
  function ( nr )
    return Size(GroupReduct(nr));
  end );

#############################################################################
##
#M  AsList    For EMNRs

InstallMethod(
 AsList,
 "EMNearRings",
 true,
 [IsNearRing and IsExplicitMultiplicationNearRingDefaultRep],
 0,
  function ( N )
  local addGroup,fam;
    addGroup := GroupReduct(N);
    fam := N!.elementsInfo;
    return List(AsList(addGroup),e->NearRingElementByGroupRep(fam,e));
  end );

#############################################################################
##
#M  AsSSortedList    For EMNRs

InstallMethod(
 AsSSortedList,
 "EMNearrings",
 true,
 [IsExplicitMultiplicationNearRingDefaultRep],
 0,
  function ( N )
  local addGroup,fam;
    addGroup := GroupReduct(N);
    fam := N!.elementsInfo;
    return List(AsSSortedList(addGroup),e->NearRingElementByGroupRep(fam,e));
  end );
 
#############################################################################
##
#M  Enumerator   For ExpMulNRs

InstallMethod(
 Enumerator,
 true,
 [ IsExplicitMultiplicationNearRingDefaultRep ],
 0,
  function( nr )
    return Objectify( NewType( FamilyObj( nr ),
  IsList and IsExplicitMultiplicationNearRingEnumerator ),
           rec( groupReduct := GroupReduct(nr),
  elementsInfo := nr!.elementsInfo ) );
  end );

#####################################################################
##
#M  Length   for nearring enumerators

InstallMethod( Length,
 "for enumerator of explicit multiplication nearring",
 true,
 [ IsList and IsExplicitMultiplicationNearRingEnumerator ],
 0,
  e -> Size( e!.groupReduct ) );

#####################################################################
##
#M  \[\]   for nearring enumerators

InstallMethod(
 \[\],
 true,
 [ IsList and IsExplicitMultiplicationNearRingEnumerator, IsPosInt ],
 0,
  function( e, pos )
  local groupElement, group, fam;
    group := e!.groupReduct;
    fam := e!.elementsInfo;

    groupElement := Enumerator(group)[pos];

    return NearRingElementByGroupRep( fam, groupElement );
  end );

#####################################################################
##
#M  Position   for nearring enumerators

InstallMethod(
 Position,
 true,
 [ IsList and IsExplicitMultiplicationNearRingEnumerator,
  IsExplicitMultiplicationNearRingElementDefaultRep, IsZeroCyc ],
 0,
  function( e, emnrelm, zero )
    return Position(Enumerator(e!.groupReduct),emnrelm![1],zero);
  end );

#####################################################################
##
#M  ViewObj   for nearring enumerators
#
InstallMethod(
 ViewObj,
 true,
 [ IsExplicitMultiplicationNearRingEnumerator ],
 0,
  function( G )
    Print( "<enumerator of near ring>" );
  end );

#############################################################################
##
#M  SubNearRingBySubgroupNC
##
##  No Check!

InstallMethod(
 SubNearRingBySubgroupNC,
 "ExpMultNRs",
 true,
 [IsExplicitMultiplicationNearRing, IsGroup],
 0,
  function ( nr, sg )
  local fam, subnr;
    fam := nr!.elementsInfo;
    subnr := Objectify(
  NewType(CollectionsFamily(fam),
  IsExplicitMultiplicationNearRing and
   IsExplicitMultiplicationNearRingDefaultRep),
  rec() );
    SetNRMultiplication( subnr, NRMultiplication( nr ) );
    subnr!.elementsInfo := fam;

    SetGroupReduct( subnr, sg );
    SetParent( subnr, nr );

    return subnr;
  end );

#############################################################################
##
#M  InvariantSubNearRings
##

InstallMethod(
 InvariantSubNearRings,
 "ExpMultNRs",
 true,
 [IsNearRing and IsExplicitMultiplicationNearRing],
 0,
  function( N )
  local mul, sgps, g, m, invars, isinv, i;
    mul := NRMultiplication(N);
    sgps := Subgroups( GroupReduct(N) );
  
    invars := [];
    for g in sgps do
      isinv := true;
      i := 0;
      while i < Size(g) and isinv do
        i := i+1;
        m := Enumerator(g)[i];
        if ForAny( N, n -> not ( mul( m, GroupElementRepOfNearRingElement(n) ) in g ) or 
      not ( mul( GroupElementRepOfNearRingElement(n), m ) in g ) ) then
   isinv := false;
        fi;
      od;
      if isinv then Add( invars, g ); fi;
    od;

    return List( invars, inv -> SubNearRingBySubgroupNC( N, inv ) ); 
  end );

#############################################################################
##
#M  SubNearRings  for ExpMulNRs
##

InstallMethod(
 SubNearRings,
 "ExpMultNRs",
 true,
 [IsNearRing and IsExplicitMultiplicationNearRing],
 0,
  function( N )
  local mul, sgps, subnrs;
    mul := NRMultiplication(N);
    sgps := Subgroups( GroupReduct(N) );

    subnrs := Filtered( sgps,
 g -> ForAll( g, m -> ForAll( g, n -> mul(m,n) in g ) ) );
  
    return List( subnrs, sg -> SubNearRingBySubgroupNC( N, sg ) ); 
  end );

#############################################################################
##
#M  ZeroSymmetricPart  for ExpMulNRs
##

InstallMethod(
 ZeroSymmetricPart,
 "ExpMulNRs",
 true,
 [IsNearRing and IsExplicitMultiplicationNearRing],
 0,
  function ( N )
  local addGroup, zero, sg, n;
    addGroup := GroupReduct( N );
    zero := Identity( addGroup );
    sg := TrivialSubgroup( addGroup );
    for n in addGroup do
      if not ( n in sg ) and NRMultiplication(N)( zero, n ) = zero then
  sg := ClosureSubgroup( sg, n );
      fi;
    od;

    return SubNearRingBySubgroupNC( N, sg );
  end );


















[ Dauer der Verarbeitung: 0.31 Sekunden  (vorverarbeitet)  ]