Fix log() error in multiple polylog G.
authorStefan Weinzierl <stefanw@thep.physik.uni-mainz.de>
Sun, 12 Oct 2014 18:30:41 +0000 (18:30 +0000)
committerRichard Kreckel <kreckel@ginac.de>
Sun, 12 Oct 2014 18:30:41 +0000 (18:30 +0000)
commitcda7fd319d75f95fbdac21213a10a04de724d228
treea48449a8a238aaea24350cedd9042b6bf6fe7b40
parent40b0071bbe4055bbae533634f008af38503ab696
Fix log() error in multiple polylog G.

Tobias Huber reported the following bug:
> G({-0.18784426860496276*I,-0.1579006477353911*I,+0.18784426860496276*I,-0.18784426860496276*I},1);
log_eval(): log(0)

The problem is the sorting operation in G_do_trafo. This operation should
1) put the elements in increasing order of |x|
2) put equal elements next to each other (which then will avoid the log(0) problem).

The current code fails for goal 2) if we have complex numbers of equal absolute
value, one number occuring more than once, in an initial order like in the example
above:
Entries 1,3,4 of the list all have the same absolute value, entries 1 and 4 are
equal. In the sorting operation 1 and 4 should be put next to each other.
Previously, the sorting operation would give 2,1,3,4. What we would like to have
is either 2,1,4,3 or 2,3,1,4. It is clear that the key for the sorting operation
cannot be |x| alone. If |x1|=|x2| we have to use the phase as well.

This patch takes the phase into account in the sorting.
ginac/inifcns_nstdsums.cpp