From: Christian Bauer Date: Mon, 4 Mar 2002 20:01:00 +0000 (+0000) Subject: * Sync 1.1 branch to 1.0 mainline. X-Git-Tag: release_1-1-0~125 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?a=commitdiff_plain;h=ef635afd43c75b9221abf9335736a459a590710e;p=ginac.git * Sync 1.1 branch to 1.0 mainline. --- diff --git a/NEWS b/NEWS index 42f7a599..81208447 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ This file records noteworthy changes. 1.1.0 () +* "(x+1).subs(x==x-1)" now returns the correct result "x" instead of "x-1". 1.0.5 () * (l)degree(s), coeff(s, n) and collect(s) were extended to accept expressions diff --git a/check/exam_misc.cpp b/check/exam_misc.cpp index 5613b375..849dc5ad 100644 --- a/check/exam_misc.cpp +++ b/check/exam_misc.cpp @@ -199,6 +199,33 @@ static unsigned exam_operator_semantics(void) 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; @@ -211,6 +238,7 @@ unsigned exam_misc(void) 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; diff --git a/doc/tutorial/ginac.texi b/doc/tutorial/ginac.texi index dcee9335..717d5b10 100644 --- a/doc/tutorial/ginac.texi +++ b/doc/tutorial/ginac.texi @@ -3191,11 +3191,11 @@ Some examples: 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 diff --git a/ginac/expairseq.cpp b/ginac/expairseq.cpp index c18fadec..36261a98 100644 --- a/ginac/expairseq.cpp +++ b/ginac/expairseq.cpp @@ -402,7 +402,7 @@ ex expairseq::subs(const lst &ls, const lst &lr, bool no_pattern) const { epvector *vp = subschildren(ls, lr, no_pattern); if (vp) - return ex_to(thisexpairseq(vp, overall_coeff)).basic::subs(ls, lr, no_pattern); + return ex_to(thisexpairseq(vp, overall_coeff)); else return basic::subs(ls, lr, no_pattern); }