diff options
author | dos-reis <gdr@axiomatics.org> | 2007-08-14 05:14:52 +0000 |
---|---|---|
committer | dos-reis <gdr@axiomatics.org> | 2007-08-14 05:14:52 +0000 |
commit | ab8cc85adde879fb963c94d15675783f2cf4b183 (patch) | |
tree | c202482327f474583b750b2c45dedfc4e4312b1d /src/algebra/gbintern.spad.pamphlet | |
download | open-axiom-ab8cc85adde879fb963c94d15675783f2cf4b183.tar.gz |
Initial population.
Diffstat (limited to 'src/algebra/gbintern.spad.pamphlet')
-rw-r--r-- | src/algebra/gbintern.spad.pamphlet | 514 |
1 files changed, 514 insertions, 0 deletions
diff --git a/src/algebra/gbintern.spad.pamphlet b/src/algebra/gbintern.spad.pamphlet new file mode 100644 index 00000000..1ba941b2 --- /dev/null +++ b/src/algebra/gbintern.spad.pamphlet @@ -0,0 +1,514 @@ +\documentclass{article} +\usepackage{axiom} +\begin{document} +\title{\$SPAD/src/algebra gbintern.spad} +\author{The Axiom Team} +\maketitle +\begin{abstract} +\end{abstract} +\eject +\tableofcontents +\eject +\section{package GBINTERN GroebnerInternalPackage} +<<package GBINTERN GroebnerInternalPackage>>= +)abbrev package GBINTERN GroebnerInternalPackage +++ Author: +++ Date Created: +++ Date Last Updated: +++ Keywords: +++ Description +++ This package provides low level tools for Groebner basis computations +GroebnerInternalPackage(Dom, Expon, VarSet, Dpol): T == C where + Dom: GcdDomain + Expon: OrderedAbelianMonoidSup + VarSet: OrderedSet + Dpol: PolynomialCategory(Dom, Expon, VarSet) + NNI ==> NonNegativeInteger + ------ Definition of Record critPair and Prinp + + critPair ==> Record( lcmfij: Expon, totdeg: NonNegativeInteger, + poli: Dpol, polj: Dpol ) + sugarPol ==> Record( totdeg: NonNegativeInteger, pol : Dpol) + Prinp ==> Record( ci:Dpol,tci:Integer,cj:Dpol,tcj:Integer,c:Dpol, + tc:Integer,rc:Dpol,trc:Integer,tF:Integer,tD:Integer) + Prinpp ==> Record( ci:Dpol,tci:Integer,cj:Dpol,tcj:Integer,c:Dpol, + tc:Integer,rc:Dpol,trc:Integer,tF:Integer,tDD:Integer, + tDF:Integer) + T== with + + credPol: (Dpol, List(Dpol)) -> Dpol + ++ credPol \undocumented + redPol: (Dpol, List(Dpol)) -> Dpol + ++ redPol \undocumented + gbasis: (List(Dpol), Integer, Integer) -> List(Dpol) + ++ gbasis \undocumented + critT: critPair -> Boolean + ++ critT \undocumented + critM: (Expon, Expon) -> Boolean + ++ critM \undocumented + critB: (Expon, Expon, Expon, Expon) -> Boolean + ++ critB \undocumented + critBonD: (Dpol, List(critPair)) -> List(critPair) + ++ critBonD \undocumented + critMTonD1: (List(critPair)) -> List(critPair) + ++ critMTonD1 \undocumented + critMonD1: (Expon, List(critPair)) -> List(critPair) + ++ critMonD1 \undocumented + redPo: (Dpol, List(Dpol) ) -> Record(poly:Dpol, mult:Dom) + ++ redPo \undocumented + hMonic: Dpol -> Dpol + ++ hMonic \undocumented + updatF: (Dpol, NNI, List(sugarPol) ) -> List(sugarPol) + ++ updatF \undocumented + sPol: critPair -> Dpol + ++ sPol \undocumented + updatD: (List(critPair), List(critPair)) -> List(critPair) + ++ updatD \undocumented + minGbasis: List(Dpol) -> List(Dpol) + ++ minGbasis \undocumented + lepol: Dpol -> Integer + ++ lepol \undocumented + prinshINFO : Dpol -> Void + ++ prinshINFO \undocumented + prindINFO: (critPair, Dpol, Dpol,Integer,Integer,Integer) -> Integer + ++ prindINFO \undocumented + fprindINFO: (critPair, Dpol, Dpol, Integer,Integer,Integer + ,Integer) -> Integer + ++ fprindINFO \undocumented + prinpolINFO: List(Dpol) -> Void + ++ prinpolINFO \undocumented + prinb: Integer-> Void + ++ prinb \undocumented + critpOrder: (critPair, critPair) -> Boolean + ++ critpOrder \undocumented + makeCrit: (sugarPol, Dpol, NonNegativeInteger) -> critPair + ++ makeCrit \undocumented + virtualDegree : Dpol -> NonNegativeInteger + ++ virtualDegree \undocumented + + C== add + Ex ==> OutputForm + import OutputForm + + ------ Definition of intermediate functions + if Dpol has totalDegree: Dpol -> NonNegativeInteger then + virtualDegree p == totalDegree p + else + virtualDegree p == 0 + + ------ ordering of critpairs + + critpOrder(cp1,cp2) == + cp1.totdeg < cp2.totdeg => true + cp2.totdeg < cp1.totdeg => false + cp1.lcmfij < cp2.lcmfij + + ------ creating a critical pair + + makeCrit(sp1, p2, totdeg2) == + p1 := sp1.pol + deg := sup(degree(p1), degree(p2)) + e1 := subtractIfCan(deg, degree(p1))::Expon + e2 := subtractIfCan(deg, degree(p2))::Expon + tdeg := max(sp1.totdeg + virtualDegree(monomial(1,e1)), + totdeg2 + virtualDegree(monomial(1,e2))) + [deg, tdeg, p1, p2]$critPair + + ------ calculate basis + + gbasis(Pol: List(Dpol), xx1: Integer, xx2: Integer ) == + D, D1: List(critPair) + --------- create D and Pol + + Pol1:= sort(degree #1 > degree #2, Pol) + basPols:= updatF(hMonic(first Pol1),virtualDegree(first Pol1),[]) + Pol1:= rest(Pol1) + D:= nil + while _^ null Pol1 repeat + h:= hMonic(first(Pol1)) + Pol1:= rest(Pol1) + toth := virtualDegree h + D1:= [makeCrit(x,h,toth) for x in basPols] + D:= updatD(critMTonD1(sort(critpOrder, D1)), + critBonD(h,D)) + basPols:= updatF(h,toth,basPols) + D:= sort(critpOrder, D) + xx:= xx2 + -------- loop + + redPols := [x.pol for x in basPols] + while _^ null D repeat + D0:= first D + s:= hMonic(sPol(D0)) + D:= rest(D) + h:= hMonic(redPol(s,redPols)) + if xx1 = 1 then + prinshINFO(h) + h = 0 => + if xx2 = 1 then + prindINFO(D0,s,h,# basPols, # D,xx) + xx:= 2 + " go to top of while " + degree(h) = 0 => + D:= nil + if xx2 = 1 then + prindINFO(D0,s,h,# basPols, # D,xx) + xx:= 2 + basPols:= updatF(h,0,[]) + leave "out of while" + D1:= [makeCrit(x,h,D0.totdeg) for x in basPols] + D:= updatD(critMTonD1(sort(critpOrder, D1)), + critBonD(h,D)) + basPols:= updatF(h,D0.totdeg,basPols) + redPols := concat(redPols,h) + if xx2 = 1 then + prindINFO(D0,s,h,# basPols, # D,xx) + xx:= 2 + Pol := [x.pol for x in basPols] + if xx2 = 1 then + prinpolINFO(Pol) + messagePrint(" THE GROEBNER BASIS POLYNOMIALS") + if xx1 = 1 and xx2 ^= 1 then + messagePrint(" THE GROEBNER BASIS POLYNOMIALS") + Pol + + -------------------------------------- + + --- erase multiple of e in D2 using crit M + + critMonD1(e: Expon, D2: List(critPair))== + null D2 => nil + x:= first(D2) + critM(e, x.lcmfij) => critMonD1(e, rest(D2)) + cons(x, critMonD1(e, rest(D2))) + + ---------------------------- + + --- reduce D1 using crit T and crit M + + critMTonD1(D1: List(critPair))== + null D1 => nil + f1:= first(D1) + s1:= #(D1) + cT1:= critT(f1) + s1= 1 and cT1 => nil + s1= 1 => D1 + e1:= f1.lcmfij + r1:= rest(D1) + e1 = (first r1).lcmfij => + cT1 => critMTonD1(cons(f1, rest(r1))) + critMTonD1(r1) + D1 := critMonD1(e1, r1) + cT1 => critMTonD1(D1) + cons(f1, critMTonD1(D1)) + + ----------------------------- + + --- erase elements in D fullfilling crit B + + critBonD(h:Dpol, D: List(critPair))== + null D => nil + x:= first(D) + critB(degree(h), x.lcmfij, degree(x.poli), degree(x.polj)) => + critBonD(h, rest(D)) + cons(x, critBonD(h, rest(D))) + + ----------------------------- + + --- concat F and h and erase multiples of h in F + + updatF(h: Dpol, deg:NNI, F: List(sugarPol)) == + null F => [[deg,h]] + f1:= first(F) + critM(degree(h), degree(f1.pol)) => updatF(h, deg, rest(F)) + cons(f1, updatF(h, deg, rest(F))) + + ----------------------------- + + --- concat ordered critical pair lists D1 and D2 + + updatD(D1: List(critPair), D2: List(critPair)) == + null D1 => D2 + null D2 => D1 + dl1:= first(D1) + dl2:= first(D2) + critpOrder(dl1,dl2) => cons(dl1, updatD(D1.rest, D2)) + cons(dl2, updatD(D1, D2.rest)) + + ----------------------------- + + --- remove gcd from pair of coefficients + + gcdCo(c1:Dom, c2:Dom):Record(co1:Dom,co2:Dom) == + d:=gcd(c1,c2) + [(c1 exquo d)::Dom, (c2 exquo d)::Dom] + + --- calculate S-polynomial of a critical pair + + sPol(p:critPair)== + Tij := p.lcmfij + fi := p.poli + fj := p.polj + cc := gcdCo(leadingCoefficient fi, leadingCoefficient fj) + reductum(fi)*monomial(cc.co2,subtractIfCan(Tij, degree fi)::Expon) - + reductum(fj)*monomial(cc.co1,subtractIfCan(Tij, degree fj)::Expon) + + ---------------------------- + + --- reduce critpair polynomial mod F + --- iterative version + + redPo(s: Dpol, F: List(Dpol)) == + m:Dom := 1 + Fh := F + while _^ ( s = 0 or null F ) repeat + f1:= first(F) + s1:= degree(s) + e: Union(Expon, "failed") + (e:= subtractIfCan(s1, degree(f1))) case Expon => + cc:=gcdCo(leadingCoefficient f1, leadingCoefficient s) + s:=cc.co1*reductum(s) - monomial(cc.co2,e)*reductum(f1) + m := m*cc.co1 + F:= Fh + F:= rest F + [s,m] + + redPol(s: Dpol, F: List(Dpol)) == credPol(redPo(s,F).poly,F) + + ---------------------------- + + --- crit T true, if e1 and e2 are disjoint + + critT(p: critPair) == p.lcmfij = (degree(p.poli) + degree(p.polj)) + + ---------------------------- + + --- crit M - true, if lcm#2 multiple of lcm#1 + + critM(e1: Expon, e2: Expon) == + en: Union(Expon, "failed") + (en:=subtractIfCan(e2, e1)) case Expon + + ---------------------------- + + --- crit B - true, if eik is a multiple of eh and eik ^equal + --- lcm(eh,ei) and eik ^equal lcm(eh,ek) + + critB(eh:Expon, eik:Expon, ei:Expon, ek:Expon) == + critM(eh, eik) and (eik ^= sup(eh, ei)) and (eik ^= sup(eh, ek)) + + ---------------------------- + + --- make polynomial monic case Domain a Field + + hMonic(p: Dpol) == + p= 0 => p + -- inv(leadingCoefficient(p))*p + primitivePart p + + ----------------------------- + + --- reduce all terms of h mod F (iterative version ) + + credPol(h: Dpol, F: List(Dpol) ) == + null F => h + h0:Dpol:= monomial(leadingCoefficient h, degree h) + while (h:=reductum h) ^= 0 repeat + hred:= redPo(h, F) + h := hred.poly + h0:=(hred.mult)*h0 + monomial(leadingCoefficient(h),degree h) + h0 + + ------------------------------- + + ---- calculate minimal basis for ordered F + + minGbasis(F: List(Dpol)) == + null F => nil + newbas := minGbasis rest F + cons(hMonic credPol( first(F), newbas),newbas) + + ------------------------------- + + ---- calculate number of terms of polynomial + + lepol(p1:Dpol)== + n: Integer + n:= 0 + while p1 ^= 0 repeat + n:= n + 1 + p1:= reductum(p1) + n + + ---- print blanc lines + + prinb(n: Integer)== + for x in 1..n repeat + messagePrint(" ") + + ---- print reduced critpair polynom + + prinshINFO(h: Dpol)== + prinb(2) + messagePrint(" reduced Critpair - Polynom :") + prinb(2) + print(h::Ex) + prinb(2) + + ------------------------------- + + ---- print info string + + prindINFO(cp: critPair, ps: Dpol, ph: Dpol, i1:Integer, + i2:Integer, n:Integer) == + ll: List Prinp + a: Dom + cpi:= cp.poli + cpj:= cp.polj + if n = 1 then + prinb(1) + messagePrint("you choose option -info- ") + messagePrint("abbrev. for the following information strings are") + messagePrint(" ci => Leading monomial for critpair calculation") + messagePrint(" tci => Number of terms of polynomial i") + messagePrint(" cj => Leading monomial for critpair calculation") + messagePrint(" tcj => Number of terms of polynomial j") + messagePrint(" c => Leading monomial of critpair polynomial") + messagePrint(" tc => Number of terms of critpair polynomial") + messagePrint(" rc => Leading monomial of redcritpair polynomial") + messagePrint(" trc => Number of terms of redcritpair polynomial") + messagePrint(" tF => Number of polynomials in reduction list F") + messagePrint(" tD => Number of critpairs still to do") + prinb(4) + n:= 2 + prinb(1) + a:= 1 + ph = 0 => + ps = 0 => + ll:= [[monomial(a,degree(cpi)),lepol(cpi), + monomial(a,degree(cpj)), + lepol(cpj),ps,0,ph,0,i1,i2]$Prinp] + print(ll::Ex) + prinb(1) + n + ll:= [[monomial(a,degree(cpi)),lepol(cpi), + monomial(a,degree(cpj)),lepol(cpj),monomial(a,degree(ps)), + lepol(ps), ph,0,i1,i2]$Prinp] + print(ll::Ex) + prinb(1) + n + ll:= [[monomial(a,degree(cpi)),lepol(cpi), + monomial(a,degree(cpj)),lepol(cpj),monomial(a,degree(ps)), + lepol(ps),monomial(a,degree(ph)),lepol(ph),i1,i2]$Prinp] + print(ll::Ex) + prinb(1) + n + + ------------------------------- + + ---- print the groebner basis polynomials + + prinpolINFO(pl: List(Dpol))== + n:Integer + n:= # pl + prinb(1) + n = 1 => + messagePrint(" There is 1 Groebner Basis Polynomial ") + prinb(2) + messagePrint(" There are ") + prinb(1) + print(n::Ex) + prinb(1) + messagePrint(" Groebner Basis Polynomials. ") + prinb(2) + + fprindINFO(cp: critPair, ps: Dpol, ph: Dpol, i1:Integer, + i2:Integer, i3:Integer, n: Integer) == + ll: List Prinpp + a: Dom + cpi:= cp.poli + cpj:= cp.polj + if n = 1 then + prinb(1) + messagePrint("you choose option -info- ") + messagePrint("abbrev. for the following information strings are") + messagePrint(" ci => Leading monomial for critpair calculation") + messagePrint(" tci => Number of terms of polynomial i") + messagePrint(" cj => Leading monomial for critpair calculation") + messagePrint(" tcj => Number of terms of polynomial j") + messagePrint(" c => Leading monomial of critpair polynomial") + messagePrint(" tc => Number of terms of critpair polynomial") + messagePrint(" rc => Leading monomial of redcritpair polynomial") + messagePrint(" trc => Number of terms of redcritpair polynomial") + messagePrint(" tF => Number of polynomials in reduction list F") + messagePrint(" tD => Number of critpairs still to do") + messagePrint(" tDF => Number of subproblems still to do") + prinb(4) + n:= 2 + prinb(1) + a:= 1 + ph = 0 => + ps = 0 => + ll:= [[monomial(a,degree(cpi)),lepol(cpi), + monomial(a,degree(cpj)), + lepol(cpj),ps,0,ph,0,i1,i2,i3]$Prinpp] + print(ll::Ex) + prinb(1) + n + ll:= [[monomial(a,degree(cpi)),lepol(cpi), + monomial(a,degree(cpj)),lepol(cpj),monomial(a,degree(ps)), + lepol(ps), ph,0,i1,i2,i3]$Prinpp] + print(ll::Ex) + prinb(1) + n + ll:= [[monomial(a,degree(cpi)),lepol(cpi), + monomial(a,degree(cpj)),lepol(cpj),monomial(a,degree(ps)), + lepol(ps),monomial(a,degree(ph)),lepol(ph),i1,i2,i3]$Prinpp] + print(ll::Ex) + prinb(1) + n + +@ +\section{License} +<<license>>= +--Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. +--All rights reserved. +-- +--Redistribution and use in source and binary forms, with or without +--modification, are permitted provided that the following conditions are +--met: +-- +-- - Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- +-- - Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- +-- - Neither the name of The Numerical ALgorithms Group Ltd. nor the +-- names of its contributors may be used to endorse or promote products +-- derived from this software without specific prior written permission. +-- +--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +--IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +--TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +--PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +--OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +--EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +--PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +--PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +--LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +--NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +--SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +@ +<<*>>= +<<license>> + +<<package GBINTERN GroebnerInternalPackage>> +@ +\eject +\begin{thebibliography}{99} +\bibitem{1} nothing +\end{thebibliography} +\end{document} |