# 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
)
);
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;
tipCoeff := TipCoefficient(rel);
redCoeff := tipCoeff / TipCoefficient(redRel) ; if start <> 1then
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;
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();
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 not reduced then for i in [1..Length(trgbRels)] do
trel := trgbRels[i];
iWalk := WalkOfPath(TipMonomial(trel)); if PositionSublist(relWalk, iWalk) = 1then
trel := ReduceRelation(trel, rel,
ExtRepOfObj(TipMonomial(trel)), 1, Length(rel));
AddSet(gbRels, trel);
Unbind(trgbRels[i]); fi;
od;
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( 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;
¤ 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.23Bemerkung:
(vorverarbeitet am 2026-10-13)
¤
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.