/* Normal Form */ load("power-7.lisp"); /* This is a quick hack to check if a division produces a negitive power */ NegativePowerP(expr):=block([lov:listofvars(expr),flag:false], for v in lov do ( if lopow(expr,v) < 0 then return(flag:true) ), flag )$ lterm1(p):=ratdisrep(lterm(p,listofvars(p)))$ NormalForm(p,f) := block([s:length(f)], block([r:0,a:MAKE_ARRAY('ANY, s+1),i,dividing,q], for i:1 thru s do a[i]:0, while p # 0 do ( i : 1, dividing : true, while ((i<=s) AND (dividing)) do ( q:divide(lterm1(p),lterm1(f[i])), if q[2] = 0 and not NegativePowerP(q[1]) then ( a[i] : a[i] + q[1], p : p - expand(q[1]*f[i]), dividing : false) else i : i+1), if (dividing) then ( r : r + lterm1(p), p : p - lterm1(p))), r))$ /* print(NormalForm(x^2*y + x*y^2+y^2, [x*y - 1, y^2- 1])); */