Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/qpa/lib/   (GAP Algebra Version 4.15.1©)  Datei vom 4.0.2024 mit Größe 1 kB image not shown  

Quellcode-Bibliothek groebner.gi   Sprache: Shell

 

# GAP Implementation
# This file was generated from 
# $Id: groebner.gi,v 1.1 2010/05/07 13:30:13 sunnyquiver Exp $
InstallMethod( GroebnerBasis, 
  "for an ideal of a path algebra and a collection of elements",
  IsIdenticalObj,
  [ IsFLMLOR, IsElementOfMagmaRingModuloRelationsCollection ], 0,
  function(I, rels)
    local GB, R;

    if not IsElementOfPathRing(ElementsFamily(FamilyObj(I))) then
        TryNextMethod();
    fi;

    R := LeftActingRingOfIdeal(I);

    GB := Objectify( NewType( FamilyObj(rels),
                       IsGroebnerBasis and IsGroebnerBasisDefaultRep ),
                       rec( ideal := I,
                            relations := AsSortedList(rels),
                            algebra := R
                          )
             );

    SetIsCompleteGroebnerBasis(GB, true);
    SetGroebnerBasisOfIdeal(I, GB);

    return GB;

  end
);


InstallMethod( CompletelyReduce,
  "for complete tip reduced groebner bases",
  true, # FIXME
  [ IsGroebnerBasis and IsCompleteGroebnerBasis 
    and IsTipReducedGroebnerBasis, IsRingElement], 0,
  function( GB, rel )
    local pats, st, tip, redRel, zero;

    zero := Zero(rel);
    redRel := zero;

    while rel <> zero do
      rel := TipReduce(GB, rel);
      tip := Tip(rel);
      rel := rel - tip;
      redRel := redRel + tip;
    od;

    return redRel;

  end
);


InstallMethod( CompletelyReduceGroebnerBasis,
  "for complete groebner bases",
  true,
  [IsGroebnerBasis and IsCompleteGroebnerBasis], 0,
  function( GB )
    local i, n, tip, rel;

    # first tip reduce it
    GB := TipReduceGroebnerBasis(GB);

    # now completely reduce each relation
    n := Length(GB!.relations);

    for i in [1..n] do
      rel := GB!.relations[i];
      tip := Tip(rel);
      GB!.relations[i] := tip + CompletelyReduce(GB, rel - tip);
    od;

    SetIsCompletelyReducedGroebnerBasis(GB, true);

    return GB;

  end
);


ReduceRelation := function( rel, redRel, extTip, start, rend )
  local redCoeff, fam, n, left, right, q, qFam, tipCoeff;
 
  fam := FamilyObj(rel);
  q := QuiverOfPathAlgebra(fam!.pathRing);
  qFam := ElementsFamily(FamilyObj(q));

  tipCoeff := TipCoefficient(rel);
  redCoeff := tipCoeff / TipCoefficient(redRel) ;
  if start <> 1 then
    left := extTip{[1..start-1]};
    left := ElementOfMagmaRing(fam, fam!.zeroRing, 
                               [ One(fam!.zeroRing)],
                               [ ObjByExtRep(qFam, left) ]);
  else
    left := One(rel);
  fi;

  if  rend < Length(extTip) then
    right := extTip{[rend+1..Length(extTip)]};
    right := ElementOfMagmaRing( fam, fam!.zeroRing,
                                [ One(fam!.zeroRing)],
                                [ ObjByExtRep(qFam, right) ]);
  else
    right := One(rel);
  fi;

  Info(InfoGroebnerBasis, 1, "redCoeff: ", redCoeff);
  Info(InfoGroebnerBasis, 1, "left: ", left);
  Info(InfoGroebnerBasis, 1, "right: ", right);
  Info(InfoGroebnerBasis, 1, "rel: ", rel);
  Info(InfoGroebnerBasis, 1, "redRel: ", redRel);

  rel := rel - redCoeff * left * redRel * right;

  return rel;

end;


