[PATCH] Improve normalisation of negative exponents.
[ginac.git] / check / exam_normalization.cpp
index 7ed7464d8b5d167988eaabcf9c25764617309e3d..17cf83db1ea1e83cc37c3db5424ee75edc4a1175 100644 (file)
@@ -252,6 +252,20 @@ static unsigned exam_exponent_law()
                result += check_normal(e, den);
        }
 
+       // Negative exponents
+       e = (exp(2*x)-exp(-2*x))/(exp(x)-exp(-x));
+       ex en = e.normal();
+       // Either exp(x) or exp(-x) can be viewed as a "symbol" during run-time
+       // thus two different forms of the result are possible
+       ex r1 = (exp(2*x)+1)/exp(x) ;
+       ex r2 = (exp(-2*x)+1)/exp(-x);
+
+       if (!en.is_equal(r1) && !en.is_equal(r2)) {
+               clog << "normal form of " << e << " erroneously returned "
+                    << en << " (should be " << r1 << " or " << r2 << ")" << endl;
+               result += 1;
+       }
+
        return result;
 }
 
@@ -305,6 +319,12 @@ static unsigned exam_power_law()
                e /= 2*pow(b, y/2)-3*pow(b, z/2);
                d = 2*pow(b, y/2)+3*pow(b, z/2);
                result += check_normal(e, d);
+
+               // Negative powers
+               e = (b -pow(b,-1));
+               e /= (pow(b, numeric(1,2)) - pow(b, numeric(-1,2)));
+               d = (b+1)*pow(b, numeric(-1,2));
+               result += check_normal(e, d);
        }
 
        return result;