]> www.ginac.de Git - ginac.git/blobdiff - ginac/inifcns_nstdsums.cpp
Fixed bug in harmonic polylogs for complex arguments with positive imaginary part.
[ginac.git] / ginac / inifcns_nstdsums.cpp
index 4fe91ad391eeb7f41e40362c7fa67223339da3a6..3b7fc556892398c64180d6ffc78f4cdf4d242593 100644 (file)
@@ -46,7 +46,7 @@
  */
 
 /*
- *  GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2004 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
@@ -1088,6 +1088,10 @@ REGISTER_FUNCTION(S,
 // anonymous namespace for helper functions
 namespace {
 
+       
+// regulates the pole (used by 1/x-transformation)
+symbol H_polesign("IMSIGN");
+
 
 // convert parameters from H to Li representation
 // parameters are expected to be in expanded form, i.e. only 0, 1 and -1
@@ -1601,7 +1605,7 @@ struct map_trafo_H_1overx : public map_function
                                        }
                                        if (allthesame) {
                                                map_trafo_H_mult unify;
-                                               return unify((pow(H(lst(1),1/arg).hold() + H(lst(0),1/arg).hold() - I*Pi, parameter.nops())
+                                               return unify((pow(H(lst(1),1/arg).hold() + H(lst(0),1/arg).hold() + H_polesign, parameter.nops())
                                                       / factorial(parameter.nops())).expand());
                                        }
                                }
@@ -1928,6 +1932,11 @@ static ex H_evalf(const ex& x1, const ex& x2)
                        // x -> 1/x
                        map_trafo_H_1overx trafo;
                        res *= trafo(H(m, xtemp));
+                       if (cln::imagpart(x) <= 0) {
+                               res = res.subs(H_polesign == -I*Pi);
+                       } else {
+                               res = res.subs(H_polesign == I*Pi);
+                       }
                }
 
                // simplify result
@@ -2033,25 +2042,25 @@ static ex H_eval(const ex& m_, const ex& x)
        if ((x == _ex1) && (*(--m.end()) != _ex0)) {
                return convert_H_to_zeta(m);
        }
-//     if (step == 0) {
-//             if (pos1 == _ex0) {
-//                     // all zero
-//                     if (x == _ex0) {
-//                             return H(m_, x).hold();
-//                     }
-//                     return pow(log(x), m.nops()) / factorial(m.nops());
-//             } else {
-//                     // all (minus) one
-//                     return pow(-pos1*log(1-pos1*x), m.nops()) / factorial(m.nops());
-//             }
-//     } else if ((step == 1) && (pos1 == _ex0)){
-//             // convertible to S
-//             if (pos2 == _ex1) {
-//                     return S(n, p, x);
-//             } else {
-//                     return pow(-1, p) * S(n, p, -x);
-//             }
-//     }
+       if (step == 0) {
+               if (pos1 == _ex0) {
+                       // all zero
+                       if (x == _ex0) {
+                               return H(m_, x).hold();
+                       }
+                       return pow(log(x), m.nops()) / factorial(m.nops());
+               } else {
+                       // all (minus) one
+                       return pow(-pos1*log(1-pos1*x), m.nops()) / factorial(m.nops());
+               }
+       } else if ((step == 1) && (pos1 == _ex0)){
+               // convertible to S
+               if (pos2 == _ex1) {
+                       return S(n, p, x);
+               } else {
+                       return pow(-1, p) * S(n, p, -x);
+               }
+       }
        if (x == _ex0) {
                return _ex0;
        }