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


Quelle  fixedrep.gi   Sprache: unbekannt

 
#############################################################################
##
#W  fixedrep.gi             GAP4 Package `ResClasses'             Stefan Kohl
##
##  This file contains implementations of methods and functions for
##  computing with unions of residue classes with distinguished ("fixed")
##  representatives.
##
#############################################################################

#############################################################################
##
#S  Implications between the categories. ////////////////////////////////////
##
#############################################################################

InstallTrueMethod( IsUnionOfResidueClassesWithFixedRepresentatives,
                   IsUnionOfResidueClassesOfZorZ_piWithFixedRepresentatives);
InstallTrueMethod( IsUnionOfResidueClassesOfZorZ_piWithFixedRepresentatives,
                   IsUnionOfResidueClassesOfZWithFixedRepresentatives );
InstallTrueMethod( IsUnionOfResidueClassesOfZorZ_piWithFixedRepresentatives,
                   IsUnionOfResidueClassesOfZ_piWithFixedRepresentatives );
InstallTrueMethod( IsUnionOfResidueClassesWithFixedRepresentatives,
                   IsUnionOfResidueClassesOfGFqxWithFixedRepresentatives );

#############################################################################
##
#S  Residue classes (mod m). ////////////////////////////////////////////////
##
#############################################################################

#############################################################################
##
#F  AllResidueClassesWithFixedRepresentativesModulo( [ <R>, ] <m> )
#F  AllResidueClassesWithFixedRepsModulo( [ <R>, ] <m> )
##
InstallGlobalFunction( AllResidueClassesWithFixedRepresentativesModulo,

  function ( arg )

    local  R, m;

    if   Length(arg) = 2
    then R := arg[1]; m := arg[2];
    else m := arg[1]; R := DefaultRing(m); fi;
    if IsZero(m) or not m in R then return fail; fi;
    return List(AllResidues(R,m),r->ResidueClassWithFixedRep(R,m,r));
  end );

#############################################################################
##
#S  Construction of unions of residue classes with fixed representatives. ///
##
#############################################################################

#############################################################################
##
#M  UnionOfResidueClassesWithFixedRepresentativesCons(<filter>,<R>,<classes>)
##
InstallMethod( UnionOfResidueClassesWithFixedRepresentativesCons,
               "for Z, Z_pi and GF(q)[x] (ResClasses)", ReturnTrue,
               [ IsUnionOfResidueClassesWithFixedRepresentatives,
                 IsRing, IsList ], 0,

  function ( filter, R, classes )

    local  Result, fam, type, rep;

    if not ( IsIntegers( R ) or IsZ_pi( R )
             or (     IsFiniteFieldPolynomialRing( R )
                  and IsUnivariatePolynomialRing( R ) ) )
    then TryNextMethod( ); fi;
    fam := ResidueClassUnionsFamily( R, true );
    if   IsIntegers( R )
    then type := IsUnionOfResidueClassesOfZWithFixedRepresentatives;
    elif IsZ_pi( R )
    then type := IsUnionOfResidueClassesOfZ_piWithFixedRepresentatives;
    elif IsPolynomialRing( R )
    then type := IsUnionOfResidueClassesOfGFqxWithFixedRepresentatives; fi;
    rep := IsUnionOfResidueClassesWithFixedRepsStandardRep;
    Result := Objectify( NewType( fam, type and rep ),
                         rec( classes := AsSortedList( classes ) ) );
    if classes <> [] then
      SetSize( Result, infinity ); SetIsFinite( Result, false );
      SetIsEmpty( Result, false );
      SetRepresentative( Result, classes[1][2] );
    else
      SetSize( Result, 0 ); SetIsEmpty( Result, true );
    fi;
    return Result;
  end );

