         /** Simplification of rational expressions. **/

/*A: K McIsaac */
/*S: University of Western Australia, Nedlands 6009, Australia*/
/*D: June 1985*/

/*: Unrat[$exp,($elm:|'Mult,'Div,'Pow|)]
	 reduces rational expressions whose numerators are complicated
	 functions of $elm into a sum of terms whose numerators are 
	 simpler functions of $elm. In the case of $elm : {'Mult,'Div,'Pow}
	 an expression containing many divisions and multiplications
	 is rewritten as a group of terms whoe numerators are of the
	 form Mult[expr1,expr2,...]. */
Unrat_:Tier;
Unrat[$exp,$elm] :: $exp
Unrat[$exp_=$exp[0] = 'Plus,$elm] :: Map[Unrat[$1,$elm],$exp]

Unrat[$exp_=$exp[0] = 'Div,$elm] ::\
	 (Lcl[%a];\
	 %a : Unrat[Num[$exp],$elm];\
	 If[P[%a[0]='Plus]&In[$elm,%a],Ex[%a/Den[$exp],\
		{'Div},,,0],%a/Den[$exp]])

Unrat[$exp_=$exp[0] = 'Mult,$elm] ::\
	 (Lcl[%a,%b,%c];\
	 %a : 1; %b : Nc[$exp];\
	 Map[If[In[$elm,$1],%a : %a Unrat[$1,$elm],%b : %b $1],$exp];\
	 %c : Ex[%a,{'Mult},,,0];\
	 If[P[%c[0]='Plus]&In[$elm,%c],Map[$1 %b,%c],%b %a])

Unrat[$exp] :: Unrat[$exp,{'Mult,'Div,'Pow}]

_XUnrat[Loaded] : 1

/*E:
#I[1]::  <ex

#I[2]::  x

			(5/2 + l) (7/2 + l)

				    2(1 - Euler - Psi[5/2 + l])
				 * (---------------------------
					     -1/2 - l

					    2(1 - Euler - Psi[7/2 + l])
					  - ---------------------------)
						     -3/2 - l
	 12(1/4 - l/2) (------------------------------------------------
					       2

				2(5/2 + l) (7/2 + l)

					   3(3/2 - Euler - Psi[5/2 + l])
					* (-----------------------------
						      1/2 - l

						  3(3/2 - Euler

							- Psi[7/2 + l])
						- ---------------------)
							-1/2 - l
			      - ----------------------------------------
						   3

				(5/2 + l) (7/2 + l)

					   4(11/6 - Euler - Psi[5/2 + l])
					* (------------------------------
						      3/2 - l

						  4(11/6 - Euler

							 - Psi[7/2 + l])
						- ----------------------)
							 1/2 - l
			      + -----------------------------------------)
						    4
#O[2]:   -----------------------------------------------------------------
				    11/4 + l/2

#I[3]::  <XUnrat

#I[4]::  Unrat[x]

	 12(1/4 - l/2) (5/2 + l) (7/2 + l) (1 - Euler - Psi[5/2 + l])
#O[4]:   ------------------------------------------------------------
			   (-1/2 - l) (11/4 + l/2)

		   12(1/4 - l/2) (5/2 + l) (7/2 + l)

			    * (1 - Euler - Psi[7/2 + l])
		 - -------------------------------------
			  (-3/2 - l) (11/4 + l/2)

		   24(1/4 - l/2) (5/2 + l) (7/2 + l)

			    * (3/2 - Euler - Psi[5/2 + l])
		 - ---------------------------------------
			   (1/2 - l) (11/4 + l/2)

		   24(1/4 - l/2) (5/2 + l) (7/2 + l)

			    * (3/2 - Euler - Psi[7/2 + l])
		 + ---------------------------------------
			   (-1/2 - l) (11/4 + l/2)

		   12(1/4 - l/2) (5/2 + l) (7/2 + l)

			    * (11/6 - Euler - Psi[5/2 + l])
		 + ----------------------------------------
			    (3/2 - l) (11/4 + l/2)

		   12(1/4 - l/2) (5/2 + l) (7/2 + l)

			     * (11/6 - Euler - Psi[7/2 + l])
		 - -----------------------------------------
			    (1/2 - l) (11/4 + l/2)

#I[5]::  (m2 x+y m1) (x+y)/(x^2+3)

	 (x + y) (m1 y + m2 x)
#O[5]:   ---------------------
		     2
		3 + x

#I[6]::  Unrat[%,{m1,m2}]

	 m1 y (x + y)   m2 x (x + y)
#O[6]:   ------------ + ------------
		 2      	2
	    3 + x          3 + x

*/
