macro( Rem=`UP/InPlaceRem` );
`UP/EucRes` := proc(D,x,y) local a,b,c,l,da,db,dr,r,C;

	C := D[CoefficientRing];
	if x = D[0] or y = D[0] then RETURN(C[0]) fi; 
	da := D[Degree](x); db := D[Degree](y);
	if db = 0 then RETURN(C[`^`](D[Coeff](y,0),da)) fi;
	if da < db then 
		r := `UP/EucRes`(D,y,x);
		if irem(da,db) = 1 then r := C[`-`](r) fi;
		RETURN( r )
	fi;

	# Euclidean Resultant coded to run in place
	a := D[ArrayCoeffs](x);
	b := D[ArrayCoeffs](y);

	r := C[1];
	while db > 0 do
	    l := C[Inv](b[db]);
	    dr := Rem(C,a,b,da,db,l);
	    r := C[`*`](r,C[`^`](b[db],da-dr));
	    if irem(da*db,2) = 1 then r := C[`-`](r) fi;
	    c := op(a); a := op(b); b := op(c);
	    da := db; db := dr
	od;

	if db = -1 then RETURN(C[0]) fi;
	C[`*`](r,C[`^`](b[0],da))

end:
save `EucRes.m`;
quit
