]> www.ginac.de Git - ginac.git/commitdiff
* Sync 1.1 branch to 1.0 mainline.
authorChristian Bauer <Christian.Bauer@uni-mainz.de>
Mon, 4 Mar 2002 20:01:00 +0000 (20:01 +0000)
committerChristian Bauer <Christian.Bauer@uni-mainz.de>
Mon, 4 Mar 2002 20:01:00 +0000 (20:01 +0000)
NEWS
check/exam_misc.cpp
doc/tutorial/ginac.texi
ginac/expairseq.cpp

diff --git a/NEWS b/NEWS
index 42f7a599a80e6969491605d1b96fc89e9a809b41..81208447d5064c278c551b2b5c41d143094b6c67 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,7 @@
 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
index 5613b3756edc81acf3b390f057fa9f9e9ff08212..849dc5adabd666ba1009e68ca18922fe926bc06b 100644 (file)
@@ -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;
index dcee9335e90270ccbc2ff045e7f792f9d258faa4..717d5b107909c665b06ad461cd98aded5bfcc4c8 100644 (file)
@@ -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
index c18fadecc9934f5ad55de6d5bc59ca91549aba17..36261a985c4e5810f3ec7f80fd6a1846f1d940ef 100644 (file)
@@ -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<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);
 }