diff --git a/books/bookvol10.4.pamphlet b/books/bookvol10.4.pamphlet index a157e66..603c8ec 100644 --- a/books/bookvol10.4.pamphlet +++ b/books/bookvol10.4.pamphlet @@ -139287,13 +139287,46 @@ o )show PolynomialGcdPackage \cross{PGCD}{gcdPrimitive} \end{tabular} +The simple Euclidean division algorithm, + +{\bf given} $a \ne 0$, $b \ne 0$ where $a$ and $b$ are two polynomials +in the variable $x$, then + +{\bf output} $q$, the quotient and $r$, the remainder + +{\bf begin} + +{\bf Let}\\ +\quad\quad $q = 0$\\ +\quad\quad $r = a$\\ +\quad\quad $d = {\rm\ degree}(b)$\\ +\quad\quad $c = {\rm\ leadingCoefficient}(b)$\\ + +{\bf while} ${\rm\ degree}(r) \ge d$ {\bf do}\\ +\quad\quad $e = {\rm\ degree}(r) - d$\\ +\quad\quad $s = \frac{{\rm\ leadingCoefficient}(r)}{c}x^e$\\ +\quad\quad $q = q + s$\\ +\quad\quad $r = r - sb$\\ +{\bf endwhile} + +{\bf return}(q,r) + +{\bf end} + +For example, given +\begin{verbatim} + p1 := (x+1) * (x+6) + p2 := (x+1) * (x-6) + gcd(p1,p2) -> x+1 +\end{verbatim} + \begin{chunk}{package PGCD PolynomialGcdPackage} )abbrev package PGCD PolynomialGcdPackage ++ Author: Michael Lucks, P. Gianni, Frederic Lehobey ++ Date Last Updated: 17 June 1996 ++ Description: ++ This package computes multivariate polynomial gcd's using -++ a hensel lifting strategy. The contraint on the coefficient +++ a hensel lifting strategy. The constraint on the coefficient ++ domain is imposed by the lifting strategy. It is assumed that ++ the coefficient domain has the property that almost all specializations ++ preserve the degree of the gcd. @@ -139312,6 +139345,10 @@ PolynomialGcdPackage(E,OV,R,P):C == T where C == with gcd : (P,P) -> P ++ gcd(p,q) computes the gcd of the two polynomials p and q. + ++ + ++E p1:=(x+1)*(x+6) + ++E p2:=(x+1)*(x-6) + ++E gcd(p1,p2) gcd : List P -> P ++ gcd(lp) computes the gcd of the list of polynomials lp. gcd : (SUPP,SUPP) -> SUPP @@ -139347,14 +139384,16 @@ PolynomialGcdPackage(E,OV,R,P):C == T where monomContent : (SUPP) -> SUPP gcdMonom : (SUPP,SUPP) -> SUPP gcdTermList : (P,P) -> P - good : (SUPP,List OV,List List R) -> Record(upol:SUP,inval:List List R) + good : (SUPP,List OV,List List R) -> Record(upol:SUP,inval:List List R) - chooseVal : (SUPP,SUPP,List OV,List List R) -> Union(UTerm,"failed") + chooseVal : (SUPP,SUPP,List OV,List List R) -> Union(UTerm,"failed") localgcd : (SUPP,SUPP,List OV,List List R) -> LGcd notCoprime : (SUPP,SUPP, List NNI,List OV,List List R) -> SUPP - imposelc : (List SUP,List OV,List R,List P) -> List SUP + imposelc : (List SUP,List OV,List R,List P) -> + Union(List SUP, "failed") - lift? :(SUPP,SUPP,UTerm,List NNI,List OV) -> Union(s:SUPP,failed:"failed",notCoprime:"notCoprime") + lift? :(SUPP,SUPP,UTerm,List NNI,List OV) -> _ + Union(s:SUPP,failed:"failed",notCoprime:"notCoprime") lift :(SUPP,SUP,SUP,P,List OV,List NNI,List R) -> Union(SUPP,"failed") ---- Local functions ---- @@ -139363,7 +139402,8 @@ PolynomialGcdPackage(E,OV,R,P):C == T where (p1 exquo f) case "failed" or (p2 exquo f) case "failed" -- Choose the integers - chooseVal(p1:SUPP,p2:SUPP,lvr:List OV,ltry:List List R):Union(UTerm,"failed") == + chooseVal(p1:SUPP,p2:SUPP,lvr:List OV,_ + ltry:List List R):Union(UTerm,"failed") == d1:=degree(p1) d2:=degree(p2) dd:NNI:=0$NNI @@ -139406,7 +139446,8 @@ PolynomialGcdPackage(E,OV,R,P):C == T where --the new gcd has degree less du
dd:=du - good(f:SUPP,lvr:List OV,ltry:List List R):Record(upol:SUP,inval:List List R) == + good(f:SUPP,lvr:List OV, _ + ltry:List List R):Record(upol:SUP,inval:List List R) == nvr:NNI:=#lvr range:I:=1 while true repeat @@ -139416,18 +139457,37 @@ PolynomialGcdPackage(E,OV,R,P):C == T where ltry:=cons(lval,ltry) uf:=completeEval(f,lvr,lval) if degree gcd(uf,differentiate uf)=0 then return [uf,ltry] - - -- impose the right lc - imposelc(lipol:List SUP, - lvar:List OV,lval:List R,leadc:List P):List SUP == +\end{chunk} + +In Gathen \cite{GG99} we find a discussion of applying the Euclidean +algorithm to elements of a field. In a field every nonzero rational +number is a unit. If we want to define a single element such that +\[gcd(f,g) \in {\bf Q}[x]\] we choose a monic polynomial, that is, the +element with a leading coefficient of 1. So +\[abs(a/{\rm\ leadingCoefficent}(a))\] defines a normal form of $a$. +\index{leadingCoefficient} +\index{monic polynomial} +\index{normal form} + +Gathen also notes that for polynomials we should modify the Euclidean +algorithm so {\sl all} remainders are normalized. Without this +constraint the remainders will have huge numerators and denominators. + +\begin{chunk}{package PGCD PolynomialGcdPackage} + -- impose the right leading condition, check for failure. + imposelc(lipol:List SUP, lvar:List OV, lval:List R, + leadc:List P): Union(List SUP, "failed") == result:List SUP :=[] for pol in lipol for leadpol in leadc repeat - p1:= univariate eval(leadpol,lvar,lval) * pol - result:= cons((p1 exquo leadingCoefficient pol)::SUP,result) + p1 := univariate eval(leadpol, lvar, lval) * pol + p1u := p1 exquo leadingCoefficient pol + p1u case "failed" => return "failed" + result := cons(p1u::SUP, result) reverse result --Compute the gcd between not coprime polynomials - notCoprime(g:SUPP,p2:SUPP,ldeg:List NNI,lvar1:List OV,ltry:List List R) : SUPP == + notCoprime(g:SUPP,p2:SUPP,ldeg:List NNI,_ + lvar1:List OV,ltry:List List R) : SUPP == g1:=gcd(g,differentiate g) l1 := (g exquo g1)::SUPP lg:LGcd:=localgcd(l1,p2,lvar1,ltry) @@ -139547,11 +139607,20 @@ PolynomialGcdPackage(E,OV,R,P):C == T where gcdMonom(m1:SUPP,m2:SUPP):SUPP == monomial(gcd(leadingCoefficient(m1),leadingCoefficient(m2)), min(degree(m1),degree(m2))) +\end{chunk} +Hensel's lifting lemma states that if a polynomial equation has a simple +root modulo a prime number $p$, then this root corresponds to a unique root +of the same equation modulo any higher power of $p$, which can be found +by iteratively ``lifting'' the solution modulo successive powers of $p$. + +See Volume 10.1 for more details. +\begin{chunk}{package PGCD PolynomialGcdPackage} --If there is a pol s.t. pol/gcd and gcd are coprime I can lift - lift?(p1:SUPP,p2:SUPP,uterm:UTerm,ldeg:List NNI, - lvar:List OV) : Union(s:SUPP,failed:"failed",notCoprime:"notCoprime") == + lift?(p1:SUPP,p2:SUPP,uterm:UTerm,ldeg:List NNI, _ + lvar:List OV) : _ + Union(s:SUPP,failed:"failed",notCoprime:"notCoprime") == leadpol:Boolean:=false (listpol,lval):=(uterm.lpol,uterm.lint.first) d:=listpol.first @@ -139584,7 +139653,9 @@ PolynomialGcdPackage(E,OV,R,P):C == T where else d:=(retract(eval(lgcd,lvar,lval)) * d exquo lcd)::SUP uf:=lcd*uf leadlist:=[lgcd,lcf] - lg:=imposelc([d,uf],lvar,lval,leadlist) + lgu := imposelc([d, uf], lvar, lval, leadlist) + lgu case "failed" => "failed" + lg := lgu::List(SUP) (pl:=lifting(f,lvar,lg,lval,leadlist,ldeg,pmod)) case "failed" => "failed" plist := pl :: List SUPP diff --git a/changelog b/changelog index 6745344..f70aae0 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,5 @@ +20140602 tpd src/axiom-website/patches.html 20140602.01.tpd.patch +20140602 tpd books/bookvol10.4 apply Waldek's changes to imposelc in PGCD 20140530 tpd src/axiom-website/patches.html 20140530.02.tpd.patch 20140530 tpd book/*.txt email cleanup 20140530 tpd src/axiom-website/patches.html 20140530.01.tpd.patch diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html index b0a21ad..1cbf4ce 100644 --- a/src/axiom-website/patches.html +++ b/src/axiom-website/patches.html @@ -4360,6 +4360,8 @@ src/input/page.input removed books/bookvolbib add Sit06 20140530.02.tpd.patch book/*.txt email cleanup +20140602.01.tpd.patch +books/bookvol10.4 apply Waldek's changes to imposelc in PGCD