X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fpseries.cpp;h=43768179befdd947211e78d9ea1002f7aae430fa;hp=5c66deca06399bb03957279b2d2f42e3f27dd19b;hb=e45f9fca76b81e01ffa5edc417c29538fa05147b;hpb=1602530f716ba1d425a0667b897182b99c374823 diff --git a/ginac/pseries.cpp b/ginac/pseries.cpp index 5c66deca..43768179 100644 --- a/ginac/pseries.cpp +++ b/ginac/pseries.cpp @@ -4,7 +4,7 @@ * methods for series expansion. */ /* - * GiNaC Copyright (C) 1999-2009 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(basis) || !is_a(exponent)))