/*		POLY		File 9  19.2.81 */
/*****************************************/
/* ROUTINES FOR POLYNOMIAL EQUATIONS */
/*****************************************/

/* Identities and unsatisfiable equations */
/*----------------------------------------*/

poly_method( _, [], true) :- !.
poly_method( _, [pair(0,A)], false) :- !.


/* Linear Equation */
/*-----------------*/

poly_method(X,Plist, X=Ans) :-
	subset(Plist,[pair(1,A),pair(0,B)]),
	not var(A), !,
	default(B),
	tidy( (-1)*B*A^ -1, Ans).

/* Quadratic Equation */
/*--------------------*/
/*
poly_method(X,Plist, X=Ans1 # X=Ans2) :-
	subset(Plist,[pair(2,A),pair(1,B),pair(0,C)]),
	not var(A), !,
	default(B), default(C),
	tidy((B^2+ -4*A*C)^(2^ -1),Sqrt),
	tidy((-1*B+Sqrt)*(2*A)^ -1,Ans1),
	tidy((-1*B+(-1*Sqrt))*(2*A)^ -1,Ans2).
*/


/* Default unbound coefficient to zero */

default(C) :- var(C), !, C=0.
default(C) :- !.



/* Polynomial with Negative Powers */
/*---------------------------------*/

poly_method(X,Plist,Ans) :-
	member(pair(N,_),Plist), N<0, !,
	N1 is -N,
	trace('Multiply through by %t to get a polynomial\n',[X^N1],1),
	maplist(add_n(N1),Plist,NPlist),
	poly_method(X,NPlist,Ans).




/* Multiply through pairs list by N */

add_n(N,pair(M,Coeff),pair(MN,Coeff)) :- !,
	MN is M+N.





/* Solve general equation by eliminating coefficients */
/*----------------------------------------------------*/

poly_method(X,GenBag,Ans) :-
	checklist(atom_coeff,GenBag),
	specialize(GenBag,X,SpecBag,Y,NewCoeffs),
	gensym(a,A), gensym(b,B),
	equate_coeffs(GenBag,X,SpecBag,Y,Y=A*X+B,EqnList),
	dottoand(EqnList,Eqns),
	simsolve(Eqns,[A,B|NewCoeffs],Solns,part),
	make_poly(Y,SpecBag,SpecPoly),
	solve(SpecPoly = 0,Y,Ans1),
	subst_mesg(Y=A*X+B & Solns, Ans1, Ans2),
	solve(Ans2,X,Ans).

/* coefficient is an atom */
atom_coeff(pair(N,C)) :- atom(C).