InstallMethod( TipReduce,
  "for complete tip reduced groebner bases",
  true, # FIXME
  [IsGroebnerBasis and IsCompleteGroebnerBasis 
   and IsTipReducedGroebnerBasis, IsRingElement], 0,
  function( GB, rel )
    local matches, st, tip, tipMon, extTip, redMatch, redPat, 
          zero, start, rend, patLen;

    st := GB!.staticDict;
    zero := Zero(rel);

    repeat

      tip := Tip(rel);
      tipMon := TipMonomial(rel);
      extTip := ExtRepOfObj(tipMon);

      matches := Search(st, tipMon);
      if not IsEmpty(matches) then
        redMatch := matches[1];
        redPat := Patterns(st)[redMatch[2][1]];
        patLen := Length(WalkOfPath(redPat));
        start := redMatch[1] - patLen + 1;
        rend := redMatch[1];
                
        rel := ReduceRelation(rel, GB!.relations[redMatch[2][1]],
                                  extTip, start, rend);
      fi;

    until IsEmpty(matches) or rel = zero;

    return rel;

  end
);


InstallMethod( TipReduce,
  "for right groebner bases and an element",
  true, # FIXME
  [ IsRightGroebnerBasis and IsGroebnerBasisDefaultRep
    and IsTipReducedGroebnerBasis,
    IsRingElement ], 0,
  function( gb, rel )
    local zero, dict, relations, tip, extTip, matches,
          redMatch, start, rend;

    zero := Zero(rel);
    dict := gb!.staticDict;
    relations := gb!.relations;

    repeat

      tip := TipMonomial(rel);
      extTip := ExtRepOfObj(tip);
      matches := PrefixSearch(dict, tip);
      if not IsEmpty(matches) then
        redMatch := matches[1];
        start := 1;
        rend := redMatch[1];
        rel := ReduceRelation(rel, relations[redMatch[2][1]],
                              extTip, start, rend);
      fi;

    until IsEmpty(matches) or rel = zero;

    return rel;

  end
);


InstallMethod( TipReduceGroebnerBasis, 
  "for groebner bases in default representation",
  true,
  [IsGroebnerBasis 
   and IsCompleteGroebnerBasis 
   and IsGroebnerBasisDefaultRep], 0,
  function( GB )
    local gbRels, trgbRels, rel, tip, extTip, pats,
          st, redPat, n, redCoeff, extras, extra, t, quiver;

    if not (HasIsTipReducedGroebnerBasis(GB)
            and IsTipReducedGroebnerBasis(GB))
    then
      gbRels := Set(GB!.relations);
      trgbRels := [];
      st := CreateSuffixTree();
 
      while not IsEmpty(gbRels) do

        rel := gbRels[1];
        RemoveSet(gbRels, rel);
        Info(InfoGroebnerBasis, 1, "Removed relation: ", rel);

        if rel <> Zero(rel) then

          tip := TipMonomial(rel);
          extTip := ExtRepOfObj(tip);
          pats := AllPatternsInSequence(st, extTip);

          if not IsEmpty(pats) then
            redPat := pats[1];
            rel := ReduceRelation(rel, trgbRels[redPat[1]], extTip, redPat[2],
                                  redPat[2] + Length(st[redPat[1]])-1);
 
            if rel <> Zero(rel) then
              Info(InfoGroebnerBasis,1, "Adding relation: ", rel);
              AddSet(gbRels, rel);
            fi;

          else
            extras := SequenceInPatterns(st, extTip);

            if not IsEmpty(extras) then
              for extra in extras do
                if IsBound(trgbRels[extra[1]]) then
                  AddSet(gbRels, trgbRels[extra[1]]);
                  Unbind(trgbRels[extra[1]]);
                  DeletePatternFromSuffixTree(st, extra[1]);
                fi;
              od;
            fi;

            t := InsertPatternIntoSuffixTree(st, extTip);
            trgbRels[t] := rel;

          fi;
        fi;
      od;

      Sort(trgbRels);
      GB!.relations := trgbRels;

    fi;

    if not IsBound(GB!.staticDict) then
        quiver := 
          QuiverOfPathAlgebra(FamilyObj(GB!.relations[1])!.pathRing);

        # Construct a static dictionary for later reductions
        GB!.staticDict := QuiverStaticDictionary(quiver,
                              List(GB!.relations, TipMonomial));
    fi;

    SetIsTipReducedGroebnerBasis(GB, true);

    return GB;

  end
);


