This file records noteworthy changes.
1.1.0 (<date>)
+* "(x+1).subs(x==x-1)" now returns the correct result "x" instead of "x-1".
1.0.5 (<date>)
* (l)degree(s), coeff(s, n) and collect(s) were extended to accept expressions
return result;
}
+/* This checks whether subs() works as intended in some special cases. */
+static unsigned exam_subs(void)
+{
+ unsigned result = 0;
+ symbol x("x");
+ ex e1, e2;
+
+ // This used to fail in GiNaC 1.0.5 because it first substituted
+ // x+1 -> (x-1)+1 -> x, and then substituted again x -> x-1, giving
+ // the wrong result
+ e1 = x+1;
+ e2 = e1.subs(x == x-1);
+ if (!e2.is_equal(x)) {
+ clog << "(x+1).subs(x==x-1) erroneously returned " << e2 << " instead of x" << endl;
+ ++result;
+ }
+
+ e1 = sin(1+sin(x));
+ e2 = e1.subs(sin(wild()) == cos(wild()));
+ if (!e2.is_equal(cos(1+cos(x)))) {
+ clog << "sin(1+sin(x)).subs(sin($1)==cos($1)) erroneously returned " << e2 << " instead of cos(1+cos(x))" << endl;
+ ++result;
+ }
+
+ return result;
+}
+
unsigned exam_misc(void)
{
unsigned result = 0;
result += exam_expand_power(); cout << '.' << flush;
result += exam_sqrfree(); cout << '.' << flush;
result += exam_operator_semantics(); cout << '.' << flush;
+ result += exam_subs(); cout << '.' << flush;
if (!result) {
cout << " passed " << endl;
b^3+a^3+(x+y)^3
> subs(a^4+b^4+(x+y)^4,$1^2==$1^3);
b^4+a^4+(x+y)^4
-> subs((a+b+c)^2,a+b=x);
+> subs((a+b+c)^2,a+b==x);
(a+b+c)^2
> subs((a+b+c)^2,a+b+$1==x+$1);
(x+c)^2
-> subs(a+2*b,a+b=x);
+> subs(a+2*b,a+b==x);
a+2*b
> subs(4*x^3-2*x^2+5*x-1,x==a);
-1+5*a-2*a^2+4*a^3
{
epvector *vp = subschildren(ls, lr, no_pattern);
if (vp)
- return ex_to<basic>(thisexpairseq(vp, overall_coeff)).basic::subs(ls, lr, no_pattern);
+ return ex_to<basic>(thisexpairseq(vp, overall_coeff));
else
return basic::subs(ls, lr, no_pattern);
}