]> www.ginac.de Git - ginac.git/blobdiff - ginac/pseries.cpp
Transform abs(x)^n => x^n if x is real and n is even.
[ginac.git] / ginac / pseries.cpp
index 4a8d7d6a0f78aaadcefee47be398d7eef3fa84a8..43768179befdd947211e78d9ea1002f7aae430fa 100644 (file)
@@ -4,7 +4,7 @@
  *  methods for series expansion. */
 
 /*
- *  GiNaC Copyright (C) 1999-2010 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2011 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -424,14 +424,12 @@ ex pseries::conjugate() const
        epvector * newseq = conjugateepvector(seq);
        ex newpoint = point.conjugate();
 
-       if (!newseq     && are_ex_trivially_equal(point, newpoint)) {
+       if (!newseq && are_ex_trivially_equal(point, newpoint)) {
                return *this;
        }
 
        ex result = (new pseries(var==newpoint, newseq ? *newseq : seq))->setflag(status_flags::dynallocated);
-       if (newseq) {
-               delete newseq;
-       }
+       delete newseq;
        return result;
 }
 
@@ -1116,6 +1114,29 @@ ex power::series(const relational & r, int order, unsigned options) const
                must_expand_basis = true;
        }
 
+       bool exponent_is_regular = true;
+       try {
+               exponent.subs(r, subs_options::no_pattern);
+       } catch (pole_error) {
+               exponent_is_regular = false;
+       }
+
+       if (!exponent_is_regular) {
+               ex l = exponent*log(basis);
+               // this == exp(l);
+               ex le = l.series(r, order, options);
+               // Note: expanding exp(l) won't help, since that will attempt
+               // Taylor expansion, and fail (because exponent is "singular")
+               // Still l itself might be expanded in Taylor series.
+               // Examples:
+               // sin(x)/x*log(cos(x))
+               // 1/x*log(1 + x)
+               return exp(le).series(r, order, options);
+               // Note: if l happens to have a Laurent expansion (with
+               // negative powers of (var - point)), expanding exp(le)
+               // will barf (which is The Right Thing).
+       }
+
        // Is the expression of type something^(-int)?
        if (!must_expand_basis && !exponent.info(info_flags::negint)
         && (!is_a<add>(basis) || !is_a<numeric>(exponent)))