aboutsummaryrefslogtreecommitdiff
path: root/src/algebra/lingrob.spad.pamphlet
diff options
context:
space:
mode:
Diffstat (limited to 'src/algebra/lingrob.spad.pamphlet')
-rw-r--r--src/algebra/lingrob.spad.pamphlet362
1 files changed, 362 insertions, 0 deletions
diff --git a/src/algebra/lingrob.spad.pamphlet b/src/algebra/lingrob.spad.pamphlet
new file mode 100644
index 00000000..29e2b34f
--- /dev/null
+++ b/src/algebra/lingrob.spad.pamphlet
@@ -0,0 +1,362 @@
+\documentclass{article}
+\usepackage{axiom}
+\begin{document}
+\title{\$SPAD/src/algebra lingrob.spad}
+\author{The Axiom Team}
+\maketitle
+\begin{abstract}
+\end{abstract}
+\eject
+\tableofcontents
+\eject
+\section{package LGROBP LinGroebnerPackage}
+<<package LGROBP LinGroebnerPackage>>=
+)abbrev package LGROBP LinGroebnerPackage
+++ Given a Groebner basis B with respect to the total degree ordering for
+++ a zero-dimensional ideal I, compute
+++ a Groebner basis with respect to the lexicographical ordering by using
+++ linear algebra.
+LinGroebnerPackage(lv,F) : C == T
+
+ where
+ Z ==> Integer
+ lv : List Symbol
+ F : GcdDomain
+
+ DP ==> DirectProduct(#lv,NonNegativeInteger)
+ DPoly ==> DistributedMultivariatePolynomial(lv,F)
+
+ HDP ==> HomogeneousDirectProduct(#lv,NonNegativeInteger)
+ HDPoly ==> HomogeneousDistributedMultivariatePolynomial(lv,F)
+
+ OV ==> OrderedVariableList(lv)
+ NNI ==> NonNegativeInteger
+ LVals ==> Record(gblist : List DPoly,gvlist : List Z)
+ VF ==> Vector F
+ VV ==> Vector NNI
+ MF ==> Matrix F
+ cLVars ==> Record(glbase:List DPoly,glval:List Z)
+
+ C == with
+
+ linGenPos : List HDPoly -> LVals
+ ++ linGenPos \undocumented
+ groebgen : List DPoly -> cLVars
+ ++ groebgen \undocumented
+ totolex : List HDPoly -> List DPoly
+ ++ totolex \undocumented
+ minPol : (List HDPoly,List HDPoly,OV) -> HDPoly
+ ++ minPol \undocumented
+ minPol : (List HDPoly,OV) -> HDPoly
+ ++ minPol \undocumented
+
+
+ computeBasis : List HDPoly -> List HDPoly
+ ++ computeBasis \undocumented
+ coord : (HDPoly,List HDPoly) -> VF
+ ++ coord \undocumented
+ anticoord : (List F,DPoly,List DPoly) -> DPoly
+ ++ anticoord \undocumented
+ intcompBasis : (OV,List HDPoly,List HDPoly) -> List HDPoly
+ ++ intcompBasis \undocumented
+ choosemon : (DPoly,List DPoly) -> DPoly
+ ++ choosemon \undocumented
+ transform : DPoly -> HDPoly
+ ++ transform \undocumented
+
+
+ T == add
+
+ import GroebnerPackage(F,DP,OV,DPoly)
+ import GroebnerPackage(F,HDP,OV,HDPoly)
+ import GroebnerInternalPackage(F,HDP,OV,HDPoly)
+ import GroebnerInternalPackage(F,DP,OV,DPoly)
+
+ lvar :=[variable(yx)::OV for yx in lv]
+
+ reduceRow(M:MF, v : VF, lastRow: Integer, pivots: Vector(Integer)) : VF ==
+ a1:F := 1
+ b:F := 0
+ dim := #v
+ for j in 1..lastRow repeat -- scan over rows
+ mj := row(M,j)
+ k:=pivots(j)
+ b:=mj.k
+ vk := v.k
+ for kk in 1..(k-1) repeat
+ v(kk) := ((-b*v(kk)) exquo a1) :: F
+ for kk in k..dim repeat
+ v(kk) := ((vk*mj(kk)-b*v(kk)) exquo a1)::F
+ a1 := b
+ v
+
+ rRedPol(f:HDPoly, B:List HDPoly):Record(poly:HDPoly, mult:F) ==
+ gm := redPo(f,B)
+ gm.poly = 0 => gm
+ gg := reductum(gm.poly)
+ ggm := rRedPol(gg,B)
+ [ggm.mult*(gm.poly - gg) + ggm.poly, ggm.mult*gm.mult]
+
+----- transform the total basis B in lex basis -----
+ totolex(B : List HDPoly) : List DPoly ==
+ result:List DPoly :=[]
+ ltresult:List DPoly :=[]
+ vBasis:= computeBasis B
+ nBasis:List DPoly :=[1$DPoly]
+ ndim:=(#vBasis)::PositiveInteger
+ ndim1:NNI:=ndim+1
+ lm:VF
+ linmat:MF:=zero(ndim,2*ndim+1)
+ linmat(1,1):=1$F
+ linmat(1,ndim1):=1
+ pivots:Vector Integer := new(ndim,0)
+ pivots(1) := 1
+ firstmon:DPoly:=1$DPoly
+ ofirstmon:DPoly:=1$DPoly
+ orecfmon:Record(poly:HDPoly, mult:F) := [1,1]
+ i:NNI:=2
+ while (firstmon:=choosemon(firstmon,ltresult))^=1 repeat
+ if (v:=firstmon exquo ofirstmon) case "failed" then
+ recfmon:=rRedPol(transform firstmon,B)
+ else
+ recfmon:=rRedPol(transform(v::DPoly) *orecfmon.poly,B)
+ recfmon.mult := recfmon.mult * orecfmon.mult
+ cc := gcd(content recfmon.poly, recfmon.mult)
+ recfmon.poly := (recfmon.poly exquo cc)::HDPoly
+ recfmon.mult := (recfmon.mult exquo cc)::F
+ veccoef:VF:=coord(recfmon.poly,vBasis)
+ ofirstmon:=firstmon
+ orecfmon := recfmon
+ lm:=zero(2*ndim+1)
+ for j in 1..ndim repeat lm(j):=veccoef(j)
+ lm(ndim+i):=recfmon.mult
+ lm := reduceRow(linmat, lm, i-1, pivots)
+ if i=ndim1 then j:=ndim1
+ else
+ j:=1
+ while lm(j) = 0 and j< ndim1 repeat j:=j+1
+ if j=ndim1 then
+ cordlist:List F:=[lm(k) for k in ndim1..ndim1+(#nBasis)]
+ antc:=+/[c*b for c in reverse cordlist
+ for b in concat(firstmon,nBasis)]
+ antc:=primitivePart antc
+ result:=concat(antc,result)
+ ltresult:=concat(antc-reductum antc,ltresult)
+ else
+ pivots(i) := j
+ setRow_!(linmat,i,lm)
+ i:=i+1
+ nBasis:=cons(firstmon,nBasis)
+ result
+
+---- Compute the univariate polynomial for x
+----oldBasis is a total degree Groebner basis
+ minPol(oldBasis:List HDPoly,x:OV) :HDPoly ==
+ algBasis:= computeBasis oldBasis
+ minPol(oldBasis,algBasis,x)
+
+---- Compute the univariate polynomial for x
+---- oldBasis is total Groebner, algBasis is the basis as algebra
+ minPol(oldBasis:List HDPoly,algBasis:List HDPoly,x:OV) :HDPoly ==
+ nvp:HDPoly:=x::HDPoly
+ f:=1$HDPoly
+ omult:F :=1
+ ndim:=(#algBasis)::PositiveInteger
+ ndim1:NNI:=ndim+1
+ lm:VF
+ linmat:MF:=zero(ndim,2*ndim+1)
+ linmat(1,1):=1$F
+ linmat(1,ndim1):=1
+ pivots:Vector Integer := new(ndim,0)
+ pivots(1) := 1
+ for i in 2..ndim1 repeat
+ recf:=rRedPol(f*nvp,oldBasis)
+ omult := recf.mult * omult
+ f := recf.poly
+ cc := gcd(content f, omult)
+ f := (f exquo cc)::HDPoly
+ omult := (omult exquo cc)::F
+ veccoef:VF:=coord(f,algBasis)
+ lm:=zero(2*ndim+1)
+ for j in 1..ndim repeat lm(j) := veccoef(j)
+ lm(ndim+i):=omult
+ lm := reduceRow(linmat, lm, i-1, pivots)
+ j:=1
+ while lm(j)=0 and j<ndim1 repeat j:=j+1
+ if j=ndim1 then return
+ g:HDPoly:=0
+ for k in ndim1..2*ndim+1 repeat
+ g:=g+lm(k) * nvp**((k-ndim1):NNI)
+ primitivePart g
+ pivots(i) := j
+ setRow_!(linmat,i,lm)
+
+----- transform a DPoly in a HDPoly -----
+ transform(dpol:DPoly) : HDPoly ==
+ dpol=0 => 0$HDPoly
+ monomial(leadingCoefficient dpol,
+ directProduct(degree(dpol)::VV)$HDP)$HDPoly +
+ transform(reductum dpol)
+
+----- compute the basis for the vector space determined by B -----
+ computeBasis(B:List HDPoly) : List HDPoly ==
+ mB:List HDPoly:=[monomial(1$F,degree f)$HDPoly for f in B]
+ result:List HDPoly := [1$HDPoly]
+ for var in lvar repeat
+ part:=intcompBasis(var,result,mB)
+ result:=concat(result,part)
+ result
+
+----- internal function for computeBasis -----
+ intcompBasis(x:OV,lr:List HDPoly,mB : List HDPoly):List HDPoly ==
+ lr=[] => lr
+ part:List HDPoly :=[]
+ for f in lr repeat
+ g:=x::HDPoly * f
+ if redPo(g,mB).poly^=0 then part:=concat(g,part)
+ concat(part,intcompBasis(x,part,mB))
+
+----- coordinate of f with respect to the basis B -----
+----- f is a reduced polynomial -----
+ coord(f:HDPoly,B:List HDPoly) : VF ==
+ ndim := #B
+ vv:VF:=new(ndim,0$F)$VF
+ while f^=0 repeat
+ rf := reductum f
+ lf := f-rf
+ lcf := leadingCoefficient f
+ i:Z:=position(monomial(1$F,degree lf),B)
+ vv.i:=lcf
+ f := rf
+ vv
+
+----- reconstruct the polynomial from its coordinate -----
+ anticoord(vv:List F,mf:DPoly,B:List DPoly) : DPoly ==
+ for f in B for c in vv repeat (mf:=mf-c*f)
+ mf
+
+----- choose the next monom -----
+ choosemon(mf:DPoly,nB:List DPoly) : DPoly ==
+ nB = [] => ((lvar.last)::DPoly)*mf
+ for x in reverse lvar repeat
+ xx:=x ::DPoly
+ mf:=xx*mf
+ if redPo(mf,nB).poly ^= 0 then return mf
+ dx := degree(mf,x)
+ mf := (mf exquo (xx ** dx))::DPoly
+ mf
+
+----- put B in general position, B is Groebner -----
+ linGenPos(B : List HDPoly) : LVals ==
+ result:List DPoly :=[]
+ ltresult:List DPoly :=[]
+ vBasis:= computeBasis B
+ nBasis:List DPoly :=[1$DPoly]
+ ndim:=#vBasis : PositiveInteger
+ ndim1:NNI:=ndim+1
+ lm:VF
+ linmat:MF:=zero(ndim,2*ndim+1)
+ linmat(1,1):=1$F
+ linmat(1,ndim1):=1
+ pivots:Vector Integer := new(ndim,0)
+ pivots(1) := 1
+ i:NNI:=2
+ rval:List Z :=[]
+ for ii in 1..(#lvar-1) repeat
+ c:Z:=0
+ while c=0 repeat c:=random()$Z rem 11
+ rval:=concat(c,rval)
+ nval:DPoly := (last.lvar)::DPoly -
+ (+/[r*(vv)::DPoly for r in rval for vv in lvar])
+ firstmon:DPoly:=1$DPoly
+ ofirstmon:DPoly:=1$DPoly
+ orecfmon:Record(poly:HDPoly, mult:F) := [1,1]
+ lx:= lvar.last
+ while (firstmon:=choosemon(firstmon,ltresult))^=1 repeat
+ if (v:=firstmon exquo ofirstmon) case "failed" then
+ recfmon:=rRedPol(transform(eval(firstmon,lx,nval)),B)
+ else
+ recfmon:=rRedPol(transform(eval(v,lx,nval))*orecfmon.poly,B)
+ recfmon.mult := recfmon.mult * orecfmon.mult
+ cc := gcd(content recfmon.poly, recfmon.mult)
+ recfmon.poly := (recfmon.poly exquo cc)::HDPoly
+ recfmon.mult := (recfmon.mult exquo cc)::F
+ veccoef:VF:=coord(recfmon.poly,vBasis)
+ ofirstmon:=firstmon
+ orecfmon := recfmon
+ lm:=zero(2*ndim+1)
+ for j in 1..ndim repeat lm(j):=veccoef(j)
+ lm(ndim+i):=recfmon.mult
+ lm := reduceRow(linmat, lm, i-1, pivots)
+ j:=1
+ while lm(j) = 0 and j<ndim1 repeat j:=j+1
+ if j=ndim1 then
+ cordlist:List F:=[lm(j) for j in ndim1..ndim1+(#nBasis)]
+ antc:=+/[c*b for c in reverse cordlist
+ for b in concat(firstmon,nBasis)]
+ result:=concat(primitivePart antc,result)
+ ltresult:=concat(antc-reductum antc,ltresult)
+ else
+ pivots(i) := j
+ setRow_!(linmat,i,lm)
+ i:=i+1
+ nBasis:=concat(firstmon,nBasis)
+ [result,rval]$LVals
+
+----- given a basis of a zero-dimensional ideal,
+----- performs a random change of coordinates
+----- computes a Groebner basis for the lex ordering
+ groebgen(L:List DPoly) : cLVars ==
+ xn:=lvar.last
+ val := xn::DPoly
+ nvar1:NNI:=(#lvar-1):NNI
+ ll: List Z :=[random()$Z rem 11 for i in 1..nvar1]
+ val:=val+ +/[ll.i*(lvar.i)::DPoly for i in 1..nvar1]
+ LL:=[elt(univariate(f,xn),val) for f in L]
+ LL:= groebner(LL)
+ [LL,ll]$cLVars
+
+@
+\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 LGROBP LinGroebnerPackage>>
+@
+\eject
+\begin{thebibliography}{99}
+\bibitem{1} nothing
+\end{thebibliography}
+\end{document}