InstallMethod( TipReduceGroebnerBasis,
  "for right groebner bases",
  true,
  [IsRightGroebnerBasis and IsGroebnerBasisDefaultRep], 0,
  function( gb )
    local gbRels, trgbRels, quiver, i, relTip, relWalk, iWalk,
            reduced, trel, rel;


    if not (HasIsTipReducedGroebnerBasis(gb)
            and IsTipReducedGroebnerBasis(gb))
    then
      gbRels := Set(gb!.relations);
      trgbRels := [];

      while not IsEmpty(gbRels) do
        rel := gbRels[1];
        RemoveSet(gbRels, rel);

        if rel <> Zero(rel) then
          reduced := false;
          relWalk := WalkOfPath(TipMonomial(rel));

          for i in [1..Length(trgbRels)] do
            iWalk := WalkOfPath(TipMonomial(trgbRels[i]));

            if PositionSublist(iWalk, relWalk) = 1 then
              rel := ReduceRelation(rel, trgbRels[i],
                         ExtRepOfObj(TipMonomial(rel)),
                         1, Length(trgbRels[i]));
              reduced := true;
              break;
            fi;
          od;

          if not reduced then
            for i in [1..Length(trgbRels)] do
              trel := trgbRels[i];
              iWalk := WalkOfPath(TipMonomial(trel));
              if PositionSublist(relWalk, iWalk) = 1 then
                trel := ReduceRelation(trel, rel,
                            ExtRepOfObj(TipMonomial(trel)),
                            1, Length(rel));
                AddSet(gbRels, trel);
                Unbind(trgbRels[i]);
              fi;
            od;

            trgbRels := Set(trgbRels);
            AddSet(trgbRels, rel);

          fi;
        fi;
      od;

      Sort(trgbRels);
      gb!.relations := trgbRels;
      SetIsTipReducedGroebnerBasis(gb, true);        

    fi;

    if not IsBound(gb!.staticDict) then
      quiver := 
        QuiverOfPathAlgebra(FamilyObj(gb!.relations[1])!.pathRing);

        # Construct a static dictionary for later reductions
      gb!.staticDict := QuiverStaticDictionary(quiver,
                          List(gb!.relations, TipMonomial));
    fi;

    return gb;

  end
);


InstallTrueMethod(IsTipReducedGroebnerBasis, 
  IsGroebnerBasis and IsCompletelyReducedGroebnerBasis);


InstallMethod( Iterator,
  "for groebner bases",
  true,
  [IsGroebnerBasis and IsGroebnerBasisDefaultRep], 0,
  function(GB)
    return Objectify( NewType( IteratorsFamily,
        IsIterator and IsMutable and IsGroebnerBasisIteratorRep ),
        rec( relations := GB!.relations, position := 1 ) );
  end
);


InstallMethod( IsDoneIterator,
  "for iterators of groebner bases",
  true,
  [IsIterator and IsGroebnerBasisIteratorRep], 0,
  function(iterator)
    return iterator!.position > Length(iterator!.relations);
  end
);


InstallMethod( NextIterator,
  "for iterators of groebner bases",
  true,
  [IsIterator and IsMutable and IsGroebnerBasisIteratorRep], 0,
  function(iterator)
    local elem;
    elem := iterator!.relations[iterator!.position];
    iterator!.position := iterator!.position + 1;
    return elem;
  end
);


InstallMethod( Enumerator,
  "for groebner bases",
  true,
  [IsGroebnerBasis and IsGroebnerBasisDefaultRep], 0,
  function(GB)
    return Immutable(GB!.relations);
  end
);


InstallOtherMethod( SetEnumerator,
  "for groebner bases",
  true,
  [ IsGroebnerBasisDefaultRep and IsAttributeStoringRep, IsList ],
  SUM_FLAGS+1,
  function( GB, relations )
    if HasIsCompletelyReducedGroebnerBasis( GB ) and
       IsCompletelyReducedGroebnerBasis( GB )
    then
        GB!.Enumerator := relations;
        SetFilterObj( GB, HasEnumerator );
    fi;
  end
);


InstallOtherMethod( SetAsList,
  "for groebner bases",
  true,
  [ IsGroebnerBasisDefaultRep, IsList ],
  SUM_FLAGS+1,
  function( GB, list )
    if HasIsCompletelyReducedGroebnerBasis( GB ) and
       IsCompletelyReducedGroebnerBasis( GB )
    then
        GB!.AsList := list;
        SetFilterObj( GB, HasAsList );
    fi;
  end
);


