]> www.ginac.de Git - ginac.git/blobdiff - ginac/power.cpp
* Last week, the FSF has moved their office.
[ginac.git] / ginac / power.cpp
index fe18097b15f78bcea22898a0f224a241059c5755..bd276c56e454f035eb6043d1c9bf8b30ce769f72 100644 (file)
@@ -3,7 +3,7 @@
  *  Implementation of GiNaC's symbolic exponentiation (basis^exponent). */
 
 /*
- *  GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2005 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
@@ -17,7 +17,7 @@
  *
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
 #include <vector>
@@ -222,12 +222,14 @@ bool power::info(unsigned inf) const
                case info_flags::cinteger_polynomial:
                case info_flags::rational_polynomial:
                case info_flags::crational_polynomial:
-                       return exponent.info(info_flags::nonnegint);
+                       return exponent.info(info_flags::nonnegint) &&
+                              basis.info(inf);
                case info_flags::rational_function:
-                       return exponent.info(info_flags::integer);
+                       return exponent.info(info_flags::integer) &&
+                              basis.info(inf);
                case info_flags::algebraic:
-                       return (!exponent.info(info_flags::integer) ||
-                                       basis.info(inf));
+                       return !exponent.info(info_flags::integer) ||
+                              basis.info(inf);
        }
        return inherited::info(inf);
 }
@@ -246,7 +248,14 @@ ex power::op(size_t i) const
 
 ex power::map(map_function & f) const
 {
-       return (new power(f(basis), f(exponent)))->setflag(status_flags::dynallocated);
+       const ex &mapped_basis = f(basis);
+       const ex &mapped_exponent = f(exponent);
+
+       if (!are_ex_trivially_equal(basis, mapped_basis)
+        || !are_ex_trivially_equal(exponent, mapped_exponent))
+               return (new power(mapped_basis, mapped_exponent))->setflag(status_flags::dynallocated);
+       else
+               return *this;
 }
 
 int power::degree(const ex & s) const
@@ -558,6 +567,16 @@ ex power::eval_ncmul(const exvector & v) const
        return inherited::eval_ncmul(v);
 }
 
+ex power::conjugate() const
+{
+       ex newbasis = basis.conjugate();
+       ex newexponent = exponent.conjugate();
+       if (are_ex_trivially_equal(basis, newbasis) && are_ex_trivially_equal(exponent, newexponent)) {
+               return *this;
+       }
+       return (new power(newbasis, newexponent))->setflag(status_flags::dynallocated);
+}
+
 // protected
 
 /** Implementation of ex::diff() for a power.
@@ -595,7 +614,7 @@ unsigned power::return_type() const
 {
        return basis.return_type();
 }
-   
+
 unsigned power::return_type_tinfo() const
 {
        return basis.return_type_tinfo();