#############################################################################
##
#F  UnionOfResidueClassesWithFixedRepresentatives( <R>, <classes> )
#F  UnionOfResidueClassesWithFixedRepresentatives( <classes> )
#F  UnionOfResidueClassesWithFixedReps( <R>, <classes> )
#F  UnionOfResidueClassesWithFixedReps( <classes> )
##
InstallGlobalFunction( UnionOfResidueClassesWithFixedRepresentatives,

  function ( arg )

    local  R, classes, usage;

    usage := Concatenation("usage: UnionOfResidueClassesWithFixedRepresenta",
                           "tives( [ <R>, ] <classes> )\n");
    if not Length(arg) in [1,2] then Error(usage); return fail; fi;
    if Length(arg) = 2 then R := arg[1];   classes := arg[2];
                       else R := Integers; classes := arg[1]; fi;
    if   not IsIntegers(R) and not IsZ_pi(R) and not IsPolynomialRing(R)
      or not IsList(classes) or not ForAll(classes,IsList)
      or not ForAll(classes,cl->Length(cl)=2)
      or not IsSubset(R,Flat(classes))
      or IsZero(Product(List(classes,cl->cl[1])))
    then Error(usage); return fail; fi;
    return UnionOfResidueClassesWithFixedRepresentativesCons(
             IsUnionOfResidueClassesWithFixedRepresentatives, R, classes );
  end );

#############################################################################
##
#F  ResidueClassWithFixedRepresentative( <R>, <m>, <r> )
#F  ResidueClassWithFixedRepresentative( <m>, <r> )
#F  ResidueClassWithFixedRep( <R>, <m>, <r> )
#F  ResidueClassWithFixedRep( <m>, <r> )
##
InstallGlobalFunction( ResidueClassWithFixedRepresentative,

  function ( arg )

    local  R, m, r, cl, usage;

    usage := Concatenation("usage: ResidueClassWithFixedRepresentative",
                           "( [ <R>, ] <m>, <r> ) for a ring <R> and ",
                           "elements <m> and <r>.\n");
    if not Length(arg) in [2,3] then Error(usage); return fail; fi;
    if Length(arg) = 3 then R := arg[1];   m := arg[2]; r := arg[3];
                       else R := Integers; m := arg[1]; r := arg[2]; fi;
    if not ( IsRing(R) and m in R and r in R )
    then Error(usage); return fail; fi;
    cl := UnionOfResidueClassesWithFixedRepresentatives( R, [ [ m, r ] ] );
    SetIsResidueClassWithFixedRepresentative( cl, true );
    return cl;
  end );

#############################################################################
##
#M  IsResidueClassWithFixedRepresentative( <obj> )  . . . . .  general method
##
InstallMethod( IsResidueClassWithFixedRepresentative,
               "general method (ResClasses)", true, [ IsObject ], 0,

  function ( obj )
    if    IsUnionOfResidueClassesWithFixedRepresentatives(obj)
      and Length(Classes(obj)) = 1
    then return true; fi;
    return false;
  end );

#############################################################################
##
#M  Modulus( <cl> ) . . . . . . for residue classes with fixed representative
##
InstallMethod( Modulus,
               "for residue classes with fixed representative (ResClasses)",
               true, [ IsResidueClassWithFixedRepresentative ], SUM_FLAGS,
               cl -> Classes(cl)[1][1] );

#############################################################################
##
#M  Residue( <cl> ) . . . . . . for residue classes with fixed representative
##
InstallMethod( Residue,
               "for residue classes with fixed representative (ResClasses)",
               true, [ IsResidueClassWithFixedRepresentative ], 0,
               cl -> Classes(cl)[1][2] );