InstallMethod( Nontips,
  "for complete Groebner bases",
  true,
  [IsCompleteGroebnerBasis and IsGroebnerBasisDefaultRep], 0,
  function( GB )
    TipReduceGroebnerBasis( GB ); # only does it if not reduced
    return DifferenceWords(GB!.staticDict);
  end
);


InstallMethod( AdmitsFinitelyManyNontips,
  "for complete Groebner bases",
  true,
  [IsCompleteGroebnerBasis and IsGroebnerBasisDefaultRep], 0,
  function( GB )
    TipReduceGroebnerBasis(GB);
    return IsFiniteDifference(GB!.staticDict);
  end
);


InstallMethod( NontipSize,
  "for complete Groebner bases",
  true,
  [ IsCompleteGroebnerBasis and IsGroebnerBasisDefaultRep ], 0,
  function(GB)
    TipReduceGroebnerBasis(GB);
    return DifferenceSize(GB!.staticDict);
  end
);


InstallMethod( ViewObj,
  "for groebner bases",
  true,
  [IsGroebnerBasis and IsGroebnerBasisDefaultRep], 0,
  function(GB)
    Print("<");

    if not HasIsCompleteGroebnerBasis(GB) 
       or not IsCompleteGroebnerBasis(GB) then
      Print("partial ");
    else
      Print("complete ");
    fi;

    if IsRightGroebnerBasis(GB) then
      Print("right ");
    else
      Print("two-sided ");
    fi;

    Print("Groebner basis containing ", 
          Length(GB!.relations), " elements>");

  end
);


InstallMethod( PrintObj,
  "for groebner bases",
  true,
  [IsGroebnerBasis and IsGroebnerBasisDefaultRep], 0,
  function(GB)
    if IsRightGroebnerBasis(GB) then
      Print("Right");
    fi;

    Print("GroebnerBasis( ", GB!.algebra, ", ", GB!.relations, " )");

  end
);


InstallMethod( IsPrefixOfTipInTipIdeal,
  "for a groebner basis and path algebra element",
  IsCollsElms,
  [ IsCompleteGroebnerBasis, IsElementOfMagmaRingModuloRelations ], 0,
  function( GB, R )
    local dict, matches, tip, extTip;

    tip := TipMonomial(R);

    if IsZeroPath(tip) then
      return true;
    else
      GB := TipReduceGroebnerBasis(GB); # create dictionary
      dict := GB!.staticDict;
      matches := Search(dict, tip);

      if not IsEmpty(matches) 
         and matches[1][1] < Length(WalkOfPath(tip))
      then
          return true;
      else
          return false;
      fi;

    fi;

  end
);


InstallOtherMethod( RightGroebnerBasis,
  "for two-sided ideals with a complete Groebner basis",
  true,
  [IsRing and HasGroebnerBasisOfIdeal], 0,
  function( I )
    local gb, relations, p, g, x, rightgb, ntips, R;

    gb := GroebnerBasisOfIdeal( I );
    R := LeftActingRingOfIdeal(I);

    if not IsCompleteGroebnerBasis( gb ) then
      TryNextMethod();
    fi;

    CompletelyReduceGroebnerBasis(gb);

    relations := [];
    ntips := Nontips(gb);

    # we have finite number of nontips in first case:
    if (ntips <> fail) then
      for p in ntips do
        for g in AsList(gb) do
          x := p * g;
          if not IsPrefixOfTipInTipIdeal( gb, x ) then
            Add(relations, x);
          fi;
        od;
      od;
    else
      Error("The quotient of R by the given ideal I must be finite dimensional.\n");
    fi;

    Sort(relations);

    rightgb := Objectify( NewType(FamilyObj(relations), 
                                  IsRightGroebnerBasis
                                  and IsGroebnerBasisDefaultRep),
                          rec( relations := relations ) );

    SetIsCompleteGroebnerBasis(rightgb, true);
    SetIsTipReducedGroebnerBasis(rightgb, true);

    return rightgb;

  end
);

Messung V0.5 in Prozent
C=98 H=89 G=93

¤ Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.0.26Bemerkung:  (vorverarbeitet am  2026-10-13) ¤

*Bot Zugriff






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.