`UP/PRem` := proc(D,x,y,m,q) local d,r,dr,v,dv,t,l,n,C;

	C := D[CoefficientRing];

	r := x; dr := D[Degree](x);
	v := y; dv := D[Degree](y);

	if dr >= dv then l := D[Coeff](v,dv); v := D[Reductum](v);
		else l := C[1] fi;
	d := dr-dv+1;

	for n from 0 while dr >= dv and r <> D[0] do 
	    t := D[`.`](D[Coeff](r,dr),D[Shift](v,dr-dv));
	    if dr = 0 then r := D[0] else r := D[Reductum](r) fi;
	    r := D[`-`]( D[`.`](l,r), t );
	    dr := D[Degree](r)
	od;

	r := D[`.`](C[`^`](l,d-n),r);
	if nargs > 3 then m := C[`^`](l,d) fi;
	if nargs > 4 then q := D[Div](D[`-`](D[`.`](m,x),r),y) fi;
	r

end:
save `PRem.m`;
quit
