| Ilya Zakharevich on Sun, 23 Feb 2003 01:17:32 -0800 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| [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);