\\ Ce fichier gp contient des fonctions pour calculer \\ le resultant de trois polynomes p1,p2,p3 homogenes \\ en trois variables (toujours x,y,z), ainsi que \\ le discriminant d'un polynome homogene en ces trois variables. \\ L'algorithme utilise est celui du sous-resultant. \\ \\ *********************************************** \\ * Auteur: Denis SIMON * \\ * mail: desimon@math.unicaen.fr.fr * \\ * date: 12 Dec 2003 * \\ *********************************************** \\ \\ exemple d'utilisation : \\ \\ ? p1=x^2-3*z^2+y*z;p2=x-y+15*z;p3=y^2*x+z^3-x*y*z+x^2*z; \\ ? resultant3([p1,p2,p3]) \\ %2 = 521784 \\ ? discriminant3(p3) \\ %3 = -63 \\ \\ la fonction hom sert a rendre homogene un polynome en x et y: \\ ? ell=y^2-y-x^3+x^2; \\ ? discriminant3(hom(ell)) \\ %5 = -11 \\ \\ {hom(p)= p=subst(subst(z^100*p,x,x/z),y,y/z); p/=z^myvaluation(p,z); return(p); } \\ \\ degre d'un polynome homogene. \\ {degreetot(p)= local(auxdeg,auxp); auxdeg=poldegree(p,x);auxp=pollead(p,x); auxdeg+=poldegree(auxp,y);auxp=pollead(auxp,y); auxdeg+=poldegree(auxp,z);auxp=pollead(auxp,z); return(auxdeg); } \\ {ex(vec,i,j)= local(aux); aux=vec[i];vec[i]=vec[j];vec[j]=aux; return(vec); } {myvaluation(p,var)= local(valp); valp=0; while(polcoeff(p,valp,var)==0,valp++); return(valp); } {myvaluation2(p,var)= local(pp,valp); pp=p; valp=0; while(subst(pp,var,0)==0,valp++;pp/=var); return(valp); } {mycontent(p)= local(vz,co,dco); vz=myvaluation(p,z); p=subst(p,z,1); co=content(p); dco=poldegree(co,y); if(dco,co=subst(co,y,y/z)*z^dco); return(co*z^vz); } {resultant2(p,q)= local(dp,dq,valp,valq,auxr,auxp,auxq,res); if(p==0 || q==0,return(0)); dp=degreetot(p);dq=degreetot(q); valp=myvaluation(p,y); valq=myvaluation(q,y); if(valp && valq,return(0)); auxr=1; if(valp, if(dq%2 && valp%2,auxr=-1); auxr*=pollead(q,x)^valp); if(valq,auxr=pollead(p,x)^valq); auxp=subst(p,y,1); auxq=subst(q,y,1); res=auxr*polresultant(auxp,auxq,x); return(res); } {resultantcomp(vp=[x,y,z])= \\ les vp[i] sont des pol homogenes en x,y et z. \\ vp[3] ne depend que de y et z. local(p,q,rt,dp,dq,drt,vy,vz,lrt,lp,res,aux,res2,dres2); p=vp[1];q=vp[2];rt=vp[3]; if(p==0 || q==0 || rt==0,return(0)); dp=degreetot(p);dq=degreetot(q);drt=degreetot(rt); if(drt==0,return(rt^(dp*dq))); vy=myvaluation(rt,y);vz=myvaluation(rt,z); rt=subst(rt,y,1);if(vz,rt/=z^vz); lrt=polcoeff(rt,drt,z);lp=polcoeff(p,dp,x); res=1; if(lp==0, aux=p;p=q;q=aux; aux=dp;dp=dq;dq=aux; if(dp%2 && dq%2 && drt%2,res=-res); lp=polcoeff(p,dp,x); if(lp==0,return(0))); if(vy, if(dp%2 && dq%2, res2=-1,res2=1); res2*=resultant2(subst(subst(p,y,0),z,y),subst(subst(q,y,0),z,y)); if(res2==0,return(0)); res*=res2^vy); if(vz, res2=resultant2(subst(p,z,0),subst(q,z,0)); if(res2==0,return(0)); res*=res2^vz); drt-=(vy+vz); if(drt==0,return(res*rt^(dp*dq))); res2=polresultant(subst(p,y,1),subst(q,y,1),x); dres2=poldegree(res2,z); res2=polresultant(rt,res2,z); res*=res2; if(dq!=poldegree(subst(q,y,1),x),res*=lp^(drt*(dq-poldegree(subst(q,y,1),x)))); if(dres2!=dp*dq,res*=pollead(rt,z)^(dp*dq-dres2)); return(res); } {resultant3(vp=[x,y,z],fl)= \\ resultant de 3 polynomes homogenes en x,y,z. \\ fl=1 pour afficher des resultats intermediaires. \\ on travaille sur la variable x. local(vdt,vdx,prodd,s,denom,nume,lp,p0,q0,r0,dd,cq,rm,res); for(i=1,3,if(vp[i]==0,return(0))); vdt=vector(3,i,degreetot(vp[i])); vdx=vector(3,i,poldegree(vp[i],x)); if(vecmin(vdt-vdx),return(0)); \\ en effet, dans ce cas, les polynomes sont dans l'ideal prodd=prod(i=1,3,vdt[i]); s=1; denom=1;nume=1; \\ on echange pour que vdx[1] >= vdx[2] >= vdx[3] if(vdx[1]