#############################################################################
##
#M  AsOrdinaryUnionOfResidueClasses( <U> )
##
InstallMethod( AsOrdinaryUnionOfResidueClasses,
               "for unions of residue classes with fixed rep's (ResClasses)",
               true, [ IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( U )

    local  R, cl;

    R := UnderlyingRing(FamilyObj(U));
    return Union(List(Classes(U),cl->ResidueClass(R,cl[1],cl[2])));
  end );

#############################################################################
##
#S  Accessing the components of a union of residue classes object. //////////
##
#############################################################################

#############################################################################
##
#M  Modulus( <U> ) . . . . . . for unions of residue classes with fixed rep's
##
InstallMethod( Modulus,
               "for unions of residue classes with fixed rep's (ResClasses)",
               true, [ IsUnionOfResidueClassesWithFixedRepresentatives ], 0,
               U -> Lcm( UnderlyingRing( FamilyObj( U ) ),
                         List( U!.classes, cl -> cl[1] ) ) );

#############################################################################
##
#M  Classes( <U> ) . . . . . . for unions of residue classes with fixed rep's
##
InstallMethod( Classes,
               "for unions of residue classes with fixed rep's (ResClasses)",
               true, [ IsUnionOfResidueClassesWithFixedRepresentatives ], 0,
               U -> U!.classes );

#############################################################################
##
#S  Testing for equality. ///////////////////////////////////////////////////
##
#############################################################################

#############################################################################
##
#M  \=( <U1>, <U2> ) . . . . . for unions of residue classes with fixed rep's
##
InstallMethod( \=,

  "for two unions of residue classes with fixed rep's (ResClasses)",
  IsIdenticalObj,
  [ IsUnionOfResidueClassesWithFixedRepresentatives,
    IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( U1, U2 )
    return U1!.classes = U2!.classes;
  end );

#############################################################################
##
#M  \<( <U1>, <U2> ) . . . . . for unions of residue classes with fixed rep's
##
##  A total ordering of unions of residue classes with fixed representatives
##  (for technical purposes, only).
##
InstallMethod( \<,

  "for two unions of residue classes with fixed rep's (ResClasses)",
  IsIdenticalObj,
  [ IsUnionOfResidueClassesWithFixedRepresentatives,
    IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( U1, U2 ) return U1!.classes < U2!.classes; end );

#############################################################################
##
#S  Membership and multiplicity. ////////////////////////////////////////////
##
#############################################################################

#############################################################################
##
#M  \in( <n>, <U> ) . for ring element and union of res.-cl. with fixed rep's
##
InstallMethod( \in,

  "for a ring element and a union of res.-cl. with fixed rep's (ResClasses)",
  ReturnTrue,
  [ IsRingElement, IsUnionOfResidueClassesWithFixedRepresentatives ],
  SUM_FLAGS,

  function ( n, U ) return Multiplicity(n,U) >= 1; end );

#############################################################################
##
#M  \in( <cl>, <U> ) . . . for res.-cl and union of res.-cl. with fixed rep's
##
InstallMethod( \in,

  "for a res.-cl. and a union of res.-cl. with fixed rep's (ResClasses)",
  ReturnTrue,
  [ IsUnionOfResidueClassesWithFixedRepresentatives,
    IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( cl, U )
    if Length(cl!.classes) > 1 then TryNextMethod(); fi;
    return cl!.classes[1] in U!.classes;
  end );

#############################################################################
##
#M  Multiplicity( <n>, <U> )
##
InstallMethod( Multiplicity,

  "for a ring element and a union of res.-cl. with fixed rep's (ResClasses)",
  ReturnTrue,
  [ IsRingElement, IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( n, U )
    if not n in UnderlyingRing(FamilyObj(U)) then return 0; fi;
    return Number(U!.classes,cl->n mod cl[1] = cl[2]);
  end );

#############################################################################
##
#M  Multiplicity( <cl>, <U> )
##
InstallMethod( Multiplicity,

  "for a res.-cl. and union of res.-cl. with fixed rep's (ResClasses)",
  ReturnTrue,
  [ IsUnionOfResidueClassesWithFixedRepresentatives,
    IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( cl, U )
    return Number( AsListOfClasses( U ), unioncl -> unioncl = cl );
  end );

#############################################################################
##
#S  Density and subset relations. ///////////////////////////////////////////
##
#############################################################################

#############################################################################
##
#M  Density( <U> ) . . . . . . for unions of residue classes with fixed rep's
##
InstallOtherMethod( Density,

  "for unions of residue classes with fixed rep's (ResClasses)",
  true, [ IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( U )

    local  R;

    R := UnderlyingRing(FamilyObj(U));
    return Sum(List(U!.classes,c->1/Length(AllResidues(R,c[1]))));
  end );

#############################################################################
##
#M  IsOverlappingFree( <U> ) . for unions of residue classes with fixed rep's
##
InstallMethod( IsOverlappingFree,

  "for unions of residue classes with fixed rep's (ResClasses)",
  true, [ IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  U -> Density( U ) = Density( AsOrdinaryUnionOfResidueClasses( U ) ) );

#############################################################################
##
#M  IsSubset( <U1>, <U2> ) . . for unions of residue classes with fixed rep's
##
InstallMethod( IsSubset,

  "for two unions of residue classes with fixed rep's (ResClasses)",
  IsIdenticalObj,
  [ IsUnionOfResidueClassesWithFixedRepresentatives,
    IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( U1, U2 )

    local  R, cls, classes, numbers;

    R       := UnderlyingRing(FamilyObj(U1));
    cls     := [Classes(U1),Classes(U2)];
    classes := Set(Union(cls));
    numbers := List(classes,cl1->List(cls,list->Number(list,cl2->cl2=cl1)));
    return ForAll(numbers,num->num[1]>=num[2]); 
  end );

#############################################################################
##
#S  Computing unions, intersections and differences. ////////////////////////
##
#############################################################################

#############################################################################
##
#M  Union2( <U1>, <U2> ) . . . for unions of residue classes with fixed rep's
##
InstallMethod( Union2,

  "for two unions of residue classes with fixed rep's (ResClasses)",
  IsIdenticalObj,
  [ IsUnionOfResidueClassesWithFixedRepresentatives,
    IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( U1, U2 )
    return UnionOfResidueClassesWithFixedRepresentatives(
             UnderlyingRing(FamilyObj(U1)),
             Concatenation(Classes(U1),Classes(U2)));
  end );

#############################################################################
##
#M  Intersection2( <U1>, <U2> ) . for unions of res.-classes with fixed rep's
##
InstallMethod( Intersection2,

  "for two unions of residue classes with fixed rep's (ResClasses)",
  IsIdenticalObj,
  [ IsUnionOfResidueClassesWithFixedRepresentatives,
    IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( U1, U2 )

    local  R, cls, cls1, cls2, int, cl;

    R := UnderlyingRing(FamilyObj(U1));
    cls1 := Classes(U1); cls2 := Classes(U2); int := Intersection(cls1,cls2);
    cls := Concatenation(List(int,cl->ListWithIdenticalEntries(
           Minimum(Number(cls1,cl1->cl1=cl),Number(cls2,cl2->cl2=cl)),cl)));
    return UnionOfResidueClassesWithFixedRepresentatives( R, cls );
  end );

#############################################################################
##
#M  Difference( <U1>, <U2> ) . for unions of residue classes with fixed rep's
##
InstallMethod( Difference,

  "for two unions of residue classes with fixed rep's (ResClasses)",
  IsIdenticalObj,
  [ IsUnionOfResidueClassesWithFixedRepresentatives,
    IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( U1, U2 )

    local  Multiple, R, cls, classes, numbers, diffcls;

    Multiple := function ( cl, k )
      if   k < 0
      then return ListWithIdenticalEntries(-k,[cl[1],cl[1]-cl[2]]);
      else return ListWithIdenticalEntries(k,cl); fi;
    end;

    R       := UnderlyingRing(FamilyObj(U1));
    cls     := [Classes(U1),Classes(U2)];
    classes := Set(Union(cls));
    numbers := List(classes,cl1->List(cls,list->Number(list,cl2->cl2=cl1)));
    numbers := TransposedMat(numbers); numbers := numbers[1] - numbers[2];
    diffcls := Concatenation(List([1..Length(numbers)],
                                  i->Multiple(classes[i],numbers[i])));
    return UnionOfResidueClassesWithFixedRepresentatives( R, diffcls );
  end );

#############################################################################
##
#S  Applying arithmetic operations to the residue classes. //////////////////
##
#############################################################################

#############################################################################
##
#M  \+( <U>, <x> ) .  for union of res.-cl. with fixed rep's and ring element
##
InstallOtherMethod( \+,

  "for a union of res.-cl. with fixed rep's and a ring element (ResClasses)",
  ReturnTrue,
  [ IsUnionOfResidueClassesWithFixedRepresentatives, IsRingElement ], 0,

  function ( U, x )
    return UnionOfResidueClassesWithFixedRepresentatives(
             UnderlyingRing(FamilyObj(U)),
             List(Classes(U),cl->[cl[1],cl[2]+x]) );
  end );

#############################################################################
##
#M  \+( <x>, <U> ) .  for ring element and union of res.-cl. with fixed rep's
##
InstallOtherMethod( \+,

  "for a ring element and a union of res.-cl. with fixed rep's (ResClasses)",
  ReturnTrue,
  [ IsRingElement, IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( x, U ) return U + x; end );

#############################################################################
##
#M  AdditiveInverseOp( <U> ) . for unions of residue classes with fixed rep's
##
InstallOtherMethod( AdditiveInverseOp,

  "for unions of residue classes with fixed rep's (ResClasses)",
  ReturnTrue, [ IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( U )

    local  R, invclasses;

    R := UnderlyingRing(FamilyObj(U));
    invclasses := List(Classes(U),cl->[-cl[1],-cl[2]]);
    return UnionOfResidueClassesWithFixedRepresentatives(R,invclasses);
  end );

#############################################################################
##
#M  \-( <U>, <x> ) .  for union of res.-cl. with fixed rep's and ring element
##
InstallOtherMethod( \-,

  "for a union of res.-cl. with fixed rep's and a ring element (ResClasses)",
  ReturnTrue,
  [ IsUnionOfResidueClassesWithFixedRepresentatives, IsRingElement ], 0,

  function ( U, x ) return U + (-x); end );

#############################################################################
##
#M  \-( <x>, <U> ) .  for ring element and union of res.-cl. with fixed rep's
##
InstallOtherMethod( \-,

  "for a ring element and a union of res.-cl. with fixed rep's (ResClasses)",
  ReturnTrue,
  [ IsRingElement, IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( x, U ) return (-U) + x; end );

#############################################################################
##
#M  \*( <U>, <x> ) .  for union of res.-cl. with fixed rep's and ring element
##
InstallOtherMethod( \*,

  "for a union of res.-cl. with fixed rep's and a ring element (ResClasses)",
  ReturnTrue,
  [ IsUnionOfResidueClassesWithFixedRepresentatives, IsRingElement ], 0,

  function ( U, x )

    local  R;

    R := UnderlyingRing(FamilyObj(U));
    return UnionOfResidueClassesWithFixedRepresentatives( R, Classes(U)*x );
  end );

#############################################################################
##
#M  \*( <x>, <U> ) .  for ring element and union of res.-cl. with fixed rep's
##
InstallOtherMethod( \*,

  "for a ring element and a union of res.-cl. with fixed rep's (ResClasses)",
  ReturnTrue,
  [ IsRingElement, IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( x, U ) return U * x; end );

#############################################################################
##
#M  \/( <U>, <x> ) .  for union of res.-cl. with fixed rep's and ring element
##
InstallOtherMethod( \/,

  "for a union of res.-cl. with fixed rep's and a ring element (ResClasses)",
  ReturnTrue,
  [ IsUnionOfResidueClassesWithFixedRepresentatives, IsRingElement ], 0,

  function ( U, x )

    local  R, quotclasses;

    R := UnderlyingRing(FamilyObj(U));
    quotclasses := Classes(U)/x;
    if not IsSubset(R,Flat(quotclasses)) then TryNextMethod(); fi;
    return UnionOfResidueClassesWithFixedRepresentatives( R, quotclasses );
  end );

#############################################################################
##
#S  Computing partitions into residue classes. //////////////////////////////
##
#############################################################################

#############################################################################
##
#M  AsListOfClasses( <U> ) . . for unions of residue classes with fixed rep's
##
InstallMethod( AsListOfClasses,
               "for unions of residue classes with fixed rep's (ResClasses)",
               true, [ IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  U -> SortedList( List( Classes( U ),
                   cl -> ResidueClassWithFixedRepresentative(
                   UnderlyingRing( FamilyObj( U ) ), cl[1], cl[2] ) ) ) );

#############################################################################
##
#S  The invariants Delta and Rho. ///////////////////////////////////////////
##
#############################################################################

#############################################################################
##
#M  Delta( <U> ) . . . .  for unions of residue classes of Z with fixed rep's
##
InstallMethod( Delta,

  "for unions of residue classes of Z with fixed rep's (ResClasses)",
  true, [ IsUnionOfResidueClassesOfZWithFixedRepresentatives ], 0,

  U -> Sum(List(Classes(U),c->c[2]/c[1])) - Length(Classes(U))/2 );

#############################################################################
##
#M  Rho( <U> ) . . . . .  for unions of residue classes of Z with fixed rep's
##
InstallMethod( Rho,

  "for unions of residue classes of Z with fixed rep's (ResClasses)", true,
  [ IsUnionOfResidueClassesOfZWithFixedRepresentatives ], 0,

  function ( U )

    local  product, factor, classes, cl, delta;

    product := 1;
    classes := AsListOfClasses(U);
    for cl in classes do
      delta  := Delta(cl)/2;
      factor := E(DenominatorRat(delta))^NumeratorRat(delta);
      if Classes(cl)[1][1] < 0 then factor := factor^-1; fi;
      product := product * factor;
    od;
    return product;
  end );

#############################################################################
##
#M  RepresentativeStabilizingRefinement( <U>, <k> )
##
InstallMethod( RepresentativeStabilizingRefinement,

  Concatenation("for a union of residue classes of Z with fixed rep's and ",
                "a positive integer (ResClasses)"), ReturnTrue,
  [ IsUnionOfResidueClassesOfZWithFixedRepresentatives, IsPosInt ], 0,

  function ( U, k )

    local  classes;

    classes := Concatenation(List(Classes(U),
                                  cl->List([0..k-1],
                                           i->[k*cl[1],i*cl[1]+cl[2]])));
    return UnionOfResidueClassesWithFixedRepresentatives(Integers,classes);
  end );

#############################################################################
##
#M  RepresentativeStabilizingRefinement( <U>, 0 )
##
InstallMethod( RepresentativeStabilizingRefinement,

  Concatenation("for a union of residue classes of Z with fixed rep's and 0",
                " (simplify) (ResClasses)"),
  ReturnTrue, [ IsUnionOfResidueClassesOfZWithFixedRepresentatives,
                IsInt and IsZero ], 0,

  function ( U, k )

    local  cls, olds, mods, parts, part, mp, rp, kp, m, complete, c,
           progression, replacement, found, cl, pos;

    cls := ShallowCopy(Classes(U));
    if Length(cls) < 2 then return U; fi;
    repeat
      olds  := ShallowCopy(cls);
      mods  := Set(List(cls,cl->cl[1]));
      parts := List(mods,m->Filtered(cls,cl->cl[1]=m));
      found := false;
      for part in parts do
        mp := part[1][1]; rp := Set(part,cl->cl[2]);
        for kp in Intersection([2..Length(rp)],DivisorsInt(mp)) do
          m := mp/kp;
          complete := First(Collected(rp mod m),c->c[2]=kp);
          if complete <> fail then
            progression := Set(Filtered(part,t->t[2] mod m = complete[1]));
            if   Set(List([1..Length(progression)-1],
                          i->progression[i+1][2]-progression[i][2]))
              <> [AbsInt(m)]
            then continue; fi;
            if m < 0 then progression := Reversed(progression); fi;
            replacement := [[m,progression[1][2]]];
            while progression <> [] do
              cl := progression[1];
              pos := Position(cls,cl);
              Unbind(cls[pos]);
              cls := SortedList(cls); 
              Unbind(progression[1]);
              progression := SortedList(progression);
            od;
            cls := Concatenation(cls,replacement);
            found := true;
          fi;
          if found then break; fi;
        od;
        if found then break; fi;
      od;
    until cls = olds;
    return UnionOfResidueClassesWithFixedRepresentatives(Integers,cls);
  end );

#############################################################################
##
#S  Viewing, printing and displaying unions of residue classes. /////////////
##
#############################################################################

#############################################################################
##
#M  ViewString( <cl> ) . . . . . . . . . for residue classes with fixed rep's
##
InstallMethod( ViewString,
               "for residue classes with fixed rep's (ResClasses)", true,
               [ IsResidueClassWithFixedRep ], 0,
               cl -> Concatenation("[",ViewString(Residue(cl)),"/",
                                       ViewString(Modulus(cl)),"]") );

#############################################################################
##
#M  ViewObj( <U> ) . . . . . . for unions of residue classes with fixed rep's
##
InstallMethod( ViewObj,
               "for unions of residue classes with fixed rep's (ResClasses)",
               true, [ IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( U )

    local  R, classes, l, i, short;

    short := RESCLASSES_VIEWINGFORMAT = "short";
    R := UnderlyingRing(FamilyObj(U));
    classes := Classes(U); l := Length(classes);
    if l = 0 or l > 8 or IsPolynomialRing(R) and l > 3 then
      if l = 0 then
        if not short then
          Print("Empty union of residue classes of ",RingToString(R),
                " with fixed representatives");
        else
          Print("[]");
        fi;
      else
        Print("<union of ",l," residue classes");
        if   not short
        then Print(" of ",RingToString(R)," with fixed representatives>");
        else Print(" with fixed rep's>"); fi;
      fi;
    else
      for i in [1..l] do
        if i > 1 then Print(" U "); fi;
        Print("[",classes[i][2],"/",classes[i][1],"]");
      od;
    fi;
  end );

#############################################################################
##
#M  String( <U> ) . . . . . .  for unions of residue classes with fixed rep's
##
InstallMethod( String,
               "for unions of residue classes with fixed rep's (ResClasses)",
               true, [ IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( U )

    local  R, classes;

    R := UnderlyingRing(FamilyObj(U)); classes := Classes(U);
    if Length(classes) = 1 then
      return Concatenation("ResidueClassWithFixedRepresentative( ",
                           String(R),", ",String(classes[1][1]),", ",
                           String(classes[1][2])," )");
    else
      return Concatenation("UnionOfResidueClassesWithFixedRepresentative",
                           "s( ",String(R),", ",String(classes)," )");
    fi;
  end );

#############################################################################
##
#M  PrintObj( <U> ) . . . . .  for unions of residue classes with fixed rep's
##
InstallMethod( PrintObj,
               "for unions of residue classes with fixed rep's (ResClasses)",
               true, [ IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( U )

    local  R, classes;

    R := UnderlyingRing(FamilyObj(U)); classes := Classes(U);
    if Length(classes) = 1 then
      Print("ResidueClassWithFixedRepresentative( ",R,", ",
            classes[1][1],", ",classes[1][2]," )");
    else
      Print("UnionOfResidueClassesWithFixedRepresentatives( ",R,", ",
            classes," )");
    fi;
  end );

#############################################################################
##
#M  Display( <U> ) . . . . . . for unions of residue classes with fixed rep's
##
InstallMethod( Display,
               "for unions of residue classes with fixed rep's (ResClasses)",
               true, [ IsUnionOfResidueClassesWithFixedRepresentatives ], 0,

  function ( U )

    local  R, classes, l, i;

    R := UnderlyingRing(FamilyObj(U));
    classes := Classes(U); l := Length(classes);
    if l = 0 then View(U); else
      for i in [1..l] do
          if i > 1 then Print(" U "); fi;
          Print("[",classes[i][2],"/",classes[i][1],"]");
      od;
    fi;
    Print("\n");
  end );

#############################################################################
##
#E  fixedrep.gi . . . . . . . . . . . . . . . . . . . . . . . . . . ends here

[ Dauer der Verarbeitung: 0.50 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