                    /** Partial fraction expansion */

/*A: John Gottschalk */
/*S: University of Western Australia */
/*D: January 1987 */


Pfs_:Tier
Rmsymb_:Tier

/*: Pfs[$exp,$form,($symbols:Null)]
	performs a partial fraction expansion of $exp, with respect to $form,
	but does not include terms containing $symbols. */
Pfs[$exp,$form] :: Pf[$exp,$form]
Pfs[$exp,$form,$symbols] : $exp
Pfs[$exp_=$exp[0] = 'Plus,$form,$symbols] :: Map[Pfs[$1,$form,$symbols],$exp]
Pfs[$exp_=($exp[0] = 'Div) | ($exp[0] = 'Mult),$form,$symbols] :: \
	(Lcl[%expr,%pf]; \
	 %expr : Rmsymb[$exp,$symbols]; \
	 %pf : Pf[%expr,$form]; \
	 If[P[%pf[0] = 'Plus],Map[$1*$exp/%expr,%pf],%pf $exp/%expr])

/*: Rmsymb[$expr,$symb]
	is used by Pfs */
Rmsymb[$x_= In[$symb,$x],$symb] :: 1
Rmsymb[$x_=~In[$symb,$x],$symb] :: $x
Rmsymb[$x_=$x[0] = 'Div ,$symb] :: Map[Rmsymb[$1,$symb],$x]
Rmsymb[$x_=$x[0] = 'Mult,$symb] :: Map[Rmsymb[$1,$symb],$x]

/*E:
SMP 1.5.0   (May 14 1986)

#I[1]::  (2f+1)/((2f+3)(f+4)(f+g+5))

		    1 + 2f
#O[1]:   ----------------------------
	 (3 + 2f) (4 + f) (5 + f + g)

#I[2]::  Pf[%,f]

				     1  	       2(5 + g)
			     ------------------ - ------------------
		-7           (-7 - 2g) (-1 - g)   (-7 - 2g) (-1 - g)
#O[2]:   ----------------- + ---------------------------------------
	 5(-1 - g) (4 + f)      	    5 + f + g

			   4    	    4
		   ------------------ + ---------
		   (-7 - 2g) (-1 - g)   5(-1 - g)
		 + ------------------------------
			       3 + 2f

#I[3]::  <XPfs

#I[4]::  Pfs[@1,f,g]

		  -4    		  7
#O[4]:   --------------------- + --------------------
	 5(3 + 2f) (5 + f + g)   5(4 + f) (5 + f + g)
*/
