Ilya Zakharevich on Sun, 23 Feb 2003 01:17:32 -0800

 [PATCH CVS] yet better subst()

```This patch

a) removes a stupid lift(Mod(pol,M), variable(M)) which should be
equivalent to pol % M;

b) enables substitution of rational expressions, as below.

Enjoy,
Ilya

? subst(x^2,(x^2+1)/(x^2-1),t)
-t - 1
%1 = ------
-t + 1
? subst(%1,t,(x^2+1)/(x^2-1))		\\ test the previous one
2
%2 = x

--- ./src/basemath/gen3.c~	Sat Feb 22 18:58:44 2003
+++ ./src/basemath/gen3.c	Sun Feb 23 01:12:00 2003
@@ -1318,8 +1318,11 @@ gconvsp(GEN x, int flpile)
subst_poly(pol, from, to) =
{ local(t='subst_poly_t, M);

+     \\ if fraction
+     M = numerator(from) - t * denominator(from);
+     \\ else
M = from - t;
-     subst(lift(Mod(pol,M), variable(M)),t,to)
+     subst(pol % M, t, to)
}
*/
GEN
@@ -1327,15 +1330,19 @@ gsubst_expr(GEN pol, GEN from, GEN to)
{
pari_sp av = avma;
long v = fetch_var();		/* XXX Need fetch_var_low_priority() */
-  GEN tmp = gsub(from, polx[v]);	/* M */
+  GEN tmp;
+
+  switch (typ(from)) {
+  case t_RFRAC: case t_RFRACN: /* M= numerator(from) - t * denominator(from) */
+      tmp = gsub((GEN)from[1], gmul(polx[v], (GEN)from[2]));
+      break;
+  default:
+      tmp = gsub(from, polx[v]);	/* M = from - t */
+  }

if (v <= gvar(from))
err(talker, "subst: unexpected variable precedence");
-  tmp = gmodulcp(pol, tmp);
-  if (typ(tmp) == t_POLMOD)
-    tmp = (GEN)tmp[2];			/* optimize lift */
-  else					/* Vector? */
-    tmp = lift0(tmp, gvar(from));
+  tmp = gmod(pol, tmp);
tmp = gsubst(tmp, v, to);
(void)delete_var();
return gerepilecopy(av, tmp);
```